summaryrefslogtreecommitdiffstats
path: root/commands/tftp.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2012-09-27 14:37:12 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2012-09-28 16:23:43 +0200
commit4183b9ab586b7aa74d6a00bbf4db13384b707bde (patch)
tree01153e63c430864d3955a59cd370619702de13da /commands/tftp.c
parent1af6fdcd03dbc311d785625bd6e2329f7ce1adb7 (diff)
downloadbarebox-4183b9ab586b7aa74d6a00bbf4db13384b707bde.tar.gz
net: Add tftp command which uses the new tftp code
Traditionally tftp is a command of its own. Since we can mount tftp as a filesystem we have duplicated the tftp code, the old code is used by the tftp command, the new by the filesystem support. This adds a tftp command based on the filesystem support to preserve backward compatibility. This allows us to remove the old tftp support in the next step. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'commands/tftp.c')
-rw-r--r--commands/tftp.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/commands/tftp.c b/commands/tftp.c
new file mode 100644
index 0000000..558b0ac
--- /dev/null
+++ b/commands/tftp.c
@@ -0,0 +1,103 @@
+/*
+ * tftp.c - (up)load tftp files
+ *
+ * Copyright (c) 2012 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+#include <common.h>
+#include <command.h>
+#include <linux/stat.h>
+#include <getopt.h>
+#include <fcntl.h>
+#include <libgen.h>
+#include <fs.h>
+#include <net.h>
+#include <libbb.h>
+
+#define TFTP_MOUNT_PATH "/.tftp_tmp_path"
+
+static int do_tftpb(int argc, char *argv[])
+{
+ char *source, *dest, *freep;
+ int opt;
+ unsigned long flags;
+ int tftp_push = 0;
+ int ret;
+ IPaddr_t ip;
+
+ while ((opt = getopt(argc, argv, "p")) > 0) {
+ switch(opt) {
+ case 'p':
+ tftp_push = 1;
+ break;
+ default:
+ return COMMAND_ERROR_USAGE;
+ }
+ }
+
+ if (argc <= optind)
+ return COMMAND_ERROR_USAGE;
+
+ source = argv[optind++];
+
+ if (argc == optind)
+ dest = basename(source);
+ else
+ dest = argv[optind];
+
+ if (tftp_push) {
+ dest = freep = asprintf("%s/%s", TFTP_MOUNT_PATH, dest);
+ flags = O_RDONLY;
+ } else {
+ source = freep = asprintf("%s/%s", TFTP_MOUNT_PATH, source);
+ flags = O_WRONLY | O_CREAT;
+ }
+
+ if (!freep)
+ return -ENOMEM;
+
+ ret = make_directory(TFTP_MOUNT_PATH);
+ if (ret)
+ goto err_free;
+
+ ip = net_get_serverip();
+ ret = mount(ip_to_string(ip), "tftp", TFTP_MOUNT_PATH);
+ if (ret)
+ goto err_rmdir;
+
+ printk("%s: %s -> %s\n", __func__, source, dest);
+
+ ret = copy_file(source, dest, 1);
+
+ umount(TFTP_MOUNT_PATH);
+
+err_rmdir:
+ rmdir(TFTP_MOUNT_PATH);
+
+err_free:
+ free(freep);
+
+ return ret;
+}
+
+BAREBOX_CMD_HELP_START(tftp)
+BAREBOX_CMD_HELP_USAGE("tftp [-p] <source> [dest]\n")
+BAREBOX_CMD_HELP_SHORT("Load a file from or upload to TFTP server.\n")
+BAREBOX_CMD_HELP_END
+
+BAREBOX_CMD_START(tftp)
+ .cmd = do_tftpb,
+ .usage = "(up-)Load file using tftp protocol",
+ BAREBOX_CMD_HELP(cmd_tftp_help)
+BAREBOX_CMD_END