Annotation of cci/usr/src/usr.bin/bsc/cmd/batch/bscbatch.c, revision 1.1

1.1     ! root        1: /*     D.L.Buck and Associates, Inc. - 8/27/84
        !             2:  *
        !             3:  *     COPYRIGHT NOTICE:
        !             4:  *             Copyright c 8/27/84 - An unpublished work by 
        !             5:  *             D.L.Buck and Associates, Inc.
        !             6:  *
        !             7:  *     PROPRIETARY RIGHTS NOTICE:
        !             8:  *             All rights reserved. This document and program contains
        !             9:  *             proprietary information of D.L.Buck and Associates,Inc.
        !            10:  *             of San Jose, California, U.S.A., embodying confidential
        !            11:  *             information,  ideas, and expressions,  no part of which
        !            12:  *             may be reproduced, or transmitted in any form or by any
        !            13:  *             means,  electronic,  mechanical,  or otherwise, without
        !            14:  *             the written permission of D.L.Buck and Associates, Inc.
        !            15:  *
        !            16:  * NAME
        !            17:  *     bscbatch - BISYNC batch job submission and query
        !            18:  *
        !            19:  * SYNOPSIS
        !            20:  *     bscbatch [-to=hostname] [-copy] [-mail] [-transp] [file ... ]
        !            21:  *     bscbatch -q[=hostname] [-t=hh[mm]] [-l=lines]
        !            22:  *
        !            23:  * DESCRIPTION
        !            24:  *     bscbatch submits files to the BISYNC daemon (bscd) for transmission to
        !            25:  *     a host, and searches among files received from a specific host for a
        !            26:  *     particular user.
        !            27:  *
        !            28:  * ALGORITHM
        !            29:  *     I.Initialize:
        !            30:  *             A. set default values
        !            31:  *             B. get user id from /etc/passwd
        !            32:  *             C. get current directory's path name
        !            33:  *             D. get command line options
        !            34:  *             E. if queuing operation
        !            35:  *                     1. get host parameters
        !            36:  *                     2. check command line options against host parameters
        !            37:  *     II. If queuing operation:
        !            38:  *             A. open AUDIT file (if audit trail is being kept)
        !            39:  *             B. if command line is exhausted:
        !            40:  *                     1. get file to queue from stdin
        !            41:  *                     2. make "C" (queue control) file name
        !            42:  *                     3. make "D" (file copy) file name
        !            43:  *                     4. make a copy of stdin file in "D" file name
        !            44:  *                     5. make the queue control file
        !            45:  *             C. if command line isn't exhausted:
        !            46:  *                     1. while not at end of command line:
        !            47:  *                             a. make sure file's name is full path name
        !            48:  *                             b. check that it exists
        !            49:  *                             c. make "C" (queue control) file name
        !            50:  *                             d. if -copy option set:
        !            51:  *                                     i. make "D" (file copy) file name
        !            52:  *                                    ii. make a copy of file in "D" file name
        !            53:  *                             e. make the queue control file
        !            54:  *             D. if an audit trail is being kept:
        !            55:  *                     1. close the audit file
        !            56:  *    III. If query operation:
        !            57:  *             A. change to host spool directory
        !            58:  *             B. open host spool directory
        !            59:  *             C. while not finished reading directory and file read has
        !            60:  *                an inode > 0:
        !            61:  *                     1. if file's name has PR or PU in it (print or punch
        !            62:  *                        file):
        !            63:  *                             a. if -age parameter was set:
        !            64:  *                                     i. get file's age
        !            65:  *                                    ii. if file's age < age wanted:
        !            66:  *                                             continue
        !            67:  *                             b. open file
        !            68:  *                             c. display file's name, when it was received,
        !            69:  *                                and its size
        !            70:  *                             d. while lines displayed <= -lines parameter:
        !            71:  *                                     i. display a line from the file,
        !            72:  *                                        one character at a time; if
        !            73:  *                                        character isn't printable, display
        !            74:  *                                        it in hex, enclosed in angular
        !            75:  *                                        brackets (<%x>).
        !            76:  *                             e. close the file
        !            77:  *                             f. display "Rename? (Y/N): " message
        !            78:  *                             g. get reply
        !            79:  *                             h. if Y, get user's input for renamimg
        !            80:  *                                     i. try to open new name
        !            81:  *                                    ii. if new name is an existing file,
        !            82:  *                                        let user choose whether or not to
        !            83:  *                                        overwrite it
        !            84:  *                                   iii. if not an existing file, or okay to
        !            85:  *                                        overwrite, use system call ("mv")
        !            86:  *                                        to rename the file
        !            87:  *                             i. display "Press Return to Continue" message
        !            88:  *             D. close directory
        !            89:  */
        !            90: 
        !            91: #include <stdio.h>
        !            92: #include <pwd.h>
        !            93: #include <sys/types.h>
        !            94: #include <sys/dir.h>
        !            95: #include <sys/stat.h>
        !            96: #include <ctype.h>
        !            97: #include "local.h"
        !            98: #if defined BSD42
        !            99: #include <sys/time.h>
        !           100: #else
        !           101: #include <time.h>
        !           102: #endif
        !           103: 
        !           104: #define YES 1
        !           105: #define NO 0
        !           106: #define PATH "/usr/spool/bscbatch/"
        !           107: #define LIB "/usr/lib/bscbatch/"
        !           108: 
        !           109: #ifndef lint
        !           110: static char sccsid[] = "@(#)bscbatch.c 1.14 REL";
        !           111: #endif
        !           112: 
        !           113: int mail = NO;         /* send mail only if problems occur */
        !           114: int copy = NO;         /* copy file to send before sending? */
        !           115: int transp = NO;       /* can host receive transparent data? */
        !           116: int delete = NO;       /* delete file after sending? */
        !           117: int queue = YES;       /* queuing or query mode? */
        !           118: int lines;             /* number of lines to display in query mode */
        !           119: int pid;               /* contains process id for this process; used to
        !           120:                           give unique names to control and copy files */
        !           121: int alpha_ctr;         /* alpha array index; unique letter is part of control
        !           122:                           and copy file names */
        !           123: int age;               /* hhmm ; minimum age of received files to display */
        !           124: int host_transp = YES; /* can host receive transp data? */
        !           125: 
        !           126: long atol();           /* function converts ascii to long */
        !           127: long minspace;         /* minimum free blocks required to receive host
        !           128:                           files or copy files to be sent */
        !           129: long freespace;                /* # of free blocks left on file system /u */
        !           130: long time();           /* function returns current time */
        !           131: 
        !           132: FILE *fopen();         /* function opens files */
        !           133: FILE *fptr;            /* fopen's all-purpose file pointer */
        !           134: FILE *popen();         /* function creates a pipe between bscbatch and a
        !           135:                           command to be submitted to the shell for execution.
        !           136:                           It returns a stream pointer which can be used to
        !           137:                           read from the command's standard output or write to
        !           138:                           its standard input. In bscbatch, it'll be used to
        !           139:                           read in the # of free blocks available, returned by
        !           140:                           the df command. */
        !           141: FILE *pptr;            /* the pointer returned by popen */
        !           142: FILE *aud;             /* the AUDIT file pointer */
        !           143: 
        !           144: char *strcpy();                /* copies strings into specified vars */
        !           145: char *index();         /* returns a pointer to positions of specified string
        !           146:                           in specified variable */
        !           147: char *pos;             /* pointer that index returns */
        !           148: char *devptr;          /* use to get device for doing minspace check on */
        !           149: char *strcat();                /* concatenate function */
        !           150: char *gets();          /* get a string from stdin */
        !           151: void exit();
        !           152: 
        !           153: char line[300];                /* all-purpose string recepticle */
        !           154: char dname[15];                /* contains name of device for minspace check */
        !           155: char sys_string[50];   /* construct commands to submit to the shell via the
        !           156:                           system command in here */
        !           157: char pwd[50];          /* contains pathname to this directory */
        !           158: char path[50];         /* contains host spool directory pathname */
        !           159: 
        !           160: char alpha[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /* index string for unique
        !           161:                                                   spool file names */
        !           162: char *user;            /* contains user name */
        !           163: char hostname[20];     /* contains host name */
        !           164: char libpath[50];      /* path to host's configuration file */
        !           165: 
        !           166: struct stat s;         /* returns pointer to stat structure */
        !           167: 
        !           168: main(argc,argv)
        !           169: int argc;
        !           170: char *argv[];
        !           171: {
        !           172:        int i = 0;                      /* convenient index */
        !           173: 
        !           174:        struct passwd *getpwuid();      /* function returns a pointer to a
        !           175:                                           structure containing /etc/passwd 
        !           176:                                           data */
        !           177:        struct passwd *uid;             /* pointer that getpwuid() returns */
        !           178:        char *getlogin();               /* returns pointer to the login name */
        !           179: /* set default values */
        !           180:        strcpy(hostname,"default");             /* host default */
        !           181: 
        !           182: /* get user id number from /etc/passwd file. getlogin() returns
        !           183:    a pointer to the login name in user; getpwuid returns a pointer to the
        !           184:    structure containing the broken-out field of the login name's entry in
        !           185:    /etc/passwd */
        !           186:        user = getlogin();
        !           187:        if (user == NULL) {
        !           188:                if ((uid = getpwuid(getuid())) == NULL) {
        !           189:                        fprintf(stderr,"bscbatch: don't know who you are!\n");
        !           190:                        exit(1);
        !           191:                }
        !           192:                user = uid->pw_name;
        !           193:        }
        !           194: 
        !           195: /* get this directory's pathname */
        !           196:        fptr = popen("pwd","r");
        !           197:        fgets(pwd,sizeof pwd-1,fptr);
        !           198:        pwd[strlen(pwd)-1] = '\0';
        !           199: 
        !           200: /* get options from command line */
        !           201:        while (++i < argc && argv[i][0] == '-') {
        !           202:        /* copy option -- if this is YES, a copy of the file to be transmitted
        !           203:           is to be made. That copy will be transmitted to the host, rather
        !           204:           than the original. */
        !           205:                if (strcmp(argv[i],"-copy") == 0)       {
        !           206:                        copy = YES;
        !           207:                        continue;
        !           208:                }
        !           209: 
        !           210:        /* mail option -- if this is YES, user is to receive mail whether
        !           211:           transmission was successful or not */
        !           212:                if (strcmp(argv[i],"-mail") == 0)       {
        !           213:                        mail = YES;
        !           214:                        continue;
        !           215:                }
        !           216: 
        !           217:        /* transparent mode option */
        !           218:                if (strcmp(argv[i],"-transp") == 0)     {
        !           219:                        transp = YES;
        !           220:                        continue;
        !           221:                }
        !           222: 
        !           223:        /* time option */
        !           224:                if(strncmp(argv[i],"-t=",3) == 0)       {
        !           225:                        if (argv[i][3] >= '0' && argv[i][3] <= '9')
        !           226:                                age = atoi(&argv[i][3]);
        !           227:                        else    {
        !           228:                                fprintf(stderr,
        !           229:                                "bscbatch: not a number <%s>\n",argv[i]);
        !           230:                                exit(1);
        !           231:                        }
        !           232:                        if (age < 100)
        !           233:                                age *= 100;
        !           234:                        continue;
        !           235:                }
        !           236: 
        !           237:        /* number of lines to display while searching (lines option) */
        !           238:                if (strncmp(argv[i],"-l=",3) == 0)      {
        !           239:                        if (argv[i][3] >= '0' && argv[i][3] <= '9')
        !           240:                                lines = atoi(&argv[i][3]);
        !           241:                        else    {
        !           242:                                fprintf(stderr,
        !           243:                                "bscbatch: not a number <%s>\n",argv[i]);
        !           244:                                exit(1);
        !           245:                        }
        !           246:                        continue;
        !           247:                }
        !           248:        
        !           249:        /* host to queue files for, or query spool directory of */
        !           250:                if (strncmp(argv[i],"-to",3) == 0 ||
        !           251:                    strncmp(argv[i],"-q",2) == 0)       {
        !           252:                        if ((pos=index(argv[i],'=')) != NULL)   {
        !           253:                                ++pos;
        !           254:                                strcpy(hostname,pos);
        !           255:                        }
        !           256:                        queue = (strncmp(argv[i],"-q",2)==0)?NO:YES;
        !           257:                        continue;
        !           258:                }
        !           259: 
        !           260:        /* if this is a flag, it's gotta be an unrecognized one */
        !           261:                if (argv[i][0] == '-')  {
        !           262:                        fprintf(stderr,
        !           263:                        "bscbatch: unrecognized option <%s>\n",argv[i]);
        !           264:                        exit(1);
        !           265:                }
        !           266:        }
        !           267: 
        !           268: /* check that all flags are valid with the option chosen */
        !           269:        if (!queue && (copy || mail || transp)) {
        !           270:                fprintf(stderr,
        !           271:        "bscbatch: options -copy, -mail, and -transp can't be used with -q\n");
        !           272:                exit(1);
        !           273:        }
        !           274: 
        !           275:        if (queue && (lines || age))    {
        !           276:                fprintf(stderr,
        !           277:                        "bscbatch: options -l and -t can't be used with -to\n");
        !           278:                exit(1);
        !           279:        }
        !           280: /* set-up host options/parameters */
        !           281:        set_host();
        !           282: 
        !           283: /* do queuing or query */
        !           284:        queue?do_queue(argc,i,argv):do_query();
        !           285: }
        !           286: 
        !           287: /* process a file */
        !           288: char audname[80];      /* temp audit pathname goes here */
        !           289: char new_audnm[80];    /* real audit pathname goes here */
        !           290: char auditlock[80];    /* audit lockfile name goes here */
        !           291: 
        !           292: do_queue(args,i,argv)
        !           293: int args,i;
        !           294: char *argv[];
        !           295: {
        !           296:        FILE *cptr;             /* fopen's general purpose file pointer */
        !           297: 
        !           298:        char fname[100];        /* contains the full data file name */
        !           299:        char cpyname[100];      /* contains the "D" file name for copy */
        !           300:        char ctlname[100];      /* queue control file name */
        !           301: 
        !           302: 
        !           303:        pid = getpid();         /* get process id and put in pid */
        !           304: 
        !           305: /* open the audit file; if unable to, audit trail not being kept */
        !           306:        sprintf(audname,"%s/%s",path,"AUDIT");
        !           307:        if (access(audname,0) >= 0)     {
        !           308:                sprintf(auditlock,"%s/%s",path,"auditlock");
        !           309:                if (creat(auditlock,0) < 0)
        !           310:                        bsc_audnm();
        !           311:                else
        !           312:                        aud = fopen(audname,"a");
        !           313:        }
        !           314: 
        !           315:        if (i>=args)    /* command line used up; get files from stdin */
        !           316:        {
        !           317:                cptr = stdin;
        !           318:                sprintf(ctlname,"%s/C%c%d",path,alpha[alpha_ctr],pid);
        !           319: 
        !           320:                /* make a copy of stdin in D<alpha><process_id> */
        !           321:                sprintf(cpyname,"%s/D%c%d",path,alpha[alpha_ctr],pid);
        !           322:                delete = YES;
        !           323:                do_copy(cptr,cpyname);
        !           324:                mkctl(mail,transp,delete,cpyname,ctlname);
        !           325:        }
        !           326:        else
        !           327:        {
        !           328:                for (;i<args;++i)
        !           329:                {
        !           330:                        if(argv[i][0] != '/')
        !           331:                                sprintf(fname,"%s/%s",pwd,argv[i]);
        !           332:                        else
        !           333:                                strcpy(fname,argv[i]);
        !           334: 
        !           335:                        if ((cptr = fopen(fname,"r")) == NULL)
        !           336:                        {       fprintf(stderr,
        !           337:                                "bscbatch: file <%s> not found\n",fname);
        !           338:                                continue;
        !           339:                        }
        !           340: 
        !           341:                        sprintf(ctlname,"%s/C%c%d",path,alpha[alpha_ctr],pid);
        !           342:                        if (copy)
        !           343:                        {       sprintf(cpyname,"%s/D%c%d",path,alpha[alpha_ctr],pid);
        !           344:                                delete = YES;
        !           345:                                do_copy(cptr,cpyname);
        !           346:                                strcpy(fname,cpyname);
        !           347:                        }
        !           348:                        mkctl(mail,transp,delete,fname,ctlname);
        !           349:                        fclose(cptr);
        !           350:                        delete = NO;
        !           351:                        ++alpha_ctr;
        !           352:                }
        !           353:        }
        !           354: 
        !           355:        go_away();
        !           356: }
        !           357: 
        !           358: /* do clean-up type stuff and go away */
        !           359: go_away()
        !           360: {
        !           361:        if (aud != NULL)        {
        !           362:                fclose(aud);
        !           363:                if (link(audname,new_audnm) >= 0)
        !           364:                        unlink(audname);
        !           365:                else
        !           366:                        unlink(auditlock);
        !           367:        }
        !           368:        exit(1);
        !           369: }
        !           370: 
        !           371: /* query: display all PR and PU files which are in this directory */
        !           372: do_query()
        !           373: {
        !           374: #if defined BSD42
        !           375:        DIR *fd;                /* Spool Directory                      */
        !           376:        struct direct *d;       /* Ptr to Spool directory entry         */
        !           377: #else
        !           378:        int fd;                 /* Spool Directory                      */
        !           379:        struct direct d;        /* Spool Directory Entry                */
        !           380: #endif
        !           381:        int cctr = 0;           /* count # of chars on this line so far */
        !           382:        int c;                  /* temp place in which to test *lptr for
        !           383:                                   isprint and isspace */
        !           384:        int counter = 0;        /* tracks lines already displayed */
        !           385:        int fage;               /* age of file to display */
        !           386:        long fday,currday;
        !           387:        register char *lptr;    /* for displaying one char at a time */
        !           388: 
        !           389:        struct stat t;          /* function returns a structure which
        !           390:                                   contains the inode data for the specified
        !           391:                                   file. */
        !           392:        struct tm *lt,*localtime();
        !           393: 
        !           394:        char tstring[21];       /* results of ctime go in here */
        !           395:        char ans[20];           /* all-purpose answer place */
        !           396:        char *ctime();
        !           397: 
        !           398:        /* change to directory */
        !           399:        chdir(path);
        !           400: 
        !           401:        /* open it */
        !           402: #if defined BSD42
        !           403: #define        DNAME   d->d_name
        !           404:        fd = opendir(".");
        !           405:        while ((d = readdir(fd)) != NULL) {
        !           406: #else
        !           407: #define        DNAME   d.d_name
        !           408:        fd = open(".",0);
        !           409:        while (read(fd,&d,sizeof d) == sizeof d) {
        !           410:                if (d.d_ino == 0)
        !           411:                        continue;
        !           412: #endif
        !           413: 
        !           414:                if (strncmp(DNAME,"PR",2) == 0 ||
        !           415:                    strncmp(DNAME,"PU",2) == 0)
        !           416:                {
        !           417:                        stat(DNAME,&t);
        !           418:                        if (age) {
        !           419:                                lt = localtime(&t.st_ctime);
        !           420:                                fage = ((lt->tm_hour) * 100) + (lt->tm_min);
        !           421: 
        !           422:                                fday = ((lt->tm_mon) *100L) + (lt->tm_mday);
        !           423:                                lt = localtime((long*)0);
        !           424:                                currday = ((lt->tm_mon) * 100L) + (lt->tm_mday);
        !           425:                                if (fage < age)
        !           426:                                        continue;
        !           427:                        }
        !           428:                /* set default number of lines to display if none specified */
        !           429:                        if (!lines) lines = 20;
        !           430:                        
        !           431:                        if ((fptr = fopen(DNAME,"r")) == NULL)
        !           432:                        {       fprintf(stderr,
        !           433:                                "bscbatch: can't open <%s/%s>\n",
        !           434:                                path,DNAME);
        !           435:                                exit(1);        }
        !           436: 
        !           437:                        strcpy(tstring,ctime(&t.st_ctime));
        !           438:                        tstring[19] = '\0';
        !           439: 
        !           440:                        /* display file name */
        !           441:                        fprintf(stdout,
        !           442:                        ">>>>> File: %s/%s <<<<<\n",path,DNAME);
        !           443:                        fprintf(stdout,
        !           444:                        ">>>>> Received: %s ..... Size: %ld bytes <<<<<\n",
        !           445:                          tstring,t.st_size);
        !           446:                        while(fgets(line,sizeof line-1,fptr) != NULL && 
        !           447:                                counter < lines)        {
        !           448:                        /* display lines from file, one character at a time;
        !           449:                           skip line[0] and line[1] if line[0] is ESC; means
        !           450:                           a special print instruction is at line[1]. Print
        !           451:                           no more than 80 characters on a line. If character 
        !           452:                           isn't printable, display it in hex enclosed in 
        !           453:                           angular brackets. */
        !           454:                                lptr = &line[0];
        !           455:                                if (line[0] == '\033' ) /* 033 is ESC */
        !           456:                                        lptr = &line[2];
        !           457:                                while (*lptr != '\n' && cctr < 80)      {
        !           458:                                        c = *lptr;
        !           459:                                        if (!isprint(c) && !isspace(c)) {
        !           460:                                                c &= 0xff;
        !           461:                                                printf("<%x>",c);
        !           462:                                        }
        !           463:                                        else
        !           464:                                                putc(*lptr,stdout);
        !           465:                                        ++lptr;
        !           466:                                        ++cctr;
        !           467:                                }
        !           468:                                putc('\n',stdout);
        !           469:                                cctr = 0;
        !           470:                                ++counter;
        !           471:                        }
        !           472:                        
        !           473:                        fclose(fptr);
        !           474: 
        !           475:                        /* get response from user before continuing */
        !           476:                        fputs("\n>>>> Rename? (Y/N) :",stdout);
        !           477:                        gets(ans);
        !           478:                        if (ans[0] == 'Y' || ans[0] == 'y')
        !           479:                                rename(DNAME);
        !           480:                        fputs("\n>>>> Press RETURN to continue <<<<",stdout);
        !           481:                        getc(stdin);
        !           482: 
        !           483:                        counter = 0;
        !           484:                }
        !           485:        }
        !           486: #if defined BSD42
        !           487:        closedir(fd);
        !           488: #else
        !           489:        close(fd);              /* close directory */
        !           490: #endif
        !           491: }
        !           492: 
        !           493: /* rename -- rename a received file */
        !           494: rename(oldname)
        !           495: char *oldname;
        !           496: {
        !           497:        FILE *nptr;             /* new file's file pointer */
        !           498:        char testnm[80];        /* get new file name here */
        !           499:        char newname[80];       /* new name for received file built here */
        !           500:        char systr[100];        /* string to submit to shell for execution */
        !           501:        char ans[20];           /* all-purpose reply variable */
        !           502: 
        !           503:        fputs("\n>>>> Enter New File Name: ",stdout);
        !           504:        gets(testnm);
        !           505: 
        !           506:        if (testnm[0] != '/')   /* put file into user's original directory */
        !           507:                sprintf(newname,"%s/%s",pwd,testnm);
        !           508:        else
        !           509:                strcpy(newname, testnm);
        !           510: 
        !           511: /* try to open newname; if you can, warn the user */
        !           512:        if ((nptr = fopen(newname,"r")) != NULL)        {
        !           513:                fclose(nptr);
        !           514:                fprintf(stderr,"bscbatch: file <%s> exists\n",newname);
        !           515:                fputs("Overwrite? (Y/N): ",stdout);
        !           516:                gets(ans);
        !           517:                if (ans[0] == 'N' || ans[0] == 'n')
        !           518:                        return;
        !           519:        }
        !           520: 
        !           521:        sprintf(systr,"mv %s %s\n",oldname,newname);
        !           522:        fprintf(stdout, "\n>>>> Verify move %s to %s (y/n): ", oldname,newname);
        !           523:        gets(ans);
        !           524:        if (ans[0] == 'y' || ans[0] == 'Y')
        !           525:                system(systr);
        !           526:        
        !           527:        return;
        !           528: }
        !           529: 
        !           530: /* create queue control files */
        !           531: mkctl(ml,trnsp,del,fname,ctlname)
        !           532: int ml,trnsp,del;
        !           533: char fname[],ctlname[];
        !           534: {
        !           535:        FILE *ctlptr;
        !           536:        char cline[50];
        !           537:        char msg[100];          /* message going into audit file */
        !           538: 
        !           539:        long time();
        !           540:        long currtime;
        !           541: 
        !           542:        struct tm *t;
        !           543:        struct tm *localtime();
        !           544: 
        !           545: /* all files queued during this session will have the same process id number
        !           546:    attached to their q-ctl names; use letters of the alphabet to make each
        !           547:    name unique if open for write not allowed because file name already exists */
        !           548:        do
        !           549:                sprintf(ctlname,"%s/C%c%d",path,alpha[alpha_ctr],pid);
        !           550:        while ((ctlptr = fopen(ctlname,"w")) == NULL && alpha_ctr < 26);
        !           551: 
        !           552:        if (ctlptr == NULL)
        !           553:        {       fprintf(stderr,
        !           554:                        "bscbatch: can't create <%s>\n",ctlname);       
        !           555:                        go_away();
        !           556:        }
        !           557:        
        !           558:        sprintf(msg,"Queued <%s>, option(s):   ",fname);
        !           559: 
        !           560: /* mail option set -- force mail to be sent to user when file successfully
        !           561:    transmitted */
        !           562:        if (ml)
        !           563:        {       sprintf(cline,"M=%s\n",user);
        !           564:                fputs(cline,ctlptr);
        !           565:                strcat(msg,"<mail> ");
        !           566:        }
        !           567:        
        !           568: /* transp option set -- force file to be sent in transparent mode */
        !           569:        if (trnsp)
        !           570:        {       sprintf(cline,"T %s\n",fname);
        !           571:                fputs(cline,ctlptr);
        !           572:                strcat(msg,"<transparent> ");
        !           573:        }
        !           574:        
        !           575:        else
        !           576:        {       sprintf(cline,"S %s\n",fname);
        !           577:                fputs(cline,ctlptr);
        !           578:        }
        !           579:        
        !           580:        if (del)
        !           581:        {       sprintf(cline,"D %s\n",fname);
        !           582:                fputs(cline,ctlptr);
        !           583:                strcat(msg,"<copy> ");
        !           584:        }
        !           585: 
        !           586: /* update the audit file if audit trail being kept */
        !           587:        if (aud)        {
        !           588:                if (!transp && !mail && !copy && !del)
        !           589:                        strcat(msg," <none>");
        !           590:                
        !           591:                currtime = time((long *)0);
        !           592:                t = localtime(&currtime);
        !           593: 
        !           594:                fprintf(aud,
        !           595:                "%s %s %02d%02d%02d%02d%02d %s\n",
        !           596:                user,"Q",t->tm_year,(t->tm_mon)+1,
        !           597:                t->tm_mday,t->tm_hour,t->tm_min,msg);
        !           598:        }
        !           599:        
        !           600:        fclose(ctlptr);
        !           601: }
        !           602: 
        !           603: /* create a copy of the file to send */
        !           604: do_copy(fileptr,cpyname)
        !           605: FILE *fileptr;
        !           606: char cpyname[];
        !           607: {
        !           608:        FILE *dptr;
        !           609: 
        !           610:        char cline[100];
        !           611: 
        !           612:        if ((dptr = fopen(cpyname,"w")) == NULL)
        !           613:        {       fprintf(stderr,
        !           614:                        "bscbatch: can't create <%s>\n",cpyname);
        !           615:                go_away();
        !           616:        }
        !           617: 
        !           618:        while (fgets(cline,100,fileptr) != NULL)
        !           619:                fputs(cline,dptr);
        !           620: 
        !           621:        fclose(dptr);
        !           622: }
        !           623: 
        !           624: /* set_host() - do host set-up and option/parameter checking */
        !           625: set_host()
        !           626: {
        !           627:        int linect = 0;                 /* keeps track of line being read
        !           628:                                           from host config file */
        !           629: 
        !           630: /* get transparent and minimum space parameters from host config file */
        !           631:        strcpy(libpath,LIB);
        !           632:        strcat(libpath,hostname);
        !           633: 
        !           634:        if ((fptr = fopen(libpath,"r")) == NULL)        {
        !           635:                fprintf(stderr,"bscbatch: host <%s> not known\n",hostname);
        !           636:                exit(1);
        !           637:        }
        !           638: 
        !           639:        while (fgets(line,sizeof line,fptr) != NULL)    {
        !           640:                /* loop to get transparent and minspace parameters */
        !           641:                ++linect;
        !           642:                if (strncmp(line,"TRANSPARENT=",12) == 0)       {
        !           643:                        pos = &line[12];
        !           644:                        host_transp = strncmp(pos,"YES",3)?NO:YES;
        !           645:                        continue;
        !           646:                }
        !           647:                if (strncmp(line,"MINSPACE=",9) == 0)   {
        !           648:                        if ((pos = index(line,',')) == NULL)    {
        !           649:                                fprintf(stderr,
        !           650:                       "bscbatch: Incorrect parameter usage, line %d in <%s>\n",
        !           651:                                linect,libpath);
        !           652:                                exit(1);
        !           653:                        }
        !           654:                        ++pos;
        !           655:                        minspace = atol(pos);
        !           656:                        pos = &line[9];
        !           657:                        devptr = &dname[0];
        !           658:                        while (*pos != ',')
        !           659:                                *devptr++ = *pos++;
        !           660:                        *devptr = '\0';
        !           661:                        continue;
        !           662:                }
        !           663:        }
        !           664: 
        !           665: /* check that, if host cannot receive transparent date, the transparent
        !           666:    option hasn't been set */
        !           667:        if (transp && (host_transp == NO))      {
        !           668:                fprintf(stderr,
        !           669:                "bscbatch: host <%s> cannot receive transparent files\n",
        !           670:                hostname);
        !           671:                exit(1);
        !           672:        }
        !           673:        
        !           674: /* check space left in file system / (user area):
        !           675:    the df command prints the # of free blocks and inodes available on the
        !           676:    entire system. Since all that's needed here is the # of free blocks in 
        !           677:    /, the flag -f is used and / is specified. popen creates a pipe between
        !           678:    bscbatch and the df command, returning a file pointer (pptr) to df's output.
        !           679:    fgets can then be used to read the string df returns into line and
        !           680:    the number of free blocks is then extracted. */
        !           681:        if (queue && minspace)
        !           682:        {       sprintf(sys_string,"df -f %s\n",dname);
        !           683:                pptr = popen(sys_string,"r");
        !           684:                fgets(line,100,pptr);
        !           685:                freespace = atol(&line[25]);
        !           686:        }
        !           687: 
        !           688: /* check that, if copy option specified and minspace is set, freespace is
        !           689:    at least 150% of minspace */
        !           690:        if (copy && minspace && (freespace < (minspace * 1.5))) {
        !           691:                fprintf(stderr,
        !           692:                "bscbatch: can't copy your files -- file system too full\n");
        !           693:                exit(1);
        !           694:        }
        !           695: 
        !           696: /* construct spool pathname, change to it to check validity */
        !           697:        strcpy(path,PATH);
        !           698:        strcat(path,hostname);
        !           699:        stat(path,&s);
        !           700:        if ((s.st_mode & S_IFMT)!= S_IFDIR)     {
        !           701:                fprintf(stderr,"bscbatch: <%s> has no spool directory\n",
        !           702:                        hostname);
        !           703:                exit(1);
        !           704:        }
        !           705: }

unix.superglobalmegacorp.com

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