xref: /csrg-svn/usr.bin/uucp/uux/uux.c (revision 25967)
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