10b561052SJoerg Wunsch /* 20b561052SJoerg Wunsch * Copyright (c) 1983, 1993 30b561052SJoerg Wunsch * The Regents of the University of California. All rights reserved. 40b561052SJoerg Wunsch * 50b561052SJoerg Wunsch * Redistribution and use in source and binary forms, with or without 60b561052SJoerg Wunsch * modification, are permitted provided that the following conditions 70b561052SJoerg Wunsch * are met: 80b561052SJoerg Wunsch * 1. Redistributions of source code must retain the above copyright 90b561052SJoerg Wunsch * notice, this list of conditions and the following disclaimer. 100b561052SJoerg Wunsch * 2. Redistributions in binary form must reproduce the above copyright 110b561052SJoerg Wunsch * notice, this list of conditions and the following disclaimer in the 120b561052SJoerg Wunsch * documentation and/or other materials provided with the distribution. 130b561052SJoerg Wunsch * 3. All advertising materials mentioning features or use of this software 140b561052SJoerg Wunsch * must display the following acknowledgement: 150b561052SJoerg Wunsch * This product includes software developed by the University of 160b561052SJoerg Wunsch * California, Berkeley and its contributors. 170b561052SJoerg Wunsch * 4. Neither the name of the University nor the names of its contributors 180b561052SJoerg Wunsch * may be used to endorse or promote products derived from this software 190b561052SJoerg Wunsch * without specific prior written permission. 200b561052SJoerg Wunsch * 210b561052SJoerg Wunsch * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 220b561052SJoerg Wunsch * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 230b561052SJoerg Wunsch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 240b561052SJoerg Wunsch * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 250b561052SJoerg Wunsch * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 260b561052SJoerg Wunsch * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 270b561052SJoerg Wunsch * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 280b561052SJoerg Wunsch * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 290b561052SJoerg Wunsch * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 300b561052SJoerg Wunsch * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 310b561052SJoerg Wunsch * SUCH DAMAGE. 320b561052SJoerg Wunsch */ 330b561052SJoerg Wunsch 340b561052SJoerg Wunsch #ifndef lint 355458e2f4SJoerg Wunsch static char sccsid[] = "@(#)displayq.c 8.4 (Berkeley) 4/28/95"; 360b561052SJoerg Wunsch #endif /* not lint */ 370b561052SJoerg Wunsch 380b561052SJoerg Wunsch #include <sys/param.h> 390b561052SJoerg Wunsch #include <sys/stat.h> 405458e2f4SJoerg Wunsch #include <sys/file.h> 410b561052SJoerg Wunsch 420b561052SJoerg Wunsch #include <signal.h> 430b561052SJoerg Wunsch #include <fcntl.h> 440b561052SJoerg Wunsch #include <dirent.h> 450b561052SJoerg Wunsch #include <unistd.h> 460b561052SJoerg Wunsch #include <stdio.h> 470b561052SJoerg Wunsch #include <stdlib.h> 480b561052SJoerg Wunsch #include <string.h> 490b561052SJoerg Wunsch #include <ctype.h> 500b561052SJoerg Wunsch #include "lp.h" 510b561052SJoerg Wunsch #include "lp.local.h" 520b561052SJoerg Wunsch #include "pathnames.h" 530b561052SJoerg Wunsch 540b561052SJoerg Wunsch /* 550b561052SJoerg Wunsch * Routines to display the state of the queue. 560b561052SJoerg Wunsch */ 570b561052SJoerg Wunsch #define JOBCOL 40 /* column for job # in -l format */ 580b561052SJoerg Wunsch #define OWNCOL 7 /* start of Owner column in normal */ 590b561052SJoerg Wunsch #define SIZCOL 62 /* start of Size column in normal */ 600b561052SJoerg Wunsch 610b561052SJoerg Wunsch /* 620b561052SJoerg Wunsch * Stuff for handling job specifications 630b561052SJoerg Wunsch */ 64360d4ad5SWarner Losh extern uid_t uid, euid; 65360d4ad5SWarner Losh 660b561052SJoerg Wunsch static int col; /* column on screen */ 670b561052SJoerg Wunsch static char current[40]; /* current file being printed */ 680b561052SJoerg Wunsch static char file[132]; /* print file name */ 690b561052SJoerg Wunsch static int first; /* first file in ``files'' column? */ 700b561052SJoerg Wunsch static int garbage; /* # of garbage cf files */ 710b561052SJoerg Wunsch static int lflag; /* long output option */ 720b561052SJoerg Wunsch static int rank; /* order to be printed (-1=none, 0=active) */ 730b561052SJoerg Wunsch static long totsize; /* total print job size in bytes */ 740b561052SJoerg Wunsch 750b561052SJoerg Wunsch static char *head0 = "Rank Owner Job Files"; 760b561052SJoerg Wunsch static char *head1 = "Total Size\n"; 770b561052SJoerg Wunsch 78334a9508SJoerg Wunsch static void alarmhandler __P((int)); 79334a9508SJoerg Wunsch 800b561052SJoerg Wunsch /* 810b561052SJoerg Wunsch * Display the current state of the queue. Format = 1 if long format. 820b561052SJoerg Wunsch */ 830b561052SJoerg Wunsch void 840b561052SJoerg Wunsch displayq(format) 850b561052SJoerg Wunsch int format; 860b561052SJoerg Wunsch { 870b561052SJoerg Wunsch register struct queue *q; 88360d4ad5SWarner Losh register int i, nitems, fd, ret; 890b561052SJoerg Wunsch register char *cp; 900b561052SJoerg Wunsch struct queue **queue; 910b561052SJoerg Wunsch struct stat statb; 920b561052SJoerg Wunsch FILE *fp; 93334a9508SJoerg Wunsch void (*savealrm)(int); 940b561052SJoerg Wunsch 950b561052SJoerg Wunsch lflag = format; 960b561052SJoerg Wunsch totsize = 0; 970b561052SJoerg Wunsch rank = -1; 980b561052SJoerg Wunsch if ((i = cgetent(&bp, printcapdb, printer)) == -2) 990b561052SJoerg Wunsch fatal("can't open printer description file"); 1000b561052SJoerg Wunsch else if (i == -1) 1010b561052SJoerg Wunsch fatal("unknown printer"); 1020b561052SJoerg Wunsch else if (i == -3) 1030b561052SJoerg Wunsch fatal("potential reference loop detected in printcap file"); 1040b561052SJoerg Wunsch if (cgetstr(bp, "lp", &LP) < 0) 1050b561052SJoerg Wunsch LP = _PATH_DEFDEVLP; 1060b561052SJoerg Wunsch if (cgetstr(bp, "rp", &RP) < 0) 1070b561052SJoerg Wunsch RP = DEFLP; 1080b561052SJoerg Wunsch if (cgetstr(bp, "sd", &SD) < 0) 1090b561052SJoerg Wunsch SD = _PATH_DEFSPOOL; 1100b561052SJoerg Wunsch if (cgetstr(bp,"lo", &LO) < 0) 1110b561052SJoerg Wunsch LO = DEFLOCK; 1120b561052SJoerg Wunsch if (cgetstr(bp, "st", &ST) < 0) 1130b561052SJoerg Wunsch ST = DEFSTAT; 1140b561052SJoerg Wunsch cgetstr(bp, "rm", &RM); 115360d4ad5SWarner Losh if ((cp = checkremote())) 1160b561052SJoerg Wunsch printf("Warning: %s\n", cp); 1170b561052SJoerg Wunsch 1180b561052SJoerg Wunsch /* 1190b561052SJoerg Wunsch * Print out local queue 1200b561052SJoerg Wunsch * Find all the control files in the spooling directory 1210b561052SJoerg Wunsch */ 122360d4ad5SWarner Losh seteuid(euid); 1230b561052SJoerg Wunsch if (chdir(SD) < 0) 1240b561052SJoerg Wunsch fatal("cannot chdir to spooling directory"); 125360d4ad5SWarner Losh seteuid(uid); 1260b561052SJoerg Wunsch if ((nitems = getq(&queue)) < 0) 1270b561052SJoerg Wunsch fatal("cannot examine spooling area\n"); 128360d4ad5SWarner Losh seteuid(euid); 129360d4ad5SWarner Losh ret = stat(LO, &statb); 130360d4ad5SWarner Losh seteuid(uid); 131360d4ad5SWarner Losh if (ret >= 0) { 1320b561052SJoerg Wunsch if (statb.st_mode & 0100) { 1335458e2f4SJoerg Wunsch if (remote) 1340b561052SJoerg Wunsch printf("%s: ", host); 1350b561052SJoerg Wunsch printf("Warning: %s is down: ", printer); 136360d4ad5SWarner Losh seteuid(euid); 1370b561052SJoerg Wunsch fd = open(ST, O_RDONLY); 138360d4ad5SWarner Losh seteuid(uid); 1390b561052SJoerg Wunsch if (fd >= 0) { 1400b561052SJoerg Wunsch (void) flock(fd, LOCK_SH); 1410b561052SJoerg Wunsch while ((i = read(fd, line, sizeof(line))) > 0) 1420b561052SJoerg Wunsch (void) fwrite(line, 1, i, stdout); 1430b561052SJoerg Wunsch (void) close(fd); /* unlocks as well */ 1440b561052SJoerg Wunsch } else 1450b561052SJoerg Wunsch putchar('\n'); 1460b561052SJoerg Wunsch } 1470b561052SJoerg Wunsch if (statb.st_mode & 010) { 1485458e2f4SJoerg Wunsch if (remote) 1490b561052SJoerg Wunsch printf("%s: ", host); 1500b561052SJoerg Wunsch printf("Warning: %s queue is turned off\n", printer); 1510b561052SJoerg Wunsch } 1520b561052SJoerg Wunsch } 1530b561052SJoerg Wunsch 1540b561052SJoerg Wunsch if (nitems) { 155360d4ad5SWarner Losh seteuid(euid); 1560b561052SJoerg Wunsch fp = fopen(LO, "r"); 157360d4ad5SWarner Losh seteuid(uid); 1580b561052SJoerg Wunsch if (fp == NULL) 1590b561052SJoerg Wunsch warn(); 1600b561052SJoerg Wunsch else { 1610b561052SJoerg Wunsch /* get daemon pid */ 1620b561052SJoerg Wunsch cp = current; 1635458e2f4SJoerg Wunsch while ((i = getc(fp)) != EOF && i != '\n') 1645458e2f4SJoerg Wunsch *cp++ = i; 1650b561052SJoerg Wunsch *cp = '\0'; 1660b561052SJoerg Wunsch i = atoi(current); 167360d4ad5SWarner Losh if (i <= 0) { 168360d4ad5SWarner Losh ret = -1; 169360d4ad5SWarner Losh } else { 170360d4ad5SWarner Losh seteuid(euid); 171360d4ad5SWarner Losh ret = kill(i, 0); 172360d4ad5SWarner Losh seteuid(uid); 173360d4ad5SWarner Losh } 174360d4ad5SWarner Losh if (ret < 0) { 1750b561052SJoerg Wunsch warn(); 176360d4ad5SWarner Losh } else { 1770b561052SJoerg Wunsch /* read current file name */ 1780b561052SJoerg Wunsch cp = current; 1795458e2f4SJoerg Wunsch while ((i = getc(fp)) != EOF && i != '\n') 1805458e2f4SJoerg Wunsch *cp++ = i; 1810b561052SJoerg Wunsch *cp = '\0'; 1820b561052SJoerg Wunsch /* 1830b561052SJoerg Wunsch * Print the status file. 1840b561052SJoerg Wunsch */ 1855458e2f4SJoerg Wunsch if (remote) 1860b561052SJoerg Wunsch printf("%s: ", host); 187360d4ad5SWarner Losh seteuid(euid); 1880b561052SJoerg Wunsch fd = open(ST, O_RDONLY); 189360d4ad5SWarner Losh seteuid(uid); 1900b561052SJoerg Wunsch if (fd >= 0) { 1910b561052SJoerg Wunsch (void) flock(fd, LOCK_SH); 1920b561052SJoerg Wunsch while ((i = read(fd, line, sizeof(line))) > 0) 1930b561052SJoerg Wunsch (void) fwrite(line, 1, i, stdout); 1940b561052SJoerg Wunsch (void) close(fd); /* unlocks as well */ 1950b561052SJoerg Wunsch } else 1960b561052SJoerg Wunsch putchar('\n'); 1970b561052SJoerg Wunsch } 1980b561052SJoerg Wunsch (void) fclose(fp); 1990b561052SJoerg Wunsch } 2000b561052SJoerg Wunsch /* 2010b561052SJoerg Wunsch * Now, examine the control files and print out the jobs to 2020b561052SJoerg Wunsch * be done for each user. 2030b561052SJoerg Wunsch */ 2040b561052SJoerg Wunsch if (!lflag) 2050b561052SJoerg Wunsch header(); 2060b561052SJoerg Wunsch for (i = 0; i < nitems; i++) { 2070b561052SJoerg Wunsch q = queue[i]; 2080b561052SJoerg Wunsch inform(q->q_name); 2090b561052SJoerg Wunsch free(q); 2100b561052SJoerg Wunsch } 2110b561052SJoerg Wunsch free(queue); 2120b561052SJoerg Wunsch } 2135458e2f4SJoerg Wunsch if (!remote) { 2140b561052SJoerg Wunsch if (nitems == 0) 2150b561052SJoerg Wunsch puts("no entries"); 2160b561052SJoerg Wunsch return; 2170b561052SJoerg Wunsch } 2180b561052SJoerg Wunsch 2190b561052SJoerg Wunsch /* 2200b561052SJoerg Wunsch * Print foreign queue 2210b561052SJoerg Wunsch * Note that a file in transit may show up in either queue. 2220b561052SJoerg Wunsch */ 2230b561052SJoerg Wunsch if (nitems) 2240b561052SJoerg Wunsch putchar('\n'); 225d583a7c3SWarner Losh (void) snprintf(line, sizeof(line), "%c%s", format + '\3', RP); 2260b561052SJoerg Wunsch cp = line; 2276ee8b269SWarner Losh for (i = 0; i < requests && cp-line+10 < sizeof(line) - 1; i++) { 2280b561052SJoerg Wunsch cp += strlen(cp); 2290b561052SJoerg Wunsch (void) sprintf(cp, " %d", requ[i]); 2300b561052SJoerg Wunsch } 231d583a7c3SWarner Losh for (i = 0; i < users && cp - line + 1 + strlen(user[i]) < 2326ee8b269SWarner Losh sizeof(line) - 1; i++) { 2330b561052SJoerg Wunsch cp += strlen(cp); 2340b561052SJoerg Wunsch *cp++ = ' '; 2350b561052SJoerg Wunsch (void) strcpy(cp, user[i]); 2360b561052SJoerg Wunsch } 2370b561052SJoerg Wunsch strcat(line, "\n"); 238334a9508SJoerg Wunsch savealrm = signal(SIGALRM, alarmhandler); 239334a9508SJoerg Wunsch alarm(10); 2405458e2f4SJoerg Wunsch fd = getport(RM, 0); 241334a9508SJoerg Wunsch (void)signal(SIGALRM, savealrm); 2420b561052SJoerg Wunsch if (fd < 0) { 2430b561052SJoerg Wunsch if (from != host) 2440b561052SJoerg Wunsch printf("%s: ", host); 2450b561052SJoerg Wunsch printf("connection to %s is down\n", RM); 2460b561052SJoerg Wunsch } 2470b561052SJoerg Wunsch else { 2480b561052SJoerg Wunsch i = strlen(line); 2490b561052SJoerg Wunsch if (write(fd, line, i) != i) 2500b561052SJoerg Wunsch fatal("Lost connection"); 2510b561052SJoerg Wunsch while ((i = read(fd, line, sizeof(line))) > 0) 2520b561052SJoerg Wunsch (void) fwrite(line, 1, i, stdout); 2530b561052SJoerg Wunsch (void) close(fd); 2540b561052SJoerg Wunsch } 2550b561052SJoerg Wunsch } 2560b561052SJoerg Wunsch 2570b561052SJoerg Wunsch /* 2580b561052SJoerg Wunsch * Print a warning message if there is no daemon present. 2590b561052SJoerg Wunsch */ 2600b561052SJoerg Wunsch void 2610b561052SJoerg Wunsch warn() 2620b561052SJoerg Wunsch { 2635458e2f4SJoerg Wunsch if (remote) 2640b561052SJoerg Wunsch printf("\n%s: ", host); 2650b561052SJoerg Wunsch puts("Warning: no daemon present"); 2660b561052SJoerg Wunsch current[0] = '\0'; 2670b561052SJoerg Wunsch } 2680b561052SJoerg Wunsch 2690b561052SJoerg Wunsch /* 2700b561052SJoerg Wunsch * Print the header for the short listing format 2710b561052SJoerg Wunsch */ 2720b561052SJoerg Wunsch void 2730b561052SJoerg Wunsch header() 2740b561052SJoerg Wunsch { 2750b561052SJoerg Wunsch printf(head0); 2760b561052SJoerg Wunsch col = strlen(head0)+1; 2770b561052SJoerg Wunsch blankfill(SIZCOL); 2780b561052SJoerg Wunsch printf(head1); 2790b561052SJoerg Wunsch } 2800b561052SJoerg Wunsch 2810b561052SJoerg Wunsch void 2820b561052SJoerg Wunsch inform(cf) 2830b561052SJoerg Wunsch char *cf; 2840b561052SJoerg Wunsch { 2850b561052SJoerg Wunsch register int j; 2860b561052SJoerg Wunsch FILE *cfp; 2870b561052SJoerg Wunsch 2880b561052SJoerg Wunsch /* 2890b561052SJoerg Wunsch * There's a chance the control file has gone away 2900b561052SJoerg Wunsch * in the meantime; if this is the case just keep going 2910b561052SJoerg Wunsch */ 292360d4ad5SWarner Losh seteuid(euid); 2930b561052SJoerg Wunsch if ((cfp = fopen(cf, "r")) == NULL) 2940b561052SJoerg Wunsch return; 295360d4ad5SWarner Losh seteuid(uid); 2960b561052SJoerg Wunsch 2970b561052SJoerg Wunsch if (rank < 0) 2980b561052SJoerg Wunsch rank = 0; 2995458e2f4SJoerg Wunsch if (remote || garbage || strcmp(cf, current)) 3000b561052SJoerg Wunsch rank++; 3010b561052SJoerg Wunsch j = 0; 3020b561052SJoerg Wunsch while (getline(cfp)) { 3030b561052SJoerg Wunsch switch (line[0]) { 3040b561052SJoerg Wunsch case 'P': /* Was this file specified in the user's list? */ 3050b561052SJoerg Wunsch if (!inlist(line+1, cf)) { 3060b561052SJoerg Wunsch fclose(cfp); 3070b561052SJoerg Wunsch return; 3080b561052SJoerg Wunsch } 3090b561052SJoerg Wunsch if (lflag) { 3100b561052SJoerg Wunsch printf("\n%s: ", line+1); 3110b561052SJoerg Wunsch col = strlen(line+1) + 2; 3120b561052SJoerg Wunsch prank(rank); 3130b561052SJoerg Wunsch blankfill(JOBCOL); 3140b561052SJoerg Wunsch printf(" [job %s]\n", cf+3); 3150b561052SJoerg Wunsch } else { 3160b561052SJoerg Wunsch col = 0; 3170b561052SJoerg Wunsch prank(rank); 3180b561052SJoerg Wunsch blankfill(OWNCOL); 3190b561052SJoerg Wunsch printf("%-10s %-3d ", line+1, atoi(cf+3)); 3200b561052SJoerg Wunsch col += 16; 3210b561052SJoerg Wunsch first = 1; 3220b561052SJoerg Wunsch } 3230b561052SJoerg Wunsch continue; 3240b561052SJoerg Wunsch default: /* some format specifer and file name? */ 3250b561052SJoerg Wunsch if (line[0] < 'a' || line[0] > 'z') 3260b561052SJoerg Wunsch continue; 327d583a7c3SWarner Losh if (j == 0 || strcmp(file, line+1) != 0) { 328d583a7c3SWarner Losh (void) strncpy(file, line+1, sizeof(file) - 1); 329d583a7c3SWarner Losh file[sizeof(file) - 1] = '\0'; 330d583a7c3SWarner Losh } 3310b561052SJoerg Wunsch j++; 3320b561052SJoerg Wunsch continue; 3330b561052SJoerg Wunsch case 'N': 3340b561052SJoerg Wunsch show(line+1, file, j); 3350b561052SJoerg Wunsch file[0] = '\0'; 3360b561052SJoerg Wunsch j = 0; 3370b561052SJoerg Wunsch } 3380b561052SJoerg Wunsch } 3390b561052SJoerg Wunsch fclose(cfp); 3400b561052SJoerg Wunsch if (!lflag) { 3410b561052SJoerg Wunsch blankfill(SIZCOL); 3420b561052SJoerg Wunsch printf("%ld bytes\n", totsize); 3430b561052SJoerg Wunsch totsize = 0; 3440b561052SJoerg Wunsch } 3450b561052SJoerg Wunsch } 3460b561052SJoerg Wunsch 3470b561052SJoerg Wunsch int 3480b561052SJoerg Wunsch inlist(name, file) 3490b561052SJoerg Wunsch char *name, *file; 3500b561052SJoerg Wunsch { 3510b561052SJoerg Wunsch register int *r, n; 3520b561052SJoerg Wunsch register char **u, *cp; 3530b561052SJoerg Wunsch 3540b561052SJoerg Wunsch if (users == 0 && requests == 0) 3550b561052SJoerg Wunsch return(1); 3560b561052SJoerg Wunsch /* 3570b561052SJoerg Wunsch * Check to see if it's in the user list 3580b561052SJoerg Wunsch */ 3590b561052SJoerg Wunsch for (u = user; u < &user[users]; u++) 3600b561052SJoerg Wunsch if (!strcmp(*u, name)) 3610b561052SJoerg Wunsch return(1); 3620b561052SJoerg Wunsch /* 3630b561052SJoerg Wunsch * Check the request list 3640b561052SJoerg Wunsch */ 3650b561052SJoerg Wunsch for (n = 0, cp = file+3; isdigit(*cp); ) 3660b561052SJoerg Wunsch n = n * 10 + (*cp++ - '0'); 3670b561052SJoerg Wunsch for (r = requ; r < &requ[requests]; r++) 3680b561052SJoerg Wunsch if (*r == n && !strcmp(cp, from)) 3690b561052SJoerg Wunsch return(1); 3700b561052SJoerg Wunsch return(0); 3710b561052SJoerg Wunsch } 3720b561052SJoerg Wunsch 3730b561052SJoerg Wunsch void 3740b561052SJoerg Wunsch show(nfile, file, copies) 3750b561052SJoerg Wunsch register char *nfile, *file; 3760b561052SJoerg Wunsch int copies; 3770b561052SJoerg Wunsch { 3780b561052SJoerg Wunsch if (strcmp(nfile, " ") == 0) 3790b561052SJoerg Wunsch nfile = "(standard input)"; 3800b561052SJoerg Wunsch if (lflag) 3810b561052SJoerg Wunsch ldump(nfile, file, copies); 3820b561052SJoerg Wunsch else 3830b561052SJoerg Wunsch dump(nfile, file, copies); 3840b561052SJoerg Wunsch } 3850b561052SJoerg Wunsch 3860b561052SJoerg Wunsch /* 3870b561052SJoerg Wunsch * Fill the line with blanks to the specified column 3880b561052SJoerg Wunsch */ 3890b561052SJoerg Wunsch void 3900b561052SJoerg Wunsch blankfill(n) 3910b561052SJoerg Wunsch register int n; 3920b561052SJoerg Wunsch { 3930b561052SJoerg Wunsch while (col++ < n) 3940b561052SJoerg Wunsch putchar(' '); 3950b561052SJoerg Wunsch } 3960b561052SJoerg Wunsch 3970b561052SJoerg Wunsch /* 3980b561052SJoerg Wunsch * Give the abbreviated dump of the file names 3990b561052SJoerg Wunsch */ 4000b561052SJoerg Wunsch void 4010b561052SJoerg Wunsch dump(nfile, file, copies) 4020b561052SJoerg Wunsch char *nfile, *file; 4030b561052SJoerg Wunsch int copies; 4040b561052SJoerg Wunsch { 4050b561052SJoerg Wunsch register short n, fill; 4060b561052SJoerg Wunsch struct stat lbuf; 4070b561052SJoerg Wunsch 4080b561052SJoerg Wunsch /* 4090b561052SJoerg Wunsch * Print as many files as will fit 4100b561052SJoerg Wunsch * (leaving room for the total size) 4110b561052SJoerg Wunsch */ 4120b561052SJoerg Wunsch fill = first ? 0 : 2; /* fill space for ``, '' */ 4130b561052SJoerg Wunsch if (((n = strlen(nfile)) + col + fill) >= SIZCOL-4) { 4140b561052SJoerg Wunsch if (col < SIZCOL) { 4150b561052SJoerg Wunsch printf(" ..."), col += 4; 4160b561052SJoerg Wunsch blankfill(SIZCOL); 4170b561052SJoerg Wunsch } 4180b561052SJoerg Wunsch } else { 4190b561052SJoerg Wunsch if (first) 4200b561052SJoerg Wunsch first = 0; 4210b561052SJoerg Wunsch else 4220b561052SJoerg Wunsch printf(", "); 4230b561052SJoerg Wunsch printf("%s", nfile); 4240b561052SJoerg Wunsch col += n+fill; 4250b561052SJoerg Wunsch } 426360d4ad5SWarner Losh seteuid(euid); 4270b561052SJoerg Wunsch if (*file && !stat(file, &lbuf)) 4280b561052SJoerg Wunsch totsize += copies * lbuf.st_size; 429360d4ad5SWarner Losh seteuid(uid); 4300b561052SJoerg Wunsch } 4310b561052SJoerg Wunsch 4320b561052SJoerg Wunsch /* 4330b561052SJoerg Wunsch * Print the long info about the file 4340b561052SJoerg Wunsch */ 4350b561052SJoerg Wunsch void 4360b561052SJoerg Wunsch ldump(nfile, file, copies) 4370b561052SJoerg Wunsch char *nfile, *file; 4380b561052SJoerg Wunsch int copies; 4390b561052SJoerg Wunsch { 4400b561052SJoerg Wunsch struct stat lbuf; 4410b561052SJoerg Wunsch 4420b561052SJoerg Wunsch putchar('\t'); 4430b561052SJoerg Wunsch if (copies > 1) 4440b561052SJoerg Wunsch printf("%-2d copies of %-19s", copies, nfile); 4450b561052SJoerg Wunsch else 4460b561052SJoerg Wunsch printf("%-32s", nfile); 4470b561052SJoerg Wunsch if (*file && !stat(file, &lbuf)) 4484ebd2ee4SJoerg Wunsch printf(" %qd bytes", lbuf.st_size); 4490b561052SJoerg Wunsch else 4500b561052SJoerg Wunsch printf(" ??? bytes"); 4510b561052SJoerg Wunsch putchar('\n'); 4520b561052SJoerg Wunsch } 4530b561052SJoerg Wunsch 4540b561052SJoerg Wunsch /* 4550b561052SJoerg Wunsch * Print the job's rank in the queue, 4560b561052SJoerg Wunsch * update col for screen management 4570b561052SJoerg Wunsch */ 4580b561052SJoerg Wunsch void 4590b561052SJoerg Wunsch prank(n) 4600b561052SJoerg Wunsch int n; 4610b561052SJoerg Wunsch { 4620b561052SJoerg Wunsch char rline[100]; 4630b561052SJoerg Wunsch static char *r[] = { 4640b561052SJoerg Wunsch "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th" 4650b561052SJoerg Wunsch }; 4660b561052SJoerg Wunsch 4670b561052SJoerg Wunsch if (n == 0) { 4680b561052SJoerg Wunsch printf("active"); 4690b561052SJoerg Wunsch col += 6; 4700b561052SJoerg Wunsch return; 4710b561052SJoerg Wunsch } 4720b561052SJoerg Wunsch if ((n/10)%10 == 1) 4730b561052SJoerg Wunsch (void)snprintf(rline, sizeof(rline), "%dth", n); 4740b561052SJoerg Wunsch else 4750b561052SJoerg Wunsch (void)snprintf(rline, sizeof(rline), "%d%s", n, r[n%10]); 4760b561052SJoerg Wunsch col += strlen(rline); 4770b561052SJoerg Wunsch printf("%s", rline); 4780b561052SJoerg Wunsch } 479334a9508SJoerg Wunsch 480334a9508SJoerg Wunsch void 481334a9508SJoerg Wunsch alarmhandler(signo) 482334a9508SJoerg Wunsch int signo; 483334a9508SJoerg Wunsch { 484334a9508SJoerg Wunsch /* ignored */ 485334a9508SJoerg Wunsch } 486