main/task_http.c

changeset 80
9d2c0a85ee6e
parent 64
326c38d3681b
child 87
47253f294a9f
equal deleted inserted replaced
79:cb5c73a8ae90 80:9d2c0a85ee6e
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);

mercurial