1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 * 26 */ 27 28 /* $Id: lpq.c 146 2006-03-24 00:26:54Z njacobs $ */ 29 30 #include <stdio.h> 31 #include <stdlib.h> 32 #include <unistd.h> 33 #include <string.h> 34 #include <locale.h> 35 #include <libintl.h> 36 #include <papi.h> 37 #include "common.h" 38 39 static void 40 usage(char *program) 41 { 42 char *name; 43 44 if ((name = strrchr(program, '/')) == NULL) 45 name = program; 46 else 47 name++; 48 49 fprintf(stdout, gettext("Usage: %s [-P printer] (user|id ...)\n"), 50 name); 51 exit(1); 52 } 53 54 static void 55 clear_screen() 56 { 57 static char buf[32]; 58 59 /* quick and dirty for now, this should be fixed real soon */ 60 if (buf[0] == '\0') { 61 FILE *fp = popen("/bin/tput clear", "r"); 62 if (fp != NULL) { 63 fgets(buf, sizeof (buf), fp); 64 fclose(fp); 65 } 66 } 67 printf("%s", buf); 68 } 69 70 int 71 main(int ac, char *av[]) 72 { 73 char *printer = NULL; 74 papi_status_t status; 75 papi_service_t svc = NULL; 76 papi_encryption_t encryption = PAPI_ENCRYPT_NEVER; 77 int format = 3; /* lpq short format */ 78 int interval = 0; 79 int num_jobs; 80 int c; 81 82 (void) setlocale(LC_ALL, ""); 83 (void) textdomain("SUNW_OST_OSCMD"); 84 85 while ((c = getopt(ac, av, "EP:l")) != EOF) 86 switch (c) { 87 case 'E': 88 encryption = PAPI_ENCRYPT_REQUIRED; 89 break; 90 case 'P': 91 printer = optarg; 92 break; 93 case 'l': 94 format = 4; /* lpq long format */ 95 break; 96 default: 97 usage(av[0]); 98 } 99 100 if ((optind < ac) && (av[optind][0] == '+')) 101 interval = atoi(av[optind++]); 102 103 if ((printer == NULL) && 104 ((printer = getenv("PRINTER")) == NULL) && 105 ((printer = getenv("LPDEST")) == NULL)) 106 printer = DEFAULT_DEST; 107 108 status = papiServiceCreate(&svc, printer, NULL, NULL, cli_auth_callback, 109 encryption, NULL); 110 if (status != PAPI_OK) { 111 fprintf(stderr, gettext( 112 "Failed to contact service for %s: %s\n"), printer, 113 verbose_papi_message(svc, status)); 114 papiServiceDestroy(svc); 115 exit(1); 116 } 117 118 do { 119 if (interval != 0) 120 clear_screen(); 121 122 num_jobs = berkeley_queue_report(svc, stdout, printer, format, 123 ac - optind, &av[optind]); 124 125 if ((interval != 0) && (num_jobs > 0)) 126 sleep(interval); 127 } while ((interval > 0) && (num_jobs > 0)); 128 129 papiServiceDestroy(svc); 130 131 return (0); 132 } 133