$OpenBSD: patch-src_daemon_c,v 1.12 2012/01/12 13:59:29 ajacoutot Exp $
--- src/daemon.c.orig	Mon Oct 17 21:30:22 2011
+++ src/daemon.c	Thu Jan 12 14:44:19 2012
@@ -54,11 +54,15 @@
 #define PATH_LOGIN_DEFS "/etc/login.defs"
 #define PATH_GDM_CUSTOM "${SYSCONFDIR}/gdm/custom.conf"
 
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
+#define FALLBACK_MINIMAL_UID 1000
+#endif
+
 #ifndef FALLBACK_MINIMAL_UID
 #define FALLBACK_MINIMAL_UID 500
 #endif
 
-#define USERDIR LOCALSTATEDIR "/lib/AccountsService/users"
+#define USERDIR LOCALSTATEDIR "/db/AccountsService/users"
 
 static const char *default_excludes[] = {
         "bin",
@@ -1023,7 +1027,11 @@ daemon_create_user_authorized_cb (Daemon              
         CreateUserData *cd = data;
         User *user;
         GError *error;
+#ifndef __OpenBSD__
         gchar *argv[9];
+#else
+        gchar *argv[13];
+#endif
 
         if (getpwnam (cd->user_name) != NULL) {
                 throw_error (context, ERROR_USER_EXISTS, "A user with name '%s' already exists", cd->user_name);
@@ -1040,14 +1048,31 @@ daemon_create_user_authorized_cb (Daemon              
         if (cd->account_type == ACCOUNT_TYPE_ADMINISTRATOR) {
                 argv[4] = "-G";
                 argv[5] = "wheel";
+#ifdef __OpenBSD__
+                argv[6] = "-g";
+                argv[7] = "=uid";
+                argv[8] = "-L";
+                argv[9] = "staff";
+                argv[10] = "--";
+                argv[11] = cd->user_name;
+                argv[12] = NULL;
+#else
                 argv[6] = "--";
                 argv[7] = cd->user_name;
                 argv[8] = NULL;
+#endif
         }
         else if (cd->account_type == ACCOUNT_TYPE_STANDARD) {
+#ifdef __OpenBSD__
+                argv[4] = "-g";
+                argv[5] = "=uid";
+                argv[6] = cd->user_name;
+                argv[7] = NULL;
+#else
                 argv[4] = "--";
                 argv[5] = cd->user_name;
                 argv[6] = NULL;
+#endif
         }
         else {
                 throw_error (context, ERROR_FAILED, "Don't know how to add user of type %d", cd->account_type);
@@ -1117,6 +1142,28 @@ daemon_delete_user_authorized_cb (Daemon              
 
                 return;
         }
+
+/*
+ * Under OpenBSD 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.
+ */
+#ifdef __OpenBSD__
+        GError *grperror;
+        gchar *grpargv[2];
+
+        sys_log (context, "delete group '%d'", pwent->pw_gid);
+
+        grpargv[0] = "/usr/sbin/groupdel";
+        grpargv[1] = pwent->pw_name;
+
+        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);
 
