# HG changeset patch # User Michiel Broek # Date 1591476704 -7200 # Node ID 9d2c0a85ee6e4481dc29dfd38fc5ab587276557d # Parent cb5c73a8ae90a070406925795e2055a4b926d0ec Added directory sorting for the logfiles. Sort in reverse order on the timestamp so the last files will be on top. diff -r cb5c73a8ae90 -r 9d2c0a85ee6e main/task_http.c --- a/main/task_http.c Sat Jun 06 20:20:06 2020 +0200 +++ b/main/task_http.c Sat Jun 06 22:51:44 2020 +0200 @@ -18,6 +18,89 @@ cJSON *root = NULL; cJSON *touch = NULL; +typedef struct _ls_list { + struct _ls_list *next; + char d_name[64]; + off_t size; + long mtime; +} ls_list; + + + +void tidy_lslist(ls_list **lap) +{ + ls_list *tmp, *old; + + for (tmp = *lap; tmp; tmp = old) { + old = tmp->next; + free(tmp); + } + *lap = NULL; +} + + + +void fill_list(ls_list **lap, char *name, off_t size, long mtime) +{ + ls_list **tmp; + + for (tmp = lap; *tmp; tmp = &((*tmp)->next)); + + *tmp = (ls_list *)malloc(sizeof(ls_list)); + (*tmp)->next = NULL; + strncpy((*tmp)->d_name, name, 63); + (*tmp)->size = size; + (*tmp)->mtime = mtime; + tmp = &((*tmp)->next); +} + + + +int comp(ls_list **lsp1, ls_list **lsp2) +{ + char as[20], bs[20]; + + snprintf(as, 19, "%ld", (*lsp1)->mtime); + snprintf(bs, 19, "%ld", (*lsp2)->mtime); + // Reverse order + return strcmp(bs, as); +} + + + +void sort_list(ls_list **lap) +{ + ls_list *ta, **vector; + size_t n = 0, i; + + if (*lap == NULL) + return; + + for (ta = *lap; ta; ta = ta->next) + n++; + vector = (ls_list **)malloc(n * sizeof(ls_list *)); + i = 0; + + for (ta = *lap; ta; ta = ta->next) { + vector[i++] = ta; + } + qsort(vector, n, sizeof(ls_list *), (int(*)(const void*, const void*))comp); + + (*lap) = vector[0]; + i = 1; + + for (ta = *lap; ta; ta = ta->next) { + if (i < n) + ta->next = vector[i++]; + else + ta->next = NULL; + } + + free(vector); + return; +} + + /** * @brief Debug dump buffer @@ -323,6 +406,7 @@ char url[128], *p, *mod_since = NULL; ip_addr_t remote_addr; uint16_t remote_port; + ls_list *lsx = NULL, *tmp; if (netconn_getaddr(conn, &remote_addr, &remote_port, 0) == ERR_OK) { strcpy(ipstr, ip4addr_ntoa(ip_2_ip4(&remote_addr))); @@ -368,18 +452,15 @@ char temp[64]; FILE *dest = fopen("/spiffs/w/logfiles.json", "w"); if (dest) { - fprintf(dest, "{\"Dir\":[{\"Folder\":\"/log\",\"Files\":["); DIR *dir = opendir("/sdcard/w/log"); if (dir) { struct dirent* de = readdir(dir); struct stat st; - bool comma = false; while (de) { snprintf(temp, 63, "/sdcard/w/log/"); strncat(temp, de->d_name, 63 - strlen(temp)); if (stat(temp, &st) == ESP_OK) { - fprintf(dest, "%s{\"File\":\"%s\",\"Size\":%ld,\"Date\":%ld}", (comma)?",":"", de->d_name, st.st_size, st.st_mtime); - comma = true; + fill_list(&lsx, de->d_name, st.st_size, st.st_mtime); } de = readdir(dir); vTaskDelay(5 / portTICK_PERIOD_MS); @@ -387,9 +468,18 @@ closedir(dir); } else { ESP_LOGE(TAG, "Error %d open directory /sdcard/w/log", errno); - } + } + + sort_list(&lsx); + bool comma = false; + fprintf(dest, "{\"Dir\":[{\"Folder\":\"/log\",\"Files\":["); + for (tmp = lsx; tmp; tmp = tmp->next) { + fprintf(dest, "%s{\"File\":\"%s\",\"Size\":%ld,\"Date\":%ld}", (comma)?",":"", tmp->d_name, tmp->size, tmp->mtime); + comma = true; + } fprintf(dest, "]}]}"); fclose(dest); + tidy_lslist(&lsx); } else { ESP_LOGE(TAG, "Error %d write /spiffs/w/logfiles.json", errno); }