diff --git a/contrib/examples/example_app/lwipcfg.h.example b/contrib/examples/example_app/lwipcfg.h.example index 5bbf2fe9..a7517130 100644 --- a/contrib/examples/example_app/lwipcfg.h.example +++ b/contrib/examples/example_app/lwipcfg.h.example @@ -66,6 +66,7 @@ * otherwise the raw api server will be used. */ /*#define LWIP_TCPECHO_APP_NETCONN */ #define LWIP_TFTP_APP 0 +#define LWIP_TFTP_CLIENT_APP 0 #define LWIP_UDPECHO_APP 0 #define LWIP_LWIPERF_APP 0 diff --git a/contrib/examples/example_app/lwipcfg.h.travis b/contrib/examples/example_app/lwipcfg.h.travis index 46c9d0f7..496342d8 100644 --- a/contrib/examples/example_app/lwipcfg.h.travis +++ b/contrib/examples/example_app/lwipcfg.h.travis @@ -62,6 +62,7 @@ * otherwise the raw api server will be used. */ /*#define LWIP_TCPECHO_APP_NETCONN */ #define LWIP_TFTP_APP 1 +#define LWIP_TFTP_CLIENT_APP 1 #define LWIP_UDPECHO_APP 1 #define LWIP_LWIPERF_APP 1 diff --git a/contrib/examples/example_app/test.c b/contrib/examples/example_app/test.c index ce34bdd2..49af3758 100644 --- a/contrib/examples/example_app/test.c +++ b/contrib/examples/example_app/test.c @@ -576,7 +576,10 @@ apps_init(void) sntp_example_init(); #endif #if LWIP_TFTP_APP - tftp_example_init(); + tftp_example_init_server(); +#endif +#if LWIP_TFTP_CLIENT_APP + tftp_example_init_client(); #endif #if LWIP_LWIPERF_APP lwiperf_example_init(); diff --git a/contrib/examples/tftp/tftp_example.c b/contrib/examples/tftp/tftp_example.c index 71f2b8d0..3e140146 100644 --- a/contrib/examples/tftp/tftp_example.c +++ b/contrib/examples/tftp/tftp_example.c @@ -29,6 +29,7 @@ #include +#include "lwip/apps/tftp_client.h" #include "lwip/apps/tftp_server.h" #include "tftp_example.h" @@ -36,16 +37,43 @@ #if LWIP_UDP +/* Define a base directory for TFTP access + * ATTENTION: This code does NOT check for sandboxing, + * i.e. '..' in paths is not checked! */ +#ifndef LWIP_TFTP_EXAMPLE_BASE_DIR +#define LWIP_TFTP_EXAMPLE_BASE_DIR "" +#endif + +/* Define this to a file to get via tftp client */ +#ifndef LWIP_TFTP_EXAMPLE_CLIENT_FILENAME +#define LWIP_TFTP_EXAMPLE_CLIENT_FILENAME "test.bin" +#endif + +/* Define this to a server IP string */ +#ifndef LWIP_TFTP_EXAMPLE_CLIENT_REMOTEIP +#define LWIP_TFTP_EXAMPLE_CLIENT_REMOTEIP "192.168.0.1" +#endif + +static char full_filename[256]; + +static void * +tftp_open_file(const char* fname, u8_t is_write) +{ + snprintf(full_filename, sizeof(full_filename), "%s%s", LWIP_TFTP_EXAMPLE_BASE_DIR, fname); + full_filename[sizeof(full_filename)-1] = 0; + + if (is_write) { + return (void*)fopen(full_filename, "wb"); + } else { + return (void*)fopen(full_filename, "rb"); + } +} + static void* tftp_open(const char* fname, const char* mode, u8_t is_write) { LWIP_UNUSED_ARG(mode); - - if (is_write) { - return (void*)fopen(fname, "wb"); - } else { - return (void*)fopen(fname, "rb"); - } + return tftp_open_file(fname, is_write); } static void @@ -100,9 +128,28 @@ static const struct tftp_context tftp = { }; void -tftp_example_init(void) +tftp_example_init_server(void) { tftp_init_server(&tftp); } +void +tftp_example_init_client(void) +{ + void *f; + err_t err; + ip_addr_t srv; + int ret = ipaddr_aton(LWIP_TFTP_EXAMPLE_CLIENT_REMOTEIP, &srv); + LWIP_ASSERT("ipaddr_aton failed", ret == 1); + + err = tftp_init_client(&tftp); + LWIP_ASSERT("tftp_init_client failed", err == ERR_OK); + + f = tftp_open_file(LWIP_TFTP_EXAMPLE_CLIENT_FILENAME, 1); + LWIP_ASSERT("failed to create file", f != NULL); + + err = tftp_get(f, &srv, TFTP_PORT, LWIP_TFTP_EXAMPLE_CLIENT_FILENAME, TFTP_MODE_OCTET); + LWIP_ASSERT("tftp_get failed", err == ERR_OK); +} + #endif /* LWIP_UDP */ diff --git a/contrib/examples/tftp/tftp_example.h b/contrib/examples/tftp/tftp_example.h index 12b13d13..73407004 100644 --- a/contrib/examples/tftp/tftp_example.h +++ b/contrib/examples/tftp/tftp_example.h @@ -18,7 +18,8 @@ extern "C" { #endif -void tftp_example_init(void); +void tftp_example_init_server(void); +void tftp_example_init_client(void); #ifdef __cplusplus }