summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeoff Levand <geoffrey.levand@am.sony.com>2009-04-12 15:11:51 +0000
committerJeremy Kerr <jk@ozlabs.org>2009-06-30 15:29:18 +0800
commitf8b433640debefa2bed2ab09af6deefb32251777 (patch)
tree682a78c2e9fe9936ca818571f087d460be73bbe5
parent8ecee33a2f5fb8562c4db7fa55f50f25a57dc8f3 (diff)
downloadtalos-petitboot-f8b433640debefa2bed2ab09af6deefb32251777.tar.gz
talos-petitboot-f8b433640debefa2bed2ab09af6deefb32251777.zip
Add remote file loading routines
Create the new files loader.h and loader.c for loading remote file specifed by its URL. Signed-off-by: Geoff Levand <geoffrey.levand@am.sony.com> Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
-rw-r--r--rules.mk2
-rw-r--r--ui/common/loader.c301
-rw-r--r--ui/common/loader.h24
3 files changed, 326 insertions, 1 deletions
diff --git a/rules.mk b/rules.mk
index 1d9299d..e0f180f 100644
--- a/rules.mk
+++ b/rules.mk
@@ -44,7 +44,7 @@ discover_objs = discover/udev.o discover/discover-server.o \
discover/device-handler.o discover/paths.o discover/parser-utils.o
# client objs
-ui_common_objs = ui/common/discover-client.o ui/common/url.o
+ui_common_objs = ui/common/discover-client.o ui/common/loader.o ui/common/url.o
ncurses_objs =
twin_objs = ui/twin/pb-twin.o
diff --git a/ui/common/loader.c b/ui/common/loader.c
new file mode 100644
index 0000000..babca28
--- /dev/null
+++ b/ui/common/loader.c
@@ -0,0 +1,301 @@
+/*
+ * Copyright (C) 2009 Sony Computer Entertainment Inc.
+ * Copyright 2009 Sony Corp.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#if defined(HAVE_CONFIG_H)
+#include "config.h"
+#endif
+
+#define _GNU_SOURCE
+#include <assert.h>
+#include <stdlib.h>
+
+#include "log/log.h"
+#include <system/system.h>
+#include "talloc/talloc.h"
+#include "loader.h"
+#include "url.h"
+
+
+/**
+ * pb_local_name - Helper to create a unique local path name.
+ * @ctx: A talloc context.
+ *
+ * Returns the local file path in a talloc'ed character string on success,
+ * or NULL on error.
+ */
+
+static char *pb_local_name(void *ctx)
+{
+ char *tmp, *ret;
+
+ tmp = tempnam(NULL, "pb-");
+
+ if (!tmp)
+ return NULL;
+
+ ret = talloc_strdup(ctx, tmp);
+ free(tmp);
+
+ return ret;
+}
+
+/**
+ * pb_load_nfs - Mounts the NFS export and returns the local file path.
+ *
+ * Returns the local file path in a talloc'ed character string on success,
+ * or NULL on error.
+ */
+
+static char *pb_load_nfs(void *ctx, struct pb_url *url)
+{
+ int result;
+ const char *argv[8];
+ const char **p;
+ char *local;
+ char *opts;
+
+ local = pb_local_name(ctx);
+
+ if (!local)
+ return NULL;
+
+ result = pb_mkdir_recursive(local);
+
+ if (result)
+ goto fail;
+
+ opts = talloc_strdup(NULL, "ro,nolock,nodiratime");
+
+ if (url->port)
+ opts = talloc_asprintf_append(opts, ",port=%s", url->port);
+
+ p = argv;
+ *p++ = pb_system_apps.mount; /* 1 */
+ *p++ = "-t"; /* 2 */
+ *p++ = "nfs"; /* 3 */
+ *p++ = opts; /* 4 */
+ *p++ = url->host; /* 5 */
+ *p++ = url->dir; /* 6 */
+ *p++ = local; /* 7 */
+ *p++ = NULL; /* 8 */
+
+ result = pb_run_cmd(argv);
+
+ talloc_free(opts);
+
+ if (result)
+ goto fail;
+
+ local = talloc_asprintf_append(local, "/%s", url->path);
+ pb_log("%s: local '%s'\n", __func__, local);
+
+ return local;
+
+fail:
+ pb_rmdir_recursive("/", local);
+ talloc_free(local);
+ return NULL;
+}
+
+/**
+ * pb_load_sftp - Loads a remote file via sftp and returns the local file path.
+ *
+ * Returns the local file path in a talloc'ed character string on success,
+ * or NULL on error.
+ */
+
+static char *pb_load_sftp(void *ctx, struct pb_url __attribute__((unused)) *url)
+{
+ int result;
+ const char *argv[5];
+ const char **p;
+ char *local;
+
+ local = pb_local_name(ctx);
+
+ if (!local)
+ return NULL;
+
+ p = argv;
+ *p++ = pb_system_apps.sftp; /* 1 */
+ *p++ = url->host; /* 2 */
+ *p++ = url->path; /* 3 */
+ *p++ = local; /* 4 */
+ *p++ = NULL; /* 5 */
+
+ result = pb_run_cmd(argv);
+
+ if (result)
+ goto fail;
+
+ return local;
+
+fail:
+ talloc_free(local);
+ return NULL;
+}
+
+/**
+ * pb_load_tftp - Loads a remote file via tftp and returns the local file path.
+ *
+ * Returns the local file path in a talloc'ed character string on success,
+ * or NULL on error.
+ */
+
+static char *pb_load_tftp(void *ctx, struct pb_url *url)
+{
+ int result;
+ const char *argv[10];
+ const char **p;
+ char *local;
+
+ local = pb_local_name(ctx);
+
+ if (!local)
+ return NULL;
+
+ /* first try busybox tftp args */
+
+ p = argv;
+ *p++ = pb_system_apps.tftp; /* 1 */
+ *p++ = "-g"; /* 2 */
+ *p++ = "-l"; /* 3 */
+ *p++ = local; /* 4 */
+ *p++ = "-r"; /* 5 */
+ *p++ = url->path; /* 6 */
+ *p++ = url->host; /* 7 */
+ if (url->port)
+ *p++ = url->port; /* 8 */
+ *p++ = NULL; /* 9 */
+
+ result = pb_run_cmd(argv);
+
+ if (!result)
+ return local;
+
+ /* next try tftp-hpa args */
+
+ p = argv;
+ *p++ = pb_system_apps.tftp; /* 1 */
+ *p++ = "-m"; /* 2 */
+ *p++ = "binary"; /* 3 */
+ *p++ = url->host; /* 4 */
+ if (url->port)
+ *p++ = url->port; /* 5 */
+ *p++ = "-c"; /* 6 */
+ *p++ = "get"; /* 7 */
+ *p++ = url->path; /* 8 */
+ *p++ = local; /* 9 */
+ *p++ = NULL; /* 10 */
+
+ result = pb_run_cmd(argv);
+
+ if (!result)
+ return local;
+
+ talloc_free(local);
+ return NULL;
+}
+
+enum wget_flags {
+ wget_empty = 0,
+ wget_no_check_certificate = 1,
+};
+
+/**
+ * pb_load_wget - Loads a remote file via wget and returns the local file path.
+ *
+ * Returns the local file path in a talloc'ed character string on success,
+ * or NULL on error.
+ */
+
+static char *pb_load_wget(void *ctx, struct pb_url *url, enum wget_flags flags)
+{
+ int result;
+ const char *argv[6];
+ const char **p;
+ char *local;
+
+ local = pb_local_name(ctx);
+
+ if (!local)
+ return NULL;
+
+ p = argv;
+ *p++ = pb_system_apps.wget; /* 1 */
+ *p++ = "-O"; /* 2 */
+ *p++ = local; /* 3 */
+ *p++ = url->full; /* 4 */
+ if (flags & wget_no_check_certificate)
+ *p++ = "--no-check-certificate"; /* 5 */
+ *p++ = NULL; /* 6 */
+
+ result = pb_run_cmd(argv);
+
+ if (result)
+ goto fail;
+
+ return local;
+
+fail:
+ talloc_free(local);
+ return NULL;
+}
+
+/**
+ * pb_load_file - Loads a remote file and returns the local file path.
+ * @ctx: The talloc context to associate with the returned string.
+ *
+ * Returns the local file path in a talloc'ed character string on success,
+ * or NULL on error.
+ */
+
+char *pb_load_file(void *ctx, const char *remote)
+{
+ char *local;
+ struct pb_url *url = pb_url_parse(NULL, remote);
+
+ if (!url)
+ return NULL;
+
+ switch (url->scheme) {
+ case pb_url_ftp:
+ case pb_url_http:
+ local = pb_load_wget(ctx, url, 0);
+ break;
+ case pb_url_https:
+ local = pb_load_wget(ctx, url,
+ wget_no_check_certificate);
+ break;
+ case pb_url_nfs:
+ local = pb_load_nfs(ctx, url);
+ break;
+ case pb_url_sftp:
+ local = pb_load_sftp(ctx, url);
+ break;
+ case pb_url_tftp:
+ local = pb_load_tftp(ctx, url);
+ break;
+ default:
+ local = talloc_strdup(ctx, url->full);
+ break;
+ }
+
+ talloc_free(url);
+ return local;
+}
diff --git a/ui/common/loader.h b/ui/common/loader.h
new file mode 100644
index 0000000..b06bb43
--- /dev/null
+++ b/ui/common/loader.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2009 Sony Computer Entertainment Inc.
+ * Copyright 2009 Sony Corp.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#if !defined(_PB_FILE_LOADER_H)
+#define _PB_FILE_LOADER_H
+
+char *pb_load_file(void *ctx, const char *remote);
+
+#endif
OpenPOWER on IntegriCloud