Annotation of researchv10dc/cmd/library/library.c, revision 1.1

1.1     ! root        1: /*     library:library.c       1.33    */
        !             2: #include "sccsid.h"
        !             3: VERSION(@(#)library:library.c  1.33)
        !             4: 
        !             5: /******************  library.c  *****************************/
        !             6: 
        !             7: /* This routine accepts requests for any type of document
        !             8:  * for which center 7811 and associated networks are responsible.
        !             9:  *
        !            10:  * Presently accepts requests for:
        !            11:  *     document stored at ITDS (e.g. TMs, MFs, SLs)
        !            12:  *     Bulletin items
        !            13:  *     books
        !            14:  *     photo copies of items
        !            15:  *     (un)subscribe to bulletins
        !            16:  */
        !            17: 
        !            18: #include "gnamef.h"
        !            19: #include <stdio.h>
        !            20: #include <ctype.h>
        !            21: #include <signal.h>
        !            22: char *malloc(), *realloc();
        !            23: #ifdef MSDOS
        !            24: char *Cmd="sendfile";
        !            25: #else
        !            26: char *Cmd="/bin/mail ";
        !            27: #endif
        !            28: char *whereto="library!techlib";
        !            29: int expert=0;
        !            30: char libcntl[100], pan[15], req_name[80];
        !            31: char libfile[120];     /* full path and name of .lib file */
        !            32: char read_cntl[50];    /* User specified controls of reader function */
        !            33: char *pager=NULL;      /* Pager to use in reading full things in opt7 */
        !            34: void showavail();
        !            35: 
        !            36: static char *program="@(#) R Waldstein, Dept 78111, general purpose orderer";
        !            37: static char *version="@(#) library, ordering program, version 3.6++";
        !            38: 
        !            39: #if  ( defined SVR4 ) || ( defined MSDOS )
        !            40: void ordint(int junk)
        !            41: #else
        !            42: ordint()
        !            43: #endif
        !            44:  {
        !            45:     printf("\nInterrupt! No requests sent\n");
        !            46:     exit(0);
        !            47:     }
        !            48: 
        !            49: main(argc, argv)
        !            50: int argc;
        !            51: char *argv[];
        !            52: {  
        !            53:     int len, reqint(), what;
        !            54:     int got_name=0, got_id=0;
        !            55:     char instr[250], copy_str[250], *tptr, *chrptr, *homeptr;
        !            56:     char  *getenv(), logf_name[120], *strchr(), *ptr, *libptr;
        !            57:     FILE *fopen(), *idfile, *tfile, *logfile, *helpfile;
        !            58: 
        !            59:     (void)signal(SIGINT, ordint);
        !            60:     if ((argc == 2) && !strcmp(argv[1], "-v")) {
        !            61:            printf("%s\n", version);
        !            62:            exit(0);
        !            63:            }
        !            64: 
        !            65:     /* if they want let them enter info via a an id file */
        !            66:     *pan = '\0';
        !            67:     *req_name = '\0';
        !            68:     *libcntl = '\0';
        !            69:     *read_cntl = *logf_name = '\0';
        !            70:     logfile = NULL;
        !            71:     libptr = getenv("LIBFILE");
        !            72:     homeptr = getenv("HOME");
        !            73: #ifdef MSDOS
        !            74:     if (libptr == NULL)
        !            75:        strcpy(libfile, "c:/library/library.lib");
        !            76:     else {
        !            77: #endif
        !            78:     if (libptr != NULL) {
        !            79:        if (*libptr == '/')
        !            80:            strcpy(libfile, libptr);
        !            81:        else {
        !            82:            strcpy(libfile, homeptr);
        !            83:            strcat(libfile, "/");
        !            84:            strcat(libfile, libptr);
        !            85:            }
        !            86:        }
        !            87:     else if (homeptr != NULL) {
        !            88:        strcpy(libfile, homeptr);
        !            89:        strcat(libfile, "/.lib");
        !            90:        }
        !            91:     else
        !            92:        strcpy(libfile, ".lib");
        !            93: #ifdef MSDOS
        !            94:   }
        !            95: #endif
        !            96: 
        !            97:     if ((idfile = fopen(libfile, "r")) == NULL) {
        !            98:        /* let them use the old .id file */
        !            99:        if ( homeptr != NULL) {
        !           100:            strcpy(instr, homeptr);
        !           101:            strcat(instr, "/.id");
        !           102:            }
        !           103:        else
        !           104:            strcpy(instr, ".id");
        !           105:        idfile = fopen(instr, "r");
        !           106:        if (idfile != NULL) strcpy(libfile, instr);
        !           107:        }
        !           108: 
        !           109:     if (idfile != NULL) {
        !           110:        while (fgets(instr, 250, idfile) != NULL) {
        !           111:            if ((tptr = strchr(instr, '\n')) != NULL) *tptr = '\0';
        !           112:            strcpy(copy_str, instr);
        !           113:            uppercase(instr);
        !           114:            if  ((strncmp(instr, "NAME", 4) == 0) || (strncmp(instr, "LIBNAME", 7) == 0)) {
        !           115:                tptr = instr + ((*instr == 'L') ? 7 : 4);
        !           116:                while (!isalpha(*tptr) ) tptr++;
        !           117:                if (strlen(tptr) > 79) {
        !           118:                    fprintf(stderr, "library: Name <%s> from file unacceptably long! Max is 79 characters!\n", tptr);
        !           119:                    exit(1);
        !           120:                    }
        !           121:                strcpy(req_name, tptr);
        !           122:                }
        !           123:            else if ((strncmp(instr, "PAN", 3) == 0) || (strncmp(instr, "ID", 2) == 0)) {
        !           124:                tptr = instr + ((*instr == 'P') ? 3 : 2);
        !           125:                while (!isalnum(*tptr)) tptr++;
        !           126:                if (strlen(tptr) > 14) {
        !           127:                    fprintf(stderr, "library: ID <%s> from file unacceptably long! Max is 14 characters!\n", tptr);
        !           128:                    exit(1);
        !           129:                    }
        !           130:                strcpy(pan, tptr);
        !           131:                }
        !           132:            /* see if they want any libcntl info on the request */
        !           133:            else if ((strncmp(instr, "ITDSCNTL", 8) == 0) ||
        !           134:                (strncmp(instr, "CNTL", 4) == 0) || (strncmp(instr, "LIBCNTL", 7) == 0) ) {
        !           135:                    tptr = instr + ((*instr == 'C') ? 4 : 7);
        !           136:                    if (*instr == 'I') tptr++;
        !           137:                    while (!isalnum(*tptr) ) tptr++;
        !           138:                    strcpy(libcntl, tptr);
        !           139:                    }
        !           140:            /* see if they want any special reader control */
        !           141:            else if (strncmp(instr, "READER", 6) == 0) {
        !           142:                    tptr = instr + 6;
        !           143:                    while (!isalpha(*tptr) ) tptr++;
        !           144:                    strncpy(read_cntl, tptr, 50);
        !           145:                    }
        !           146:            /* see if they want any local cntl info for the session */
        !           147:            else if (strncmp(instr, "LIBLOCAL", 8) == 0) {
        !           148:                    tptr = instr + 8;
        !           149:                    while (!isalpha(*tptr) ) tptr++;
        !           150:                    if ( strchr(tptr, 'F') != NULL) 
        !           151:                        fprintf(stderr, "Sorry - ask for fiche no longer supported!\n");
        !           152:                    if ( strchr(tptr, 'X') != NULL) expert = 1;
        !           153:                    }
        !           154:            /* see if they want an itds log */
        !           155:            else if ((strncmp(instr, "ITDSLOG", 7) == 0) || (strncmp(instr, "LIBLOG", 6) == 0)) {
        !           156:                tptr = copy_str + ((*instr == 'L') ? 6 : 7);
        !           157:                while ((*tptr != '/') && (*tptr != '.') && !isalnum(*tptr) )
        !           158:                        tptr++;
        !           159:                if (*tptr != '/') {
        !           160:                    strcpy(logf_name, homeptr);
        !           161:                    strcat(logf_name, "/");
        !           162:                    }
        !           163:                strcat(logf_name, tptr);
        !           164:                }
        !           165:            else if (!strncmp(instr, "PAGER", 5)) {
        !           166:                tptr = copy_str + 5;
        !           167:                while (*tptr && !ispunct(*tptr)) tptr++;
        !           168:                if (*tptr) tptr++;
        !           169:                while (isspace(*tptr)) tptr++;
        !           170:                if (*tptr) {
        !           171:                    if (*tptr == '"') {
        !           172:                        tptr++;
        !           173:                        ptr = tptr + strlen(tptr) - 1;
        !           174:                        if (*ptr == '"') *ptr = '\0';
        !           175:                        }
        !           176:                    pager = malloc(strlen(tptr) + 1);
        !           177:                    if (pager != NULL) strcpy(pager, tptr);
        !           178:                    }
        !           179:                }
        !           180:            }
        !           181:        fclose(idfile);
        !           182:        }
        !           183:            
        !           184:     tptr = getenv("LIBNAME");
        !           185:     if (tptr != NULL) strcpy(req_name, tptr);
        !           186:     tptr = getenv("LIBID");
        !           187:     if (tptr != NULL) strcpy(pan, tptr);
        !           188:     tptr = getenv("LIBCNTL");
        !           189:     if (tptr != NULL) strcpy(libcntl, tptr);
        !           190:     tptr = getenv("LIBLOCAL");
        !           191:     if (tptr != NULL) {
        !           192:        if ( (strchr(tptr, 'f') != NULL) || (strchr(tptr, 'F') != NULL))
        !           193:            fprintf(stderr, "Sorry - ask for fiche no longer supported!\n");
        !           194:        if ( (strchr(tptr, 'x') != NULL) || (strchr(tptr, 'X') != NULL))
        !           195:                            expert = 1;
        !           196:        }
        !           197:     /* see if they want a log kept */
        !           198:     tptr = getenv("LIBLOG");
        !           199:     if (tptr != NULL) {
        !           200:            *logf_name = '\0';
        !           201:            if (*tptr != '/') {
        !           202:                strcpy(logf_name, homeptr);
        !           203:                strcat(logf_name, "/");
        !           204:                }
        !           205:            strcat(logf_name, tptr);
        !           206:            }
        !           207:     if (*logf_name != '\0') {
        !           208:        /* careful about the \n on the end of the log file name */
        !           209:        tptr = logf_name + strlen(logf_name) - 1;
        !           210:        if (*tptr == '\n') *tptr = '\0';
        !           211:        /* open up the log file. Note done here to assure that we can */
        !           212:        if ( (logfile = fopen(logf_name, "a+")) == NULL) {
        !           213:            fprintf(stderr, "library: Problems opening log file %s\n", logf_name);
        !           214:            exit(1);
        !           215:            }
        !           216:        }
        !           217:     /* open a temp file for use for the requests */
        !           218:     if (*pan == '\0' || *req_name == '\0') {
        !           219:        printf("Welcome to the library network request service\n");
        !           220:        printf("Use . <period> to exit, break to quit without sending requests.\n");
        !           221:        }
        !           222:     idfile = stdin;
        !           223:     if (!isatty(fileno(stdin)) &&
        !           224:             ((*pan == '\0') || (*req_name == '\0') || (argc < 2))) {
        !           225:        idfile = fopen("/dev/tty", "r");
        !           226:        }
        !           227:     while (*pan == '\0') {
        !           228:        printf("\nEnter AT&T Identification Number (e.g. SS#): ");
        !           229:        fflush(stdout);
        !           230:        if (fgets(instr, 250, idfile) == NULL) {
        !           231:            fprintf(stderr, "Input ended?! Bye.\n");
        !           232:            exit(1);
        !           233:            }
        !           234:        if ((tptr = strchr(instr, '\n')) != NULL) *tptr = '\0';
        !           235:        len = strlen(instr);
        !           236:        if ((*instr == '.') || !len) exit(1);
        !           237:        if ((len<3) || (len > 14)) {
        !           238:            printf("ID must be 3 to 14 characters long. Reenter");
        !           239:            continue;
        !           240:            }
        !           241:        strcpy(pan,instr);
        !           242:        got_id = 1;
        !           243:        }
        !           244: 
        !           245:     while (*req_name == '\0') {
        !           246:        printf("Enter your last name (note LAST):");
        !           247:        fflush(stdout);
        !           248:        if (fgets(instr, 250, idfile) == NULL) {
        !           249:            fprintf(stderr, "Input ended?! Bye.\n");
        !           250:            exit(1);
        !           251:            }
        !           252:        if ((tptr = strchr(instr, '\n')) != NULL) *tptr = '\0';
        !           253:        if (*instr == '.') exit(1);
        !           254:        tptr = instr;
        !           255:        while (*tptr && !isalpha(*tptr) ) tptr++;
        !           256:        if ((strlen(tptr) >= 2) && (strlen(tptr) < 79))
        !           257:            strcpy(req_name, tptr);
        !           258:        else
        !           259:            printf("A name is required!. Reenter\n");
        !           260:        got_name = 1;
        !           261:        }
        !           262: 
        !           263:     /* Save it for them if new entry */
        !           264:     while (got_name || got_id) {
        !           265:        printf("Do you want this personnel data saved (in file $HOME/.lib). Enter y if yes: ");
        !           266:        fflush(stdout);
        !           267:        if (fgets(instr, 250, idfile) == NULL) {
        !           268:            fprintf(stderr, "Input ended?! Bye.\n");
        !           269:            exit(1);
        !           270:            }
        !           271:        if ((*instr == 'y') || (*instr == 'Y')) {
        !           272:            if ((tfile = fopen(libfile, "a")) != NULL) {
        !           273:                if (got_id)
        !           274:                    fprintf(tfile, "id: %s\n", pan);
        !           275:                if (got_name)
        !           276:                    fprintf(tfile, "name: %s\n", req_name);
        !           277:                fclose(tfile);
        !           278:                chmod(libfile, 0600);
        !           279:                }
        !           280:            break;
        !           281:            }
        !           282:        else if (*instr == '?') {
        !           283:            printf("\n\
        !           284: This feature allows you to save the personnel information prompted\n\
        !           285: for above in a file. This will mean that in the future the library\n\
        !           286: command will not ask again for this information, it will get the\n\
        !           287: information from the file \"%s\". Do NOT do this if other\n\
        !           288: people use this login - their orders would be placed in your name.\n\
        !           289: For further information about this feature, or other questions\n\
        !           290: about the library command call 908 582-4840. THank you.\n\n", libfile);
        !           291:            }
        !           292:        else
        !           293:            break;
        !           294:        }
        !           295: 
        !           296:     /* first see if they passed a parm saying what they wanted */
        !           297:     argc--;
        !           298:     argv++;
        !           299:     if (argc > 0 && *argv[0] == '-') {
        !           300:        uppercase(argv[0]);
        !           301:        chrptr = argv[0] + 1;
        !           302:        if ((*chrptr == 'C') || (*chrptr == '4'))
        !           303:                    what = 4;
        !           304:        else if ((*chrptr == 'K') || (*chrptr == '1'))
        !           305:                    what = 1;
        !           306:        else if ((*chrptr == 'P') || (*chrptr == '2'))
        !           307:                    what = 2;
        !           308:        else if ((*chrptr == 'S') || (*chrptr == '3'))
        !           309:                    what = 3;
        !           310:        else if ((*chrptr == 'R') || (*chrptr == '5'))
        !           311:                    what = 5;
        !           312:        else if ((*chrptr == 'I') || (*chrptr == '6'))
        !           313:                    what = 6;
        !           314:        else if ((*chrptr == 'B') || (*chrptr == '7'))
        !           315:                    what = 7;
        !           316:        else {
        !           317:            printf("Illegal parameter passed\n\tk (or 1) = order known item (by number)\n");
        !           318:            printf("\tp (or 2) = order unannounced items\n");
        !           319:            printf("\ts (or 3) = subscribe (or unsubscribe) to a bulletin\n");
        !           320:            printf("\tc (or 4) = AT&T Library Network database search\n");
        !           321:            printf("\tr (or 5) = request human assistance\n");
        !           322:            printf("\ti (or 6) = AT&T Library Network information/document\n");
        !           323:            printf("\tb (or 7) = Read AT&T Library Network Email transmissions\n");
        !           324:            exit(1);
        !           325:            }
        !           326:        argc--;
        !           327:        argv++;
        !           328:        } /* end of specified type as parameter */
        !           329:            
        !           330:     else { /* let them select what they want */
        !           331:       showlist:
        !           332:        printf("\n");
        !           333:        printf("1)  Order by number - this includes nearly everything announced\n");
        !           334:        printf("\tby the AT&T Library Network (e.g. TMs, bulletin items) or handled\n");
        !           335:        printf("\tby the Engineering Information Services (e.g. J docs, CPSs).\n");
        !           336:        printf("\n");
        !           337:        printf("2)  Order item not announced by the AT&T Library Network. Available:\n");
        !           338:        showavail("2.");
        !           339:        printf("\n");
        !           340:        printf("3)  Subscribe or unsubscribe to a bulletin (e.g. Mercury, CTP)\n");
        !           341:        printf("\n");
        !           342:        printf("4)  Submit a database search. Examples of available databases:\n");
        !           343:        printf("\tbook catalog, internal documents, AT&T personnel, released papers\n");
        !           344:        printf("\n");
        !           345:        printf("5)  Request human assistance / interaction. Type(s) available:\n");
        !           346:        showavail("5.");
        !           347:        printf("\n");
        !           348:        printf("6)  Request AT&T Library Network information/services. Examples:\n");
        !           349:        printf("\tLINUS info, products/services descriptions, loan/reserve status\n");
        !           350:        printf("\n");
        !           351:        printf("7)  Read AT&T Library Network email transmissions\n");
        !           352:        printf("\n");
        !           353: 
        !           354: 
        !           355:        while (1) {
        !           356:            printf("Enter number from menu (? for help [? number for specific help]): ");
        !           357:            if (fgets(instr, 250, idfile) == NULL) exit(0);
        !           358:            if (*instr == 'v') {
        !           359:                printf("%s\n", version);
        !           360:                continue;
        !           361:                }
        !           362:            if ((*instr == '.') || (*instr == 'q')) exit(0);
        !           363:            ptr = instr;
        !           364:            what = atoi(ptr);
        !           365:            if (what < 0 || what > 7) {
        !           366:                fprintf(stderr, "Illegal option %d picked. Must be in range 1-6\n", what);
        !           367:                continue;
        !           368:                }
        !           369:            if (what) {
        !           370:                ptr++;
        !           371:                while (*ptr && (*ptr == ' ')) ptr++;
        !           372:                }
        !           373:            if ( (toupper(*ptr) == 'H') || (*ptr == '?') ) {
        !           374:                if (!what) {
        !           375:                    ptr++;
        !           376:                    while (*ptr && (*ptr == ' ')) ptr++;
        !           377:                    what = atoi(ptr);
        !           378:                    }
        !           379:                if ((what > 0) && (what < 8)) {
        !           380:                    sprintf(instr, "%s/option%d.help", WHERE, what);
        !           381:                    if (access(instr, 04) != 0)
        !           382:                        sprintf(instr, "%s/help.option%d", WHERE, what);
        !           383:                    }
        !           384:                else
        !           385:                    sprintf(instr, "%s/library.help", WHERE);
        !           386:                if ((helpfile = fopen(instr, "r")) == NULL) {
        !           387:                    printf("Sorry. Help statement unavailable!\n");
        !           388:                    goto showlist;
        !           389:                    }
        !           390:                while (fgets(instr, 250, helpfile) != NULL)
        !           391:                        fputs(instr, stdout);
        !           392:                fclose(helpfile);
        !           393:                }
        !           394:            else if (!what)
        !           395:                fprintf(stderr, "Sorry - don't understand your input <%s>\n", instr);
        !           396:            else 
        !           397:                break;
        !           398:            }
        !           399:        }
        !           400: 
        !           401:     switch (what) {
        !           402:        case 1: option1(logfile, argc, argv);
        !           403:                break;
        !           404:        case 2: /* Option 2 is a request for an item */
        !           405:                option2(logfile, argc, argv, 2);
        !           406:                break;
        !           407:        case 3: /* a bulletin subscription */
        !           408:                option3(logfile, argc, argv);
        !           409:                break;
        !           410:        case 4: /* a search of the book catalog */
        !           411:                option2(logfile, argc, argv, 4);
        !           412:                break;
        !           413:        case 5: /* option 5 is request for human assistance */
        !           414:                option2(logfile, argc, argv, 5);
        !           415:                break;
        !           416:        case 6: /* a document request */
        !           417:                option2(logfile, argc, argv, 6);
        !           418:                break;
        !           419:        case 7: /* read some bulletin stuff */
        !           420:                reader(logfile, argc, argv);
        !           421:                break;
        !           422:        default: /* error  */
        !           423:                fprintf(stderr, "Program error. Please call it in\n");
        !           424:                exit(1);
        !           425:        }
        !           426: 
        !           427:     /* Just come back in case we need to clean up anything */
        !           428:     exit(0);
        !           429:     }
        !           430: 
        !           431: 
        !           432: void showavail(str)
        !           433: char *str;
        !           434:  {
        !           435:     int i, j;
        !           436:     char filename[60], instr[100], *tptr;
        !           437:     FILE *tfile;
        !           438:     DIR *tdir;
        !           439: 
        !           440:     printf("\t ");
        !           441:     /* use the file names - or W line in the library directory */
        !           442:     if ((tdir = opendir(WHERE)) == NULL) {
        !           443:        printf("No %s directory!!\n", WHERE);
        !           444:        return;
        !           445:        }
        !           446:     i = 0;
        !           447:     j = 9; /* j keeps track of number of characters out */
        !           448:     while (gnamef(tdir, filename) == TRUE) {
        !           449:        if (strncmp(filename, str, strlen(str)) == 0) {
        !           450:            /* check if they say special words what to call it */
        !           451:            sprintf(instr, "%s/%s", WHERE, filename);
        !           452:            if ((tfile = fopen(instr, "r")) == NULL) continue;
        !           453:            if (i++ != 0) printf("; ");
        !           454:            if (fgets(instr, 100, tfile) == NULL) {
        !           455:                fclose(tfile);
        !           456:                continue;
        !           457:                }
        !           458:            if (*instr == 'W') {
        !           459:                tptr = instr+1;
        !           460:                while ((*tptr == ' ') || (*tptr == '\t')) tptr++;
        !           461:                strcpy(instr, tptr);
        !           462:                tptr = instr;
        !           463:                while (*tptr && (*tptr != '\n')) tptr++;
        !           464:                if (*tptr) *tptr = '\0';
        !           465:                if (!strlen(instr)) strcpy(instr, filename+2);
        !           466:                }
        !           467:            else strcpy(instr, filename+2);
        !           468:            fclose(tfile);
        !           469:            if ((strlen(instr) + j) > 74) {
        !           470:                printf("\n\t ");
        !           471:                j = 9;
        !           472:                }
        !           473:            printf("%s", instr);
        !           474:            j += strlen(instr) + 2; /* the +2 counts the semicolon put on */
        !           475:            }
        !           476:        }
        !           477:     if (!i) printf("Nothing");
        !           478:     printf(".\n");
        !           479:     closedir(tdir);
        !           480:     return;
        !           481:     }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.