/* Search down given translated URL searching for actual file name and filling * in path_info string. Doesn't make any claims about file type, must be * handled elsewhere. * Returns 0 on success, errno on failure */ int extract_path_info(per_request *reqInfo, struct stat *finfo) { register int x,max; char *str; int l,u; str = newString(HUGE_STRING_LEN,STR_TMP); max=count_dirs(reqInfo->filename); for(x=max ; x > 0 ; x--) { make_dirstr(reqInfo->filename,x+1,str); l=strlen(str); u=strlen(reqInfo->url); if(!(stat(str,finfo)) && !strcmp(reqInfo->filename+l, reqInfo->url+u-strlen(reqInfo->filename+ l))) { strcat(reqInfo->path_info,&(reqInfo->filename[l])); reqInfo->filename[l] = '\0'; reqInfo->url[strlen(reqInfo->url) - strlen(reqInfo->path_info)]='\0'; freeString(str); return 0; } } freeString(str); return errno; }
void evaluate_access(per_request *reqInfo,struct stat *finfo,int *allow, char *allow_options) { int will_allow, need_auth, num_dirs; int need_enhance; char opts[MAX_STRING_LEN], override[MAX_STRING_LEN]; char path[MAX_STRING_LEN], d[MAX_STRING_LEN]; char errstr[MAX_STRING_LEN]; register int x,y,z,n; if(S_ISDIR(finfo->st_mode)) strncpy_dir(path,reqInfo->filename,MAX_STRING_LEN); else lim_strcpy(path,reqInfo->filename,MAX_STRING_LEN); no2slash(path); num_dirs = count_dirs(path); will_allow = FA_ALLOW; need_auth = -1; need_enhance = -1; reqInfo->auth_user[0] = '\0'; reqInfo->auth_group[0] = '\0'; reset_mime_vars(); for(x=0;x<num_dirs;x++) { opts[x] = OPT_ALL; override[x] = OR_ALL; }
void get_abs_path(char **rel_path_ptr) { // get start path char *start_path = resolve_start(*rel_path_ptr); int total_size = count_dirs(start_path) + 1; // total size includes NULL at end char **start_array = extract_path_array(start_path); char **args = extract_path_array(*rel_path_ptr); int i; for (i = 0; args[i] != NULL; ++i) { start_array = add_dir(start_array, &total_size, args[i]); } int abs_size = get_abs_size(start_array); char *abs_path = malloc(abs_size + 1); abs_path[0] = '\0'; construct_abs_path(abs_path, start_array); *rel_path_ptr = realloc(*rel_path_ptr, strlen(abs_path) + 1); strcpy(*rel_path_ptr, abs_path); free(abs_path); destroy_path_array(args); destroy_path_array(start_array); free(start_path); }