|
|
1.1 ! root 1: /* conn 2.1 5/23/79 19:07:44 */ ! 2: #define CONN ! 3: #include "uucp.h" ! 4: #include <signal.h> ! 5: #include <sgtty.h> ! 6: #include <setjmp.h> ! 7: #include <ctype.h> ! 8: #include <sys/types.h> ! 9: #include <time.h> ! 10: ! 11: static char SiD[] = "@(#)conn 2.1"; ! 12: ! 13: #ifdef DATAKIT ! 14: #include <dk.h> ! 15: #endif ! 16: ! 17: ! 18: #define F_NAME 0 ! 19: #define F_TIME 1 ! 20: #define F_LINE 2 ! 21: #define F_SPEED 3 ! 22: #define F_PHONE 4 ! 23: #define F_LOGIN 5 ! 24: ! 25: jmp_buf Sjbuf; ! 26: int alarmtr(); ! 27: #define INVOKE(a, r) ret = a; if (ret<0) return(r); ! 28: /******* ! 29: * conn(system) ! 30: * char *system; ! 31: * ! 32: * conn - place a telephone call to system and ! 33: * login, etc. ! 34: * ! 35: * return codes: ! 36: * CF_SYSTEM: don't know system ! 37: * CF_TIME: wrong time to call ! 38: * CF_DIAL: call failed ! 39: * CF_LOGIN: login/password dialog failed ! 40: * ! 41: * >0 - file no. - connect ok ! 42: * ! 43: */ ! 44: ! 45: conn(system) ! 46: char *system; ! 47: { ! 48: int ret, nf; ! 49: int fn; ! 50: char *flds[50]; ! 51: DEBUG(4, "gdial %s\n", "called"); ! 52: INVOKE(gdial(), CF_DIAL) ! 53: DEBUG(4, "finds %s\n", "called"); ! 54: INVOKE(nf = finds(system, flds), nf) ! 55: DEBUG(4, "getto %s\n", "called"); ! 56: INVOKE(fn = getto(flds), CF_DIAL) ! 57: DEBUG(4, "login %s\n", "called"); ! 58: INVOKE(login(nf, flds, fn), CF_LOGIN) ! 59: return(fn); ! 60: } ! 61: ! 62: /*** ! 63: * char * ! 64: * lastc(s) return pointer to last character ! 65: * char *s; ! 66: * ! 67: */ ! 68: ! 69: char * ! 70: lastc(s) ! 71: char *s; ! 72: { ! 73: while (*s != '\0') s++; ! 74: return(s); ! 75: } ! 76: ! 77: #define MAXDEV 10 ! 78: #define MAXDCH MAXDEV*20 ! 79: #define MAXCODE 30 ! 80: #define MAXCCH MAXCODE*20 ! 81: /* This array tells us about possible acu's, etc. */ ! 82: struct Devices { ! 83: char *D_type; ! 84: char *D_line; ! 85: char *D_calldev; ! 86: int D_speed; ! 87: } Devs [MAXDEV]; ! 88: ! 89: char Devbuff[MAXDCH]; ! 90: ! 91: struct Codes { ! 92: char *C_locs; ! 93: char *C_prefix; ! 94: } Dialcodes [MAXCODE]; ! 95: ! 96: char Codebuff[MAXCCH]; ! 97: int Dcfull = 0; ! 98: ! 99: ! 100: /*** ! 101: * gdial() get device and dial info ! 102: * ! 103: * return codes: 0 | FAIL ! 104: */ ! 105: ! 106: gdial() ! 107: { ! 108: char *flds[10], *lt; ! 109: char *lb = Devbuff; ! 110: char *lc = Codebuff; ! 111: FILE *fn; ! 112: int nr; ! 113: struct Devices *pd; ! 114: struct Codes *pc; ! 115: if (Dcfull) return(0); ! 116: ! 117: fn = fopen(Devfile, "r"); ! 118: ASSERT(fn != NULL, "CAN'T OPEN %s", Devfile); ! 119: for (pd = Devs; fgets(lb, 200, fn); pd++) { ! 120: lt = lastc(lb); ! 121: nr = getargs(lb, flds); ! 122: ASSERT(nr == 4, "BAD LINE %s", lb); ! 123: pd->D_type = flds[0]; ! 124: pd->D_line = flds[1]; ! 125: pd->D_calldev = flds[2]; ! 126: pd->D_speed = atoi(flds[3]); ! 127: lb = lt; ! 128: ASSERT(lb < Devbuff + MAXDCH, "TOO LONG %s", Devbuff); ! 129: ASSERT(pd < Devs + MAXDEV, "TOO MANY DEVICES %d", MAXCODE); ! 130: } ! 131: pd->D_line = NULL; ! 132: fclose(fn); ! 133: ASSERT(pd > Devs, "BAD FILE %s", Devfile); ! 134: /* Now dialcodes, same way */ ! 135: fn = fopen(Dialfile, "r"); ! 136: ASSERT(fn != NULL, "CAN'T OPEN %s", Dialfile); ! 137: for (pc = Dialcodes; fgets(lc, 200, fn); pc++) { ! 138: lt = lastc(lc); ! 139: nr = getargs(lc, flds); ! 140: if (nr == 1) flds[nr++] = ""; ! 141: ASSERT(nr == 2, "BAD LINE %s", lc); ! 142: pc->C_locs = flds[0]; ! 143: pc->C_prefix = flds[1]; ! 144: lc = lt; ! 145: ASSERT(lc < Codebuff + MAXCCH, "TOO LONG %s", Codebuff); ! 146: ASSERT(pc < Dialcodes + MAXCODE, "MANY DEVICES %d", MAXCODE); ! 147: } ! 148: pc->C_locs = 0; ! 149: fclose(fn); ! 150: return(0); ! 151: } ! 152: ! 153: ! 154: /*** ! 155: * ckdev(type, speed, ndev) ! 156: * char *type, *speed; ! 157: * int ndev; ! 158: * ! 159: * ckdev - return the device number in table Devs for ! 160: * a device with proper attributes. ! 161: * ! 162: * return codes: >= 0 (ok) | FAIL ! 163: */ ! 164: ! 165: ckdev(type, speed, ndev) ! 166: char *type, *speed; ! 167: int ndev; ! 168: { ! 169: int sp; ! 170: struct Devices *pd; ! 171: ! 172: sp = atoi(speed); ! 173: for (pd = &Devs[ndev]; pd->D_line != NULL; pd++) { ! 174: if (sp != pd->D_speed) ! 175: continue; ! 176: if ((strcmp(pd->D_type, type) == SAME) ! 177: && !mlock(pd->D_line)) ! 178: return(ndev = pd - Devs); ! 179: if ((strcmp(pd->D_line, type) == SAME) ! 180: && !mlock(type)) ! 181: return(ndev = pd - Devs); ! 182: } ! 183: return(FAIL); ! 184: } ! 185: ! 186: ! 187: /*** ! 188: * getto(flds) connect to remote machine ! 189: * char *flds[]; ! 190: * ! 191: * return codes: ! 192: * >0 - file number - ok ! 193: * FAIL - failed ! 194: */ ! 195: ! 196: getto(flds) ! 197: char *flds[]; ! 198: { ! 199: DEBUG(F_PHONE, "call: no. %s ", flds[4]); ! 200: DEBUG(4, "for sys %s ", flds[F_NAME]); ! 201: ! 202: if (prefix("ACU", flds[F_LINE])) ! 203: return(call(flds)); ! 204: ! 205: #ifdef DATAKIT ! 206: else if (prefix("DK", flds[F_LINE])) ! 207: return(dkcall(flds)); ! 208: #endif ! 209: ! 210: else ! 211: return(direct(flds)); ! 212: } ! 213: ! 214: /*** ! 215: * call(flds) call remote machine ! 216: * char *flds[]; ! 217: * ! 218: * "flds" contains the call information (name, date, type, speed, ! 219: * phone no. ... ! 220: * Ndev has the device no. ! 221: * ! 222: * return codes: ! 223: * >0 - file number - ok ! 224: * FAIL - failed ! 225: */ ! 226: ! 227: call(flds) ! 228: char *flds[]; ! 229: { ! 230: char *pno, pref[20], phone[20]; ! 231: char *s1, *s2; ! 232: int dcr, i; ! 233: struct Codes *pc; ! 234: ! 235: pno = flds[F_PHONE]; ! 236: s1 = pref; s2 = pno; ! 237: while (isalpha(*s2)) ! 238: *s1++ = *s2++; ! 239: *s1 = '\0'; ! 240: for (pc = Dialcodes; pc->C_locs; pc++) ! 241: if (strcmp(pc->C_locs, pref) == SAME) { ! 242: s1 = pc->C_prefix; ! 243: break; ! 244: } ! 245: sprintf(phone, "%s%s", s1, s2); ! 246: for (i = 0; i < TRYCALLS; i++) { ! 247: DEBUG(4, "Dial %s\n", phone); ! 248: dcr = dialup(phone, flds); ! 249: DEBUG(4, "dcr returned as %d\n", dcr); ! 250: if (dcr != FAIL) ! 251: break; ! 252: } ! 253: return(dcr); ! 254: ! 255: } ! 256: ! 257: /* file descriptor for call unit */ ! 258: int Dnf = 0; ! 259: ! 260: /*** ! 261: * dialup(ph, flds) dial remote machine ! 262: * char *ph; ! 263: * char *flds[]; ! 264: * ! 265: * return codes: ! 266: * file descriptor - succeeded ! 267: * FAIL - failed ! 268: */ ! 269: ! 270: dialup(ph, flds) ! 271: char *ph; ! 272: char *flds[]; ! 273: { ! 274: #ifdef DIALOUT ! 275: int dcf; ! 276: if ((dcf = dialout(ph, flds[F_SPEED])) < 0) ! 277: return(FAIL); ! 278: return(dcf); ! 279: #endif ! 280: ! 281: #ifndef DIALOUT ! 282: char dcname[20], dnname[20], phone[20]; ! 283: struct Devices *pd; ! 284: int nw, lt, pid, dcf, ndev, timelim; ! 285: extern int Error; ! 286: ! 287: for (ndev = 0;;ndev++) { ! 288: ndev = ckdev(flds[F_LINE], flds[F_SPEED], ndev); ! 289: if (ndev < 0) { ! 290: logent("AVAILABLE DEVICE", "NO"); ! 291: DEBUG(4, "NO AVAILABLE DEVICE %s\n", ""); ! 292: return(FAIL); ! 293: } ! 294: pd = &Devs[ndev]; ! 295: sprintf(dnname, "/dev/%s", pd->D_calldev); ! 296: /* open call unit */ ! 297: Dnf = open(dnname, 1); ! 298: if (Dnf >= 0) ! 299: break; ! 300: delock(pd->D_line); ! 301: } ! 302: sprintf(dcname, "/dev/%s", pd->D_line); ! 303: sprintf(phone, "%s%s", ph, ACULAST); ! 304: DEBUG(4, "dc - %s, ", dcname); ! 305: DEBUG(4, "acu - %s\n", dnname); ! 306: if (setjmp(Sjbuf)) { ! 307: DEBUG(1, "DN write %s\n", "timeout"); ! 308: logent("DIALUP DN write", "TIMEOUT"); ! 309: kill(pid, 9); ! 310: delock(pd->D_line); ! 311: close(Dnf); ! 312: return(FAIL); ! 313: } ! 314: signal(SIGALRM, alarmtr); ! 315: timelim = 5 * strlen(phone); ! 316: alarm(timelim < 30 ? 30 : timelim); ! 317: if ((pid = fork()) == 0) { ! 318: sleep(2); ! 319: fclose(stdin); ! 320: fclose(stdout); ! 321: nw = write(Dnf, phone, lt = strlen(phone)); ! 322: if (nw != lt) { ! 323: DEBUG(1, "ACU write %s\n", "error"); ! 324: logent("DIALUP ACU write", "FAILED"); ! 325: exit(1); ! 326: } ! 327: DEBUG(4, "ACU write ok%s\n", ""); ! 328: exit(0); ! 329: } ! 330: /* open line - will return on carrier */ ! 331: dcf = open(dcname, 2); ! 332: DEBUG(4, "dcf is %d\n", dcf); ! 333: if (dcf < 0) { ! 334: DEBUG(1, "Line open %s\n", "failed"); ! 335: logent("DIALUP LINE open", "FAILED"); ! 336: alarm(0); ! 337: kill(pid, 9); ! 338: close(Dnf); ! 339: return(FAIL); ! 340: } ! 341: ioctl(dcf, TIOCHPCL, 0); ! 342: while ((nw = wait(<)) != pid && nw != -1) ! 343: ; ! 344: alarm(0); ! 345: fflush(stdout); ! 346: fixline(dcf, pd->D_speed); ! 347: DEBUG(4, "Forked %d ", pid); ! 348: DEBUG(4, "Wait got %d ", nw); ! 349: DEBUG(4, "Status %o\n", lt); ! 350: if (lt != 0) { ! 351: close(dcf); ! 352: close(Dnf); ! 353: return(FAIL); ! 354: } ! 355: return(dcf); ! 356: #endif ! 357: } ! 358: ! 359: ! 360: /*** ! 361: * clsacu() close call unit ! 362: * ! 363: * return codes: none ! 364: */ ! 365: ! 366: clsacu() ! 367: { ! 368: if (Dnf > 0) { ! 369: close(Dnf); ! 370: sleep(5); ! 371: Dnf = 0; ! 372: } ! 373: return; ! 374: } ! 375: ! 376: ! 377: /*** ! 378: * direct(flds) connect to hardware line ! 379: * char *flds[]; ! 380: * ! 381: * return codes: ! 382: * >0 - file number - ok ! 383: * FAIL - failed ! 384: */ ! 385: ! 386: direct(flds) ! 387: char *flds[]; ! 388: { ! 389: int dcr, ndev; ! 390: char dcname[20]; ! 391: ! 392: ndev = 0; ! 393: if ((ndev = ckdev(flds[F_LINE], flds[F_SPEED], ndev)) < 0) { ! 394: logent("DEVICE", "NOT AVAILABLE"); ! 395: return(FAIL); ! 396: } ! 397: sprintf(dcname, "/dev/%s", Devs[ndev].D_line); ! 398: signal(SIGALRM, alarmtr); ! 399: alarm(10); ! 400: if (setjmp(Sjbuf)) ! 401: return(FAIL); ! 402: dcr = open(dcname, 2); /* read/write */ ! 403: alarm(0); ! 404: if (dcr < 0) ! 405: return(FAIL); ! 406: fflush(stdout); ! 407: fixline(dcr, Devs[ndev].D_speed); ! 408: return(dcr); ! 409: } ! 410: ! 411: #ifdef DATAKIT ! 412: ! 413: #define DKTRIES 2 ! 414: ! 415: /*** ! 416: * dkcall(flds) make datakit connection ! 417: * ! 418: * return codes: ! 419: * >0 - file number - ok ! 420: * FAIL - failed ! 421: */ ! 422: ! 423: dkcall(flds) ! 424: char *flds[]; ! 425: { ! 426: int dkphone; ! 427: register char *cp; ! 428: register ret, i; ! 429: ! 430: if (setjmp(Sjbuf)) ! 431: return(FAIL); ! 432: signal(SIGALRM, alarmtr); ! 433: dkphone = 0; ! 434: cp = flds[F_PHONE]; ! 435: while(*cp) ! 436: dkphone = 10 * dkphone + (*cp++ - '0'); ! 437: DEBUG(4, "dkphone (%d) ", dkphone); ! 438: for (i = 0; i < DKTRIES; i++) { ! 439: ret = dkdial(D_UU, dkphone, 0); ! 440: DEBUG(4, "dkdial (%d)\n", ret); ! 441: if (ret > -1) ! 442: break; ! 443: } ! 444: return(ret); ! 445: } ! 446: #endif ! 447: ! 448: #define MAXC 300 ! 449: ! 450: /*** ! 451: * finds(sysnam, flds) set system attribute vector ! 452: * char *sysnam, *flds[]; ! 453: * ! 454: * return codes: ! 455: * >0 - number of arguments in vector - succeeded ! 456: * CF_SYSTEM - system name not found ! 457: * CF_TIME - wrong time to call ! 458: */ ! 459: ! 460: finds(sysnam, flds) ! 461: char *sysnam, *flds[]; ! 462: { ! 463: FILE *fsys; ! 464: static char info[MAXC]; ! 465: char **fnp; ! 466: int na; ! 467: int fnd = 0; ! 468: ! 469: for (fnp = Sysfiles; *fnp != NULL && !fnd; fnp++) { ! 470: fsys = fopen(*fnp, "r"); ! 471: if (fsys == NULL) ! 472: continue; ! 473: while (!fnd && (fgets(info, MAXC, fsys) != NULL)) { ! 474: na = getargs(info, flds); ! 475: if (prefix(sysnam, flds[F_NAME])) ! 476: fnd = 1; ! 477: } ! 478: fclose(fsys); ! 479: } ! 480: if (fnd == 0) ! 481: return(CF_SYSTEM); ! 482: /* format of fields ! 483: * 0 name; ! 484: * 1 time ! 485: * 2 acu/hardwired ! 486: * 3 speed ! 487: * etc ! 488: */ ! 489: if (ifdate(flds[F_TIME]) == 0) { ! 490: DEBUG(1, "Wrong time to call %s\n", sysnam); ! 491: logent(sysnam, "WRONG TIME TO CALL"); ! 492: return(CF_TIME); ! 493: } ! 494: return(na); ! 495: } ! 496: ! 497: ! 498: /*** ! 499: * login(nf, flds, dcr) do log conversation ! 500: * char *flds[]; ! 501: * int nf; ! 502: * ! 503: * return codes: 0 | FAIL ! 504: */ ! 505: ! 506: login(nf, flds, fn) ! 507: char *flds[]; ! 508: int nf, fn; ! 509: { ! 510: char *want, *altern; ! 511: extern char *index(); ! 512: int k, ok; ! 513: ! 514: ASSERT(nf > 4, "TOO FEW LOG FIELDS %d", nf); ! 515: for (k = F_LOGIN; k < nf; k += 2) { ! 516: want = flds[k]; ! 517: ok = FAIL; ! 518: while (ok != 0) { ! 519: altern = index(want, '-'); ! 520: if (altern != NULL) ! 521: *altern++ = '\0'; ! 522: DEBUG(4, "wanted %s ", want); ! 523: ok = expect(want, fn); ! 524: DEBUG(4, "got %s\n", ok ? "?" : "that"); ! 525: if (ok == 0) ! 526: break; ! 527: if (altern == NULL) { ! 528: logent("LOGIN", "FAILED"); ! 529: return(FAIL); ! 530: } ! 531: want = index(altern, '-'); ! 532: if (want != NULL) ! 533: *want++ = '\0'; ! 534: sendthem(altern, fn); ! 535: } ! 536: sleep(2); ! 537: sendthem(flds[k+1], fn); ! 538: } ! 539: return(0); ! 540: } ! 541: ! 542: ! 543: struct sg_spds {int sp_val, sp_name;} spds[] = { ! 544: { 300, B300}, ! 545: {1200, B1200}, ! 546: {4800, B4800}, ! 547: {9600, B9600}, ! 548: {0, 0} }; ! 549: ! 550: /*** ! 551: * fixline(tty, spwant) set speed/echo/mode... ! 552: * int tty, spwant; ! 553: * ! 554: * return codes: none ! 555: */ ! 556: ! 557: fixline(tty, spwant) ! 558: int tty, spwant; ! 559: { ! 560: struct sgttyb ttbuf; ! 561: struct sg_spds *ps; ! 562: int speed = -1; ! 563: int ret; ! 564: ! 565: for (ps = spds; ps->sp_val; ps++) ! 566: if (ps->sp_val == spwant) ! 567: speed = ps->sp_name; ! 568: ASSERT(speed >= 0, "BAD SPEED %d", speed); ! 569: ioctl(tty, TIOCGETP, &ttbuf); ! 570: ttbuf.sg_flags =(ANYP|RAW); ! 571: ttbuf.sg_ispeed = ttbuf.sg_ospeed = speed; ! 572: DEBUG(4, "Speed: want %d ", spwant); ! 573: DEBUG(4, "use %o ", speed); ! 574: DEBUG(4, "ps %d\n", ps-spds); ! 575: ret = ioctl(tty, TIOCSETP, &ttbuf); ! 576: ASSERT(ret >= 0, "RETURN FROM STTY %d", ret); ! 577: ioctl(tty, TIOCHPCL, 0); ! 578: ioctl(tty, TIOCEXCL, 0); ! 579: return; ! 580: } ! 581: ! 582: ! 583: #define MR 300 ! 584: ! 585: int Error = 0; ! 586: ! 587: /*** ! 588: * expect(str, fn) look for expected string ! 589: * char *str; ! 590: * ! 591: * return codes: ! 592: * 0 - found ! 593: * FAIL - lost line or too many characters read ! 594: * some character - timed out ! 595: */ ! 596: ! 597: expect(str, fn) ! 598: char *str; ! 599: int fn; ! 600: { ! 601: static char rdvec[MR]; ! 602: char *rp = rdvec; ! 603: int nextch = 0, kr; ! 604: ! 605: if (strcmp(str, "\"\"") == SAME) ! 606: return(0); ! 607: *rp = 0; ! 608: if (setjmp(Sjbuf)) { ! 609: return(FAIL); ! 610: } ! 611: signal(SIGALRM, alarmtr); ! 612: while (notin(str, rdvec)) { ! 613: alarm(MAXCHARTIME); ! 614: kr = read(fn, &nextch, 1); ! 615: if (kr <= 0) { ! 616: DEBUG(4, "kr - %d\n", kr); ! 617: alarm(0); ! 618: DEBUG(4, "lost line kr - %d, ", kr); ! 619: DEBUG(4, "fn - %d\n", fn); ! 620: logent("LOGIN", "LOST LINE"); ! 621: return(FAIL); ! 622: } ! 623: { ! 624: int c; ! 625: c = nextch & 0177; ! 626: DEBUG(4, "%c", c > 040 ? c : '_'); ! 627: } ! 628: if ((*rp = nextch & 0177) != '\0') ! 629: rp++; ! 630: *rp = '\0'; ! 631: if (rp >= rdvec + MR) ! 632: return(FAIL); ! 633: } ! 634: alarm(0); ! 635: return(0); ! 636: } ! 637: ! 638: ! 639: /*** ! 640: * alarmtr() - catch alarm routine for "expect". ! 641: */ ! 642: ! 643: alarmtr() ! 644: { ! 645: longjmp(Sjbuf, 1); ! 646: } ! 647: ! 648: ! 649: /*** ! 650: * sendthem(str, fn) send line of login sequence ! 651: * char *str; ! 652: * ! 653: * return codes: none ! 654: */ ! 655: ! 656: sendthem(str, fn) ! 657: char *str; ! 658: int fn; ! 659: { ! 660: int nw, ns; ! 661: int nulls; ! 662: ! 663: if (prefix("BREAK", str)) { ! 664: sscanf(&str[5], "%1d", &nulls); ! 665: if (nulls <= 0 || nulls > 10) ! 666: nulls = 3; ! 667: /* send break */ ! 668: DEBUG(5, "%s,", str); ! 669: DEBUG(5, "%d\n", nulls); ! 670: genbrk(fn, nulls); ! 671: return; ! 672: } ! 673: ! 674: if (strcmp(str, "EOT") == SAME) { ! 675: write(fn, EOTMSG, strlen(EOTMSG)); ! 676: return; ! 677: } ! 678: if (strcmp(str, "") != SAME) { ! 679: nw = write(fn, str, ns = strlen(str)); ! 680: ASSERT(nw == ns, "BAD WRITE $s", str); ! 681: } ! 682: write(fn, "\n", 1); ! 683: return; ! 684: } ! 685: ! 686: #define BSPEED B150 ! 687: ! 688: /*** ! 689: * genbrk send a break ! 690: * ! 691: * return codes; none ! 692: */ ! 693: ! 694: genbrk(fn, bnulls) ! 695: { ! 696: struct sgttyb ttbuf; ! 697: int ret, sospeed; ! 698: ! 699: ret = ioctl(fn, TIOCGETP, &ttbuf); ! 700: DEBUG(5, "ioctl ret %d\n", ret); ! 701: sospeed = ttbuf.sg_ospeed; ! 702: ttbuf.sg_ospeed = BSPEED; ! 703: ret = ioctl(fn, TIOCSETP, &ttbuf); ! 704: DEBUG(5, "ioctl ret %d\n", ret); ! 705: ret = write(fn, "\0\0\0\0\0\0\0\0\0\0\0\0", bnulls); ! 706: ASSERT(ret > 0, "BAD WRITE genbrk %d", ret); ! 707: ttbuf.sg_ospeed = sospeed; ! 708: ret = ioctl(fn, TIOCSETP, &ttbuf); ! 709: ret = write(fn, "@", 1); ! 710: ASSERT(ret > 0, "BAD WRITE genbrk %d", ret); ! 711: DEBUG(4, "sent BREAK nulls - %d\n", bnulls); ! 712: return; ! 713: } ! 714: ! 715: ! 716: /*** ! 717: * notin(sh, lg) check for occurrence of substring "sh" ! 718: * char *sh, *lg; ! 719: * ! 720: * return codes: ! 721: * 0 - found the string ! 722: * 1 - not in the string ! 723: */ ! 724: ! 725: notin(sh, lg) ! 726: char *sh, *lg; ! 727: { ! 728: while (*lg != '\0') { ! 729: if (prefix(sh, lg)) ! 730: return(0); ! 731: else ! 732: lg++; ! 733: } ! 734: return(1); ! 735: } ! 736: ! 737: ! 738: /******* ! 739: * ifdate(s) ! 740: * char *s; ! 741: * ! 742: * ifdate - this routine will check a string (s) ! 743: * like "MoTu0800-1730" to see if the present ! 744: * time is within the given limits. ! 745: * ! 746: * String alternatives: ! 747: * Wk - Mo thru Fr ! 748: * zero or one time means all day ! 749: * Any - any day ! 750: * ! 751: * return codes: ! 752: * 0 - not within limits ! 753: * 1 - within limits ! 754: */ ! 755: ! 756: ifdate(s) ! 757: char *s; ! 758: { ! 759: static char *days[]={ ! 760: "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", 0 ! 761: }; ! 762: long clock; ! 763: int i, tl, th, tn, dayok=0; ! 764: struct tm *localtime(); ! 765: struct tm *tp; ! 766: ! 767: time(&clock); ! 768: tp = localtime(&clock); ! 769: while (isalpha(*s)) { ! 770: for (i = 0; days[i]; i++) { ! 771: if (prefix(days[i], s)) ! 772: if (tp->tm_wday == i) ! 773: dayok = 1; ! 774: } ! 775: ! 776: if (prefix("Wk", s)) ! 777: if (tp->tm_wday >= 1 && tp->tm_wday <= 5) ! 778: dayok = 1; ! 779: if (prefix("Any", s)) ! 780: dayok = 1; ! 781: s++; ! 782: } ! 783: ! 784: if (dayok == 0) ! 785: return(0); ! 786: i = sscanf(s, "%d-%d", &tl, &th); ! 787: tn = tp->tm_hour * 100 + tp->tm_min; ! 788: if (i < 2) ! 789: return(1); ! 790: if (tn >= tl && tn <= th) ! 791: return(1); ! 792: return(0); ! 793: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.