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#pragma ident	"%Z%%M%	%I%	%E% SMI"
31
32/* LINTLIBRARY */
33
34# include	<stdio.h>
35
36# include	"lp.h"
37# include	"users.h"
38
39static int loaded = 0;
40static struct user_priority *ppri_tbl;
41struct user_priority *ld_priority_file();
42static USER usr;
43
44int putuser ( char * user, USER * pri_s )
45{
46    int fd;
47
48    if (!loaded)
49    {
50	if (!(ppri_tbl = ld_priority_file(Lp_Users)))
51	    return(-1);
52	loaded = 1;
53    }
54
55    if (!add_user(ppri_tbl, user, pri_s->priority_limit))
56    {
57	return(-1);
58    }
59
60    if ((fd = open_locked(Lp_Users, "w", LPU_MODE)) < 0)
61	return(-1);
62    output_tbl(fd, ppri_tbl);
63    close(fd);
64    return(0);
65}
66
67USER * getuser ( char * user )
68{
69    int limit;
70
71    /* root and lp do not get a limit */
72    if (STREQU(user, "root") || STREQU(user, LPUSER))
73    {
74	usr.priority_limit = 0;
75	return(&usr);
76    }
77
78    if (!loaded)
79    {
80	if (!(ppri_tbl = ld_priority_file(Lp_Users)))
81	    return((USER *)0);
82
83	loaded = 1;
84    }
85
86    for (limit = PRI_MIN; limit <= PRI_MAX; limit++)
87	if (bang_searchlist(user, ppri_tbl->users[limit - PRI_MIN]))
88	{
89	    usr.priority_limit = limit;
90	    return(&usr);
91	}
92
93    usr.priority_limit = ppri_tbl->deflt_limit;
94    return(&usr);
95}
96
97int deluser ( char * user )
98{
99    int fd;
100
101    if (!loaded)
102    {
103	if (!(ppri_tbl = ld_priority_file(Lp_Users)))
104	    return(-1);
105
106	loaded = 1;
107    }
108
109    del_user(ppri_tbl, user);
110
111    if ((fd = open_locked(Lp_Users, "w", LPU_MODE)) < 0)
112	return(-1);
113
114    output_tbl(fd, ppri_tbl);
115    close(fd);
116    return(0);
117}
118
119int getdfltpri ( void )
120{
121    if (!loaded)
122    {
123	if (!(ppri_tbl = ld_priority_file(Lp_Users)))
124	    return(-1);
125
126	loaded = 1;
127    }
128
129    return (ppri_tbl->deflt);
130}
131
132void
133trashusers(void)
134{
135    int limit;
136
137    if (loaded)
138    {
139	if (ppri_tbl)
140	{
141	    for (limit = PRI_MIN; limit <= PRI_MAX; limit++)
142		freelist (ppri_tbl->users[limit - PRI_MIN]);
143	    ppri_tbl = 0;
144	}
145	loaded = 0;
146    }
147}
148
149