15 static TaskHandle_t xTaskHTTP = NULL; |
15 static TaskHandle_t xTaskHTTP = NULL; |
16 static TaskHandle_t xTaskQueue = NULL; |
16 static TaskHandle_t xTaskQueue = NULL; |
17 |
17 |
18 cJSON *root = NULL; |
18 cJSON *root = NULL; |
19 cJSON *touch = NULL; |
19 cJSON *touch = NULL; |
|
20 |
|
21 typedef struct _ls_list { |
|
22 struct _ls_list *next; |
|
23 char d_name[64]; |
|
24 off_t size; |
|
25 long mtime; |
|
26 } ls_list; |
|
27 |
|
28 |
|
29 |
|
30 void tidy_lslist(ls_list **lap) |
|
31 { |
|
32 ls_list *tmp, *old; |
|
33 |
|
34 for (tmp = *lap; tmp; tmp = old) { |
|
35 old = tmp->next; |
|
36 free(tmp); |
|
37 } |
|
38 *lap = NULL; |
|
39 } |
|
40 |
|
41 |
|
42 |
|
43 void fill_list(ls_list **lap, char *name, off_t size, long mtime) |
|
44 { |
|
45 ls_list **tmp; |
|
46 |
|
47 for (tmp = lap; *tmp; tmp = &((*tmp)->next)); |
|
48 |
|
49 *tmp = (ls_list *)malloc(sizeof(ls_list)); |
|
50 (*tmp)->next = NULL; |
|
51 strncpy((*tmp)->d_name, name, 63); |
|
52 (*tmp)->size = size; |
|
53 (*tmp)->mtime = mtime; |
|
54 tmp = &((*tmp)->next); |
|
55 } |
|
56 |
|
57 |
|
58 |
|
59 int comp(ls_list **lsp1, ls_list **lsp2) |
|
60 { |
|
61 char as[20], bs[20]; |
|
62 |
|
63 snprintf(as, 19, "%ld", (*lsp1)->mtime); |
|
64 snprintf(bs, 19, "%ld", (*lsp2)->mtime); |
|
65 // Reverse order |
|
66 return strcmp(bs, as); |
|
67 } |
|
68 |
|
69 |
|
70 |
|
71 void sort_list(ls_list **lap) |
|
72 { |
|
73 ls_list *ta, **vector; |
|
74 size_t n = 0, i; |
|
75 |
|
76 if (*lap == NULL) |
|
77 return; |
|
78 |
|
79 for (ta = *lap; ta; ta = ta->next) |
|
80 n++; |
|
81 vector = (ls_list **)malloc(n * sizeof(ls_list *)); |
|
82 i = 0; |
|
83 |
|
84 for (ta = *lap; ta; ta = ta->next) { |
|
85 vector[i++] = ta; |
|
86 } |
|
87 qsort(vector, n, sizeof(ls_list *), (int(*)(const void*, const void*))comp); |
|
88 |
|
89 (*lap) = vector[0]; |
|
90 i = 1; |
|
91 |
|
92 for (ta = *lap; ta; ta = ta->next) { |
|
93 if (i < n) |
|
94 ta->next = vector[i++]; |
|
95 else |
|
96 ta->next = NULL; |
|
97 } |
|
98 |
|
99 free(vector); |
|
100 return; |
|
101 } |
|
102 |
20 |
103 |
21 |
104 |
22 /** |
105 /** |
23 * @brief Debug dump buffer |
106 * @brief Debug dump buffer |
24 * @param buf The buffer |
107 * @param buf The buffer |
321 static uint16_t buflen; |
404 static uint16_t buflen; |
322 static err_t err; |
405 static err_t err; |
323 char url[128], *p, *mod_since = NULL; |
406 char url[128], *p, *mod_since = NULL; |
324 ip_addr_t remote_addr; |
407 ip_addr_t remote_addr; |
325 uint16_t remote_port; |
408 uint16_t remote_port; |
|
409 ls_list *lsx = NULL, *tmp; |
326 |
410 |
327 if (netconn_getaddr(conn, &remote_addr, &remote_port, 0) == ERR_OK) { |
411 if (netconn_getaddr(conn, &remote_addr, &remote_port, 0) == ERR_OK) { |
328 strcpy(ipstr, ip4addr_ntoa(ip_2_ip4(&remote_addr))); |
412 strcpy(ipstr, ip4addr_ntoa(ip_2_ip4(&remote_addr))); |
329 } else { |
413 } else { |
330 ipstr[0] = '\0'; |
414 ipstr[0] = '\0'; |
366 |
450 |
367 if (strstr(buf, "GET /logfiles.json")) { |
451 if (strstr(buf, "GET /logfiles.json")) { |
368 char temp[64]; |
452 char temp[64]; |
369 FILE *dest = fopen("/spiffs/w/logfiles.json", "w"); |
453 FILE *dest = fopen("/spiffs/w/logfiles.json", "w"); |
370 if (dest) { |
454 if (dest) { |
371 fprintf(dest, "{\"Dir\":[{\"Folder\":\"/log\",\"Files\":["); |
|
372 DIR *dir = opendir("/sdcard/w/log"); |
455 DIR *dir = opendir("/sdcard/w/log"); |
373 if (dir) { |
456 if (dir) { |
374 struct dirent* de = readdir(dir); |
457 struct dirent* de = readdir(dir); |
375 struct stat st; |
458 struct stat st; |
376 bool comma = false; |
|
377 while (de) { |
459 while (de) { |
378 snprintf(temp, 63, "/sdcard/w/log/"); |
460 snprintf(temp, 63, "/sdcard/w/log/"); |
379 strncat(temp, de->d_name, 63 - strlen(temp)); |
461 strncat(temp, de->d_name, 63 - strlen(temp)); |
380 if (stat(temp, &st) == ESP_OK) { |
462 if (stat(temp, &st) == ESP_OK) { |
381 fprintf(dest, "%s{\"File\":\"%s\",\"Size\":%ld,\"Date\":%ld}", (comma)?",":"", de->d_name, st.st_size, st.st_mtime); |
463 fill_list(&lsx, de->d_name, st.st_size, st.st_mtime); |
382 comma = true; |
|
383 } |
464 } |
384 de = readdir(dir); |
465 de = readdir(dir); |
385 vTaskDelay(5 / portTICK_PERIOD_MS); |
466 vTaskDelay(5 / portTICK_PERIOD_MS); |
386 } |
467 } |
387 closedir(dir); |
468 closedir(dir); |
388 } else { |
469 } else { |
389 ESP_LOGE(TAG, "Error %d open directory /sdcard/w/log", errno); |
470 ESP_LOGE(TAG, "Error %d open directory /sdcard/w/log", errno); |
390 } |
471 } |
|
472 |
|
473 sort_list(&lsx); |
|
474 bool comma = false; |
|
475 fprintf(dest, "{\"Dir\":[{\"Folder\":\"/log\",\"Files\":["); |
|
476 for (tmp = lsx; tmp; tmp = tmp->next) { |
|
477 fprintf(dest, "%s{\"File\":\"%s\",\"Size\":%ld,\"Date\":%ld}", (comma)?",":"", tmp->d_name, tmp->size, tmp->mtime); |
|
478 comma = true; |
|
479 } |
391 fprintf(dest, "]}]}"); |
480 fprintf(dest, "]}]}"); |
392 fclose(dest); |
481 fclose(dest); |
|
482 tidy_lslist(&lsx); |
393 } else { |
483 } else { |
394 ESP_LOGE(TAG, "Error %d write /spiffs/w/logfiles.json", errno); |
484 ESP_LOGE(TAG, "Error %d write /spiffs/w/logfiles.json", errno); |
395 } |
485 } |
396 http_sendfile(conn, (char *)"/logfiles.json", NULL, ipstr); |
486 http_sendfile(conn, (char *)"/logfiles.json", NULL, ipstr); |
397 netconn_close(conn); |
487 netconn_close(conn); |