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
usage(char * program)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
clear_screen()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
main(int ac,char * av[])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