xref: /csrg-svn/usr.bin/uucp/uucico/cico.c (revision 13639)
1*13639Ssam #ifndef lint
2*13639Ssam static char sccsid[] = "@(#)cico.c	5.1 (Berkeley) 07/02/83";
3*13639Ssam #endif
4*13639Ssam 
5*13639Ssam #include "uucp.h"
6*13639Ssam #include <signal.h>
7*13639Ssam #include <setjmp.h>
8*13639Ssam #include <sys/types.h>
9*13639Ssam #ifdef	SYSIII
10*13639Ssam #include <termio.h>
11*13639Ssam #endif
12*13639Ssam #ifndef	SYSIII
13*13639Ssam #include <sgtty.h>
14*13639Ssam #endif
15*13639Ssam 
16*13639Ssam 
17*13639Ssam #ifdef UNET
18*13639Ssam #include <UNET/unetio.h>
19*13639Ssam #include <UNET/tcp.h>
20*13639Ssam static struct uiocstate ust;
21*13639Ssam #endif
22*13639Ssam 
23*13639Ssam jmp_buf Sjbuf;
24*13639Ssam 	/*  call fail text  */
25*13639Ssam char *Stattext[] = {
26*13639Ssam 	"",
27*13639Ssam 	"BAD SYSTEM",
28*13639Ssam 	"WRONG TIME",
29*13639Ssam 	"SYSTEM LOCKED",
30*13639Ssam 	"NO DEVICE",
31*13639Ssam 	"DIAL FAILED",
32*13639Ssam 	"LOGIN FAILED",
33*13639Ssam 	"BAD SEQUENCE"
34*13639Ssam 	};
35*13639Ssam 
36*13639Ssam int Role = 0;
37*13639Ssam 	/*  call fail codes  */
38*13639Ssam int Stattype[] = {0, 0, 0, 0,
39*13639Ssam 	SS_NODEVICE, SS_FAIL, SS_FAIL, SS_BADSEQ
40*13639Ssam 	};
41*13639Ssam 
42*13639Ssam 
43*13639Ssam int Errorrate = 0;
44*13639Ssam #ifdef	SYSIII
45*13639Ssam struct termio Savettyb;
46*13639Ssam #endif
47*13639Ssam #ifndef	SYSIII
48*13639Ssam struct sgttyb Savettyb;
49*13639Ssam #endif
50*13639Ssam 
51*13639Ssam /*******
52*13639Ssam  *	cico - this program is used  to place a call to a
53*13639Ssam  *	remote machine, login, and copy files between the two machines.
54*13639Ssam  */
55*13639Ssam 
56*13639Ssam main(argc, argv)
57*13639Ssam register char *argv[];
58*13639Ssam {
59*13639Ssam 	register int ret;
60*13639Ssam 	int seq;
61*13639Ssam 	int onesys = 0;
62*13639Ssam 	char wkpre[NAMESIZE], file[NAMESIZE];
63*13639Ssam 	char msg[BUFSIZ], *q;
64*13639Ssam 	register char *p;
65*13639Ssam 	extern onintr(), timeout(), setdebug();
66*13639Ssam 	extern intrEXIT();
67*13639Ssam 	extern char *pskip();
68*13639Ssam 	char rflags[30];
69*13639Ssam 	char *ttyn;
70*13639Ssam 	int orig_uid = getuid();
71*13639Ssam 
72*13639Ssam 	strcpy(Progname, "uucico");
73*13639Ssam 	uucpname(Myname);
74*13639Ssam 
75*13639Ssam 	/* Try to run as uucp -- rti!trt */
76*13639Ssam 	setgid(getegid());
77*13639Ssam 	setuid(geteuid());
78*13639Ssam 
79*13639Ssam 	signal(SIGILL, intrEXIT);
80*13639Ssam 	signal(SIGTRAP, intrEXIT);
81*13639Ssam 	signal(SIGIOT, intrEXIT);
82*13639Ssam 	signal(SIGEMT, intrEXIT);
83*13639Ssam 	signal(SIGFPE, intrEXIT);
84*13639Ssam 	signal(SIGBUS, intrEXIT);
85*13639Ssam 	signal(SIGSEGV, intrEXIT);
86*13639Ssam 	signal(SIGSYS, intrEXIT);
87*13639Ssam 	signal(SIGINT, onintr);
88*13639Ssam 	signal(SIGHUP, onintr);
89*13639Ssam 	signal(SIGQUIT, onintr);
90*13639Ssam 	signal(SIGTERM, onintr);
91*13639Ssam 	signal(SIGPIPE, onintr);	/* 4.1a tcp-ip stupidity */
92*13639Ssam 	signal(SIGFPE, setdebug);
93*13639Ssam 	ret = guinfo(getuid(), User, msg);
94*13639Ssam 	strcpy(Loginuser, User);
95*13639Ssam 	ASSERT(ret == 0, "BAD UID ", "", ret);
96*13639Ssam 
97*13639Ssam 	rflags[0] = '\0';
98*13639Ssam 	umask(WFMASK);
99*13639Ssam 	strcpy(Rmtname, Myname);
100*13639Ssam 	Ifn = Ofn = -1;
101*13639Ssam 	while(argc>1 && argv[1][0] == '-'){
102*13639Ssam 		switch(argv[1][1]){
103*13639Ssam 		case 'd':
104*13639Ssam 			Spool = &argv[1][2];
105*13639Ssam 			break;
106*13639Ssam #ifdef PROTODEBUG
107*13639Ssam 		case 'E':
108*13639Ssam 			Errorrate = atoi(&argv[1][2]);
109*13639Ssam 			if (Errorrate <= 0)
110*13639Ssam 				Errorrate = 100;
111*13639Ssam 			break;
112*13639Ssam 		case 'g':
113*13639Ssam 			Pkdrvon = 1;
114*13639Ssam 			break;
115*13639Ssam 		case 'G':
116*13639Ssam 			Pkdrvon = 1;
117*13639Ssam 			strcat(rflags, " -g ");
118*13639Ssam 			break;
119*13639Ssam #endif
120*13639Ssam 		case 'r':
121*13639Ssam 			Role = atoi(&argv[1][2]);
122*13639Ssam 			break;
123*13639Ssam 		case 's':
124*13639Ssam 			sprintf(Rmtname, "%.7s", &argv[1][2]);
125*13639Ssam 			if (Rmtname[0] != '\0')
126*13639Ssam 				onesys = 1;
127*13639Ssam 			break;
128*13639Ssam 		case 'x':
129*13639Ssam 			chkdebug(orig_uid);
130*13639Ssam 			Debug = atoi(&argv[1][2]);
131*13639Ssam 			if (Debug <= 0)
132*13639Ssam 				Debug = 1;
133*13639Ssam 			strcat(rflags, argv[1]);
134*13639Ssam 			logent("ENABLED", "DEBUG");
135*13639Ssam 			break;
136*13639Ssam 		default:
137*13639Ssam 			printf("unknown flag %s\n", argv[1]);
138*13639Ssam 			break;
139*13639Ssam 		}
140*13639Ssam 		--argc;  argv++;
141*13639Ssam 	}
142*13639Ssam 
143*13639Ssam 	subchdir(Spool);
144*13639Ssam 	strcpy(Wrkdir, Spool);
145*13639Ssam 
146*13639Ssam #ifdef	UNET
147*13639Ssam /*
148*13639Ssam  * Determine if we are on UNET
149*13639Ssam  */
150*13639Ssam 	ret = ioctl(0, UIOCSTATE, &ust);
151*13639Ssam 	if (ret == 0) {
152*13639Ssam 		Unet = 1;
153*13639Ssam 		DEBUG(4, "UNET connection -- ioctl-s disabled\n", "");
154*13639Ssam 	}
155*13639Ssam #endif
156*13639Ssam 	if (Role == SLAVE) {
157*13639Ssam 		/* initial handshake */
158*13639Ssam 		onesys = 1;
159*13639Ssam 		if (!Unet) {
160*13639Ssam #ifdef	SYSIII
161*13639Ssam 			ret = ioctl(0, TCGETA, &Savettyb);
162*13639Ssam 			Savettyb.c_cflag = (Savettyb.c_cflag & ~CS8) | CS7;
163*13639Ssam 			Savettyb.c_oflag |= OPOST;
164*13639Ssam 			Savettyb.c_lflag |= (ISIG|ICANON|ECHO);
165*13639Ssam #endif
166*13639Ssam #ifndef	SYSIII
167*13639Ssam 			ret = ioctl(0, TIOCGETP, &Savettyb);
168*13639Ssam 			Savettyb.sg_flags |= ECHO;
169*13639Ssam 			Savettyb.sg_flags &= ~RAW;
170*13639Ssam #endif
171*13639Ssam 		}
172*13639Ssam 		Ifn = 0;
173*13639Ssam 		Ofn = 1;
174*13639Ssam 		fixmode(Ifn);
175*13639Ssam 		fclose(stderr);
176*13639Ssam 		fopen(RMTDEBUG, "w");
177*13639Ssam 		omsg('S', "here", Ofn);
178*13639Ssam 		signal(SIGALRM, timeout);
179*13639Ssam 		alarm(MAXMSGTIME);
180*13639Ssam 		if (setjmp(Sjbuf)) {
181*13639Ssam 			/* timed out */
182*13639Ssam 			if (!Unet) {
183*13639Ssam #ifdef	SYSIII
184*13639Ssam 				ret = ioctl(0, TCSETA, &Savettyb);
185*13639Ssam #endif
186*13639Ssam #ifndef	SYSIII
187*13639Ssam 				ret = ioctl(0, TIOCSETP, &Savettyb);
188*13639Ssam #endif
189*13639Ssam 			}
190*13639Ssam 			exit(0);
191*13639Ssam 		}
192*13639Ssam 		for (;;) {
193*13639Ssam 			ret = imsg(msg, Ifn);
194*13639Ssam 			if (ret != 0) {
195*13639Ssam 				alarm(0);
196*13639Ssam 				if (!Unet) {
197*13639Ssam #ifdef	SYSIII
198*13639Ssam 					ret = ioctl(0, TCSETA, &Savettyb);
199*13639Ssam #endif
200*13639Ssam #ifndef	SYSIII
201*13639Ssam 					ret = ioctl(0, TIOCSETP, &Savettyb);
202*13639Ssam #endif
203*13639Ssam 				}
204*13639Ssam 				exit(0);
205*13639Ssam 			}
206*13639Ssam 			if (msg[0] == 'S')
207*13639Ssam 				break;
208*13639Ssam 		}
209*13639Ssam 		alarm(0);
210*13639Ssam 		q = &msg[1];
211*13639Ssam 		p = pskip(q);
212*13639Ssam 		sprintf(Rmtname, "%.7s", q);
213*13639Ssam 		DEBUG(4, "sys-%s\n", Rmtname);
214*13639Ssam 		if (mlock(Rmtname)) {
215*13639Ssam 			omsg('R', "LCK", Ofn);
216*13639Ssam 			cleanup(0);
217*13639Ssam 		}
218*13639Ssam 		else if (callback(Loginuser)) {
219*13639Ssam 			signal(SIGINT, SIG_IGN);
220*13639Ssam 			signal(SIGHUP, SIG_IGN);
221*13639Ssam 			omsg('R', "CB", Ofn);
222*13639Ssam 			logent("CALLBACK", "REQUIRED");
223*13639Ssam 			/*  set up for call back  */
224*13639Ssam 			systat(Rmtname, SS_CALLBACK, "CALL BACK");
225*13639Ssam 			gename(CMDPRE, Rmtname, 'C', file);
226*13639Ssam 			close(creat(subfile(file), 0666));
227*13639Ssam 			xuucico(Rmtname);
228*13639Ssam 			cleanup(0);
229*13639Ssam 		}
230*13639Ssam 		seq = 0;
231*13639Ssam 		while (*p == '-') {
232*13639Ssam 			q = pskip(p);
233*13639Ssam 			switch(*(++p)) {
234*13639Ssam 			case 'g':
235*13639Ssam 				Pkdrvon = 1;
236*13639Ssam 				break;
237*13639Ssam 			case 'x':
238*13639Ssam 				Debug = atoi(++p);
239*13639Ssam 				if (Debug <= 0)
240*13639Ssam 					Debug = 1;
241*13639Ssam 				break;
242*13639Ssam 			case 'Q':
243*13639Ssam 				seq = atoi(++p);
244*13639Ssam 				break;
245*13639Ssam 			default:
246*13639Ssam 				break;
247*13639Ssam 			}
248*13639Ssam 			p = q;
249*13639Ssam 		}
250*13639Ssam 		if (callok(Rmtname) == SS_BADSEQ) {
251*13639Ssam 			logent("BADSEQ", "PREVIOUS");
252*13639Ssam 			omsg('R', "BADSEQ", Ofn);
253*13639Ssam 			cleanup(0);
254*13639Ssam 		}
255*13639Ssam 		if ((ret = gnxseq(Rmtname)) == seq) {
256*13639Ssam 			omsg('R', "OK", Ofn);
257*13639Ssam 			cmtseq();
258*13639Ssam 		}
259*13639Ssam 		else {
260*13639Ssam 			systat(Rmtname, Stattype[7], Stattext[7]);
261*13639Ssam 			logent("BAD SEQ", "HANDSHAKE FAILED");
262*13639Ssam 			ulkseq();
263*13639Ssam 			omsg('R', "BADSEQ", Ofn);
264*13639Ssam 			cleanup(0);
265*13639Ssam 		}
266*13639Ssam 		ttyn = ttyname(Ifn);
267*13639Ssam 		if (ttyn != NULL)
268*13639Ssam 			chmod(ttyn, 0600);
269*13639Ssam 	}
270*13639Ssam loop:
271*13639Ssam 	if (!onesys) {
272*13639Ssam 		ret = gnsys(Rmtname, Spool, CMDPRE);
273*13639Ssam 		if (ret == FAIL)
274*13639Ssam 			cleanup(100);
275*13639Ssam 		if (ret == 0)
276*13639Ssam 			cleanup(0);
277*13639Ssam 	}
278*13639Ssam 	else if (Role == MASTER && callok(Rmtname) != 0) {
279*13639Ssam 		logent("SYSTEM STATUS", "CAN NOT CALL");
280*13639Ssam 		cleanup(0);
281*13639Ssam 	}
282*13639Ssam 
283*13639Ssam 	sprintf(wkpre, "%c.%.7s", CMDPRE, Rmtname);
284*13639Ssam 
285*13639Ssam 	if (Role == MASTER) {
286*13639Ssam 		/*  master part */
287*13639Ssam 		signal(SIGINT, SIG_IGN);
288*13639Ssam 		signal(SIGHUP, SIG_IGN);
289*13639Ssam 		signal(SIGQUIT, SIG_IGN);
290*13639Ssam 		if (!iswrk(file, "chk", Spool, wkpre) && !onesys) {
291*13639Ssam 			logent(Rmtname, "NO WORK");
292*13639Ssam 			goto next;
293*13639Ssam 		}
294*13639Ssam 		if (Ifn != -1 && Role == MASTER) {
295*13639Ssam 			write(Ofn, EOTMSG, strlen(EOTMSG));
296*13639Ssam 			clsacu();
297*13639Ssam 			close(Ofn);
298*13639Ssam 			close(Ifn);
299*13639Ssam 			Ifn = Ofn = -1;
300*13639Ssam 			rmlock(CNULL);
301*13639Ssam 			sleep(3);
302*13639Ssam 		}
303*13639Ssam 		sprintf(msg, "call to %s ", Rmtname);
304*13639Ssam 		if (mlock(Rmtname) != 0) {
305*13639Ssam 			logent(msg, "LOCKED");
306*13639Ssam 			goto next;
307*13639Ssam 		}
308*13639Ssam 		Ofn = Ifn = conn(Rmtname);
309*13639Ssam 		if (Ofn < 0) {
310*13639Ssam 			logent(msg, "FAILED");
311*13639Ssam 			systat(Rmtname, Stattype[-Ofn],
312*13639Ssam 				Stattext[-Ofn]);
313*13639Ssam 			goto next;
314*13639Ssam 		}
315*13639Ssam 		else {
316*13639Ssam 			logent(msg, "SUCCEEDED");
317*13639Ssam 		}
318*13639Ssam 
319*13639Ssam 		if (setjmp(Sjbuf))
320*13639Ssam 			goto next;
321*13639Ssam 		signal(SIGALRM, timeout);
322*13639Ssam 		alarm(2 * MAXMSGTIME);
323*13639Ssam 		for (;;) {
324*13639Ssam 			ret = imsg(msg, Ifn);
325*13639Ssam 			if (ret != 0) {
326*13639Ssam 				alarm(0);
327*13639Ssam 				logent("imsg 1", "FAILED");
328*13639Ssam 				goto next;
329*13639Ssam 			}
330*13639Ssam 			if (msg[0] == 'S')
331*13639Ssam 				break;
332*13639Ssam 		}
333*13639Ssam 		alarm(MAXMSGTIME);
334*13639Ssam 		seq = gnxseq(Rmtname);
335*13639Ssam 		sprintf(msg, "%.7s -Q%d %s", Myname, seq, rflags);
336*13639Ssam 		omsg('S', msg, Ofn);
337*13639Ssam 		for (;;) {
338*13639Ssam 			ret = imsg(msg, Ifn);
339*13639Ssam 			DEBUG(4, "msg-%s\n", msg);
340*13639Ssam 			if (ret != 0) {
341*13639Ssam 				alarm(0);
342*13639Ssam 				ulkseq();
343*13639Ssam 				logent("imsg 2", "FAILED");
344*13639Ssam 				goto next;
345*13639Ssam 			}
346*13639Ssam 			if (msg[0] == 'R')
347*13639Ssam 				break;
348*13639Ssam 		}
349*13639Ssam 		alarm(0);
350*13639Ssam 		if (msg[1] == 'B') {
351*13639Ssam 			/* bad sequence */
352*13639Ssam 			logent("BAD SEQ", "HANDSHAKE FAILED");
353*13639Ssam 			systat(Rmtname, Stattype[7], Stattext[7]);
354*13639Ssam 			ulkseq();
355*13639Ssam 			goto next;
356*13639Ssam 		}
357*13639Ssam 		if (strcmp(&msg[1], "OK") != SAME)  {
358*13639Ssam 			logent(&msg[1], "HANDSHAKE FAILED");
359*13639Ssam 			ulkseq();
360*13639Ssam 			goto next;
361*13639Ssam 		}
362*13639Ssam 		cmtseq();
363*13639Ssam 	}
364*13639Ssam 	DEBUG(1, " Rmtname %s, ", Rmtname);
365*13639Ssam 	DEBUG(1, "Role %s,  ", Role ? "MASTER" : "SLAVE");
366*13639Ssam 	DEBUG(1, "Ifn - %d, ", Ifn);
367*13639Ssam 	DEBUG(1, "Loginuser - %s\n", Loginuser);
368*13639Ssam 
369*13639Ssam 	alarm(MAXMSGTIME);
370*13639Ssam 	if (setjmp(Sjbuf))
371*13639Ssam 		goto Failure;
372*13639Ssam 	ret = startup(Role);
373*13639Ssam 	alarm(0);
374*13639Ssam 	if (ret != SUCCESS) {
375*13639Ssam Failure:
376*13639Ssam 		logent("startup", "FAILED");
377*13639Ssam 		systat(Rmtname, SS_FAIL, "STARTUP");
378*13639Ssam 		goto next;
379*13639Ssam 	}
380*13639Ssam 	else {
381*13639Ssam 		logent("startup", "OK");
382*13639Ssam 		systat(Rmtname, SS_INPROGRESS, "TALKING");
383*13639Ssam 		ret = cntrl(Role, wkpre);
384*13639Ssam 		DEBUG(1, "cntrl - %d\n", ret);
385*13639Ssam 		signal(SIGINT, SIG_IGN);
386*13639Ssam 		signal(SIGHUP, SIG_IGN);
387*13639Ssam 		signal(SIGALRM, timeout);
388*13639Ssam 		if (ret == 0) {
389*13639Ssam 			logent("conversation complete", "OK");
390*13639Ssam 			rmstat(Rmtname);
391*13639Ssam 
392*13639Ssam 		}
393*13639Ssam 		else {
394*13639Ssam 			logent("conversation complete", "FAILED");
395*13639Ssam 			systat(Rmtname, SS_FAIL, "CONVERSATION");
396*13639Ssam 		}
397*13639Ssam 		alarm(MAXMSGTIME);
398*13639Ssam 		omsg('O', "OOOOO", Ofn);
399*13639Ssam 		DEBUG(4, "send OO %d,", ret);
400*13639Ssam 		if (!setjmp(Sjbuf)) {
401*13639Ssam 			for (;;) {
402*13639Ssam 				omsg('O', "OOOOO", Ofn);
403*13639Ssam 				ret = imsg(msg, Ifn);
404*13639Ssam 				if (ret != 0)
405*13639Ssam 					break;
406*13639Ssam 				if (msg[0] == 'O')
407*13639Ssam 					break;
408*13639Ssam 			}
409*13639Ssam 		}
410*13639Ssam 		alarm(0);
411*13639Ssam 		clsacu();	/* rti!trt: is this needed? */
412*13639Ssam 	}
413*13639Ssam next:
414*13639Ssam 	if (!onesys) {
415*13639Ssam 		goto loop;
416*13639Ssam 	}
417*13639Ssam 	cleanup(0);
418*13639Ssam }
419*13639Ssam 
420*13639Ssam #ifndef	SYSIII
421*13639Ssam struct sgttyb Hupvec;
422*13639Ssam #endif
423*13639Ssam 
424*13639Ssam /***
425*13639Ssam  *	cleanup(code)	cleanup and exit with "code" status
426*13639Ssam  *	int code;
427*13639Ssam  */
428*13639Ssam 
429*13639Ssam cleanup(code)
430*13639Ssam register int code;
431*13639Ssam {
432*13639Ssam 	register int ret;
433*13639Ssam 	register char *ttyn;
434*13639Ssam 
435*13639Ssam 	signal(SIGINT, SIG_IGN);
436*13639Ssam 	signal(SIGHUP, SIG_IGN);
437*13639Ssam 	rmlock(CNULL);
438*13639Ssam 	clsacu();
439*13639Ssam 	logcls();
440*13639Ssam 	if (Role == SLAVE) {
441*13639Ssam 		if (!Unet) {
442*13639Ssam #ifdef	SYSIII
443*13639Ssam 			Savettyb.c_cflag |= HUPCL;
444*13639Ssam 			ret = ioctl(0, TCSETA, &Savettyb);
445*13639Ssam #endif
446*13639Ssam #ifndef	SYSIII
447*13639Ssam 			/* rti!trt:  use more robust hang up sequence */
448*13639Ssam 			ret = ioctl(0, TIOCHPCL, STBNULL);
449*13639Ssam 			ret = ioctl(0, TIOCGETP, &Hupvec);
450*13639Ssam 			Hupvec.sg_ispeed = B0;
451*13639Ssam 			Hupvec.sg_ospeed = B0;
452*13639Ssam 			ret = ioctl(0, TIOCSETP, &Hupvec);
453*13639Ssam 			sleep(2);
454*13639Ssam 			ret = ioctl(0, TIOCSETP, &Savettyb);
455*13639Ssam #endif
456*13639Ssam 			DEBUG(4, "ret ioctl - %d\n", ret);
457*13639Ssam 		}
458*13639Ssam 		ttyn = ttyname(Ifn);
459*13639Ssam 		if (ttyn != NULL)
460*13639Ssam 			chmod(ttyn, 0600);
461*13639Ssam 	}
462*13639Ssam 	if (Ofn != -1) {
463*13639Ssam 		if (Role == MASTER)
464*13639Ssam 			write(Ofn, EOTMSG, strlen(EOTMSG));
465*13639Ssam 		close(Ifn);
466*13639Ssam 		close(Ofn);
467*13639Ssam 	}
468*13639Ssam 	DEBUG(1, "exit code %d\n", code);
469*13639Ssam 	if (code == 0)
470*13639Ssam 		xuuxqt();
471*13639Ssam 	exit(code);
472*13639Ssam }
473*13639Ssam 
474*13639Ssam /***
475*13639Ssam  *	onintr(inter)	interrupt - remove locks and exit
476*13639Ssam  */
477*13639Ssam 
478*13639Ssam onintr(inter)
479*13639Ssam register int inter;
480*13639Ssam {
481*13639Ssam 	char str[30];
482*13639Ssam 	signal(inter, SIG_IGN);
483*13639Ssam 	sprintf(str, "SIGNAL %d", inter);
484*13639Ssam 	logent(str, "CAUGHT");
485*13639Ssam 	cleanup(inter);
486*13639Ssam }
487*13639Ssam 
488*13639Ssam /* changed to single version of intrEXIT.  Is this okay? rti!trt */
489*13639Ssam intrEXIT(signo)
490*13639Ssam int signo;
491*13639Ssam {
492*13639Ssam 	signal(signo, SIG_DFL);
493*13639Ssam 	setgid(getgid());
494*13639Ssam 	setuid(getuid());
495*13639Ssam 	abort();
496*13639Ssam }
497*13639Ssam /*
498*13639Ssam  * Catch a special signal
499*13639Ssam  * (SIGFPE, ugh), and toggle debugging between 0 and 30.
500*13639Ssam  * Handy for looking in on long running uucicos.
501*13639Ssam  */
502*13639Ssam setdebug()
503*13639Ssam {
504*13639Ssam 	if (Debug < 30)
505*13639Ssam 		Debug = 30;
506*13639Ssam 	else
507*13639Ssam 		Debug = 0;
508*13639Ssam }
509*13639Ssam 
510*13639Ssam 
511*13639Ssam /***
512*13639Ssam  *	fixmode(tty)	fix kill/echo/raw on line
513*13639Ssam  *
514*13639Ssam  *	return codes:  none
515*13639Ssam  */
516*13639Ssam 
517*13639Ssam fixmode(tty)
518*13639Ssam register int tty;
519*13639Ssam {
520*13639Ssam #ifdef	SYSIII
521*13639Ssam 	struct termio ttbuf;
522*13639Ssam #endif
523*13639Ssam #ifndef	SYSIII
524*13639Ssam 	struct sgttyb ttbuf;
525*13639Ssam #endif
526*13639Ssam 	register int ret;
527*13639Ssam 
528*13639Ssam 	if (Unet)
529*13639Ssam 		return;
530*13639Ssam #ifdef	SYSIII
531*13639Ssam 	ioctl(tty, TCGETA, &ttbuf);
532*13639Ssam 	ttbuf.c_iflag = ttbuf.c_oflag = ttbuf.c_lflag = (ushort)0;
533*13639Ssam 	ttbuf.c_cflag &= (CBAUD);
534*13639Ssam 	ttbuf.c_cflag |= (CS8|CREAD);
535*13639Ssam 	ttbuf.c_cc[VMIN] = 6;
536*13639Ssam 	ttbuf.c_cc[VTIME] = 1;
537*13639Ssam 	ret = ioctl(tty, TCSETA, &ttbuf);
538*13639Ssam #endif
539*13639Ssam #ifndef	SYSIII
540*13639Ssam 	ioctl(tty, TIOCGETP, &ttbuf);
541*13639Ssam 	ttbuf.sg_flags = (ANYP | RAW);
542*13639Ssam 	ret = ioctl(tty, TIOCSETP, &ttbuf);
543*13639Ssam #endif
544*13639Ssam 	ASSERT(ret >= 0, "STTY FAILED", "", ret);
545*13639Ssam #ifndef	SYSIII
546*13639Ssam 	ioctl(tty, TIOCEXCL, STBNULL);
547*13639Ssam #endif
548*13639Ssam }
549*13639Ssam 
550*13639Ssam 
551*13639Ssam /***
552*13639Ssam  *	timeout()	catch SIGALRM routine
553*13639Ssam  */
554*13639Ssam 
555*13639Ssam timeout()
556*13639Ssam {
557*13639Ssam 	logent(Rmtname, "TIMEOUT");
558*13639Ssam 	longjmp(Sjbuf, 1);
559*13639Ssam }
560*13639Ssam 
561*13639Ssam static char *
562*13639Ssam pskip(p)
563*13639Ssam register char *p;
564*13639Ssam {
565*13639Ssam 	while( *p && *p != ' ' )
566*13639Ssam 		++p;
567*13639Ssam 	if( *p ) *p++ = 0;
568*13639Ssam 	return(p);
569*13639Ssam }
570