Jelajahi Sumber

ftp: runtime error reporting to the web interface

Sergey Alirzaev 4 tahun lalu
induk
melakukan
6be8db2a2e
3 mengubah file dengan 23 tambahan dan 17 penghapusan
  1. 6 4
      modules/HTTP_Server/http_server.c
  2. 15 11
      modules/ftp.c
  3. 2 2
      modules/ftp.h

+ 6 - 4
modules/HTTP_Server/http_server.c

@@ -1432,8 +1432,10 @@ static char *HTTP_FTPFWUpdate(uint32_t reqNum, char *bufIn, char *bufOut, uint16
     }
 
     HTTP_SaveSettings();
-    char *error = start_ftp_client(&ftpcfg);
-    *lenBufOut = sprintf(bufOut, "HTTP/1.1 200 OK\r\nContent-Type:text/plain\r\n\r\n%s", error);
+    start_ftp_client(&ftpcfg);
+
+    strcpy(bufOut, HTTP_200_OK);
+    *lenBufOut = strlen(bufOut);
     return bufOut;
 }
 
@@ -1442,8 +1444,8 @@ static char *HTTP_FTPFWState(uint32_t reqNum, char *bufIn, char *bufOut, uint16_
     (void)bufIn;
     (void)lenBufIn;
     (void)reqNum;
-    unsigned percentage = get_ftp_progress();
-    *lenBufOut = sprintf(bufOut, "HTTP/1.1 200 OK\r\nContent-Type:text/plain\r\n\r\n%u", percentage);
+    char *progress = get_ftp_progress();
+    *lenBufOut = sprintf(bufOut, "HTTP/1.1 200 OK\r\nContent-Type:text/plain\r\n\r\n%s", progress);
     return bufOut;
 }
 #endif // HARDWARE_BT6711

+ 15 - 11
modules/ftp.c

@@ -59,6 +59,7 @@
 #define min(x,y) ((x)<(y)?(x):(y))
 
 static unsigned received_bytes_count = 0;
+static char **error_ptr;
 
 /** Close control or data pcb
  * @param pointer to lwftp session data
@@ -117,8 +118,6 @@ static err_t lwftp_data_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, er
   (void)err;
   lwftp_session_t *s = (lwftp_session_t*)arg;
   if (p) {
-    // notify the web interface that we can proceed
-    s->error = "1";
     if (s->data_sink) {
       struct pbuf *q;
       for (q=p; q; q=q->next) {
@@ -352,7 +351,7 @@ anonymous:
           s->control_state = LWFTP_XFERING;
         } else if (response==550) {
             s->control_state = LWFTP_QUIT;
-            s->error = "Failed to open file"
+            s->error = "Failed to open file";
             LWIP_DEBUGF(LWFTP_WARNING, ("lwftp: %s '%s'\n", error, s->settings->remote_path));
         }
         else {
@@ -470,6 +469,7 @@ static void lwftp_control_err(void *arg, err_t err)
       LWIP_DEBUGF(LWFTP_WARNING, ("lwftp: %s (%s)\n",lwip_strerr(err)));
       result = LWFTP_RESULT_ERR_CONNECT;
     } else {
+      s->error = "connection closed by remote host";
       LWIP_DEBUGF(LWFTP_WARNING, ("lwftp:connection closed by remote host\n"));
       result = LWFTP_RESULT_ERR_CLOSED;
     }
@@ -683,23 +683,27 @@ static unsigned data_sink(void *arg, const char* ptr, unsigned len)
   return len;
 }
 
-char *start_ftp_client(lwftp_session_t *s)
+void start_ftp_client(lwftp_session_t *s)
 {
   received_bytes_count = 0;
+  s->error = NULL;
+  error_ptr = &s->error;
   s->data_sink = data_sink;
   //s->done_fn = ftp_retr_callback;
   lwftp_retr(s);
   // FTP session will continue with the connection callback
-  //// wait for the client to connect to the server and check whether the file exists
-  //while (s->error == NULL) {
-  //  vTaskDelay(200);
-  //}
-  return "1";
 }
 
-uint32_t get_ftp_progress()
+char *get_ftp_progress()
 {
-  return received_bytes_count * 100 / MAIN_FW_SIZE;
+  if (*error_ptr) {
+    return *error_ptr;
+  } else {
+    unsigned progress = received_bytes_count * 100 / MAIN_FW_SIZE;
+    static char progress_str_buf[4];
+    snprintf(progress_str_buf, sizeof(progress_str_buf), "%u", progress);
+    return progress_str_buf;
+  }
 }
 
 #endif // !BT6702_SERVICE

+ 2 - 2
modules/ftp.h

@@ -82,7 +82,7 @@ typedef struct {
 
 // LWFTP API
 err_t lwftp_store(lwftp_session_t *s);
-char *start_ftp_client(lwftp_session_t *s);
-uint32_t get_ftp_progress(void);
+void start_ftp_client(lwftp_session_t *s);
+char *get_ftp_progress(void);
 
 #endif