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

Defined functions

cleanup defined in line 357; used 11 times
fixmode defined in line 415; used 1 times
intrEXIT defined in line 407; used 9 times
intrHUP defined in line 404; used 2 times
intrINT defined in line 403; used 2 times
intrQUIT defined in line 405; used 2 times
intrTERM defined in line 406; used 2 times
main defined in line 36; never used
onintr defined in line 393; used 6 times
pskip defined in line 440; used 3 times
timeout defined in line 435; used 4 times

Defined variables

Errorrate defined in line 28; never used
Hupvec defined in line 350; used 1 times
Role defined in line 20; used 11 times
Savettyb defined in line 29; used 9 times
Sjbuf defined in line 7; used 4 times
Stattext defined in line 9; used 3 times
Stattype defined in line 23; used 3 times
Last modified: 1979-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1377
Valid CSS Valid XHTML 1.0 Strict