FreeCalypso > hg > freecalypso-tools
comparison 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 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:e7502631a0f9 |
|---|---|
| 1 /* | |
| 2 * upload-fs implementation | |
| 3 */ | |
| 4 | |
| 5 #include <sys/types.h> | |
| 6 #include <sys/param.h> | |
| 7 #include <sys/stat.h> | |
| 8 #include <dirent.h> | |
| 9 #include <ctype.h> | |
| 10 #include <stdio.h> | |
| 11 #include <stdlib.h> | |
| 12 #include <string.h> | |
| 13 #include <strings.h> | |
| 14 #include "etm.h" | |
| 15 #include "ffs.h" | |
| 16 #include "ffserr.h" | |
| 17 #include "tmffs2.h" | |
| 18 #include "limits.h" | |
| 19 #include "ffslimits.h" | |
| 20 #include "localtypes.h" | |
| 21 #include "localstruct.h" | |
| 22 #include "exitcodes.h" | |
| 23 | |
| 24 uploadfs_level(srcpath, depth, prefix) | |
| 25 char *srcpath, *prefix; | |
| 26 { | |
| 27 char ffs_childpath[MAX_FULL_PATHNAME+1], *ffs_childp; | |
| 28 DIR *rdd; | |
| 29 struct dirent *dirent; | |
| 30 char hostpath_child[MAXPATHLEN]; | |
| 31 struct stat hst; | |
| 32 int rc; | |
| 33 | |
| 34 strcpy(ffs_childpath, prefix); | |
| 35 ffs_childp = index(ffs_childpath, '\0'); | |
| 36 *ffs_childp++ = '/'; | |
| 37 rdd = opendir(srcpath); | |
| 38 if (!rdd) { | |
| 39 perror(srcpath); | |
| 40 return(ERROR_UNIX); | |
| 41 } | |
| 42 while (dirent = readdir(rdd)) { | |
| 43 if (dirent->d_name[0] == '.') | |
| 44 continue; | |
| 45 if (strlen(dirent->d_name) > MAX_FN_COMPONENT) { | |
| 46 fprintf(stderr, | |
| 47 "error: \"%s\" in %s exceeds the FFS component name limit\n", | |
| 48 dirent->d_name, srcpath); | |
| 49 closedir(rdd); | |
| 50 return(ERROR_USAGE); | |
| 51 } | |
| 52 if (strlen(srcpath) + strlen(dirent->d_name) + 2 > | |
| 53 sizeof hostpath_child) { | |
| 54 fprintf(stderr, | |
| 55 "error: host side pathname buffer overflow\n"); | |
| 56 closedir(rdd); | |
| 57 return(ERROR_UNIX); | |
| 58 } | |
| 59 sprintf(hostpath_child, "%s/%s", srcpath, dirent->d_name); | |
| 60 if (lstat(hostpath_child, &hst) < 0) { | |
| 61 perror(hostpath_child); | |
| 62 closedir(rdd); | |
| 63 return(ERROR_UNIX); | |
| 64 } | |
| 65 strcpy(ffs_childp, dirent->d_name); | |
| 66 switch (hst.st_mode & S_IFMT) { | |
| 67 case S_IFREG: | |
| 68 printf("uploading %s\n", ffs_childpath); | |
| 69 rc = fwrite_from_file(ffs_childpath, hostpath_child); | |
| 70 if (rc) { | |
| 71 closedir(rdd); | |
| 72 return(rc); | |
| 73 } | |
| 74 break; | |
| 75 case S_IFDIR: | |
| 76 if (depth >= MAX_NAME_DEPTH-1) { | |
| 77 fprintf(stderr, | |
| 78 "error: directory nesting too deep at %s\n", | |
| 79 hostpath_child); | |
| 80 closedir(rdd); | |
| 81 return(ERROR_USAGE); | |
| 82 } | |
| 83 printf("mkdir %s\n", ffs_childpath); | |
| 84 rc = do_mkdir_existok(ffs_childpath); | |
| 85 if (rc) { | |
| 86 closedir(rdd); | |
| 87 return(rc); | |
| 88 } | |
| 89 rc = uploadfs_level(hostpath_child, depth + 1, | |
| 90 ffs_childpath); | |
| 91 if (rc) { | |
| 92 closedir(rdd); | |
| 93 return(rc); | |
| 94 } | |
| 95 break; | |
| 96 default: | |
| 97 fprintf(stderr, | |
| 98 "error: %s is neither a regular file nor a directory\n", | |
| 99 hostpath_child); | |
| 100 closedir(rdd); | |
| 101 return(ERROR_USAGE); | |
| 102 } | |
| 103 } | |
| 104 closedir(rdd); | |
| 105 return(0); | |
| 106 } | |
| 107 | |
| 108 cmd_uploadfs(argc, argv) | |
| 109 char **argv; | |
| 110 { | |
| 111 return uploadfs_level(argv[1], 0, ""); | |
| 112 } | |
| 113 | |
| 114 cmd_upload_file(argc, argv) | |
| 115 char **argv; | |
| 116 { | |
| 117 if (strlen(argv[2]) >= TMFFS_STRING_SIZE) { | |
| 118 fprintf(stderr, | |
| 119 "error: pathname arg exceeds string length limit\n"); | |
| 120 return(ERROR_USAGE); | |
| 121 } | |
| 122 return fwrite_from_file(argv[2], argv[1]); | |
| 123 } | |
| 124 | |
| 125 cmd_upload_subtree(argc, argv) | |
| 126 char **argv; | |
| 127 { | |
| 128 int rc, depth; | |
| 129 | |
| 130 depth = validate_ffs_pathname(argv[2]); | |
| 131 if (depth < 0) | |
| 132 return(ERROR_USAGE); /* error msg already printed */ | |
| 133 if (depth == 0) { | |
| 134 fprintf(stderr, "please use upload-fs command instead\n"); | |
| 135 return(ERROR_USAGE); | |
| 136 } | |
| 137 if (depth >= MAX_NAME_DEPTH) { | |
| 138 fprintf(stderr, "cannot upload into max-depth directory\n"); | |
| 139 return(ERROR_USAGE); | |
| 140 } | |
| 141 printf("mkdir %s\n", argv[2]); | |
| 142 rc = do_mkdir_existok(argv[2]); | |
| 143 if (rc) | |
| 144 return(rc); | |
| 145 return uploadfs_level(argv[1], depth, argv[2]); | |
| 146 } |
