1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
$NetBSD: patch-src_daemon.c,v 1.1 2018/06/11 23:55:50 youri Exp $
Add NetBSD backend inspired from OpenBSD ports.
--- src/daemon.c.orig 2015-02-25 13:51:44.000000000 +0000
+++ src/daemon.c
@@ -29,6 +29,7 @@
#include <fcntl.h>
#include <sys/wait.h>
#include <pwd.h>
+#include <grp.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
@@ -46,9 +47,13 @@
#include "util.h"
#define PATH_PASSWD "/etc/passwd"
+#if defined(HAVE_SHADOW_H)
#define PATH_SHADOW "/etc/shadow"
+#elif defined(__NetBSD__)
+#define PATH_SHADOW "/etc/master.passwd"
+#endif
#define PATH_GROUP "/etc/group"
#define PATH_GDM_CUSTOM "/etc/gdm/custom.conf"
enum {
PROP_0,
@@ -1083,6 +1088,34 @@ daemon_delete_user_authorized_cb (Daemon
return;
}
+/*
+ * Under NetBSD there is no /etc/login.defs (for USERGROUPS_ENAB), so
+ * we need to explicitely remove the user's group if it contains no more
+ * members and matches the username.
+ */
+#ifdef __NetBSD__
+ struct group *grp;
+ GError *grperror;
+ const gchar *grpargv[3];
+
+ grp = getgrnam (pwent->pw_name);
+
+ if ((grp != NULL) && (*grp->gr_name == *pwent->pw_name) && (*grp->gr_mem == NULL)) {
+ sys_log (context, "delete group '%d'", pwent->pw_gid);
+
+ grpargv[0] = "/usr/sbin/groupdel";
+ grpargv[1] = pwent->pw_name;
+ grpargv[2] = NULL;
+
+ grperror = NULL;
+ if (!spawn_with_login_uid (context, grpargv, &grperror)) {
+ throw_error (context, ERROR_FAILED, "running '%s' failed: %s", grpargv[0], grperror->message);
+ g_error_free (grperror);
+ return;
+ }
+ }
+#endif
+
sys_log (context, "delete user '%s' (%d)", pwent->pw_name, ud->uid);
if (daemon->priv->autologin != NULL) {
@@ -1108,11 +1141,18 @@ daemon_delete_user_authorized_cb (Daemon
argv[0] = "/usr/sbin/userdel";
if (ud->remove_files) {
+#ifdef __NetBSD__
+ argv[1] = "-r";
+ argv[2] = "--";
+ argv[3] = pwent->pw_name;
+ argv[4] = NULL;
+#else
argv[1] = "-f";
argv[2] = "-r";
argv[3] = "--";
argv[4] = pwent->pw_name;
argv[5] = NULL;
+#endif
}
else {
argv[1] = "-f";
|