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.
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.
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]
21 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
22 /* All Rights Reserved */
26 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
27 * Use is subject to license terms.
30 #include <sys/types.h>
38 #include <sys/types.h>
52 * This command deletes user logins. Arguments are:
54 * -r - when given, this option removes home directory & its contents
56 * login - a string of printable chars except colon (:)
59 extern int check_perm(), isbusy(), get_default_zfs_flags();
60 extern int rm_files(), call_passmgmt(), edit_group();
62 static char *logname
; /* login name to delete */
63 static char *nargv
[20]; /* arguments for execvp of passmgmt */
68 main(int argc
, char **argv
)
70 int ch
, ret
= 0, rflag
= 0;
71 int zfs_flags
= 0, argindex
, tries
;
72 struct passwd
*pstruct
;
75 FILE *pwf
; /* fille ptr for opened passwd file */
77 char *usertype
= NULL
;
83 errmsg(M_PERM_DENIED
);
87 opterr
= 0; /* no print errors from getopt */
88 usertype
= getusertype(argv
[0]);
90 while ((ch
= getopt(argc
, argv
, "r")) != EOF
) {
96 if (is_role(usertype
))
104 if (optind
!= argc
- 1) {
105 if (is_role(usertype
))
112 logname
= argv
[optind
];
115 pstruct
= getpwnam(logname
);
118 * Do this with fgetpwent to make sure we are only looking on local
119 * system (since passmgmt only works on local system).
121 if ((pwf
= fopen("/etc/passwd", "r")) == NULL
) {
122 errmsg(M_OOPS
, "open", "/etc/passwd");
125 while ((pstruct
= fgetpwent(pwf
)) != NULL
)
126 if (strcmp(pstruct
->pw_name
, logname
) == 0)
132 if (pstruct
== NULL
) {
133 errmsg(M_EXIST
, logname
);
134 exit(EX_NAME_NOT_EXIST
);
137 if (isbusy(logname
)) {
138 errmsg(M_BUSY
, logname
, "remove");
142 /* that's it for validations - now do the work */
143 /* set up arguments to passmgmt in nargv array */
145 nargv
[1] = "-d"; /* delete */
146 argindex
= 2; /* next argument */
148 /* finally - login name */
149 nargv
[argindex
++] = logname
;
151 /* set the last to null */
152 nargv
[argindex
++] = NULL
;
154 /* remove home directory */
156 /* Check Permissions */
157 if (stat(pstruct
->pw_dir
, &statbuf
)) {
158 errmsg(M_OOPS
, "find status about home directory",
163 if (check_perm(statbuf
, pstruct
->pw_uid
, pstruct
->pw_gid
,
164 S_IWOTH
|S_IXOTH
) != 0) {
165 errmsg(M_NO_PERM
, logname
, pstruct
->pw_dir
);
168 zfs_flags
= get_default_zfs_flags();
170 if (rm_files(pstruct
->pw_dir
, logname
, zfs_flags
) != EX_SUCCESS
)
174 /* now call passmgmt */
176 for (tries
= 3; ret
!= PEX_SUCCESS
&& tries
--; ) {
177 switch (ret
= call_passmgmt(nargv
)) {
179 ret
= edit_group(logname
, (char *)0, (int **)0, 1);
180 if (ret
!= EX_SUCCESS
)
181 errmsg(M_UPDATE
, "deleted");
187 case PEX_HOSED_FILES
:
188 errmsg(M_HOSED_FILES
);
189 exit(EX_INCONSISTENT
);
194 /* should NEVER occur that passmgmt usage is wrong */
195 if (is_role(usertype
))
204 * uid is used - shouldn't happen but print message anyway
206 errmsg(M_UID_USED
, pstruct
->pw_uid
);
212 errmsg(M_USED
, logname
);
213 exit(EX_NAME_EXISTS
);
217 errmsg(M_UPDATE
, "deleted");
223 errmsg(M_UPDATE
, "deleted");
226 * Now, remove this user from all project entries
229 rc
= edit_project(logname
, (char *)0, (projid_t
**)0, 1);
230 if (rc
!= EX_SUCCESS
) {
231 errmsg(M_UPDATE
, "modified");