int handle_file_list(WFM2_FILE_LIST_PARAM *aListParam, WFM2_FILE_OBJECT *aFileObj) { char *full_path=NULL; int exist, i; int g_access=SHARE_NOACCESS, nPermission=0, is_iso=0; char *delim="/", *node_tmp=NULL; int nShareCount=0, nTotalShare=0; //SECTION_INFO *shareList=NULL; char *node1=NULL, *iso=NULL; int nLen=0, nLen1=0; // check iso section node1 = strstr(&aListParam->node[1], "/"); nLen = strlen(aListParam->node); if(node1 != NULL) { nLen1 = strlen(node1); iso = __ax_calloc(1, (nLen - nLen1 + 1)); strncpy(iso, &aListParam->node[1], (nLen - nLen1)); } else { iso = __ax_calloc(1, (nLen + 1)); strncpy(iso, &aListParam->node[1], nLen); } is_iso = 0; /* nShareCount = Get_NAS_Share_List_V2_ISO(&shareList, 0, 0, NULL, ISO_FILTER_ONLY, &nTotalShare); for(i=0; i<nTotalShare; i++){ if (!strcasecmp(iso, shareList[i].section_name)) { is_iso = 1; break; } } if(shareList != NULL) Release_List(shareList); */ if(iso) __ax_free(iso); /*The first request node is "/", but we do not display folder in "/", so * give null share json*/ if (!strcmp(aListParam->node, "/")) { File_List_To_JSON(NULL, 0, 0, 0, 0); return -1; } /* node_tmp = __ax_strdup(aListParam->node); g_access = Get_NAS_User_Security_For_Share_Ex(aListParam->remoteUser, strtok(node_tmp, delim)); #ifdef STORAGE_V2 if(g_access == SHARE_NOACCESS && aListParam->no_check == 0) #else if(g_access == SHARE_NOACCESS) #endif { Status_To_JSON(WFM2_PERMISSION_DENY); if(node_tmp) __ax_free(node_tmp); return -1; } if(node_tmp) __ax_free(node_tmp); */ //nEnd = nStart + nLimit - 1; aListParam->end = aListParam->start + aListParam->limit - 1; full_path = (char *)__ax_malloc(strlen(aListParam->node) + MAX_FILE_LENGTH + PATH_PREFIX_LENGTH + 256); exist = check_exist(aListParam->node, full_path); if(exist < 0) { #ifdef STORAGE_V2 if(aListParam->no_check == 0) #endif #ifdef LIBRSYNC if(aListParam->view_versioning == 0) #endif { Status_To_JSON(WFM2_FILE_NO_EXIST); if(full_path) __ax_free(full_path); return -1; } } #ifdef ACL //if not iso folder, check permission //the external disk and non-ext3 or non-ext4 vdd are not //supported for ACL //so do not check the acl permission if(Is_ACL_Enabled() && No_Support_ACL(aListParam->node) == 0) { #ifdef LIBRSYNC if(aListParam->view_versioning == 0) #endif if(!is_iso) { aListParam->permission = Get_ACL_User_Group_Security_For_Share(aListParam->remoteUser, full_path); if(aListParam->permission < 5) { Status_To_JSON(WFM2_PERMISSION_DENY); if (full_path) __ax_free(full_path); return -1; } } } else nPermission = g_access; #endif // ACL for (i=0; i<sizeof(sort_func)/sizeof(SORT_FUNC); i++) { if (!strcmp(sort_func[i].sort_mode, aListParam->sort)) { aListParam->sortmode = i; break; } } #ifdef STORAGE_V2 if (aListParam->no_check) { if(access(aListParam->node, 0) < 0) { Status_To_JSON(WFM2_FILE_NO_EXIST); if (full_path) __ax_free(full_path); return -1; } else { _get_file_list(aListParam->node, aListParam, aFileObj); } } else _get_file_list(full_path, aListParam, aFileObj); #else _get_file_list(full_path, aListParam, aFileObj); #endif if(full_path) __ax_free(full_path); return 0; }
int _get_file_list(char *path, WFM2_FILE_LIST_PARAM *aListParam, WFM2_FILE_OBJECT *aFileObj) { char tmp[MAX_FILE_PATH]; DIR *dir, *_dir; struct dirent * ptr; struct stat buf; int total=0, count=0, i, j, nFindPageNum=0;; int start=aListParam->start, end=aListParam->end, sort_mode=aListParam->sortmode, file_type=aListParam->filetype, permission=aListParam->permission, hidden_file=aListParam->hidden_file, recycle=aListParam->recycle; char q_dir_1[MAX_FILE_PATH]="Photos"; char q_dir_2[MAX_FILE_PATH]="Videos"; char q_dir_3[MAX_FILE_PATH]="Documents"; char q_dir_4[MAX_FILE_PATH]="Others"; char q_dir_5[MAX_FILE_PATH]="Music"; dir = opendir(path); while ((ptr = readdir(dir))!=NULL) { //do not include "." and ".." if (!strcmp(ptr->d_name, ".") || !strcmp(ptr->d_name, "..")) continue; //do not include q_dir if(!strcmp(path, "/tmp/mnt/Qsync")){ if (!strcmp(ptr->d_name,q_dir_1) || !strcmp(ptr->d_name,q_dir_2) || !strcmp(ptr->d_name,q_dir_3) || !strcmp(ptr->d_name,q_dir_4) || !strcmp(ptr->d_name,q_dir_5)) continue; } total++; } closedir(dir); _dir = opendir(path); all_file = (JSON_FILE_OBJECT *)__ax_malloc(total * sizeof(JSON_FILE_OBJECT)); memset(all_file, 0, (total * sizeof(JSON_FILE_OBJECT))); while ((ptr = readdir(_dir))!=NULL) { //do not include "." and ".." if (!strcmp(ptr->d_name, ".") || !strcmp(ptr->d_name, "..")) continue; //do not include q_dir if (!strcmp(path, "/tmp/mnt/Qsync")){ if (!strcmp(ptr->d_name, q_dir_1) || !strcmp(ptr->d_name,q_dir_2) || !strcmp(ptr->d_name,q_dir_3) || !strcmp(ptr->d_name,q_dir_4) || !strcmp(ptr->d_name,q_dir_5)) continue; } struct passwd *user; struct group *data; user = getpwuid(buf.st_uid); if (user == NULL) sprintf((all_file+count)->owner, "%d", buf.st_uid); else strcpy((all_file+count)->owner, user->pw_name); data = getgrgid(buf.st_gid); if (data == NULL) sprintf((all_file+count)->group, "%d", buf.st_gid); else strcpy((all_file+count)->group, data->gr_name); sprintf(tmp, "%s/%s", path, ptr->d_name); stat(tmp, &buf); (all_file+count)->filesize = (unsigned long long)(buf.st_size); (all_file+count)->mt = buf.st_mtime; strcpy((all_file+count)->filename, ptr->d_name); sprintf((all_file+count)->privilege, "%03o", (buf.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO))); if (S_ISDIR(buf.st_mode)) { (all_file+count)->isfolder = 1; strcpy((all_file+count)->type_str, " "); } count++; if(count >= total) { break; } } closedir(_dir); // split sort filename for natural sort if(sort_mode == 1) { // sort by natural for (i=0; i<total; i++) { if(split_sort_filename((all_file+i)->filename, &(all_file+i)->split_name) < 0) { if(all_file) { for(j=0; j<(i+1); j++) free_wfm2_split_data((all_file+j)->split_name.data); __ax_free(all_file); } return -1; } } } //sorting by type (sort_func[sort_mode].function)(aListParam->dir, total); temp_file = (JSON_FILE_OBJECT *)__ax_malloc(total * sizeof(JSON_FILE_OBJECT)); memset(temp_file, 0, (total * sizeof(JSON_FILE_OBJECT))); j=0; //display folder first for (i=0; i<total; i++) { if ((all_file+i)->isfolder == 1) { *(temp_file+j) = *(all_file+i); j++; } } for (i=0; i<total; i++) { if ((all_file+i)->isfolder == 0) { *(temp_file+j) = *(all_file+i); if(aListParam->filename != NULL && strlen(aListParam->filename) > 0) { if(!strcmp((temp_file+j)->filename, aListParam->filename)) { nFindPageNum = (int)((i+1) / (end-start+1)); if(((i+1)%(end-start+1)) > 0) nFindPageNum += 1; if(nFindPageNum > 1) { int nLimit=0; nLimit = end-start+1; start = (nFindPageNum-1) * nLimit; end = start + (nLimit-1); } else start = 0; } } j++; } } if (all_file) __ax_free(all_file); if(total < 0){ perror("scandir"); //if (all_file) __ax_free(all_file); if (temp_file) __ax_free(temp_file); return -1; } else{ int total_obj = 0; JSON_FILE_OBJECT *file=NULL; if(total > end) total_obj = end - start + 1; else if(total <= end && total >= start) total_obj = total - start; else { //if (all_file) __ax_free(all_file); if (temp_file) __ax_free(temp_file); return -1; } file = (JSON_FILE_OBJECT *)__ax_malloc(total_obj * sizeof(JSON_FILE_OBJECT)); memset(file, 0, (total_obj * sizeof(JSON_FILE_OBJECT))); for (i=0; i<total_obj; i++) { strcpy((file+i)->filename, (temp_file+start)->filename); (file+i)->isfolder = (temp_file+start)->isfolder; (file+i)->filesize = (temp_file+start)->filesize; strcpy((file+i)->owner, (temp_file+start)->owner); strcpy((file+i)->group, (temp_file+start)->group); (file+i)->mt = (temp_file+start)->mt; strcpy((file+i)->mt_str, (temp_file+start)->mt_str); strcpy((file+i)->privilege, (temp_file+start)->privilege); start++; } if(temp_file) __ax_free(temp_file); File_List_To_JSON(file, total_obj, total, permission, 0); if(file) __ax_free(file); } return 0; }
int special_search(INPUT *input) { INPUT *tmp = NULL; char *ptr = NULL, tmp_time[12], *folder = NULL; struct tm *p; time_t timep_begin, timep_end; int i; //SECTION_INFO *shareList=NULL; JSON_FILE_OBJECT *file; struct stat buf; struct passwd *user; struct group *data; tmp = CGI_Find_Parameter(input, "Time_begin"); if (tmp == NULL) return -1; else { ptr = tmp->val; strncpy(tmp_time, ptr, 4); tmp_time[4] = 0x0; p = (struct tm *)__ax_malloc(sizeof(struct tm)); p->tm_year = atoi(tmp_time) - 1900; ptr = ptr + 4; strncpy(tmp_time, ptr, 2); tmp_time[2] = 0x0; p->tm_mon = atoi(tmp_time) - 1; ptr = ptr + 2; strncpy(tmp_time, ptr, 2); tmp_time[2] = 0x0; p->tm_mday = atoi(tmp_time); p->tm_hour = 0; p->tm_min = 0; p->tm_sec = 0; timep_begin = mktime(p); if (p) __ax_free(p); } tmp = CGI_Find_Parameter(input, "Time_end"); if (tmp == NULL) return -1; else { ptr = tmp->val; strncpy(tmp_time, ptr, 4); tmp_time[4] = 0x0; p = (struct tm *)__ax_malloc(sizeof(struct tm)); p->tm_year = atoi(tmp_time) - 1900; ptr = ptr + 4; strncpy(tmp_time, ptr, 2); tmp_time[2] = 0x0; p->tm_mon = atoi(tmp_time) - 1; ptr = ptr + 2; strncpy(tmp_time, ptr, 2); tmp_time[2] = 0x0; p->tm_mday = atoi(tmp_time); p->tm_hour = 0; p->tm_min = 0; p->tm_sec = 0; timep_end = mktime(p); if (p) __ax_free(p); } tmp = CGI_Find_Parameter(input, "Folder_name"); if (tmp == NULL) return -1; else folder = tmp->val; /* Get_NAS_Share_List_V2(&shareList, 0, 0, NULL, &total_share); for (i=0; i<total_share; i++) { sprintf(buffer, "/%s/%s", shareList[i].section_name, folder); full_path = (char *)__ax_malloc(strlen(folder) + MAX_FILE_LENGTH + 15); exist = check_exist(buffer, full_path); if (exist < 0) { //Status_To_JSON(WFM2_FILE_NO_EXIST); //if (full_path) __ax_free(full_path); // return -1; } else _search_by_time(full_path, timep_begin, timep_end); if (full_path) __ax_free(full_path); } */ file = (JSON_FILE_OBJECT *)__ax_malloc( total_file * sizeof(JSON_FILE_OBJECT)); for (i=0;i<total_file;i++) { lstat(file_list[i], &buf); strcpy((file+i)->filename, file_list[i]); (file+i)->isfolder = 0; (file+i)->filesize = (unsigned long long)(buf.st_size); user = getpwuid(buf.st_uid); if (user == NULL) sprintf((file+i)->owner, "%d", buf.st_uid); else strcpy((file+i)->owner, user->pw_name); data = getgrgid(buf.st_gid); if (data == NULL) sprintf((file+i)->group, "%d", buf.st_gid); else strcpy((file+i)->group, data->gr_name); /* { char sDateStr[64]={0}; char sTimeStr[64]={0}; Change_Date_To_String_By_Format(buf.st_mtime, sDateStr, nDate_format); Change_Time_To_String_By_Format(buf.st_mtime, sTimeStr, 0, nTime_format); sprintf((file+i)->mt_str, "%s %s", sDateStr, sTimeStr); } */ sprintf((file+i)->privilege, "%o", (buf.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO))); } File_List_To_JSON(file, total_file, total_file, 0, 0); if (file) __ax_free(file); //if(shareList != NULL) Release_List(shareList); return 0; }
int op_search(INPUT *input) { int ret = 0; INPUT *keyword = NULL, *start = NULL, *limit = NULL; INPUT *source = NULL, *tmp = NULL, *time = NULL; char *full_path = NULL, *source_tmp = NULL, *sort_type = "ASC"; int exist = 0, end = 0, sort_mode = 0, permission = NO, is_iso = 0; //only for internal use ret = special_search(input); if (ret == 0) return 0; source = CGI_Find_Parameter(input, "source_path"); if (source == NULL) return -1; if(!Check_Illegal_Path(source->val)) { Status_To_JSON(WFM2_ILLEGAL_NAME); return -1; } time = CGI_Find_Parameter(input, "time"); if (time != NULL) { char *ptr = NULL, tmp[12]; struct tm *p; time_t timep; struct stat buf; struct passwd *user; struct group *data; int i; JSON_FILE_OBJECT *file; ptr = time->val; strncpy(tmp, ptr, 4); tmp[4] = 0x0; p = (struct tm *)__ax_malloc(sizeof(struct tm)); p->tm_year = atoi(tmp) - 1900; ptr = ptr + 4; strncpy(tmp, ptr, 2); tmp[2] = 0x0; p->tm_mon = atoi(tmp) - 1; ptr = ptr + 2; strncpy(tmp, ptr, 2); tmp[2] = 0x0; p->tm_mday = atoi(tmp); p->tm_hour = 0; p->tm_min = 0; p->tm_sec = 0; timep = mktime(p); if (p) __ax_free(p); full_path = (char *)__ax_malloc(strlen(source->val) + MAX_FILE_LENGTH + 15); exist = check_exist(source->val, full_path); if (exist < 0) { Status_To_JSON(WFM2_FILE_NO_EXIST); if (full_path) __ax_free(full_path); return -1; } _search_by_time(full_path, timep, 0); file = (JSON_FILE_OBJECT *)__ax_malloc( total_file * sizeof(JSON_FILE_OBJECT)); for (i=0;i<total_file;i++) { lstat(file_list[i], &buf); strcpy((file+i)->filename, file_list[i]); (file+i)->isfolder = 0; (file+i)->filesize = (unsigned long long)(buf.st_size); user = getpwuid(buf.st_uid); if (user == NULL) sprintf((file+i)->owner, "%d", buf.st_uid); else strcpy((file+i)->owner, user->pw_name); data = getgrgid(buf.st_gid); if (data == NULL) sprintf((file+i)->group, "%d", buf.st_gid); else strcpy((file+i)->group, data->gr_name); /* { char sDateStr[64]={0}; char sTimeStr[64]={0}; Change_Date_To_String_By_Format(buf.st_mtime, sDateStr, nDate_format); Change_Time_To_String_By_Format(buf.st_mtime, sTimeStr, 0, nTime_format); sprintf((file+i)->mt_str, "%s %s", sDateStr, sTimeStr); } */ sprintf((file+i)->privilege, "%o", (buf.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO))); } File_List_To_JSON(file, total_file, total_file, 0, 0); if (full_path) __ax_free(full_path); if (file) __ax_free(file); return 0; } if((tmp = CGI_Find_Parameter(input, "is_iso"))) is_iso = atoi(tmp->val); /* source_tmp = (char *)__ax_malloc(strlen(source->val) + 1); strcpy(source_tmp, source->val); g_access = Get_NAS_User_Security_For_Share_Ex(remote_user, strtok(source_tmp, delim)); if (g_access == SHARE_NOACCESS) { Status_To_JSON(WFM2_PERMISSION_DENY); if(source_tmp) __ax_free(source_tmp); return -1; } */ full_path = (char *)__ax_malloc(strlen(source->val) + MAX_FILE_LENGTH + 15); exist = check_exist(source->val, full_path); if (exist < 0) { Status_To_JSON(WFM2_FILE_NO_EXIST); if (full_path) __ax_free(full_path); return -1; } #ifdef ACL //if not iso folder, check permission if (Is_ACL_Enabled() && No_Support_ACL(source_tmp) == 0) { if (!is_iso) { permission= Get_ACL_User_Group_Security_For_Share(remote_user, full_path); if (permission < 5) { Status_To_JSON(WFM2_PERMISSION_DENY); if (full_path) __ax_free(full_path); return -1; } } } #endif if(source_tmp) __ax_free(source_tmp); keyword = CGI_Find_Parameter(input, "keyword"); if (keyword == NULL) { //CGI_Free_Input(source); if (full_path) __ax_free(full_path); return -1; } start = CGI_Find_Parameter(input, "start"); if (start == NULL) { if (full_path) __ax_free(full_path); return -1; } limit = CGI_Find_Parameter(input, "limit"); if (limit == NULL) { if (full_path) __ax_free(full_path); return -1; } _search(full_path, keyword); /* if (keyword!=NULL) CGI_Free_Input(keyword); if (source!=NULL) CGI_Free_Input(source); */ int i; end = atoi(start->val) + atoi(limit->val) - 1; if ((tmp = CGI_Find_Parameter(input, "sort"))) { for (i=0; i<sizeof(sort_func)/sizeof(SORT_FUNC); i++) { if (!strcmp(sort_func[i].sort_mode, tmp->val)) { sort_mode = i; break; } } } if ((tmp = CGI_Find_Parameter(input, "dir"))) sort_type = tmp->val; output_search_to_json(atoi(start->val), end, sort_mode, sort_type, permission); if (full_path) __ax_free(full_path); if (file_list) __ax_free(file_list); file_list = NULL; if(folder_list) __ax_free(folder_list); folder_list = NULL; total_match = 0; total_search = 0; total_file = 0; total_folder = 0; return ret; }
int output_search_to_json(int start, int end, int sort_mode, char *sort_type, int permission) { int total_obj = 0, total = total_file + total_folder, i = 0, j = 0, k = 0; int file_start = 0, folder_start = 0, file_end = 0, folder_end = 0; JSON_FILE_OBJECT *file; struct stat buf; struct passwd *user; struct group *data; char *p = NULL; all_file = (JSON_FILE_OBJECT *)__ax_malloc(total_file * sizeof(JSON_FILE_OBJECT)); all_folder = (JSON_FILE_OBJECT *)__ax_malloc(total_folder * sizeof(JSON_FILE_OBJECT)); for (k=0; k<total_folder; k++) { lstat(folder_list[k], &buf); if (S_ISDIR(buf.st_mode)) { strcpy((all_folder+k)->filename, folder_list[k]); (all_folder+k)->isfolder = 1; strcpy((all_folder+k)->type_str, " "); (all_folder+k)->filesize = (unsigned long long)(buf.st_size); user = getpwuid(buf.st_uid); if (user == NULL) sprintf((all_folder+k)->owner, "%d", buf.st_uid); else strcpy((all_folder+k)->owner, user->pw_name); data = getgrgid(buf.st_gid); if (data == NULL) sprintf((all_folder+k)->group, "%d", buf.st_gid); else strcpy((all_folder+k)->group, data->gr_name); (all_folder+k)->mt = buf.st_mtime; /* { char sDateStr[64]={0}; char sTimeStr[64]={0}; Change_Date_To_String_By_Format(buf.st_mtime, sDateStr, nDate_format); Change_Time_To_String_By_Format(buf.st_mtime, sTimeStr, 0, nTime_format); sprintf((all_folder+k)->mt_str, "%s %s", sDateStr, sTimeStr); } */ strftime((all_folder+k)->mt_str, 32, "%Y-%m-%d %H:%M:%S", localtime(&buf.st_mtime)); sprintf((all_folder+k)->privilege, "%o", (buf.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO))); } } for (k=0; k<total_file; k++) { lstat(file_list[k], &buf); if (S_ISDIR(buf.st_mode) == 0) { strcpy((all_file+k)->filename, file_list[k]); (all_file+k)->isfolder = 0; p = strrchr(file_list[k], '.'); if (p != 0) { p = p + 1; strncpy((all_file+k)->type_str, p, 11); (all_file+k)->type_str[11] = '\0'; } else{ strcpy((all_file+k)->type_str, " "); } (all_file+k)->filesize = (unsigned long long)(buf.st_size); user = getpwuid(buf.st_uid); if (user == NULL) sprintf((all_file+k)->owner, "%d", buf.st_uid); else strcpy((all_file+k)->owner, user->pw_name); data = getgrgid(buf.st_gid); if (data == NULL) sprintf((all_file+k)->group, "%d", buf.st_gid); else strcpy((all_file+k)->group, data->gr_name); (all_file+k)->mt = buf.st_mtime; /* { char sDateStr[64]={0}; char sTimeStr[64]={0}; Change_Date_To_String_By_Format(buf.st_mtime, sDateStr, nDate_format); Change_Time_To_String_By_Format(buf.st_mtime, sTimeStr, 0, nTime_format); sprintf((all_file+k)->mt_str, "%s %s", sDateStr, sTimeStr); } */ strftime((all_file+k)->mt_str, 32, "%Y-%m-%d %H:%M:%S", localtime(&buf.st_mtime)); sprintf((all_file+k)->privilege, "%o", (buf.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO))); } } //sorting by type (sort_func[sort_mode].function)(sort_type, total); if (total > end) total_obj = end - start + 1; else if (total <= end && total >= start) total_obj = total - start; else { if (all_file) __ax_free(all_file); if (all_folder) __ax_free(all_folder); return -1; } file = (JSON_FILE_OBJECT *)__ax_malloc(total_obj * sizeof(JSON_FILE_OBJECT)); memset(file, 0, (total_obj * sizeof(JSON_FILE_OBJECT))); //output file and folder count. k = 0; //output folder first. if (start < total_folder) { folder_start = start; if (total_folder > end) folder_end = end + 1; else if (total_folder <= end && total_folder >= start) folder_end = total_folder; else goto output_file; for (i=folder_start; i<folder_end; i++) { strcpy((file+k)->filename, (all_folder+folder_start)->filename); (file+k)->isfolder = 1; (file+k)->filesize = (all_folder+folder_start)->filesize; strcpy((file+k)->owner, (all_folder+folder_start)->owner); strcpy((file+k)->group, (all_folder+folder_start)->group); (file+k)->mt = (all_folder+folder_start)->mt; strcpy((file+k)->mt_str, (all_folder+folder_start)->mt_str); strcpy((file+k)->privilege, (all_folder+folder_start)->privilege); folder_start++; k++; } } output_file: if (start < (total_folder + total_file)) { if (start < total_folder) file_start = 0; else file_start = start - total_folder; if ((total_folder+total_file) > end) file_end = end + 1; else if ((total_folder+total_file) <= end && (total_folder+total_file) >= start) file_end = total_folder+total_file; else goto output_end; if (start > folder_end) folder_end = start; for (j=folder_end; j<file_end; j++) { strcpy((file+k)->filename, (all_file+file_start)->filename); (file+k)->isfolder = 0; (file+k)->filesize = (all_file+file_start)->filesize; strcpy((file+k)->owner, (all_file+file_start)->owner); strcpy((file+k)->group, (all_file+file_start)->group); (file+k)->mt = (all_file+file_start)->mt; strcpy((file+k)->mt_str, (all_file+file_start)->mt_str); strcpy((file+k)->privilege, (all_file+file_start)->privilege); file_start++; k++; } } File_List_To_JSON(file, total_obj, total, permission, 0); output_end: if (file) __ax_free(file); if (all_file) __ax_free(all_file); if (all_folder) __ax_free(all_folder); return 0; }