diff options
Diffstat (limited to 'net/tftp.c')
-rw-r--r-- | net/tftp.c | 72 |
1 files changed, 71 insertions, 1 deletions
diff --git a/net/tftp.c b/net/tftp.c index 169855f2db..b9c6fddf97 100644 --- a/net/tftp.c +++ b/net/tftp.c @@ -11,6 +11,8 @@ #include <clock.h> #include <fs.h> #include <errno.h> +#include <libgen.h> +#include <fcntl.h> #include "tftp.h" #undef ET_DEBUG @@ -49,7 +51,7 @@ static int TftpState; static char *tftp_filename; -extern int net_store_fd; +static int net_store_fd; static int store_block(unsigned block, uchar * src, unsigned len) { @@ -253,3 +255,71 @@ void TftpStart(char *filename) TftpSend(); } + +static int do_tftpb (cmd_tbl_t *cmdtp, int argc, char *argv[]) +{ + int rcode = 0; + char *localfile; + char *remotefile; + + if (argc < 2) + return COMMAND_ERROR_USAGE; + + remotefile = argv[1]; + + if (argc == 2) + localfile = basename(remotefile); + else + localfile = argv[2]; + + net_store_fd = open(localfile, O_WRONLY | O_CREAT); + if (net_store_fd < 0) { + perror("open"); + return 1; + } + + if (NetLoopInit(TFTP) < 0) + goto out; + + TftpStart(remotefile); + + rcode = NetLoop(); + if (rcode < 0) { + rcode = 1; + goto out; + } + + /* NetLoop ok, update environment */ + netboot_update_env(); + +out: + close(net_store_fd); + return rcode; +} + +static const __maybe_unused char cmd_tftp_help[] = +"Usage: tftp <file> [localfile]\n" +"Load a file via network using BootP/TFTP protocol.\n"; + +BAREBOX_CMD_START(tftp) + .cmd = do_tftpb, + .usage = "Load file using tftp protocol", + BAREBOX_CMD_HELP(cmd_tftp_help) +BAREBOX_CMD_END + +/** + * @page tftp_command tftp + * + * Usage is: tftp \<filename\> [\<localfilename\>] + * + * Load a file via network using BootP/TFTP protocol. The loaded file you + * can find after download in you current ramdisk. Refer \b ls command. + * + * \<localfile> can be the local filename only, or also a device name. In the + * case of a device name, the will gets stored there. This works also for + * partitions of flash memory. Refer \b erase, \b unprotect for flash + * preparation. + * + * Note: This command is available only, if enabled in the menuconfig. + */ + |