summaryrefslogtreecommitdiff
path: root/data.c
diff options
context:
space:
mode:
Diffstat (limited to 'data.c')
-rw-r--r--data.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/data.c b/data.c
index ad581ee..78e138c 100644
--- a/data.c
+++ b/data.c
@@ -543,10 +543,12 @@ xs_list *index_list_desc(const char *fn, int skip, int show)
543 543
544/** objects **/ 544/** objects **/
545 545
546xs_str *_object_fn_by_md5(const char *md5) 546static xs_str *_object_fn_by_md5(const char *md5)
547{ 547{
548 if (!xs_is_hex(md5)) 548 if (!xs_is_hex(md5) || strlen(md5) != 32) {
549 srv_log(xs_fmt("_object_fn_by_md5(): '%s' not hex", md5)); 549 srv_log(xs_fmt("_object_fn_by_md5(): bad md5 '%s'", md5));
550 return NULL;
551 }
550 552
551 xs *bfn = xs_fmt("%s/object/%c%c", srv_basedir, md5[0], md5[1]); 553 xs *bfn = xs_fmt("%s/object/%c%c", srv_basedir, md5[0], md5[1]);
552 554
@@ -567,7 +569,7 @@ int object_here_by_md5(const char *id)
567/* checks if an object is already downloaded */ 569/* checks if an object is already downloaded */
568{ 570{
569 xs *fn = _object_fn_by_md5(id); 571 xs *fn = _object_fn_by_md5(id);
570 return mtime(fn) > 0.0; 572 return fn && mtime(fn) > 0.0;
571} 573}
572 574
573 575
@@ -586,6 +588,11 @@ int object_get_by_md5(const char *md5, xs_dict **obj)
586 xs *fn = _object_fn_by_md5(md5); 588 xs *fn = _object_fn_by_md5(md5);
587 FILE *f; 589 FILE *f;
588 590
591 if (xs_is_null(fn)) {
592 srv_log(xs_fmt("object_get_by_md5(): bad md5 '%s'", md5));
593 return 500;
594 }
595
589 if ((f = fopen(fn, "r")) != NULL) { 596 if ((f = fopen(fn, "r")) != NULL) {
590 flock(fileno(f), LOCK_SH); 597 flock(fileno(f), LOCK_SH);
591 598
@@ -689,6 +696,11 @@ int object_del_by_md5(const char *md5)
689 int status = 404; 696 int status = 404;
690 xs *fn = _object_fn_by_md5(md5); 697 xs *fn = _object_fn_by_md5(md5);
691 698
699 if (xs_is_null(fn)) {
700 srv_log(xs_fmt("object_del_by_md5(): bad md5 '%s'", md5));
701 return 500;
702 }
703
692 if (unlink(fn) != -1) { 704 if (unlink(fn) != -1) {
693 status = 200; 705 status = 200;
694 706
@@ -736,7 +748,7 @@ int object_del_if_unref(const char *id)
736double object_ctime_by_md5(const char *md5) 748double object_ctime_by_md5(const char *md5)
737{ 749{
738 xs *fn = _object_fn_by_md5(md5); 750 xs *fn = _object_fn_by_md5(md5);
739 return f_ctime(fn); 751 return fn ? f_ctime(fn) : 0.0;
740} 752}
741 753
742 754
@@ -793,10 +805,13 @@ xs_list *object_announces(const char *id)
793} 805}
794 806
795 807
796int object_parent(const char *id, char *buf, int size) 808int object_parent(const char *md5, char *buf, int size)
797/* returns the object parent, if any */ 809/* returns the object parent, if any */
798{ 810{
799 xs *fn = _object_fn_by_md5(id); 811 xs *fn = _object_fn_by_md5(md5);
812 if (xs_is_null(fn))
813 return 0;
814
800 fn = xs_replace_i(fn, ".json", "_p.idx"); 815 fn = xs_replace_i(fn, ".json", "_p.idx");
801 return index_first(fn, buf, size); 816 return index_first(fn, buf, size);
802} 817}