diff rvinterf/etmsync/fsupload.c @ 0:e7502631a0f9

initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 11 Jun 2016 00:13:35 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/etmsync/fsupload.c	Sat Jun 11 00:13:35 2016 +0000
@@ -0,0 +1,146 @@
+/*
+ * upload-fs implementation
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include "etm.h"
+#include "ffs.h"
+#include "ffserr.h"
+#include "tmffs2.h"
+#include "limits.h"
+#include "ffslimits.h"
+#include "localtypes.h"
+#include "localstruct.h"
+#include "exitcodes.h"
+
+uploadfs_level(srcpath, depth, prefix)
+	char *srcpath, *prefix;
+{
+	char ffs_childpath[MAX_FULL_PATHNAME+1], *ffs_childp;
+	DIR *rdd;
+	struct dirent *dirent;
+	char hostpath_child[MAXPATHLEN];
+	struct stat hst;
+	int rc;
+
+	strcpy(ffs_childpath, prefix);
+	ffs_childp = index(ffs_childpath, '\0');
+	*ffs_childp++ = '/';
+	rdd = opendir(srcpath);
+	if (!rdd) {
+		perror(srcpath);
+		return(ERROR_UNIX);
+	}
+	while (dirent = readdir(rdd)) {
+		if (dirent->d_name[0] == '.')
+			continue;
+		if (strlen(dirent->d_name) > MAX_FN_COMPONENT) {
+			fprintf(stderr,
+		"error: \"%s\" in %s exceeds the FFS component name limit\n",
+				dirent->d_name, srcpath);
+			closedir(rdd);
+			return(ERROR_USAGE);
+		}
+		if (strlen(srcpath) + strlen(dirent->d_name) + 2 >
+		    sizeof hostpath_child) {
+			fprintf(stderr,
+				"error: host side pathname buffer overflow\n");
+			closedir(rdd);
+			return(ERROR_UNIX);
+		}
+		sprintf(hostpath_child, "%s/%s", srcpath, dirent->d_name);
+		if (lstat(hostpath_child, &hst) < 0) {
+			perror(hostpath_child);
+			closedir(rdd);
+			return(ERROR_UNIX);
+		}
+		strcpy(ffs_childp, dirent->d_name);
+		switch (hst.st_mode & S_IFMT) {
+		case S_IFREG:
+			printf("uploading %s\n", ffs_childpath);
+			rc = fwrite_from_file(ffs_childpath, hostpath_child);
+			if (rc) {
+				closedir(rdd);
+				return(rc);
+			}
+			break;
+		case S_IFDIR:
+			if (depth >= MAX_NAME_DEPTH-1) {
+				fprintf(stderr,
+				"error: directory nesting too deep at %s\n",
+					hostpath_child);
+				closedir(rdd);
+				return(ERROR_USAGE);
+			}
+			printf("mkdir %s\n", ffs_childpath);
+			rc = do_mkdir_existok(ffs_childpath);
+			if (rc) {
+				closedir(rdd);
+				return(rc);
+			}
+			rc = uploadfs_level(hostpath_child, depth + 1,
+						ffs_childpath);
+			if (rc) {
+				closedir(rdd);
+				return(rc);
+			}
+			break;
+		default:
+			fprintf(stderr,
+			"error: %s is neither a regular file nor a directory\n",
+				hostpath_child);
+			closedir(rdd);
+			return(ERROR_USAGE);
+		}
+	}
+	closedir(rdd);
+	return(0);
+}
+
+cmd_uploadfs(argc, argv)
+	char **argv;
+{
+	return uploadfs_level(argv[1], 0, "");
+}
+
+cmd_upload_file(argc, argv)
+	char **argv;
+{
+	if (strlen(argv[2]) >= TMFFS_STRING_SIZE) {
+		fprintf(stderr,
+			"error: pathname arg exceeds string length limit\n");
+		return(ERROR_USAGE);
+	}
+	return fwrite_from_file(argv[2], argv[1]);
+}
+
+cmd_upload_subtree(argc, argv)
+	char **argv;
+{
+	int rc, depth;
+
+	depth = validate_ffs_pathname(argv[2]);
+	if (depth < 0)
+		return(ERROR_USAGE);	/* error msg already printed */
+	if (depth == 0) {
+		fprintf(stderr, "please use upload-fs command instead\n");
+		return(ERROR_USAGE);
+	}
+	if (depth >= MAX_NAME_DEPTH) {
+		fprintf(stderr, "cannot upload into max-depth directory\n");
+		return(ERROR_USAGE);
+	}
+	printf("mkdir %s\n", argv[2]);
+	rc = do_mkdir_existok(argv[2]);
+	if (rc)
+		return(rc);
+	return uploadfs_level(argv[1], depth, argv[2]);
+}