Added directory sorting for the logfiles. Sort in reverse order on the timestamp so the last files will be on top.

Sat, 06 Jun 2020 22:51:44 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sat, 06 Jun 2020 22:51:44 +0200
changeset 80
9d2c0a85ee6e
parent 79
cb5c73a8ae90
child 81
72c715ac0444

Added directory sorting for the logfiles. Sort in reverse order on the timestamp so the last files will be on top.

main/task_http.c file | annotate | diff | comparison | revisions
--- 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