main/task_http.c

changeset 80
9d2c0a85ee6e
parent 64
326c38d3681b
child 87
47253f294a9f
--- 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);
 	    }

mercurial