xref: /illumos-gate/usr/src/cmd/lp/cmd/lpusers.c (revision 55fea89d)
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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
28 /*	  All Rights Reserved  	*/
29 
30 /* lpusers [-q priority-level] -u (user-list | "")
31    lpusers -d priority-level
32    lpusers -l
33 */
34 #include <errno.h>
35 #include <fcntl.h>
36 #include <stdio.h>
37 #include <sys/types.h>
38 #include <locale.h>
39 
40 #include "lp.h"
41 #include "users.h"
42 #include "msgs.h"
43 
44 #define	WHO_AM_I	I_AM_LPUSERS
45 #include "oam.h"
46 
47 char message[100],
48      reply[100];
49 
50 char	*PRIORITY;
51 
52 int add_user(), del_user();
53 
54 int
main(int argc,char * argv[])55 main(int argc, char *argv[])
56 {
57     int mtype, size, c,
58 	list = FALSE, limit = -1, deflt = -1;
59     int fd;
60     char *userlist = 0, *user, **users, *p;
61     char stroptsw[] = "-X";
62     short status;
63     struct user_priority *ppri_tbl, *ld_priority_file();
64     extern char *optarg;
65     extern int optind, opterr, optopt, errno;
66 
67     setlocale(LC_ALL, "");
68 
69 #if !defined(TEXT_DOMAIN)
70 #define TEXT_DOMAIN "SYS_TEST"
71 #endif
72     (void) textdomain(TEXT_DOMAIN);
73 
74 
75     if(argc == 1) {
76 usage:
77 	(void) printf(gettext("usage: \n"));
78   	(void) printf(gettext("(assign priority limit to users)\n"));
79 	(void) printf(gettext("\tlpusers -q priority -u user-list\n"));
80 
81   	(void) printf(gettext(
82 		"(assign default priority limit for balance of users)\n"));
83 	(void) printf(gettext("\tlpusers -q priority\n"));
84 
85   	(void) printf(gettext("(put users back to default priority limit)\n"));
86 	(void) printf(gettext("\tlpusers -u user-list\n"));
87 
88   	(void) printf(gettext("(assign default priority)\n"));
89 	(void) printf(gettext("\tlpusers -d priority\n"));
90 
91   	(void) printf(gettext("(examine priority limits, defaults)\n"));
92 	(void) printf(gettext("\tlpusers -l\n"));
93 
94 	exit(argc == 1);
95     }
96 
97     opterr = 0; /* disable printing of errors by getopt */
98     while ((c = getopt(argc, argv, "ld:q:u:")) != -1)
99 	switch(c) {
100 	case 'l':
101 	    if (list)
102 		LP_ERRMSG1(WARNING, E_LP_2MANY, 'l');
103 	    list = TRUE;
104 	    break;
105 	case 'd':
106 	    if (deflt != -1)
107 		LP_ERRMSG1(WARNING, E_LP_2MANY, 'd');
108 	    deflt = (int)strtol(optarg,&p,10);
109 	    if (*p || deflt<PRI_MIN || deflt>PRI_MAX) {
110 		LP_ERRMSG1(ERROR, E_LP_BADPRI, optarg);
111 		exit(1);
112 	    }
113 	    break;
114 	case 'q':
115 	    if (limit != -1)
116 		LP_ERRMSG1(WARNING, E_LP_2MANY, 'q');
117 	    limit = (int)strtol(optarg,&p,10);
118 	    if (*p || limit<PRI_MIN || limit>PRI_MAX) {
119 		LP_ERRMSG1(ERROR, E_LP_BADPRI, optarg);
120 		exit(1);
121 	    }
122 	    break;
123 	case 'u':
124 	    if (userlist)
125 		LP_ERRMSG1(WARNING, E_LP_2MANY, 'u');
126 	    userlist = optarg;
127 	    break;
128 	case '?':
129 	    if (optopt == '?')
130 		    goto usage;
131 	    stroptsw[1] = optopt;
132 	    if (strchr("ldqu", optopt))
133 		LP_ERRMSG1(ERROR, E_LP_OPTARG, stroptsw);
134 	    else
135 		LP_ERRMSG1(ERROR, E_LP_OPTION, stroptsw);
136 	    exit(1);
137 	}
138 
139     if (optind < argc) {
140 	LP_ERRMSG1(ERROR, E_LP_EXTRA, argv[optind]);
141 	exit(1);
142     }
143 
144     if (((list || deflt != -1) && (limit != -1 || userlist))
145 	|| (list && deflt != -1)) {
146 	LP_ERRMSG(ERROR, E_LP_OPTCOMB);
147 	/* invalid combination of options */
148 	exit(1);
149     }
150 
151     PRIORITY = Lp_Users;
152 
153     /* load existing priorities from file */
154     if (!(ppri_tbl = ld_priority_file(PRIORITY))) {
155 	switch (errno) {
156 	case EBADF:
157 	    LP_ERRMSG1(ERROR, E_LPU_BADFORM, PRIORITY);
158 	    break;
159 	default:
160 	    LP_ERRMSG2(ERROR, E_LPU_BADFILE, PRIORITY, errno);
161 	}
162 	exit(1);
163     }
164 
165     if (list) {
166 	print_tbl(ppri_tbl);
167 	exit (0);
168     } else {
169 	if (userlist) {
170 	    users = getlist(userlist, " \t", ",");
171 	    if (users)
172 		while (user = *users++) {
173 		    if (del_user(ppri_tbl, user) && (limit == -1))
174 			LP_ERRMSG1(WARNING, E_LPU_NOUSER, user);
175 		    if (limit != -1) {
176 			if (add_user(ppri_tbl, user, limit))
177 			    LP_ERRMSG1(WARNING, E_LPU_BADU, user);
178 		    }
179 		}
180 	} else if (deflt != -1)
181 	    ppri_tbl->deflt = deflt;
182 	else
183 	    ppri_tbl->deflt_limit = limit;
184 
185 	if ((fd = open_locked(PRIORITY, "w", LPU_MODE)) < 0) {
186 	    LP_ERRMSG1(ERROR, E_LP_ACCESS, PRIORITY);
187 	    exit(1);
188 	}
189 	output_tbl(fd, ppri_tbl);
190 	close(fd);
191     }
192 
193     if (mopen()) /* error on mopen == no spooler, exit quietly */
194 	exit(0);
195 
196     (void)putmessage (message, S_LOAD_USER_FILE);
197 
198     if (msend(message))
199 	goto Error;
200     if (mrecv(reply, sizeof(reply)) == -1)
201 	goto Error;
202     mtype = getmessage(reply, R_LOAD_USER_FILE, &status);
203     if (mtype != R_LOAD_USER_FILE) {
204 	LP_ERRMSG1 (ERROR, E_LP_BADREPLY, mtype);
205 	goto NoError;
206     }
207 
208     if (status == 0)
209 	goto NoError;
210 
211 Error:	LP_ERRMSG (ERROR, E_LPU_NOLOAD);
212 
213 NoError:(void)mclose ();
214     return (0);
215 }
216