|
|
researchv10 Dan Cross
/* library:library.c 1.33 */
#include "sccsid.h"
VERSION(@(#)library:library.c 1.33)
/****************** library.c *****************************/
/* This routine accepts requests for any type of document
* for which center 7811 and associated networks are responsible.
*
* Presently accepts requests for:
* document stored at ITDS (e.g. TMs, MFs, SLs)
* Bulletin items
* books
* photo copies of items
* (un)subscribe to bulletins
*/
#include "gnamef.h"
#include <stdio.h>
#include <ctype.h>
#include <signal.h>
char *malloc(), *realloc();
#ifdef MSDOS
char *Cmd="sendfile";
#else
char *Cmd="/bin/mail ";
#endif
char *whereto="library!techlib";
int expert=0;
char libcntl[100], pan[15], req_name[80];
char libfile[120]; /* full path and name of .lib file */
char read_cntl[50]; /* User specified controls of reader function */
char *pager=NULL; /* Pager to use in reading full things in opt7 */
void showavail();
static char *program="@(#) R Waldstein, Dept 78111, general purpose orderer";
static char *version="@(#) library, ordering program, version 3.6++";
#if ( defined SVR4 ) || ( defined MSDOS )
void ordint(int junk)
#else
ordint()
#endif
{
printf("\nInterrupt! No requests sent\n");
exit(0);
}
main(argc, argv)
int argc;
char *argv[];
{
int len, reqint(), what;
int got_name=0, got_id=0;
char instr[250], copy_str[250], *tptr, *chrptr, *homeptr;
char *getenv(), logf_name[120], *strchr(), *ptr, *libptr;
FILE *fopen(), *idfile, *tfile, *logfile, *helpfile;
(void)signal(SIGINT, ordint);
if ((argc == 2) && !strcmp(argv[1], "-v")) {
printf("%s\n", version);
exit(0);
}
/* if they want let them enter info via a an id file */
*pan = '\0';
*req_name = '\0';
*libcntl = '\0';
*read_cntl = *logf_name = '\0';
logfile = NULL;
libptr = getenv("LIBFILE");
homeptr = getenv("HOME");
#ifdef MSDOS
if (libptr == NULL)
strcpy(libfile, "c:/library/library.lib");
else {
#endif
if (libptr != NULL) {
if (*libptr == '/')
strcpy(libfile, libptr);
else {
strcpy(libfile, homeptr);
strcat(libfile, "/");
strcat(libfile, libptr);
}
}
else if (homeptr != NULL) {
strcpy(libfile, homeptr);
strcat(libfile, "/.lib");
}
else
strcpy(libfile, ".lib");
#ifdef MSDOS
}
#endif
if ((idfile = fopen(libfile, "r")) == NULL) {
/* let them use the old .id file */
if ( homeptr != NULL) {
strcpy(instr, homeptr);
strcat(instr, "/.id");
}
else
strcpy(instr, ".id");
idfile = fopen(instr, "r");
if (idfile != NULL) strcpy(libfile, instr);
}
if (idfile != NULL) {
while (fgets(instr, 250, idfile) != NULL) {
if ((tptr = strchr(instr, '\n')) != NULL) *tptr = '\0';
strcpy(copy_str, instr);
uppercase(instr);
if ((strncmp(instr, "NAME", 4) == 0) || (strncmp(instr, "LIBNAME", 7) == 0)) {
tptr = instr + ((*instr == 'L') ? 7 : 4);
while (!isalpha(*tptr) ) tptr++;
if (strlen(tptr) > 79) {
fprintf(stderr, "library: Name <%s> from file unacceptably long! Max is 79 characters!\n", tptr);
exit(1);
}
strcpy(req_name, tptr);
}
else if ((strncmp(instr, "PAN", 3) == 0) || (strncmp(instr, "ID", 2) == 0)) {
tptr = instr + ((*instr == 'P') ? 3 : 2);
while (!isalnum(*tptr)) tptr++;
if (strlen(tptr) > 14) {
fprintf(stderr, "library: ID <%s> from file unacceptably long! Max is 14 characters!\n", tptr);
exit(1);
}
strcpy(pan, tptr);
}
/* see if they want any libcntl info on the request */
else if ((strncmp(instr, "ITDSCNTL", 8) == 0) ||
(strncmp(instr, "CNTL", 4) == 0) || (strncmp(instr, "LIBCNTL", 7) == 0) ) {
tptr = instr + ((*instr == 'C') ? 4 : 7);
if (*instr == 'I') tptr++;
while (!isalnum(*tptr) ) tptr++;
strcpy(libcntl, tptr);
}
/* see if they want any special reader control */
else if (strncmp(instr, "READER", 6) == 0) {
tptr = instr + 6;
while (!isalpha(*tptr) ) tptr++;
strncpy(read_cntl, tptr, 50);
}
/* see if they want any local cntl info for the session */
else if (strncmp(instr, "LIBLOCAL", 8) == 0) {
tptr = instr + 8;
while (!isalpha(*tptr) ) tptr++;
if ( strchr(tptr, 'F') != NULL)
fprintf(stderr, "Sorry - ask for fiche no longer supported!\n");
if ( strchr(tptr, 'X') != NULL) expert = 1;
}
/* see if they want an itds log */
else if ((strncmp(instr, "ITDSLOG", 7) == 0) || (strncmp(instr, "LIBLOG", 6) == 0)) {
tptr = copy_str + ((*instr == 'L') ? 6 : 7);
while ((*tptr != '/') && (*tptr != '.') && !isalnum(*tptr) )
tptr++;
if (*tptr != '/') {
strcpy(logf_name, homeptr);
strcat(logf_name, "/");
}
strcat(logf_name, tptr);
}
else if (!strncmp(instr, "PAGER", 5)) {
tptr = copy_str + 5;
while (*tptr && !ispunct(*tptr)) tptr++;
if (*tptr) tptr++;
while (isspace(*tptr)) tptr++;
if (*tptr) {
if (*tptr == '"') {
tptr++;
ptr = tptr + strlen(tptr) - 1;
if (*ptr == '"') *ptr = '\0';
}
pager = malloc(strlen(tptr) + 1);
if (pager != NULL) strcpy(pager, tptr);
}
}
}
fclose(idfile);
}
tptr = getenv("LIBNAME");
if (tptr != NULL) strcpy(req_name, tptr);
tptr = getenv("LIBID");
if (tptr != NULL) strcpy(pan, tptr);
tptr = getenv("LIBCNTL");
if (tptr != NULL) strcpy(libcntl, tptr);
tptr = getenv("LIBLOCAL");
if (tptr != NULL) {
if ( (strchr(tptr, 'f') != NULL) || (strchr(tptr, 'F') != NULL))
fprintf(stderr, "Sorry - ask for fiche no longer supported!\n");
if ( (strchr(tptr, 'x') != NULL) || (strchr(tptr, 'X') != NULL))
expert = 1;
}
/* see if they want a log kept */
tptr = getenv("LIBLOG");
if (tptr != NULL) {
*logf_name = '\0';
if (*tptr != '/') {
strcpy(logf_name, homeptr);
strcat(logf_name, "/");
}
strcat(logf_name, tptr);
}
if (*logf_name != '\0') {
/* careful about the \n on the end of the log file name */
tptr = logf_name + strlen(logf_name) - 1;
if (*tptr == '\n') *tptr = '\0';
/* open up the log file. Note done here to assure that we can */
if ( (logfile = fopen(logf_name, "a+")) == NULL) {
fprintf(stderr, "library: Problems opening log file %s\n", logf_name);
exit(1);
}
}
/* open a temp file for use for the requests */
if (*pan == '\0' || *req_name == '\0') {
printf("Welcome to the library network request service\n");
printf("Use . <period> to exit, break to quit without sending requests.\n");
}
idfile = stdin;
if (!isatty(fileno(stdin)) &&
((*pan == '\0') || (*req_name == '\0') || (argc < 2))) {
idfile = fopen("/dev/tty", "r");
}
while (*pan == '\0') {
printf("\nEnter AT&T Identification Number (e.g. SS#): ");
fflush(stdout);
if (fgets(instr, 250, idfile) == NULL) {
fprintf(stderr, "Input ended?! Bye.\n");
exit(1);
}
if ((tptr = strchr(instr, '\n')) != NULL) *tptr = '\0';
len = strlen(instr);
if ((*instr == '.') || !len) exit(1);
if ((len<3) || (len > 14)) {
printf("ID must be 3 to 14 characters long. Reenter");
continue;
}
strcpy(pan,instr);
got_id = 1;
}
while (*req_name == '\0') {
printf("Enter your last name (note LAST):");
fflush(stdout);
if (fgets(instr, 250, idfile) == NULL) {
fprintf(stderr, "Input ended?! Bye.\n");
exit(1);
}
if ((tptr = strchr(instr, '\n')) != NULL) *tptr = '\0';
if (*instr == '.') exit(1);
tptr = instr;
while (*tptr && !isalpha(*tptr) ) tptr++;
if ((strlen(tptr) >= 2) && (strlen(tptr) < 79))
strcpy(req_name, tptr);
else
printf("A name is required!. Reenter\n");
got_name = 1;
}
/* Save it for them if new entry */
while (got_name || got_id) {
printf("Do you want this personnel data saved (in file $HOME/.lib). Enter y if yes: ");
fflush(stdout);
if (fgets(instr, 250, idfile) == NULL) {
fprintf(stderr, "Input ended?! Bye.\n");
exit(1);
}
if ((*instr == 'y') || (*instr == 'Y')) {
if ((tfile = fopen(libfile, "a")) != NULL) {
if (got_id)
fprintf(tfile, "id: %s\n", pan);
if (got_name)
fprintf(tfile, "name: %s\n", req_name);
fclose(tfile);
chmod(libfile, 0600);
}
break;
}
else if (*instr == '?') {
printf("\n\
This feature allows you to save the personnel information prompted\n\
for above in a file. This will mean that in the future the library\n\
command will not ask again for this information, it will get the\n\
information from the file \"%s\". Do NOT do this if other\n\
people use this login - their orders would be placed in your name.\n\
For further information about this feature, or other questions\n\
about the library command call 908 582-4840. THank you.\n\n", libfile);
}
else
break;
}
/* first see if they passed a parm saying what they wanted */
argc--;
argv++;
if (argc > 0 && *argv[0] == '-') {
uppercase(argv[0]);
chrptr = argv[0] + 1;
if ((*chrptr == 'C') || (*chrptr == '4'))
what = 4;
else if ((*chrptr == 'K') || (*chrptr == '1'))
what = 1;
else if ((*chrptr == 'P') || (*chrptr == '2'))
what = 2;
else if ((*chrptr == 'S') || (*chrptr == '3'))
what = 3;
else if ((*chrptr == 'R') || (*chrptr == '5'))
what = 5;
else if ((*chrptr == 'I') || (*chrptr == '6'))
what = 6;
else if ((*chrptr == 'B') || (*chrptr == '7'))
what = 7;
else {
printf("Illegal parameter passed\n\tk (or 1) = order known item (by number)\n");
printf("\tp (or 2) = order unannounced items\n");
printf("\ts (or 3) = subscribe (or unsubscribe) to a bulletin\n");
printf("\tc (or 4) = AT&T Library Network database search\n");
printf("\tr (or 5) = request human assistance\n");
printf("\ti (or 6) = AT&T Library Network information/document\n");
printf("\tb (or 7) = Read AT&T Library Network Email transmissions\n");
exit(1);
}
argc--;
argv++;
} /* end of specified type as parameter */
else { /* let them select what they want */
showlist:
printf("\n");
printf("1) Order by number - this includes nearly everything announced\n");
printf("\tby the AT&T Library Network (e.g. TMs, bulletin items) or handled\n");
printf("\tby the Engineering Information Services (e.g. J docs, CPSs).\n");
printf("\n");
printf("2) Order item not announced by the AT&T Library Network. Available:\n");
showavail("2.");
printf("\n");
printf("3) Subscribe or unsubscribe to a bulletin (e.g. Mercury, CTP)\n");
printf("\n");
printf("4) Submit a database search. Examples of available databases:\n");
printf("\tbook catalog, internal documents, AT&T personnel, released papers\n");
printf("\n");
printf("5) Request human assistance / interaction. Type(s) available:\n");
showavail("5.");
printf("\n");
printf("6) Request AT&T Library Network information/services. Examples:\n");
printf("\tLINUS info, products/services descriptions, loan/reserve status\n");
printf("\n");
printf("7) Read AT&T Library Network email transmissions\n");
printf("\n");
while (1) {
printf("Enter number from menu (? for help [? number for specific help]): ");
if (fgets(instr, 250, idfile) == NULL) exit(0);
if (*instr == 'v') {
printf("%s\n", version);
continue;
}
if ((*instr == '.') || (*instr == 'q')) exit(0);
ptr = instr;
what = atoi(ptr);
if (what < 0 || what > 7) {
fprintf(stderr, "Illegal option %d picked. Must be in range 1-6\n", what);
continue;
}
if (what) {
ptr++;
while (*ptr && (*ptr == ' ')) ptr++;
}
if ( (toupper(*ptr) == 'H') || (*ptr == '?') ) {
if (!what) {
ptr++;
while (*ptr && (*ptr == ' ')) ptr++;
what = atoi(ptr);
}
if ((what > 0) && (what < 8)) {
sprintf(instr, "%s/option%d.help", WHERE, what);
if (access(instr, 04) != 0)
sprintf(instr, "%s/help.option%d", WHERE, what);
}
else
sprintf(instr, "%s/library.help", WHERE);
if ((helpfile = fopen(instr, "r")) == NULL) {
printf("Sorry. Help statement unavailable!\n");
goto showlist;
}
while (fgets(instr, 250, helpfile) != NULL)
fputs(instr, stdout);
fclose(helpfile);
}
else if (!what)
fprintf(stderr, "Sorry - don't understand your input <%s>\n", instr);
else
break;
}
}
switch (what) {
case 1: option1(logfile, argc, argv);
break;
case 2: /* Option 2 is a request for an item */
option2(logfile, argc, argv, 2);
break;
case 3: /* a bulletin subscription */
option3(logfile, argc, argv);
break;
case 4: /* a search of the book catalog */
option2(logfile, argc, argv, 4);
break;
case 5: /* option 5 is request for human assistance */
option2(logfile, argc, argv, 5);
break;
case 6: /* a document request */
option2(logfile, argc, argv, 6);
break;
case 7: /* read some bulletin stuff */
reader(logfile, argc, argv);
break;
default: /* error */
fprintf(stderr, "Program error. Please call it in\n");
exit(1);
}
/* Just come back in case we need to clean up anything */
exit(0);
}
void showavail(str)
char *str;
{
int i, j;
char filename[60], instr[100], *tptr;
FILE *tfile;
DIR *tdir;
printf("\t ");
/* use the file names - or W line in the library directory */
if ((tdir = opendir(WHERE)) == NULL) {
printf("No %s directory!!\n", WHERE);
return;
}
i = 0;
j = 9; /* j keeps track of number of characters out */
while (gnamef(tdir, filename) == TRUE) {
if (strncmp(filename, str, strlen(str)) == 0) {
/* check if they say special words what to call it */
sprintf(instr, "%s/%s", WHERE, filename);
if ((tfile = fopen(instr, "r")) == NULL) continue;
if (i++ != 0) printf("; ");
if (fgets(instr, 100, tfile) == NULL) {
fclose(tfile);
continue;
}
if (*instr == 'W') {
tptr = instr+1;
while ((*tptr == ' ') || (*tptr == '\t')) tptr++;
strcpy(instr, tptr);
tptr = instr;
while (*tptr && (*tptr != '\n')) tptr++;
if (*tptr) *tptr = '\0';
if (!strlen(instr)) strcpy(instr, filename+2);
}
else strcpy(instr, filename+2);
fclose(tfile);
if ((strlen(instr) + j) > 74) {
printf("\n\t ");
j = 9;
}
printf("%s", instr);
j += strlen(instr) + 2; /* the +2 counts the semicolon put on */
}
}
if (!i) printf("Nothing");
printf(".\n");
closedir(tdir);
return;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.