# HG changeset patch # User Michael Spacefalcon # Date 1393664823 0 # Node ID 0242d5facf7b6b84dcb329fbe372e1fdd45a916a # Parent 792f164b63a69a0bbec0c4154a908465cddb1e06 fc-fsio: upload-fs implemented diff -r 792f164b63a6 -r 0242d5facf7b rvinterf/etmsync/Makefile --- a/rvinterf/etmsync/Makefile Sat Mar 01 08:19:15 2014 +0000 +++ b/rvinterf/etmsync/Makefile Sat Mar 01 09:07:03 2014 +0000 @@ -4,8 +4,8 @@ INSTBIN=/usr/local/bin FSIO_OBJS= connect.o dispatch.o fdcmd.o fileio.o fsbasics.o fscmdtab.o \ - fserr.o fsiomain.o fspath.o fsread.o fswrite.o interf.o \ - launchrvif.o + fserr.o fsiomain.o fspath.o fsread.o fsupload.o fswrite.o \ + interf.o launchrvif.o all: ${PROGS} diff -r 792f164b63a6 -r 0242d5facf7b rvinterf/etmsync/fscmdtab.c --- a/rvinterf/etmsync/fscmdtab.c Sat Mar 01 08:19:15 2014 +0000 +++ b/rvinterf/etmsync/fscmdtab.c Sat Mar 01 09:07:03 2014 +0000 @@ -17,6 +17,7 @@ extern int cmd_ls(); extern int cmd_mkdir(); extern int cmd_stat(); +extern int cmd_uploadfs(); struct cmdtab cmdtab[] = { {"cpout", 2, 2, cmd_cpout}, @@ -32,5 +33,6 @@ {"ls", 1, 1, cmd_ls}, {"mkdir", 1, 1, cmd_mkdir}, {"stat", 1, 1, cmd_stat}, + {"upload-fs", 1, 1, cmd_uploadfs}, {0, 0, 0, 0} }; diff -r 792f164b63a6 -r 0242d5facf7b rvinterf/etmsync/fsupload.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/etmsync/fsupload.c Sat Mar 01 09:07:03 2014 +0000 @@ -0,0 +1,112 @@ +/* + * upload-fs implementation + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#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, ""); +}