|
|
1.1 ! root 1: /* @(#)cico 2.2 5/18/79 11:31:12 */ ! 2: #include "uucp.h" ! 3: #include "uucpdefs.h" ! 4: #include <signal.h> ! 5: #include <sgtty.h> ! 6: #include <setjmp.h> ! 7: ! 8: char Scico[] = "@(#)cico 2.2"; ! 9: ! 10: jmp_buf Sjbuf; ! 11: /* call fail text */ ! 12: char *Stattext[] = { ! 13: "", ! 14: "BAD SYSTEM", ! 15: "WRONG TIME", ! 16: "SYSTEM LOCKED", ! 17: "NO DEVICE", ! 18: "DIAL FAILED", ! 19: "LOGIN FAILED", ! 20: "BAD SEQUENCE" ! 21: }; ! 22: ! 23: int Role = 0; ! 24: char *ttyname(); ! 25: ! 26: /* call fail codes */ ! 27: int Stattype[] = {0, 0, 0, 0, ! 28: SS_NODEVICE, SS_FAIL, SS_FAIL, SS_BADSEQ ! 29: }; ! 30: ! 31: ! 32: int Errorrate = 0; ! 33: struct sgttyb Savettyb; ! 34: ! 35: /******* ! 36: * cico - this program is used to place a call to a ! 37: * remote machine, login, and copy files between the two machines. ! 38: */ ! 39: ! 40: main(argc, argv) ! 41: char *argv[]; ! 42: { ! 43: int ret, seq; ! 44: int onesys = 0; ! 45: char wkpre[NAMESIZE], file[NAMESIZE]; ! 46: char msg[BUFSIZ], *p, *q; ! 47: extern onintr(), timeout(); ! 48: extern intrINT(); ! 49: extern intrHUP(); ! 50: extern intrQUIT(); ! 51: extern intrTERM(); ! 52: extern intrEXIT(); ! 53: extern char *pskip(); ! 54: char rflags[30]; ! 55: char *ttyn; ! 56: ! 57: signal(SIGILL, intrEXIT); ! 58: signal(SIGTRAP, intrEXIT); ! 59: signal(SIGIOT, intrEXIT); ! 60: signal(SIGEMT, intrEXIT); ! 61: signal(SIGFPE, intrEXIT); ! 62: signal(SIGBUS, intrEXIT); ! 63: signal(SIGSEGV, intrEXIT); ! 64: signal(SIGSYS, intrEXIT); ! 65: signal(SIGINT, intrINT); ! 66: signal(SIGHUP, intrHUP); ! 67: signal(SIGQUIT, intrQUIT); ! 68: signal(SIGTERM, intrTERM); ! 69: ret = guinfo(getuid(), User, msg); ! 70: strcpy(Loginuser, User); ! 71: ASSERT(ret == 0, "BAD UID ret %d", ret); ! 72: ! 73: rflags[0] = '\0'; ! 74: uucpname(Myname); ! 75: strcpy(Rmtname, Myname); ! 76: Ifn = Ofn = -1; ! 77: while(argc>1 && argv[1][0] == '-'){ ! 78: switch(argv[1][1]){ ! 79: case 'd': ! 80: Spool = &argv[1][2]; ! 81: break; ! 82: /* ! 83: * case 'E': ! 84: * Errorrate = atoi(&argv[1][2]); ! 85: * if (Errorrate <= 0) ! 86: * Errorrate = 100; ! 87: * break; ! 88: * case 'g': ! 89: * Pkdrvon = 1; ! 90: * break; ! 91: * case 'G': ! 92: * Pkdrvon = 1; ! 93: * strcat(rflags, " -g "); ! 94: * break; ! 95: */ ! 96: case 'r': ! 97: Role = atoi(&argv[1][2]); ! 98: break; ! 99: case 's': ! 100: sprintf(Rmtname, "%.7s", &argv[1][2]); ! 101: if (Rmtname[0] != '\0') ! 102: onesys = 1; ! 103: break; ! 104: case 'x': ! 105: Debug = atoi(&argv[1][2]); ! 106: if (Debug <= 0) ! 107: Debug = 1; ! 108: strcat(rflags, argv[1]); ! 109: break; ! 110: default: ! 111: printf("unknown flag %s\n", argv[1]); ! 112: break; ! 113: } ! 114: --argc; argv++; ! 115: } ! 116: ! 117: chdir(Spool); ! 118: strcpy(Wrkdir, Spool); ! 119: ! 120: if (Role == SLAVE) { ! 121: /* initial handshake */ ! 122: onesys = 1; ! 123: ret = ioctl(0, TIOCGETP, &Savettyb); ! 124: Savettyb.sg_flags |= ECHO; ! 125: Savettyb.sg_flags &= ~RAW; ! 126: Ifn = 0; ! 127: Ofn = 1; ! 128: fixmode(Ifn); ! 129: fclose(stderr); ! 130: fopen(RMTDEBUG, "w"); ! 131: chmod(RMTDEBUG, 0666); ! 132: omsg('S', "here", Ofn); ! 133: signal(SIGALRM, timeout); ! 134: alarm(MAXMSGTIME); ! 135: if (setjmp(Sjbuf)) { ! 136: /* timed out */ ! 137: ret = ioctl(0, TIOCSETP, &Savettyb); ! 138: exit(0); ! 139: } ! 140: for (;;) { ! 141: ret = imsg(msg, Ifn); ! 142: if (ret != 0) { ! 143: alarm(0); ! 144: ret = ioctl(0, TIOCSETP, &Savettyb); ! 145: exit(0); ! 146: } ! 147: if (msg[0] == 'S') ! 148: break; ! 149: } ! 150: alarm(0); ! 151: DEBUG(4, "msg-%s,", msg); ! 152: q = &msg[1]; ! 153: p = pskip(q); ! 154: sprintf(Rmtname, "%.7s", q); ! 155: DEBUG(4, "sys-%s\n", Rmtname); ! 156: if (mlock(Rmtname)) { ! 157: omsg('R', "LCK", Ofn); ! 158: cleanup(0); ! 159: } ! 160: else if (callback(Loginuser)) { ! 161: signal(SIGINT, SIG_IGN); ! 162: signal(SIGHUP, SIG_IGN); ! 163: omsg('R', "CB", Ofn); ! 164: DEBUG(4, "CALLBACK Role %d\n", Role); ! 165: logent("CALLBACK", "REQUIRED"); ! 166: /* set up for call back */ ! 167: systat(Rmtname, SS_CALLBACK, "CALL BACK"); ! 168: gename(CMDPRE, Rmtname, 'C', file); ! 169: close(creat(file, 0666)); ! 170: chmod(file, 0666); ! 171: xuucico(Rmtname); ! 172: cleanup(0); ! 173: } ! 174: seq = 0; ! 175: while (*p == '-') { ! 176: q = pskip(p); ! 177: switch(*(++p)) { ! 178: case 'g': ! 179: Pkdrvon = 1; ! 180: break; ! 181: case 'x': ! 182: Debug = atoi(++p); ! 183: if (Debug <= 0) ! 184: Debug = 1; ! 185: break; ! 186: case 'Q': ! 187: seq = atoi(++p); ! 188: break; ! 189: default: ! 190: break; ! 191: } ! 192: p = q; ! 193: } ! 194: if (callok(Rmtname) == SS_BADSEQ) { ! 195: logent("BADSEQ", "PREVIOUS"); ! 196: omsg('R', "BADSEQ", Ofn); ! 197: cleanup(0); ! 198: } ! 199: if ((ret = gnxseq(Rmtname)) == seq) { ! 200: omsg('R', "OK", Ofn); ! 201: cmtseq(); ! 202: } ! 203: else { ! 204: systat(Rmtname, Stattype[7], Stattext[7]); ! 205: logent("BAD SEQ", "HANDSHAKE FAILED"); ! 206: ulkseq(); ! 207: omsg('R', "BADSEQ", Ofn); ! 208: cleanup(0); ! 209: } ! 210: } ! 211: loop: ! 212: if (!onesys) { ! 213: ret = gnsys(Rmtname, Spool, CMDPRE); ! 214: if (ret == FAIL) ! 215: cleanup(100); ! 216: if (ret == 0) ! 217: cleanup(0); ! 218: } ! 219: else if (Role == MASTER && callok(Rmtname) != 0) { ! 220: logent("SYSTEM STATUS", "CAN NOT CALL"); ! 221: cleanup(0); ! 222: } ! 223: ! 224: sprintf(wkpre, "%c.%.7s", CMDPRE, Rmtname); ! 225: ! 226: if (Role == MASTER) { ! 227: /* master part */ ! 228: signal(SIGINT, SIG_IGN); ! 229: signal(SIGHUP, SIG_IGN); ! 230: signal(SIGQUIT, SIG_IGN); ! 231: if (!iswrk(file, "chk", Spool, wkpre) && !onesys) { ! 232: logent(Rmtname, "NO WORK"); ! 233: cleanup(0); ! 234: } ! 235: if (Ifn != -1 && Role == MASTER) { ! 236: write(Ofn, EOTMSG, strlen(EOTMSG)); ! 237: close(Ofn); ! 238: close(Ifn); ! 239: Ifn = Ofn = -1; ! 240: rmlock(NULL); ! 241: clsacu(); ! 242: sleep(3); ! 243: } ! 244: sprintf(msg, "call to %s ", Rmtname); ! 245: if (mlock(Rmtname) != 0) { ! 246: logent(msg, "LOCKED"); ! 247: goto next; ! 248: } ! 249: Ofn = Ifn = conn(Rmtname); ! 250: if (Ofn < 0) { ! 251: logent(msg, "FAILED"); ! 252: systat(Rmtname, Stattype[-Ofn], ! 253: Stattext[-Ofn]); ! 254: goto next; ! 255: } ! 256: else { ! 257: logent(msg, "SUCCEEDED"); ! 258: } ! 259: ! 260: if (setjmp(Sjbuf)) ! 261: goto next; ! 262: signal(SIGALRM, timeout); ! 263: alarm(2 * MAXMSGTIME); ! 264: for (;;) { ! 265: ret = imsg(msg, Ifn); ! 266: if (ret != 0) { ! 267: alarm(0); ! 268: goto next; ! 269: } ! 270: if (msg[0] == 'S') ! 271: break; ! 272: } ! 273: alarm(MAXMSGTIME); ! 274: seq = gnxseq(Rmtname); ! 275: sprintf(msg, "%.7s -Q%d %s", Myname, seq, rflags); ! 276: omsg('S', msg, Ofn); ! 277: for (;;) { ! 278: ret = imsg(msg, Ifn); ! 279: DEBUG(4, "msg-%s\n", msg); ! 280: if (ret != 0) { ! 281: alarm(0); ! 282: ulkseq(); ! 283: goto next; ! 284: } ! 285: if (msg[0] == 'R') ! 286: break; ! 287: } ! 288: alarm(0); ! 289: if (msg[1] == 'B') { ! 290: /* bad sequence */ ! 291: logent("BAD SEQ", "HANDSHAKE FAILED"); ! 292: systat(Rmtname, Stattype[7], Stattext[7]); ! 293: ulkseq(); ! 294: goto next; ! 295: } ! 296: if (strcmp(&msg[1], "OK") != SAME) { ! 297: logent(&msg[1], "HANDSHAKE FAILED"); ! 298: ulkseq(); ! 299: goto next; ! 300: } ! 301: cmtseq(); ! 302: } ! 303: ttyn = ttyname(Ifn); ! 304: if (ttyn != NULL) ! 305: chmod(ttyn, 0600); ! 306: DEBUG(1, " Rmtname %s, ", Rmtname); ! 307: DEBUG(1, "my Role %s, ", Role ? "MASTER" : "SLAVE"); ! 308: DEBUG(1, "Spool - %s\n", Spool); ! 309: DEBUG(1, "Ifn - %d, ", Ifn); ! 310: DEBUG(1, "Ofn - %d, ", Ofn); ! 311: DEBUG(1, "Loginuser - %s\n", Loginuser); ! 312: ! 313: ret = startup(Role); ! 314: if (ret != SUCCESS) { ! 315: logent("startup", "FAILED"); ! 316: systat(Rmtname, SS_FAIL, "STARTUP"); ! 317: goto next; ! 318: } ! 319: else { ! 320: logent("startup", "OK"); ! 321: systat(Rmtname, SS_INPROGRESS, "TALKING"); ! 322: ret = cntrl(Role, wkpre); ! 323: DEBUG(1, "ret from cntrl - %d\n", ret); ! 324: signal(SIGINT, SIG_IGN); ! 325: signal(SIGHUP, SIG_IGN); ! 326: signal(SIGALRM, timeout); ! 327: if (ret == 0) { ! 328: logent("conversation complete", "OK"); ! 329: rmstat(Rmtname); ! 330: ! 331: } ! 332: else { ! 333: logent("conversation complete", "FAILED"); ! 334: systat(Rmtname, SS_FAIL, "CONVERSATION"); ! 335: } ! 336: alarm(MAXMSGTIME); ! 337: omsg('O', "OOOOO", Ofn); ! 338: DEBUG(4, "send OO %d,", ret); ! 339: if (!setjmp(Sjbuf)) { ! 340: for (;;) { ! 341: omsg('O', "OOOOO", Ofn); ! 342: ret = imsg(msg, Ifn); ! 343: if (ret != 0) ! 344: break; ! 345: if (msg[0] == 'O') ! 346: break; ! 347: } ! 348: } ! 349: alarm(0); ! 350: } ! 351: next: ! 352: if (!onesys) { ! 353: goto loop; ! 354: } ! 355: cleanup(0); ! 356: } ! 357: ! 358: ! 359: int Hupvec[] = {0, 0, 1}; ! 360: ! 361: /*** ! 362: * cleanup(code) cleanup and exit with "code" status ! 363: * int code; ! 364: */ ! 365: ! 366: cleanup(code) ! 367: int code; ! 368: { ! 369: int ret; ! 370: char *ttyn; ! 371: ! 372: signal(SIGINT, SIG_IGN); ! 373: signal(SIGHUP, SIG_IGN); ! 374: rmlock(NULL); ! 375: clsacu(); ! 376: logcls(); ! 377: if (Role == SLAVE) { ! 378: ret = ioctl(0, TIOCSETP, &Savettyb); ! 379: DEBUG(4, "\nIfn - %d, ", Ifn); ! 380: DEBUG(4, "ret ioctl - %d\n", ret); ! 381: DEBUG(4, "tty.flags %o,", Savettyb.sg_flags); ! 382: DEBUG(4, "tty.ispeed %d, ", Savettyb.sg_ispeed); ! 383: DEBUG(4, "tty.ospeed %d, ", Savettyb.sg_ospeed); ! 384: ret = ioctl(0, TIOCSETP, Hupvec); ! 385: DEBUG(4, "ret ioctl - %d\n", ret); ! 386: } ! 387: if (Ofn != -1) { ! 388: if (Role == MASTER) ! 389: write(Ofn, EOTMSG, strlen(EOTMSG)); ! 390: ttyn = ttyname(Ifn); ! 391: if (ttyn != NULL) ! 392: chmod(ttyn, 0666); ! 393: close(Ifn); ! 394: close(Ofn); ! 395: } ! 396: DEBUG(1, "exit code %d\n", code); ! 397: if (code == 0) ! 398: xuuxqt(); ! 399: exit(code); ! 400: } ! 401: ! 402: /*** ! 403: * onintr(inter) interrupt - remove locks and exit ! 404: */ ! 405: ! 406: onintr(inter) ! 407: int inter; ! 408: { ! 409: char str[30]; ! 410: signal(inter, SIG_IGN); ! 411: sprintf(str, "SIGNAL %d", inter); ! 412: logent(str, "CAUGHT"); ! 413: cleanup(inter); ! 414: } ! 415: ! 416: intrINT() { onintr(SIGINT);} ! 417: intrHUP() { onintr(SIGHUP);} ! 418: intrQUIT() { onintr(SIGQUIT);} ! 419: intrTERM() { onintr(SIGTERM);} ! 420: intrEXIT() ! 421: { ! 422: signal(SIGIOT, SIG_DFL); ! 423: setuid(getuid()); ! 424: abort(); ! 425: } ! 426: ! 427: /*** ! 428: * fixmode(tty) fix kill/echo/raw on line ! 429: * ! 430: * return codes: none ! 431: */ ! 432: ! 433: fixmode(tty) ! 434: int tty; ! 435: { ! 436: struct sgttyb ttbuf; ! 437: int ret; ! 438: ! 439: ioctl(tty, TIOCGETP, &ttbuf); ! 440: ttbuf.sg_flags = (ANYP | RAW); ! 441: ret = ioctl(tty, TIOCSETP, &ttbuf); ! 442: ASSERT(ret >= 0, "RETURN FROM STTY %d", ret); ! 443: ioctl(tty, TIOCEXCL, 0); ! 444: return; ! 445: } ! 446: ! 447: ! 448: /*** ! 449: * timeout() catch SIGALRM routine ! 450: */ ! 451: ! 452: timeout() ! 453: { ! 454: longjmp(Sjbuf, 1); ! 455: } ! 456: ! 457: static char * ! 458: pskip(p) ! 459: register char *p; ! 460: { ! 461: while( *p && *p != ' ' ) ! 462: ++p; ! 463: if( *p ) *p++ = 0; ! 464: return(p); ! 465: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.