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