|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.