113695Ssam #ifndef lint 2*25967Sbloom static char sccsid[] = "@(#)uux.c 5.6 (Berkeley) 01/24/86"; 313695Ssam #endif 413695Ssam 513695Ssam #include "uucp.h" 613695Ssam 713695Ssam #define NOSYSPART 0 813695Ssam #define HASSYSPART 1 913695Ssam 1025146Sbloom #define LQUOTE '(' 1125146Sbloom #define RQUOTE ')' 1225146Sbloom 1313695Ssam #define APPCMD(d) {\ 14*25967Sbloom register char *p; for (p = d; *p != '\0';)\ 15*25967Sbloom {*cmdp++ = *p++;\ 16*25967Sbloom if(cmdp>(sizeof(cmd)+&cmd[0])){\ 17*25967Sbloom fprintf(stderr,"argument list too long\n");\ 18*25967Sbloom cleanup(EX_SOFTWARE);\ 19*25967Sbloom }\ 20*25967Sbloom }\ 21*25967Sbloom *cmdp++ = ' '; *cmdp = '\0';} 2213695Ssam 2313695Ssam #define GENSEND(f, a, b, c, d, e) {\ 24*25967Sbloom fprintf(f, "S %s %s %s -%s %s 0666\n", a, b, c, d, e); } 2517845Sralph #define GENRCV(f, a, b, c) {fprintf(f, "R %s %s %s - \n", a, b, c);} 2613695Ssam 2725146Sbloom struct timeb Now; 2825146Sbloom 2913695Ssam main(argc, argv) 3013695Ssam char *argv[]; 3113695Ssam { 3213695Ssam char cfile[NAMESIZE]; /* send commands for files from here */ 3313695Ssam char dfile[NAMESIZE]; /* used for all data files from here */ 3413695Ssam char rxfile[NAMESIZE]; /* to be sent to xqt file (X. ...) */ 3513695Ssam char tfile[NAMESIZE]; /* temporary file name */ 3613695Ssam char tcfile[NAMESIZE]; /* temporary file name */ 3713695Ssam char t2file[NAMESIZE]; /* temporary file name */ 3813695Ssam int cflag = 0; /* commands in C. file flag */ 3913695Ssam int rflag = 0; /* C. files for receiving flag */ 4017845Sralph #ifdef DONTCOPY 4117845Sralph int Copy = 0; /* Don't Copy spool files */ 4217845Sralph #else !DONTCOPY 4313695Ssam int Copy = 1; /* Copy spool files */ 4417845Sralph #endif !DONTCOPY 4517845Sralph int Linkit = 0; /* Try link before copy */ 46*25967Sbloom char buf[2*BUFSIZ]; 47*25967Sbloom char inargs[2*BUFSIZ]; 4813695Ssam int pipein = 0; 4913695Ssam int startjob = 1; 5013695Ssam char Grade = 'A'; 5113695Ssam char path[MAXFULLNAME]; 52*25967Sbloom char cmd[2*BUFSIZ]; 5313695Ssam char *ap, *cmdp; 54*25967Sbloom char prm[2*BUFSIZ]; 5523691Sbloom char syspart[MAXBASENAME+1], rest[MAXFULLNAME]; 5623691Sbloom char Xsys[MAXBASENAME+1], local[MAXBASENAME+1]; 5718627Sralph char *xsys = Xsys; 5813695Ssam FILE *fprx, *fpc, *fpd, *fp; 5913695Ssam extern char *getprm(), *lastpart(); 6013695Ssam extern FILE *ufopen(); 6113695Ssam int uid, ret; 6213695Ssam char redir = '\0'; 6313695Ssam int nonoti = 0; 6413695Ssam int nonzero = 0; 6517845Sralph int link_failed; 6617845Sralph char *ReturnTo = NULL; 6717845Sralph extern int LocalOnly; 6813695Ssam 6913695Ssam strcpy(Progname, "uux"); 7013695Ssam uucpname(Myname); 7113695Ssam umask(WFMASK); 7213695Ssam Ofn = 1; 7313695Ssam Ifn = 0; 7417845Sralph #ifdef VMS 7517845Sralph arg_fix(argc, argv); 7617845Sralph #endif 7713695Ssam while (argc>1 && argv[1][0] == '-') { 7813695Ssam switch(argv[1][1]){ 7913695Ssam case 'p': 8013695Ssam case '\0': 8113695Ssam pipein = 1; 8213695Ssam break; 8313695Ssam case 'r': 8413695Ssam startjob = 0; 8513695Ssam break; 8613695Ssam case 'c': 8717845Sralph Copy = 0; 8817845Sralph Linkit = 0; 8917845Sralph break; 9013695Ssam case 'l': 9113695Ssam Copy = 0; 9217845Sralph Linkit = 1; 9313695Ssam break; 9417845Sralph case 'C': 9517845Sralph Copy = 1; 9617845Sralph Linkit = 0; 9717845Sralph break; 9813695Ssam case 'g': 9913695Ssam Grade = argv[1][2]; 10013695Ssam break; 10113695Ssam case 'x': 10217845Sralph chkdebug(); 10313695Ssam Debug = atoi(&argv[1][2]); 10413695Ssam if (Debug <= 0) 10513695Ssam Debug = 1; 10613695Ssam break; 10713695Ssam case 'n': 10813695Ssam nonoti = 1; 10913695Ssam break; 11013695Ssam case 'z': 11113695Ssam nonzero = 1; 11213695Ssam break; 11317845Sralph case 'L': 11417845Sralph LocalOnly++; 11517845Sralph break; 11617845Sralph case 'a': 11717845Sralph ReturnTo = &argv[1][2]; 11823691Sbloom if (prefix(Myname, ReturnTo) && ReturnTo[strlen(Myname)] == '!') 11923691Sbloom ReturnTo = index(ReturnTo, '!') + 1; 12017845Sralph break; 12113695Ssam default: 12213695Ssam fprintf(stderr, "unknown flag %s\n", argv[1]); 12313695Ssam break; 12413695Ssam } 12513695Ssam --argc; argv++; 12613695Ssam } 12725146Sbloom ap = getwd(Wrkdir); 12825146Sbloom if (ap == 0) { 12925146Sbloom fprintf(stderr, "can't get working directory; will try to continue\n"); 13025146Sbloom strcpy(Wrkdir, "/UNKNOWN"); 13117845Sralph } 13213695Ssam 13313695Ssam DEBUG(4, "\n\n** %s **\n", "START"); 13413695Ssam 13513695Ssam inargs[0] = '\0'; 13613695Ssam for (argv++; argc > 1; argc--) { 13713695Ssam DEBUG(4, "arg - %s:", *argv); 13813695Ssam strcat(inargs, " "); 13913695Ssam strcat(inargs, *argv++); 14013695Ssam } 14113695Ssam DEBUG(4, "arg - %s\n", inargs); 14217845Sralph ret = subchdir(Spool); 14317845Sralph ASSERT(ret >= 0, "CHDIR FAILED", Spool, ret); 14413695Ssam uid = getuid(); 14513695Ssam guinfo(uid, User, path); 14613695Ssam 14723691Sbloom strncpy(local, Myname, MAXBASENAME); 14813695Ssam cmdp = cmd; 14913695Ssam *cmdp = '\0'; 15013695Ssam gename(DATAPRE, local, 'X', rxfile); 15113695Ssam fprx = ufopen(rxfile, "w"); 15213695Ssam ASSERT(fprx != NULL, "CAN'T OPEN", rxfile, 0); 15313695Ssam gename(DATAPRE, local, 'T', tcfile); 15413695Ssam fpc = ufopen(tcfile, "w"); 15513695Ssam ASSERT(fpc != NULL, "CAN'T OPEN", tcfile, 0); 15613695Ssam fprintf(fprx, "%c %s %s\n", X_USER, User, local); 15713695Ssam if (nonoti) 15813695Ssam fprintf(fprx, "%c\n", X_NONOTI); 15913695Ssam if (nonzero) 16013695Ssam fprintf(fprx, "%c\n", X_NONZERO); 16117845Sralph if (ReturnTo == NULL || *ReturnTo == '\0') 16217845Sralph ReturnTo = User; 16317845Sralph fprintf(fprx, "%c %s\n", X_RETURNTO, ReturnTo); 16413695Ssam 16513695Ssam /* find remote system name */ 16613695Ssam ap = inargs; 16713695Ssam xsys[0] = '\0'; 16813695Ssam while ((ap = getprm(ap, prm)) != NULL) { 16913695Ssam if (prm[0] == '>' || prm[0] == '<') { 17013695Ssam ap = getprm(ap, prm); 17113695Ssam continue; 17213695Ssam } 17313695Ssam 17413695Ssam split(prm, xsys, rest); 17513695Ssam break; 17613695Ssam } 17713695Ssam if (xsys[0] == '\0') 17813695Ssam strcpy(xsys, local); 17918627Sralph if (versys(&xsys) != 0) { 18013695Ssam /* bad system name */ 18113695Ssam fprintf(stderr, "bad system name: %s\n", xsys); 18213695Ssam fclose(fprx); 18313695Ssam fclose(fpc); 18413695Ssam cleanup(EX_NOHOST); 18513695Ssam } 18613695Ssam 18725146Sbloom strncpy(Rmtname, xsys, MAXBASENAME); 18825146Sbloom DEBUG(4, "xsys %s\n", xsys); 18925146Sbloom 19013695Ssam if (pipein) { 19113695Ssam gename(DATAPRE, local, 'B', dfile); 19213695Ssam fpd = ufopen(dfile, "w"); 19313695Ssam ASSERT(fpd != NULL, "CAN'T OPEN", dfile, 0); 19413695Ssam while (!feof(stdin)) { 19513695Ssam ret = fread(buf, 1, BUFSIZ, stdin); 19613695Ssam fwrite(buf, 1, ret, fpd); 197*25967Sbloom if (ferror(stdin)) { 198*25967Sbloom perror("stdin"); 199*25967Sbloom cleanup(EX_IOERR); 200*25967Sbloom } 201*25967Sbloom if (ferror(fpd)) { 202*25967Sbloom perror(dfile); 203*25967Sbloom cleanup(EX_IOERR); 204*25967Sbloom } 20513695Ssam } 20613695Ssam fclose(fpd); 20717845Sralph strcpy(tfile, dfile); 20813695Ssam if (strcmp(local, xsys) != SAME) { 20925146Sbloom register int Len = strlen(local); 21025146Sbloom if (Len > SYSNSIZE) 21125146Sbloom Len = SYSNSIZE; 21225146Sbloom tfile[Len + 2] = 'S'; 21317845Sralph GENSEND(fpc, dfile, tfile, User, "", dfile); 21413695Ssam cflag++; 21513695Ssam } 21617845Sralph fprintf(fprx, "%c %s\n", X_RQDFILE, tfile); 21717845Sralph fprintf(fprx, "%c %s\n", X_STDIN, tfile); 21813695Ssam } 21913695Ssam /* parse command */ 22013695Ssam ap = inargs; 22113695Ssam while ((ap = getprm(ap, prm)) != NULL) { 22213695Ssam DEBUG(4, "prm - %s\n", prm); 22313695Ssam if (prm[0] == '>' || prm[0] == '<') { 22413695Ssam redir = prm[0]; 22513695Ssam continue; 22613695Ssam } 22713695Ssam 22813695Ssam if (prm[0] == ';') { 22913695Ssam APPCMD(prm); 23013695Ssam continue; 23113695Ssam } 23213695Ssam 23313695Ssam if (prm[0] == '|' || prm[0] == '^') { 23413695Ssam if (cmdp != cmd) 23513695Ssam APPCMD(prm); 23613695Ssam continue; 23713695Ssam } 23813695Ssam 23913695Ssam /* process command or file or option */ 24013695Ssam ret = split(prm, syspart, rest); 24113695Ssam DEBUG(4, "s - %s, ", syspart); 24213695Ssam DEBUG(4, "r - %s, ", rest); 24313695Ssam DEBUG(4, "ret - %d\n", ret); 24413695Ssam if (syspart[0] == '\0') 24513695Ssam strcpy(syspart, local); 24613695Ssam 24713695Ssam if (cmdp == cmd && redir == '\0') { 24813695Ssam /* command */ 24913695Ssam APPCMD(rest); 25013695Ssam continue; 25113695Ssam } 25213695Ssam 25313695Ssam /* process file or option */ 25413695Ssam DEBUG(4, "file s- %s, ", syspart); 25513695Ssam DEBUG(4, "local - %s\n", local); 25613695Ssam /* process file */ 25713695Ssam if (redir == '>') { 25813695Ssam if (rest[0] != '~') 25913695Ssam if (ckexpf(rest)) 26013695Ssam cleanup(EX_CANTCREAT); 26113695Ssam fprintf(fprx, "%c %s %s\n", X_STDOUT, rest, 26213695Ssam syspart); 26313695Ssam redir = '\0'; 26413695Ssam continue; 26513695Ssam } 26613695Ssam 26713695Ssam if (ret == NOSYSPART && redir == '\0') { 26813695Ssam /* option */ 26913695Ssam APPCMD(rest); 27013695Ssam continue; 27113695Ssam } 27213695Ssam 27313695Ssam if (strcmp(xsys, local) == SAME 27413695Ssam && strcmp(xsys, syspart) == SAME) { 27513695Ssam if (ckexpf(rest)) 27613695Ssam cleanup(EX_CANTCREAT); 27713695Ssam if (redir == '<') 27813695Ssam fprintf(fprx, "%c %s\n", X_STDIN, rest); 27913695Ssam else 28013695Ssam APPCMD(rest); 28113695Ssam redir = '\0'; 28213695Ssam continue; 28313695Ssam } 28413695Ssam 28513695Ssam if (strcmp(syspart, local) == SAME) { 28613695Ssam /* generate send file */ 28713695Ssam if (ckexpf(rest)) 28813695Ssam cleanup(EX_CANTCREAT); 28913695Ssam gename(DATAPRE, local, 'A', dfile); 29013695Ssam DEBUG(4, "rest %s\n", rest); 29113695Ssam if ((chkpth(User, "", rest) || anyread(rest)) != 0) { 29213695Ssam fprintf(stderr, "permission denied %s\n", rest); 29313695Ssam cleanup(EX_NOINPUT); 29413695Ssam } 29517845Sralph link_failed = 0; 29617845Sralph if (Linkit) { 29717845Sralph if (link(subfile(rest), subfile(dfile)) != 0) 29817845Sralph link_failed++; 29917845Sralph else 30017845Sralph GENSEND(fpc, rest, dfile, User, "", dfile); 30117845Sralph } 30217845Sralph if (Copy || link_failed) { 30313695Ssam if (xcp(rest, dfile) != 0) { 30413695Ssam fprintf(stderr, "can't copy %s to %s\n", rest, dfile); 30513695Ssam cleanup(EX_NOINPUT); 30613695Ssam } 30713695Ssam GENSEND(fpc, rest, dfile, User, "", dfile); 30813695Ssam } 30917845Sralph if (!Copy && !Linkit) { 31013695Ssam GENSEND(fpc, rest, dfile, User, "c", "D.0"); 31113695Ssam } 31213695Ssam cflag++; 31313695Ssam if (redir == '<') { 31413695Ssam fprintf(fprx, "%c %s\n", X_STDIN, dfile); 31513695Ssam fprintf(fprx, "%c %s\n", X_RQDFILE, dfile); 31618627Sralph } else { 31713695Ssam APPCMD(lastpart(rest)); 31813695Ssam fprintf(fprx, "%c %s %s\n", X_RQDFILE, 31913695Ssam dfile, lastpart(rest)); 32013695Ssam } 32113695Ssam redir = '\0'; 32213695Ssam continue; 32313695Ssam } 32413695Ssam 32513695Ssam if (strcmp(local, xsys) == SAME) { 32613695Ssam /* generate local receive */ 32713695Ssam gename(CMDPRE, syspart, 'R', tfile); 32813695Ssam strcpy(dfile, tfile); 32913695Ssam dfile[0] = DATAPRE; 33013695Ssam fp = ufopen(tfile, "w"); 33113695Ssam ASSERT(fp != NULL, "CAN'T OPEN", tfile, 0); 33213695Ssam if (ckexpf(rest)) 33313695Ssam cleanup(EX_CANTCREAT); 33413695Ssam GENRCV(fp, rest, dfile, User); 33513695Ssam fclose(fp); 33613695Ssam rflag++; 33713695Ssam if (rest[0] != '~') 33813695Ssam if (ckexpf(rest)) 33913695Ssam cleanup(EX_CANTCREAT); 34013695Ssam if (redir == '<') { 34113695Ssam fprintf(fprx, "%c %s\n", X_RQDFILE, dfile); 34213695Ssam fprintf(fprx, "%c %s\n", X_STDIN, dfile); 34318627Sralph } else { 34413695Ssam fprintf(fprx, "%c %s %s\n", X_RQDFILE, dfile, 34513695Ssam lastpart(rest)); 34613695Ssam APPCMD(lastpart(rest)); 34713695Ssam } 34813695Ssam 34913695Ssam redir = '\0'; 35013695Ssam continue; 35113695Ssam } 35213695Ssam 35313695Ssam if (strcmp(syspart, xsys) != SAME) { 35413695Ssam /* generate remote receives */ 35513695Ssam gename(DATAPRE, syspart, 'R', dfile); 35613695Ssam strcpy(tfile, dfile); 35713695Ssam tfile[0] = CMDPRE; 35813695Ssam fpd = ufopen(dfile, "w"); 35913695Ssam ASSERT(fpd != NULL, "CAN'T OPEN", dfile, 0); 36013695Ssam gename(DATAPRE, local, 'T', t2file); 36113695Ssam GENRCV(fpd, rest, t2file, User); 36213695Ssam fclose(fpd); 36313695Ssam GENSEND(fpc, dfile, tfile, User, "", dfile); 36413695Ssam cflag++; 36513695Ssam if (redir == '<') { 36613695Ssam fprintf(fprx, "%c %s\n", X_RQDFILE, t2file); 36713695Ssam fprintf(fprx, "%c %s\n", X_STDIN, t2file); 36818627Sralph } else { 36913695Ssam fprintf(fprx, "%c %s %s\n", X_RQDFILE, t2file, 37013695Ssam lastpart(rest)); 37113695Ssam APPCMD(lastpart(rest)); 37213695Ssam } 37313695Ssam redir = '\0'; 37413695Ssam continue; 37513695Ssam } 37613695Ssam 37713695Ssam /* file on remote system */ 37813695Ssam if (rest[0] != '~') 37913695Ssam if (ckexpf(rest)) 38013695Ssam cleanup(EX_CANTCREAT); 38113695Ssam if (redir == '<') 38213695Ssam fprintf(fprx, "%c %s\n", X_STDIN, rest); 38313695Ssam else 38413695Ssam APPCMD(rest); 38513695Ssam redir = '\0'; 38613695Ssam continue; 38713695Ssam 38813695Ssam } 38917845Sralph /* 39017845Sralph * clean up trailing ' ' in command. 39117845Sralph */ 39217845Sralph if (cmdp > cmd && cmdp[0] == '\0' && cmdp[-1] == ' ') 39317845Sralph *--cmdp = '\0'; 39417845Sralph /* block multi-hop uux, which doesn't work */ 39517845Sralph for (ap = cmd; *ap && *ap != ' '; ap++) 39617845Sralph if (*ap == '!') { 39717845Sralph fprintf(stderr, "uux handles only adjacent sites.\n"); 39817845Sralph fprintf(stderr, "Try uusend for multi-hop delivery.\n"); 399*25967Sbloom cleanup(EX_USAGE); 40017845Sralph } 40113695Ssam 40213695Ssam fprintf(fprx, "%c %s\n", X_CMD, cmd); 403*25967Sbloom if (ferror(fprx)) { 404*25967Sbloom logent(cmd, "COULD NOT QUEUE XQT"); 405*25967Sbloom cleanup(EX_IOERR); 406*25967Sbloom } else 407*25967Sbloom logent(cmd, "XQT QUE'D"); 40813695Ssam fclose(fprx); 40913695Ssam 41017845Sralph gename(XQTPRE, local, Grade, tfile); 41113695Ssam if (strcmp(xsys, local) == SAME) { 41213695Ssam /* rti!trt: xmv() works across filesystems, link(II) doesnt */ 41313695Ssam xmv(rxfile, tfile); 41413695Ssam if (startjob) 41513695Ssam if (rflag) 41613695Ssam xuucico(xsys); 41713695Ssam else 41813695Ssam xuuxqt(); 41913695Ssam } 42013695Ssam else { 42113695Ssam GENSEND(fpc, rxfile, tfile, User, "", rxfile); 42213695Ssam cflag++; 42313695Ssam } 42413695Ssam 425*25967Sbloom if (ferror(fpc)) 426*25967Sbloom cleanup(EX_IOERR); 42713695Ssam fclose(fpc); 42813695Ssam if (cflag) { 42913695Ssam gename(CMDPRE, xsys, Grade, cfile); 43013695Ssam /* rti!trt: use xmv() rather than link(II) */ 43113695Ssam xmv(tcfile, cfile); 43213695Ssam if (startjob) 43313695Ssam xuucico(xsys); 43413695Ssam cleanup(0); 43513695Ssam } 43613695Ssam else 43713695Ssam unlink(subfile(tcfile)); 43818627Sralph exit(0); 43913695Ssam } 44013695Ssam 44113695Ssam #define FTABSIZE 30 44213695Ssam char Fname[FTABSIZE][NAMESIZE]; 44313695Ssam int Fnamect = 0; 44413695Ssam 44517845Sralph /* 44617845Sralph * cleanup and unlink if error 44713695Ssam * 44813695Ssam * return - none - do exit() 44913695Ssam */ 45013695Ssam 45113695Ssam cleanup(code) 45213695Ssam int code; 45313695Ssam { 45413695Ssam int i; 45513695Ssam 45613695Ssam logcls(); 45713695Ssam rmlock(CNULL); 45813695Ssam if (code) { 45913695Ssam for (i = 0; i < Fnamect; i++) 46013695Ssam unlink(subfile(Fname[i])); 46113695Ssam fprintf(stderr, "uux failed. code %d\n", code); 46213695Ssam } 46313695Ssam DEBUG(1, "exit code %d\n", code); 46413695Ssam exit(code); 46513695Ssam } 46613695Ssam 46717845Sralph /* 46817845Sralph * open file and record name 46913695Ssam * 47013695Ssam * return file pointer. 47113695Ssam */ 47213695Ssam 47313695Ssam FILE *ufopen(file, mode) 47413695Ssam char *file, *mode; 47513695Ssam { 47613695Ssam if (Fnamect < FTABSIZE) 47713695Ssam strcpy(Fname[Fnamect++], file); 47813695Ssam else 47913695Ssam logent("Fname", "TABLE OVERFLOW"); 48017845Sralph return fopen(subfile(file), mode); 48113695Ssam } 48217845Sralph #ifdef VMS 48317845Sralph /* 48417845Sralph * EUNICE bug: 48517845Sralph * quotes are not stripped from DCL. Do it here. 48617845Sralph * Note if we are running under Unix shell we don't 48717845Sralph * do the right thing. 48817845Sralph */ 48917845Sralph arg_fix(argc, argv) 49017845Sralph char **argv; 49117845Sralph { 49217845Sralph register char *cp, *tp; 49317845Sralph 49417845Sralph for (; argc > 0; --argc, argv++) { 49517845Sralph cp = *argv; 49617845Sralph if (cp == (char *)0 || *cp++ != '"') 49717845Sralph continue; 49817845Sralph tp = cp; 49917845Sralph while (*tp++) ; 50017845Sralph tp -= 2; 50117845Sralph if (*tp == '"') { 50217845Sralph *tp = '\0'; 50317845Sralph *argv = cp; 50417845Sralph } 50517845Sralph } 50617845Sralph } 50717845Sralph #endif VMS 50825146Sbloom 50925146Sbloom /* 51025146Sbloom * split into system and file part 51125146Sbloom * 51225146Sbloom * return codes: 51325146Sbloom * NOSYSPART 51425146Sbloom * HASSYSPART 51525146Sbloom */ 51625146Sbloom 51725146Sbloom split(name, sys, rest) 51825146Sbloom register char *name, *rest; 51925146Sbloom char *sys; 52025146Sbloom { 52125146Sbloom register char *c; 52225146Sbloom register int i; 52325146Sbloom 52425146Sbloom if (*name == LQUOTE) { 52525146Sbloom if ((c = index(name + 1, RQUOTE)) != NULL) { 52625146Sbloom /* strip off quotes */ 52725146Sbloom name++; 52825146Sbloom while (c != name) 52925146Sbloom *rest++ = *name++; 53025146Sbloom *rest = '\0'; 53125146Sbloom *sys = '\0'; 53225146Sbloom return NOSYSPART; 53325146Sbloom } 53425146Sbloom } 53525146Sbloom 53625146Sbloom if ((c = index(name, '!')) == NULL) { 53725146Sbloom strcpy(rest, name); 53825146Sbloom *sys = '\0'; 53925146Sbloom return NOSYSPART; 54025146Sbloom } 54125146Sbloom 54225146Sbloom *c++ = '\0'; 54325146Sbloom strncpy(sys, name, MAXBASENAME); 54425146Sbloom sys[MAXBASENAME] = '\0'; 54525146Sbloom 54625146Sbloom strcpy(rest, c); 54725146Sbloom return HASSYSPART; 54825146Sbloom } 549