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 /*
24 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
25 * Use is subject to license terms.
26 */
27
28 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
29 /* All Rights Reserved */
30
31 /*
32 * Copyright (c) 2013 RackTop Systems.
33 */
34
35 /*LINTLIBRARY*/
36
37 #include <sys/types.h>
38 #include <stdio.h>
39 #include <string.h>
40 #include <userdefs.h>
41 #include <user_attr.h>
42 #include <limits.h>
43 #include <stdlib.h>
44 #include <stddef.h>
45 #include <time.h>
46 #include <unistd.h>
47 #include "userdisp.h"
48 #include "funcs.h"
49 #include "messages.h"
50
51 /* Print out a NL when the line gets too long */
52 #define PRINTNL() \
53 if (outcount > 40) { \
54 outcount = 0; \
55 (void) fprintf(fptr, "\n"); \
56 }
57
58 /*
59 * getusrdef - get the user defaults file for the type of
60 * user entry (user or role). See libuserdefs
61 */
62
63 struct userdefs *
64 getusrdef(char *usertype)
65 {
66 struct userdefs *ud;
67
68 if (is_role(usertype))
69 ud = _get_roledefs();
70 else
71 ud = _get_userdefs();
72
73 return (ud);
74 }
75
76 void
77 dispusrdef(FILE *fptr, unsigned flags, char *usertype)
78 {
79 struct userdefs *deflts = getusrdef(usertype);
80 int outcount = 0;
81
82 /* Print out values */
83
84 if (flags & D_GROUP) {
85 outcount += fprintf(fptr, "group=%s,%ld ",
86 deflts->defgname, deflts->defgroup);
87 PRINTNL();
88 }
89
90 if (flags & D_PROJ) {
91 outcount += fprintf(fptr, "project=%s,%ld ",
92 deflts->defprojname, deflts->defproj);
93 PRINTNL();
94 }
95
96 if (flags & D_BASEDIR) {
97 outcount += fprintf(fptr, "basedir=%s ", deflts->defparent);
98 PRINTNL();
99 }
100
101 if (flags & D_RID) {
102 outcount += fprintf(fptr, "rid=%ld ", deflts->defrid);
103 PRINTNL();
104 }
105
106 if (flags & D_SKEL) {
107 outcount += fprintf(fptr, "skel=%s ", deflts->defskel);
108 PRINTNL();
109 }
110
111 if (flags & D_SHELL) {
112 outcount += fprintf(fptr, "shell=%s ", deflts->defshell);
113 PRINTNL();
114 }
115
116 if (flags & D_INACT) {
117 outcount += fprintf(fptr, "inactive=%d ", deflts->definact);
118 PRINTNL();
119 }
120
121 if (flags & D_EXPIRE) {
122 outcount += fprintf(fptr, "expire=%s ", deflts->defexpire);
123 PRINTNL();
124 }
125
126 if (flags & D_AUTH) {
127 outcount += fprintf(fptr, "auths=%s ", deflts->defauth);
128 PRINTNL();
129 }
130
131 if (flags & D_PROF) {
132 outcount += fprintf(fptr, "profiles=%s ", deflts->defprof);
133 PRINTNL();
134 }
135
136 if ((flags & D_ROLE) &&
137 (!is_role(usertype))) {
138 outcount += fprintf(fptr, "roles=%s ", deflts->defrole);
139 PRINTNL();
140 }
141
142 if (flags & D_LPRIV) {
143 outcount += fprintf(fptr, "limitpriv=%s ",
144 deflts->deflimpriv);
145 PRINTNL();
146 }
147
148 if (flags & D_DPRIV) {
149 outcount += fprintf(fptr, "defaultpriv=%s ",
150 deflts->defdfltpriv);
151 PRINTNL();
152 }
153
154 if (flags & D_LOCK) {
155 outcount += fprintf(fptr, "lock_after_retries=%s ",
156 deflts->deflock_after_retries);
157 }
158
159 if (outcount > 0)
160 (void) fprintf(fptr, "\n");
161 }
162
163 /*
164 * putusrdef -
165 * changes default values in defadduser file
166 */
167 int
168 putusrdef(struct userdefs *defs, char *usertype)
169 {
170 FILE *fp = NULL; /* default file - fptr */
171 boolean_t locked = B_FALSE;
172 int res;
173 int ex = EX_UPDATE;
174
175 if (is_role(usertype)) {
176 fp = fopen(DEFROLEFILE, "w");
177 } else {
178 fp = fopen(DEFFILE, "w");
179 }
180 if (fp == NULL) {
181 errmsg(M_FAILED);
182 goto out;
183 }
184
185 if (lockf(fileno(fp), F_LOCK, 0) != 0) {
186 /* print error if can't lock whole of DEFFILE */
187 errmsg(M_UPDATE, "created");
188 goto out;
189 }
190 locked = B_TRUE;
191
192 if (is_role(usertype)) {
193 res = fwrite_roledefs(fp, defs);
194 } else {
195 res = fwrite_userdefs(fp, defs);
196 }
197 if (res <= 0) {
198 errmsg(M_UPDATE, "created");
199 goto out;
200 }
201 ex = EX_SUCCESS;
202
203 out:
204 if (fp != NULL) {
205 if (locked)
206 (void) lockf(fileno(fp), F_ULOCK, 0);
207 (void) fclose(fp);
208 }
209
210 return (ex);
211 }