1: /* 2: * A front-end to the mread/mwrite commands. 3: * 4: * Emmet P. Gray US Army, HQ III Corps & Fort Hood 5: * ...!uunet!uiucuxc!fthood!egray Attn: AFZF-DE-ENV 6: * fthood!egray@uxc.cso.uiuc.edu Directorate of Engineering & Housing 7: * Environmental Management Office 8: * Fort Hood, TX 76544-5057 9: */ 10: 11: #include <stdio.h> 12: #include <ctype.h> 13: #include "patchlevel.h" 14: 15: #define NONE 0 16: #define MREAD 1 17: #define MWRITE 2 18: #define MKDIR 19: 20: main(argc, argv) 21: int argc; 22: char *argv[]; 23: { 24: extern int optind; 25: extern char *optarg; 26: int i, oops, msdos_args, unix_args, destination; 27: char **nargv, **malloc(); 28: void exit(); 29: /* get command line options */ 30: msdos_args = 0; 31: unix_args = 0; 32: oops = 0; 33: while ((i = getopt(argc, argv, "tnvm")) != EOF) { 34: switch (i) { 35: case 't': 36: case 'n': 37: case 'v': 38: case 'm': 39: break; 40: default: 41: oops = 1; 42: break; 43: } 44: } 45: 46: if (oops || (argc - optind) < 2) { 47: fprintf(stderr, "Mtools version %s, dated %s\n", VERSION, DATE); 48: fprintf(stderr, "Usage: %s [-tnvm] sourcefile targetfile\n", argv[0]); 49: fprintf(stderr, " %s [-tnvm] sourcefile [sourcefiles...] targetdirectory\n", argv[0]); 50: exit(1); 51: } 52: /* last file determines the direction */ 53: if (argv[argc - 1][1] == ':') 54: destination = MWRITE; 55: else 56: destination = MREAD; 57: 58: /* count the arguments */ 59: for (i = optind; i < argc; i++) { 60: if (argv[i][1] == ':') 61: msdos_args++; 62: else 63: unix_args++; 64: } 65: 66: if (destination == MREAD && unix_args > 1) { 67: fprintf(stderr, "%s: Duplicate destination files\n", argv[0]); 68: exit(1); 69: } 70: /* chaining of mread and mwrite */ 71: if (destination == MWRITE && msdos_args > 1) 72: chain(argc, argv); 73: 74: /* 75: * Copy the *argv[] array in case your Unix doesn't end the array 76: * with a null when it passes it to main() 77: */ 78: nargv = (char **) malloc((unsigned int) (argc + 1) * sizeof(*argv)); 79: nargv[0] = "mcopy"; 80: for (i = 1; i < argc; i++) 81: nargv[i] = argv[i]; 82: nargv[argc] = NULL; 83: 84: if (destination == MWRITE) 85: execvp("mwrite", nargv); 86: else 87: execvp("mread", nargv); 88: } 89: 90: chain(argc, argv) 91: int argc; 92: char *argv[]; 93: { 94: extern int optind; 95: int i, j, pid, status; 96: char *tmpdir, *mktemp(), **nargv, **malloc(), buf[256], *strcpy(); 97: char *unixname(), *realloc(); 98: void exit(); 99: 100: nargv = (char **) malloc((unsigned int) (argc + 4) * sizeof(*argv)); 101: nargv[0] = "mread"; 102: nargv[1] = "-n"; 103: /* copy only the msdos arguments */ 104: j = 2; 105: for (i = optind; i < argc -1; i++) { 106: if (argv[i][1] == ':') 107: nargv[j++] = argv[i]; 108: } 109: /* create a temp directory */ 110: tmpdir = mktemp("/tmp/mtoolsXXXXXX"); 111: if (mkdir(tmpdir, 0777) < 0) 112: perror("mkdir"); 113: 114: nargv[j++] = tmpdir; 115: nargv[j] = NULL; 116: 117: printf("reading...\n"); 118: if (!(pid = fork())) 119: execvp("mread", nargv); 120: 121: while (wait(&status) != pid) 122: ; 123: /* reconstruct the argv[] */ 124: nargv[0] = "sh"; 125: nargv[1] = "-c"; 126: nargv[2] = (char *) malloc(7); 127: strcpy(nargv[2], "mwrite"); 128: 129: j = 3; 130: for (i = 1; i < argc -1; i++) { 131: /* 132: * Substitute the msdos arguments for their unix 133: * counterparts that have already been copied to tmpdir. 134: */ 135: if (argv[i][1] == ':') 136: sprintf(buf, "%s/%s", tmpdir, unixname(argv[i])); 137: else 138: strcpy(buf, argv[i]); 139: 140: nargv[2] = (char *) realloc(nargv[2], sizeof(nargv[2]) + sizeof(buf)); 141: strcat(nargv[2], " "); 142: strcat(nargv[2], buf); 143: } 144: /* protect last arg from expansion */ 145: sprintf(buf, "'%s'", argv[i]); 146: nargv[2] = (char *) realloc(nargv[2], sizeof(nargv[2]) + sizeof(buf)); 147: strcat(nargv[2], " "); 148: strcat(nargv[2], buf); 149: 150: nargv[3] = NULL; 151: 152: printf("writing...\n"); 153: if (!(pid = fork())) 154: execvp("sh", nargv); 155: 156: while (wait(&status) != pid) 157: ; 158: /* clobber the directory */ 159: sprintf(buf, "rm -fr %s", tmpdir); 160: system(buf); 161: exit(0); 162: } 163: 164: char * 165: unixname(filename) 166: char *filename; 167: { 168: char *s, *temp, *strcpy(), *strrchr(), buf[256]; 169: static char ans[13]; 170: 171: strcpy(buf, filename); 172: temp = buf; 173: /* skip drive letter */ 174: if (buf[0] && buf[1] == ':') 175: temp = &buf[2]; 176: /* find the last separator */ 177: if (s = strrchr(temp, '/')) 178: temp = s + 1; 179: if (s = strrchr(temp, '\\')) 180: temp = s + 1; 181: /* xlate to lower case */ 182: for (s = temp; *s; ++s) { 183: if (isupper(*s)) 184: *s = tolower(*s); 185: } 186: 187: strcpy(ans, temp); 188: return(ans); 189: } 190: 191: #ifdef MKDIR 192: mkdir(path, mode) 193: char *path; 194: int mode; 195: { 196: char buf[256]; 197: sprintf(buf, "mkdir %s", path); 198: return(system(buf)); 199: } 200: #endif /* MKDIR */