Dir *Dir_create(const char *base, const char *prefix, const char *index_file, const char *default_ctype) { Dir *dir = calloc(sizeof(Dir), 1); check_mem(dir); dir->base = bfromcstr(base); check(blength(dir->base) < MAX_DIR_PATH, "Base directory is too long, must be less than %d", MAX_DIR_PATH); // dir can come from the routing table so it could have a pattern in it, strip that off bstring pattern = bfromcstr(prefix); int first_paren = bstrchr(pattern, '('); dir->prefix = first_paren >= 0 ? bHead(pattern, first_paren) : bstrcpy(pattern); bdestroy(pattern); check(blength(dir->prefix) < MAX_DIR_PATH, "Prefix is too long, must be less than %d", MAX_DIR_PATH); check(bchar(dir->prefix, 0) == '/' && bchar(dir->prefix, blength(dir->prefix)-1) == '/', "Dir route prefix (%s) must start with / and end with / or else you break the internet.", prefix); dir->index_file = bfromcstr(index_file); dir->default_ctype = bfromcstr(default_ctype); dir->fr_cache = Cache_create(FR_CACHE_SIZE, filerecord_cache_lookup, filerecord_cache_evict); check(dir->fr_cache, "Failed to create FileRecord cache"); return dir; error: if(dir) free(dir); return NULL; }
Dir *Dir_create(const char *base, const char *index_file, const char *default_ctype) { Dir *dir = calloc(sizeof(Dir), 1); check_mem(dir); if(!MAX_SEND_BUFFER || !MAX_DIR_PATH) { MAX_SEND_BUFFER = Setting_get_int("limits.dir_send_buffer", 16 * 1024); MAX_DIR_PATH = Setting_get_int("limits.dir_max_path", 256); log_info("MAX limits.dir_send_buffer=%d, limits.dir_max_path=%d", MAX_SEND_BUFFER, MAX_DIR_PATH); } dir->base = bfromcstr(base); check(blength(dir->base) < MAX_DIR_PATH, "Base directory is too long, must be less than %d", MAX_DIR_PATH); check(bchar(dir->base, 0) != '/', "Don't start the base with / in %s, that will fail when not in chroot.", base); check(bchar(dir->base, blength(dir->base) - 1) == '/', "End directory base with / in %s or it won't work right.", base); dir->index_file = bfromcstr(index_file); dir->default_ctype = bfromcstr(default_ctype); dir->fr_cache = Cache_create(FR_CACHE_SIZE, filerecord_cache_lookup, filerecord_cache_evict); check(dir->fr_cache, "Failed to create FileRecord cache"); return dir; error: if(dir) free(dir); return NULL; }