Beispiel #1
0
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;
}
Beispiel #2
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;
}
Beispiel #3
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;
}
Beispiel #4
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;
}
Beispiel #5
0
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;
}