Annotation of coherent/g/usr/bin/mlp/lpstat.c, revision 1.1.1.1

1.1       root        1: /******************************************************************************
                      2:    lpstat.  MLP line-printer status a'la Unix V.
                      3: ******************************************************************************/
                      4: 
                      5: #include "header.h"
                      6: 
                      7: 
                      8: extern char curr_printer[WORKSTR];
                      9: extern char curr_device[WORKSTR];
                     10: extern char curr_backend[WORKSTR];
                     11: 
                     12: 
                     13: /******************************************************************************
                     14:   Report the name of the system default printer
                     15: ******************************************************************************/
                     16: 
                     17: void system_default_printer()
                     18: {
                     19:    char *c;
                     20:    c = controls( DEFAULT, "");
                     21: 
                     22:    printf("system default destination is: %s\n", c);
                     23: }
                     24: 
                     25: 
                     26: 
                     27: /******************************************************************************
                     28:   Report whether the scheduler is running or not
                     29: ******************************************************************************/
                     30: 
                     31: void report_scheduler_status()
                     32: {
                     33:    if ( scheduler_status())
                     34:       printf("scheduler is running\n");
                     35:    else
                     36:       printf("scheduler is not running\n");
                     37: }
                     38: 
                     39: 
                     40: 
                     41: 
                     42: 
                     43: /******************************************************************************
                     44:   List the currently printing requests and the pending ones in Unix V style
                     45: ******************************************************************************/
                     46: 
                     47: report_request_status()
                     48: {
                     49:    int   n, fd;
                     50:    char *requests, *entries, *name, header[HEADER_SIZE], path[WORKSTR];
                     51:    char  user[20], timestr[40], printer[20];
                     52:    long  rtime;
                     53:    struct passwd *p;
                     54: 
                     55:    p = getpwuid(getuid());
                     56: 
                     57:    requests = report_printer_status( REQUEST_DISPLAY);
                     58: 
                     59:    entries  = dirlist( QUEUE_PATH, FALSE);  /* return sorted spool queue list */
                     60:                                             /* This list is a two dimensional */
                     61:                                             /* array (entries x MAXNAMLEN) */
                     62:                                             /* Ascending order */
                     63: 
                     64:    for ( n = 0; *(name = (entries+(n * MAXNAMLEN))); n++) {
                     65:       if ( *name == 'r') break;
                     66: 
                     67:       if (strstr( requests, name) == NULL) {
                     68:          sprintf( path, "%s/%s", QUEUE_PATH, name);
                     69: 
                     70:          if ( (fd = open( path, O_RDONLY)) != BAD) {
                     71:              read( fd, header, HEADER_SIZE);
                     72:              close( fd);
                     73: 
                     74:              strcpy( user, headerval( header, H_USER, ""));
                     75:              unpadd( user);
                     76: 
                     77:              if ( (p && !strcmp( user, p->pw_name)) || (getuid(0) == 0)) {
                     78:                 strcpy( printer, headerval( header, H_PRINTER, ""));
                     79:                 unpadd( printer);
                     80: 
                     81:                 strcpy( timestr, headerval( header, H_DSTAMP, ""));
                     82:                 rtime = 0L; sscanf( timestr, "%ld", &rtime);
                     83:                 strcpy( timestr, ctime(&rtime));
                     84:                 timestr[strlen(timestr)-1] = 0;
                     85: 
                     86:                 printf( "%s-%s\t\t%c\t%s", user,
                     87:                    (name+2), *(name+1), timestr);
                     88: 
                     89:                 printf( "\tfor %s\n", printer);
                     90:              }
                     91:          }
                     92:       }
                     93:    }
                     94: 
                     95:    free( entries);
                     96: }
                     97: 
                     98: 
                     99: 
                    100: 
                    101: 
                    102: /******************************************************************************
                    103:   List the currently printing requests and the pending ones in MLP style
                    104: ******************************************************************************/
                    105: 
                    106: report_mlp_request_status()
                    107: {
                    108:    int   n, fd, printing, val;
                    109:    char *requests, *entries, *name, header[HEADER_SIZE], path[WORKSTR];
                    110:    char  user[20], printer[20], title[100], tmp[WORKSTR];
                    111:    long  rtime;
                    112:    struct tm *tt;
                    113: 
                    114:    entries  = dirlist( QUEUE_PATH, TRUE);  /* return sorted spool queue list */
                    115:                                             /* This list is a two dimensional */
                    116:                                             /* array (entries x MAXNAMLEN) */
                    117:                                             /* Ascending order */
                    118: 
                    119:    printf("REQ # S P L #Pgs FL  #Cp   Date   Time  Description...\n");
                    120:    printf("----- - - - ---- --- --- -------- ----- -----------------------------------\n");
                    121: 
                    122:    for ( n = 0; *(name = (entries+(n * MAXNAMLEN))); n++) {
                    123:       printing = FALSE;
                    124: 
                    125:       if (strstr( requests, name)) printing = TRUE;
                    126: 
                    127:       sprintf( path, "%s/%s", QUEUE_PATH, name);
                    128: 
                    129:       if ( (fd = open( path, O_RDONLY)) != BAD) {
                    130:           read( fd, header, HEADER_SIZE);
                    131:           close( fd);
                    132: 
                    133:           printf("%-5s ", (name+2));  /* request sequence no. */
                    134: 
                    135:           /* Request Status */
                    136: 
                    137:           if (printing)
                    138:              printf("* ");  /* printing now */
                    139:           else
                    140:           if (*name == 'R')
                    141:              printf("P ");  /* waiting to print */
                    142:           else
                    143:           if (*name == 'r')
                    144:              printf("Q ");  /* held in queue print */
                    145:           else
                    146:              printf("? ");  /* don't know the status */
                    147: 
                    148:           printf("%c ", *(name+1));   /* priority */
                    149: 
                    150:           printf("%s ", unpadd( headerval( header, H_LONGEVITY, "")));
                    151: 
                    152:           val = 0;
                    153:           sscanf( unpadd( headerval( header, H_PAGES, "")), "%d", &val);
                    154:           printf("%4d ", val);
                    155:     
                    156:           val = 0;
                    157:           sscanf( unpadd( headerval( header, H_FORMLEN, "")), "%d", &val);
                    158:           printf("%3d ", val);
                    159:     
                    160:           val = 0;
                    161:           sscanf( unpadd( headerval( header, H_COPIES, "")), "%d", &val);
                    162:           printf("%3d ", val);
                    163: 
                    164: 
                    165:           sscanf( unpadd( headerval( header, H_DSTAMP, "")), "%ld", &rtime);
                    166: 
                    167:           tt = localtime( &rtime);
                    168: 
                    169:           printf( "%02d/%02d/%02d ", (tt->tm_mon+1), tt->tm_mday, tt->tm_year);
                    170:           printf( "%02d:%02d ", tt->tm_hour, tt->tm_min);
                    171:     
                    172:           strcpy( user,    unpadd( headerval( header, H_USER, "")));
                    173:           strcpy( printer, unpadd( headerval( header, H_PRINTER, "")));
                    174:           strcpy( title,   unpadd( headerval( header, H_DESC, "")));
                    175:    
                    176:           sprintf( tmp, "%s -by %s -on %s", title, user, printer);
                    177: 
                    178:           printf("%s\n", tmp);
                    179:       }
                    180:    }
                    181: }
                    182: 
                    183: 
                    184: 
                    185: 
                    186: /******************************************************************************
                    187:   Print a list of printers available for routine.
                    188: ******************************************************************************/
                    189: 
                    190: list_printers( user)
                    191: char *user;
                    192: {
                    193:    char *list;
                    194: 
                    195:    printf("%s  ( ", route_request( user));
                    196: 
                    197:    each_printer( E_START);
                    198: 
                    199:    while (*(list = each_printer( E_NEXT)))
                    200:       printf( "%s ", strtok( list, SEP));
                    201: 
                    202:    each_printer( E_END);
                    203: 
                    204:    printf("system display local )\n");
                    205: }
                    206: 
                    207: 
                    208: 
                    209: 
                    210: 
                    211: 
                    212: /******************************************************************************
                    213:   Set the printer that the user wants to route to.
                    214: ******************************************************************************/
                    215: 
                    216: set_route( user, printer)
                    217: char *user;
                    218: char *printer;
                    219: {
                    220:    FILE *fp;
                    221:    int   inlist;
                    222:    char *list, path[WORKSTR];
                    223: 
                    224:    each_printer( E_START);
                    225: 
                    226:    inlist = FALSE;
                    227: 
                    228:    while (*(list = each_printer( E_NEXT)))
                    229:       if (!strcmp( strtok( list, SEP), printer)) inlist = TRUE;
                    230: 
                    231:    each_printer( E_END);
                    232: 
                    233:    if (!strcmp( "local",   printer)) inlist = TRUE;
                    234:    if (!strcmp( "display", printer)) inlist = TRUE;
                    235:    if (!strcmp( "system",  printer)) inlist = TRUE;
                    236: 
                    237:    if (!inlist) {
                    238:       printf("\007\"%s\" is not a defined printer.\n", printer);
                    239:       return;
                    240:    }
                    241: 
                    242:    sprintf( path, "%s/%s", ROUTE_PATH, user);
                    243: 
                    244:    if ( fp = fopen( path, "w+")) {
                    245:       fprintf( fp, "%s\n", printer);
                    246:       fclose( fp);
                    247:       printf( "%s, your requests will now spool to the \"%s\" printer.\n", 
                    248:          user, printer);
                    249:    }
                    250: }
                    251: 
                    252: 
                    253: 
                    254: 
                    255: /******************************************************************************
                    256:    Reprioritize the requests
                    257: ******************************************************************************/
                    258: 
                    259: void reprioritize_requests( argc, argv)
                    260: int   argc;
                    261: char *argv[];
                    262: {
                    263:    int   n, m, reqnum, filenum, fd;
                    264:    char *t, *name, prior, oldnam[WORKSTR], newnam[WORKSTR], *head, auser[30];
                    265:    struct passwd *p;
                    266: 
                    267:    p = getpwuid(getuid());
                    268: 
                    269:    prior = argv[1][2];
                    270: 
                    271:    if ( prior < '0') prior = '0';
                    272:    if ( prior > '9') prior = '9';
                    273: 
                    274: 
                    275:    MLP_lock( L_CANCEL);
                    276: 
                    277:    /* Not sure why I want to do this? */
                    278:    /* kill_printing_request( 0, R_CANCEL, CLEAR_ALL); */
                    279: 
                    280:    t = dirlist( QUEUE_PATH, FALSE);  /* return sorted spool queue list */
                    281:                                      /* This list is a two dimensional */
                    282:                                      /* (entries x MAXNAMLEN) */
                    283:                                      /* Ascending order */
                    284: 
                    285:    head = (char *) calloc( HEADER_SIZE, 1);
                    286: 
                    287:    for (n = 0; *(name = (t+(n * MAXNAMLEN))); n++) {
                    288: 
                    289:       if (sscanf( &name[2], "%d", &filenum) == 1) {
                    290: 
                    291:          for (m = 2; m <= argc; m++) {
                    292:             if (sscanf( argv[m], "%d", &reqnum) == 1) {
                    293:                if ( filenum == reqnum) {
                    294:                   sprintf( oldnam, "%s/%s", QUEUE_PATH, name);
                    295: 
                    296:                   if ( (fd = open( oldnam, O_RDONLY)) != BAD) {
                    297:                      read( fd, head, HEADER_SIZE);
                    298:                      close( fd);
                    299: 
                    300:                      strcpy( auser, headerval( head, H_USER, ""));
                    301:                      unpadd( auser);
                    302: 
                    303:                      if (p && !strcmp( auser, p->pw_name) ||
                    304:                         (getuid() == 0)) {
                    305: 
                    306:                         name[1] = prior;
                    307:                         sprintf( newnam, "%s/%s", QUEUE_PATH, name);
                    308:                         rename( oldnam, newnam);
                    309: 
                    310:                         if ( *name == 'R') {
                    311:                            /* make_inactive( name); */
                    312:                            kill_printing_request( reqnum, R_CANCEL, CLEAR_ONE);
                    313:                            warning( "Request #%d aborted due to a change in priority", 
                    314:                               reqnum);
                    315:                         }
                    316:                      }
                    317:                   }
                    318:                }
                    319:             }
                    320:          }
                    321:       }
                    322:    }
                    323: 
                    324:    free( head);
                    325: 
                    326:    MLP_unlock( L_CANCEL);
                    327: 
                    328:    free( t);
                    329: }
                    330: 
                    331: 
                    332: 
                    333: 
                    334: 
                    335: 
                    336: /******************************************************************************
                    337:    Change the longevity or the printer
                    338: ******************************************************************************/
                    339: 
                    340: void adjust_requests( argc, argv, flag)
                    341: int   argc;
                    342: char *argv[];
                    343: int   flag;
                    344: {
                    345:    int   n, m, reqnum, filenum, fd;
                    346:    char *t, *name, nam[WORKSTR], oper[20], head[HEADER_SIZE], auser[30];
                    347:    struct passwd *p;
                    348: 
                    349:    p = getpwuid(getuid());
                    350: 
                    351:    strcpy( oper, &argv[1][2]);
                    352: 
                    353:    if (flag == A_LIFETIME) {
                    354:       oper[1] = 0;
                    355:       switch (*oper) {
                    356:          case 't':
                    357:          case 'T': *oper = 'T'; break;
                    358:          case 'l':
                    359:          case 'L': *oper = 'L'; break;
                    360:          case 's':
                    361:          case 'S':
                    362:          default:  *oper = 'S'; break;
                    363:       }
                    364:    }
                    365: 
                    366:    MLP_lock( L_CANCEL);
                    367: 
                    368:    /* Not sure why I want to do this? */
                    369:    /* kill_printing_request( 0, R_CANCEL, CLEAR_ALL); */
                    370: 
                    371:    t = dirlist( QUEUE_PATH, FALSE);  /* return sorted spool queue list */
                    372:                                      /* This list is a two dimensional */
                    373:                                      /* (entries x MAXNAMLEN) */
                    374:                                      /* Ascending order */
                    375: 
                    376:    for (n = 0; *(name = (t+(n * MAXNAMLEN))); n++) {
                    377: 
                    378:       if (sscanf( &name[2], "%d", &filenum) == 1) {
                    379: 
                    380:          for (m = 2; m <= argc; m++) {
                    381:             if (sscanf( argv[m], "%d", &reqnum) == 1) {
                    382: 
                    383:                if ( filenum == reqnum) {
                    384:                   sprintf( nam, "%s/%s", QUEUE_PATH, name);
                    385: 
                    386:                   if ( fd = open( nam, O_RDWR)) {
                    387:                      read( fd, head, HEADER_SIZE);
                    388: 
                    389:                      strcpy( auser, headerval( head, H_USER, ""));
                    390:                      unpadd( auser);
                    391: 
                    392:                      if ((p && !strcmp( auser, p->pw_name)) ||
                    393:                          (getuid() == 0)) {
                    394: 
                    395:                         if ( flag == A_PRINTER)
                    396:                            headerval( head, H_PRINTER, oper);
                    397:                         else
                    398:                            headerval( head, H_LONGEVITY, oper);
                    399: 
                    400:                         lseek( fd, 0L, 0);
                    401: 
                    402:                         write( fd, head, HEADER_SIZE);
                    403:                         close( fd);
                    404:  
                    405:                         if ( *name == 'R' && flag == A_PRINTER) {
                    406:                            /* make_inactive( name); */
                    407:                            kill_printing_request( reqnum, R_CANCEL, CLEAR_ONE);
                    408: 
                    409:                            warning( "Request #%d aborted because it was moved to a new printer", 
                    410:                               reqnum);
                    411:                         }
                    412:                      }
                    413:                   }
                    414:                }
                    415: 
                    416: 
                    417:             }
                    418:          }
                    419:       }
                    420:    }
                    421: 
                    422:    MLP_unlock( L_CANCEL);
                    423: 
                    424:    free( t);
                    425: }
                    426: 
                    427: 
                    428: 
                    429: 
                    430: 
                    431: 
                    432: 
                    433: /******************************************************************************
                    434:   Cancel all the requests in the list given.  This is a critical section--we
                    435:   cannot allow the despooler to reschedule a request that we just canceled
                    436:   before we are able to put the request in the inactive queue.  First we
                    437:   cancel the despooling of the request, if necessary.  Then we place the
                    438:   request in the inactive part of the queue.  The keyword "all" on the
                    439:   command line will cancel all printing and pending reports.
                    440: ******************************************************************************/
                    441: 
                    442: void cancel_all_requests()
                    443: {
                    444:    int n, val;
                    445:    char *t, *name;
                    446: 
                    447:    MLP_lock( L_CANCEL);
                    448: 
                    449:    kill_printing_request( 0, R_CANCEL, CLEAR_ALL);
                    450: 
                    451:    t = dirlist( QUEUE_PATH, FALSE);  /* return sorted spool queue list */
                    452:                                      /* This list is a two dimensional */
                    453:                                      /* (entries x MAXNAMLEN) */
                    454:                                      /* Ascending order */
                    455: 
                    456: 
                    457: 
                    458: 
                    459:    for (n = 0; *(name = (t+(n * MAXNAMLEN))); n++)
                    460:       if ( *name == 'R') {
                    461:          if (do_i_own_it()) {
                    462:             make_inactive( name);
                    463:             sscanf( &name[2], "%d", &val);
                    464:             warning("Request #%d has been canceled.", val);
                    465:             printf("#%d canceled\n", val);
                    466:          }
                    467:       }
                    468: 
                    469:    MLP_unlock( L_CANCEL);
                    470: 
                    471:    free( t);
                    472: }
                    473: 
                    474: 
                    475: 
                    476: 
                    477: void cancel_requests( argc, argv)
                    478: int   argc;
                    479: char *argv[];
                    480: {
                    481:    int n, m, seqnum, Seqnum;
                    482:    char *c, *d, *t, *name, *head;
                    483: 
                    484:    if (!strcmp( argv[1], "all")) {
                    485:       cancel_all_requests();
                    486:       return;
                    487:    }
                    488: 
                    489: 
                    490:    MLP_lock( L_CANCEL);
                    491: 
                    492: 
                    493:    t = dirlist( QUEUE_PATH, FALSE);  /* return sorted spool queue list */
                    494:                                      /* This list is a two dimensional */
                    495:                                      /* (entries x MAXNAMLEN) */
                    496:                                      /* Ascending order */
                    497: 
                    498:    head = (char *) calloc( HEADER_SIZE, 1);
                    499: 
                    500:    for ( n = 1; n < argc; n++) {
                    501: 
                    502:       c = argv[n];
                    503: 
                    504:       if ( d = strrchr( c, '-')) c = (d+1);
                    505: 
                    506:       seqnum = 0; sscanf( c, "%d", &seqnum);
                    507: 
                    508:       if ( seqnum > 0) {
                    509: 
                    510:          if (!kill_printing_request( seqnum, R_CANCEL, CLEAR_ONE)) {
                    511: 
                    512:             for (m = 0; *(name = (t+(m * MAXNAMLEN))); m++)
                    513:                if ( *name == 'R') {
                    514:                   sscanf( &name[2], "%d", &Seqnum);
                    515: 
                    516:                   if ( Seqnum == seqnum) {
                    517: 
                    518:                      if (do_i_own_it()) {
                    519:                         make_inactive( name);
                    520:                         warning("Request #%d has been canceled.", Seqnum);
                    521:                         printf("#%d canceled\n", Seqnum);
                    522:                      }
                    523:                   }
                    524:                }
                    525:                else
                    526:                   break;
                    527:          }
                    528:       }
                    529:    }
                    530: 
                    531:    free( head);
                    532: 
                    533:    MLP_unlock( L_CANCEL);
                    534: 
                    535:    free( t);
                    536: }
                    537: 
                    538: 
                    539: 
                    540: /*****************************************************************************
                    541:    Print usage message.
                    542: *****************************************************************************/
                    543: 
                    544: void do_usage()
                    545: {
                    546:    printf("\nusages:  lpadmin -pprinter [-vdevice] [-mmodel]\n");
                    547:    printf("         lpadmin -ddestination\n");
                    548:    printf("         lpadmin -xdestination\n\n");
                    549:    printf("NOTE:  This utility modifies %s\n", CONTROL_PATH);
                    550:    printf("       Models are found in %s\n\n", BACKEND_PATH);
                    551: }
                    552: 
                    553: 
                    554: 
                    555: 
                    556: /*****************************************************************************
                    557:    Delete the given destination from the controls file.  This routine is in
                    558:    two parts inorder to reuse some of the code.
                    559: *****************************************************************************/
                    560: 
                    561: void _delete_destination( dest, newdest, device, backend)
                    562: char *dest;
                    563: char *newdest;
                    564: char *device;
                    565: char *backend;
                    566: {
                    567:    FILE *fp, *newfp;
                    568:    char  line[128], *t, tmppath[WORKSTR], tmp[WORKSTR];
                    569: 
                    570:    fp = (FILE *) each_printer( E_FILE);
                    571: 
                    572:    sprintf( tmppath, "%s.tmp", CONTROL_PATH);
                    573: 
                    574:    if ( newfp = fopen( tmppath, "w")) {
                    575: 
                    576:       while (fgets( line, sizeof(line), fp)) {
                    577:          strcpy( tmp, line);
                    578: 
                    579:          if (t = strtok( tmp, SEP)) {
                    580: 
                    581:             if (!strcmp( "PRINTER", uppercase( t))) {
                    582:                t = strtok( NULL, SEP);
                    583:                if (strcmp( dest, t))
                    584:                   fprintf( newfp, "%s", line);
                    585:             }
                    586:             else
                    587:                fprintf( newfp, "%s", line);
                    588:          }
                    589:          else
                    590:             fprintf( newfp, "%s", line);
                    591:       }
                    592: 
                    593: 
                    594:       if ( *newdest)
                    595:          fprintf( newfp, "printer = %s, %s, %s\n", newdest, device, backend);
                    596: 
                    597:       close( fp);  close( newfp);
                    598: 
                    599:       rename( tmppath, CONTROL_PATH);
                    600: 
                    601:       chmod( CONTROL_PATH, 0664);
                    602:    }
                    603: }
                    604: 
                    605: 
                    606: void delete_destination( dest)
                    607: char *dest;
                    608: {
                    609:     each_printer( E_START); 
                    610:    _delete_destination( dest, "", "", ""); 
                    611:     each_printer( E_UNLOCK);
                    612:     log( "Remove Printer: %s", dest); 
                    613: }
                    614: 
                    615: 
                    616: 
                    617: 
                    618: 
                    619: /*****************************************************************************
                    620:   Adds a new destination to the controls file.  Any current definition by
                    621:   the same name will be overwritten
                    622: *****************************************************************************/
                    623: 
                    624: add_destination( printer, device, backend)
                    625: char *printer;
                    626: char *device;
                    627: char *backend;
                    628: {
                    629:     each_printer( E_START);
                    630: 
                    631:    _delete_destination( printer, printer, device, backend);
                    632: 
                    633:     each_printer( E_UNLOCK);
                    634: 
                    635:     log( "Add Printer: %s, device=%s, backend=%s", printer, device, backend); 
                    636: }
                    637: 
                    638: 
                    639: 
                    640: 
                    641: /*****************************************************************************
                    642:    Change the system default destination, checking to see if the destination
                    643:    exists first.
                    644: *****************************************************************************/
                    645: 
                    646: change_destination( dest)
                    647: char *dest;
                    648: {
                    649:    int   ok = FALSE;
                    650:    char *list;
                    651: 
                    652:    each_printer( E_START);
                    653: 
                    654:    while (*(list = each_printer( E_NEXT)))
                    655:       if (!strcmp( strtok( list, SEP), dest)) ok = TRUE;
                    656: 
                    657:    each_printer( E_END);
                    658: 
                    659:    if (ok)
                    660:       controls( DEFAULT, dest);
                    661:    else
                    662:       printf("\007Destination \"%s\" does not exist.\n", dest);
                    663: 
                    664:    log( "Change System Default to: %s", dest); 
                    665: }
                    666: 
                    667: 
                    668: 
                    669: 
                    670: /*****************************************************************************
                    671:    Parse the arguments and figure out what function to do.
                    672: *****************************************************************************/
                    673: 
                    674: lpadmin( argc, argv)
                    675: int   argc;
                    676: char *argv[];
                    677: {
                    678:    int n, add, del, dest;
                    679:    char printer[20], backend[20], device[129];
                    680: 
                    681:    if ( argc == 1) { do_usage(); exit(0); }
                    682: 
                    683:    strcpy( printer, "main");
                    684:    strcpy( backend, "");
                    685:    strcpy( device,  "/dev/null");
                    686: 
                    687:    add = del = dest = FALSE;
                    688: 
                    689:    for ( n = 1; n < argc; n++) {
                    690:       if (!strncmp( argv[n], "-p", 2)) {
                    691:          strncpy( printer, &argv[n][2], sizeof( printer));
                    692:          add = TRUE;
                    693:       }
                    694:       else
                    695:       if (!strncmp( argv[n], "-x", 2)) {
                    696:          strncpy( printer, &argv[n][2], sizeof( printer));
                    697:          del = TRUE;
                    698:       }
                    699:       else
                    700:       if (!strncmp( argv[n], "-d", 2)) {
                    701:          strncpy( printer, &argv[n][2], sizeof( printer));
                    702:          dest = TRUE;
                    703:       }
                    704:       else
                    705:       if (!strncmp( argv[n], "-m", 2))
                    706:          strncpy( backend, &argv[n][2], sizeof( backend));
                    707:       else
                    708:       if (!strncmp( argv[n], "-v", 2))
                    709:          strncpy( device, &argv[n][2], sizeof( device));
                    710:    }
                    711: 
                    712: 
                    713: 
                    714: 
                    715:    if (add) {  /* Add a new printer */
                    716:       add_destination( printer, device, backend);
                    717:       exit(0);
                    718:    }
                    719:    
                    720:    if (del) {  /* Delete a printer definition */
                    721:       delete_destination( printer);
                    722:       exit(0);
                    723:    }
                    724:    
                    725:    if (dest) { /* Change the system default printer */
                    726:       change_destination( printer);
                    727:       exit(0);
                    728:    }
                    729: }
                    730: 
                    731: 
                    732: 
                    733: 
                    734: 
                    735: 
                    736: void main( argc, argv)
                    737: int   argc;
                    738: char *argv[];
                    739: {
                    740:    int    n;
                    741:    extern char progname[];
                    742:    char   user[15], *c;
                    743: 
                    744:    umask(FPERMS);
                    745: 
                    746:    c = basename( argv[0]);  if (c) strcpy( progname, c);
                    747: 
                    748: 
                    749:    /********* If program is called "lpadmin" ***********/
                    750: 
                    751:    if (!strcmp( progname, "lpadmin")) {
                    752:       if (getuid() == 0) {
                    753:          lpadmin( argc, argv);
                    754:          wakeup_despooler();
                    755:       }
                    756:       else
                    757:          printf("\007\nSorry, you must be superuser to do this.\n\n");
                    758: 
                    759:       exit(0);
                    760:    }
                    761: 
                    762: 
                    763:    /********* If program is called "cancel" ***********/
                    764: 
                    765:    if (!strcmp( progname, "cancel")) {
                    766:       if (argc == 1)
                    767:          printf("\nusage:  cancel request_num1 request_num2 ... request_numN\n\n");
                    768:       else
                    769:          cancel_requests( argc, argv);
                    770: 
                    771:       wakeup_despooler();
                    772: 
                    773:       exit(0);
                    774:    }
                    775: 
                    776: 
                    777:    /********* If program is called "chreq" ***********/
                    778: 
                    779:    if (!strcmp( progname, "chreq")) {
                    780:       if (!strncmp( argv[1], "-p", 2) && argc > 2)
                    781:          reprioritize_requests( argc, argv);
                    782:       else
                    783:       if (!strncmp( argv[1], "-d", 2) && argc > 2)
                    784:          adjust_requests( argc, argv, A_PRINTER);
                    785:       else
                    786:       if (!strncmp( argv[1], "-l", 2) && argc > 2)
                    787:          adjust_requests( argc, argv, A_LIFETIME);
                    788:       else {
                    789:          printf("\nusage: chreq -pNew_priority    reqests_num1 request_");
                    790:          printf("num2 ... request_numN\n\n");
                    791:          printf("             -dNew_destination request_num1 request_");
                    792:          printf("num2 ... request_numN\n\n");
                    793:          printf("             -lNew_lifetime    request_num1 request_");
                    794:          printf("num2 ... request_numN\n\n");
                    795:       }
                    796: 
                    797:       wakeup_despooler();
                    798:       exit(0);
                    799:    }
                    800: 
                    801: 
                    802: 
                    803:    /********* If program is called "route" ***********/
                    804: 
                    805:    if (!strcmp( progname, "route")) {
                    806:       strcpy( user, "unknown");
                    807: 
                    808:       if ( getlogin())
                    809:          strcpy( user, getlogin());
                    810: 
                    811:       if ( argc == 1) list_printers( user);
                    812:       else
                    813:       if ( argv[1] != NULL)
                    814:          set_route( user, argv[1]);
                    815: 
                    816:       wakeup_despooler();
                    817:       exit(0);
                    818:    }
                    819: 
                    820: 
                    821:    /********* If program is called "lpstat" ***********/
                    822:    if ( argc == 1) report_request_status();
                    823: 
                    824:    for ( n = 1; n < argc; n++) {
                    825:       if (!strcmp( argv[n], "-s")) { /* Summary */
                    826:          report_scheduler_status();
                    827:          system_default_printer();
                    828:          report_printer_status( DEVICE_DISPLAY);
                    829:       }
                    830:       else
                    831:       if (!strcmp( argv[n], "-v")) /* Devices */
                    832:          report_printer_status( DEVICE_DISPLAY);
                    833:       else
                    834:       if (!strcmp( argv[n], "-t")) { /* All */
                    835:          report_scheduler_status();
                    836:          system_default_printer();
                    837:          report_printer_status( DEVICE_DISPLAY);
                    838:          report_printer_status( PRINTER_DISPLAY);
                    839:          report_request_status();
                    840:       }
                    841:       else
                    842:       if (!strcmp( argv[n], "-q")) /* MLP Queue Status */
                    843:          report_mlp_request_status();
                    844:       else
                    845:       if (!strcmp( argv[n], "-r")) /* Scheduler Status */
                    846:          report_scheduler_status();
                    847:       else
                    848:       if (!strcmp( argv[n], "-p")) /* Printer Status */
                    849:          report_printer_status( PRINTER_DISPLAY);
                    850:       else
                    851:       if (!strcmp( argv[n], "-o")) /* Request Status */
                    852:          report_request_status();
                    853:       else
                    854:       if (!strcmp( argv[n], "-d")) /* Default Destination */
                    855:          system_default_printer();
                    856:    }
                    857: 
                    858:    wakeup_despooler();
                    859: }

unix.superglobalmegacorp.com

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