Functions called from EFI applications should not do console output.
Refactor the wget code to implement this requirement. The wget_http_info
struct is used to hold the boolean that signifies whether the output is
allowed or not.

Signed-off-by: Jerome Forissier <jerome.foriss...@linaro.org>
Reported-by: Heinrich Schuchardt <xypron.g...@gmx.de>
---

Changes in v4:
- Patch renamed, deals with NET in addition to NET_LWIP

Changes in v3:
- New patch

 include/net-common.h     |  2 ++
 lib/efi_loader/efi_net.c |  2 +-
 net/lwip/wget.c          | 33 +++++++++++++++++++++++----------
 net/wget.c               | 23 +++++++++++++++++------
 4 files changed, 43 insertions(+), 17 deletions(-)

diff --git a/include/net-common.h b/include/net-common.h
index 30860f5975a..1043b24d0b9 100644
--- a/include/net-common.h
+++ b/include/net-common.h
@@ -555,6 +555,7 @@ enum wget_http_method {
  *                     Filled by client.
  * @hdr_cont_len:      content length according to headers. Filled by wget
  * @headers:           buffer for headers. Filled by wget.
+ * @silent:            do not print anything to the console. Filled by client.
  */
 struct wget_http_info {
        enum wget_http_method method;
@@ -565,6 +566,7 @@ struct wget_http_info {
        bool check_buffer_size;
        u32 hdr_cont_len;
        char *headers;
+       bool silent;
 };
 
 extern struct wget_http_info default_wget_info;
diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c
index b3291b4f1d5..9ff0b691ee1 100644
--- a/lib/efi_loader/efi_net.c
+++ b/lib/efi_loader/efi_net.c
@@ -51,7 +51,7 @@ static int next_dp_entry;
 static struct wget_http_info efi_wget_info = {
        .set_bootdev = false,
        .check_buffer_size = true,
-
+       .silent = true,
 };
 #endif
 
diff --git a/net/lwip/wget.c b/net/lwip/wget.c
index 2b512a1bc84..3529768eb06 100644
--- a/net/lwip/wget.c
+++ b/net/lwip/wget.c
@@ -217,7 +217,8 @@ static err_t httpc_recv_cb(void *arg, struct altcp_pcb 
*pcb, struct pbuf *pbuf,
                memcpy((void *)ctx->daddr, buf->payload, buf->len);
                ctx->daddr += buf->len;
                ctx->size += buf->len;
-               if (ctx->size - ctx->prevsize > PROGRESS_PRINT_STEP_BYTES) {
+               if (!wget_info->silent &&
+                   ctx->size - ctx->prevsize > PROGRESS_PRINT_STEP_BYTES) {
                        printf("#");
                        ctx->prevsize = ctx->size;
                }
@@ -255,11 +256,15 @@ static void httpc_result_cb(void *arg, httpc_result_t 
httpc_result,
        elapsed = get_timer(ctx->start_time);
        if (!elapsed)
                elapsed = 1;
-       if (rx_content_len > PROGRESS_PRINT_STEP_BYTES)
-               printf("\n");
-       printf("%u bytes transferred in %lu ms (", rx_content_len, elapsed);
-       print_size(rx_content_len / elapsed * 1000, "/s)\n");
-       printf("Bytes transferred = %lu (%lx hex)\n", ctx->size, ctx->size);
+       if (!wget_info->silent) {
+               if (rx_content_len > PROGRESS_PRINT_STEP_BYTES)
+                       printf("\n");
+               printf("%u bytes transferred in %lu ms (", rx_content_len,
+                      elapsed);
+               print_size(rx_content_len / elapsed * 1000, "/s)\n");
+               printf("Bytes transferred = %lu (%lx hex)\n", ctx->size,
+                      ctx->size);
+       }
        if (wget_info->set_bootdev)
                efi_set_bootdev("Http", ctx->server_name, ctx->path, 
map_sysmem(ctx->saved_daddr, 0),
                                rx_content_len);
@@ -339,7 +344,8 @@ static int _set_cacert(const void *addr, size_t sz)
        mbedtls_x509_crt_init(&crt);
        ret = mbedtls_x509_crt_parse(&crt, cacert, cacert_size);
        if (ret) {
-               printf("Could not parse certificates (%d)\n", ret);
+               if (!wget_info->silent)
+                       printf("Could not parse certificates (%d)\n", ret);
                free(cacert);
                cacert = NULL;
                cacert_size = 0;
@@ -392,6 +398,12 @@ int wget_do_request(ulong dst_addr, char *uri)
        ctx.prevsize = 0;
        ctx.start_time = 0;
 
+       if (!wget_info)
+               wget_info = &default_wget_info;
+
+       net_lwip_set_current();
+       udev = eth_get_dev();
+
        if (parse_url(uri, ctx.server_name, &ctx.port, &path, &is_https))
                return CMD_RET_USAGE;
 
@@ -421,9 +433,10 @@ int wget_do_request(ulong dst_addr, char *uri)
 
                if (cacert_auth_mode == AUTH_REQUIRED) {
                        if (!ca || !ca_sz) {
-                               printf("Error: cacert authentication mode is "
-                                      "'required' but no CA certificates "
-                                      "given\n");
+                               if (!wget_info->silent)
+                                       printf("Error: cacert authentication "
+                                              "mode is 'required' but no CA "
+                                              "certificates given\n");
                                return CMD_RET_FAILURE;
                       }
                } else if (cacert_auth_mode == AUTH_NONE) {
diff --git a/net/wget.c b/net/wget.c
index c73836cbc9d..3c0fff488eb 100644
--- a/net/wget.c
+++ b/net/wget.c
@@ -59,8 +59,10 @@ static inline int store_block(uchar *src, unsigned int 
offset, unsigned int len)
        if (CONFIG_IS_ENABLED(LMB) && wget_info->set_bootdev) {
                if (store_addr < image_load_addr ||
                    lmb_read_check(store_addr, len)) {
-                       printf("\nwget error: ");
-                       printf("trying to overwrite reserved memory...\n");
+                       if (!wget_info->silent) {
+                               printf("\nwget error: ");
+                               printf("trying to overwrite reserved memory\n");
+                       }
                        return -1;
                }
        }
@@ -76,6 +78,9 @@ static void show_block_marker(u32 packets)
 {
        int cnt;
 
+       if (wget_info->silent)
+               return;
+
        if (content_length != -1) {
                if (net_boot_file_size > content_length)
                        content_length = net_boot_file_size;
@@ -101,11 +106,15 @@ static void tcp_stream_on_closed(struct tcp_stream *tcp)
        net_set_state(wget_loop_state);
        if (wget_loop_state != NETLOOP_SUCCESS) {
                net_boot_file_size = 0;
-               printf("\nwget: Transfer Fail, TCP status - %d\n", tcp->status);
+               if (!wget_info->silent)
+                       printf("\nwget: Transfer Fail, TCP status - %d\n",
+                              tcp->status);
                return;
        }
 
-       printf("\nPackets received %d, Transfer Successful\n", tcp->rx_packets);
+       if (!wget_info->silent)
+               printf("\nPackets received %d, Transfer Successful\n",
+                      tcp->rx_packets);
        wget_info->file_size = net_boot_file_size;
        if (wget_info->method == WGET_HTTP_METHOD_GET && 
wget_info->set_bootdev) {
                efi_set_bootdev("Http", NULL, image_url,
@@ -139,7 +148,8 @@ static void tcp_stream_on_rcv_nxt_update(struct tcp_stream 
*tcp, u32 rx_bytes)
                    tcp->state == TCP_ESTABLISHED)
                        goto end;
 
-               printf("ERROR: misssed HTTP header\n");
+               if (!wget_info->silent)
+                       printf("ERROR: misssed HTTP header\n");
                tcp_stream_close(tcp);
                goto end;
        }
@@ -346,7 +356,8 @@ void wget_start(void)
        tcp_stream_set_on_create_handler(tcp_stream_on_create);
        tcp = tcp_stream_connect(web_server_ip, server_port);
        if (!tcp) {
-               printf("No free tcp streams\n");
+               if (!wget_info->silent)
+                       printf("No free tcp streams\n");
                net_set_state(NETLOOP_FAIL);
                return;
        }
-- 
2.43.0

Reply via email to