$OpenBSD: patch-src_user_c,v 1.7 2011/07/04 05:16:47 ajacoutot Exp $
--- src/user.c.orig	Thu May 19 05:38:50 2011
+++ src/user.c	Mon Jul  4 07:13:32 2011
@@ -29,7 +29,11 @@
 #include <sys/wait.h>
 #include <unistd.h>
 #include <grp.h>
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
+#include <pwd.h>
+#else
 #include <shadow.h>
+#endif
 
 #include <glib.h>
 #include <glib/gi18n.h>
@@ -46,7 +50,7 @@
 #include "user-glue.h"
 #include "util.h"
 
-#define ICONDIR LOCALSTATEDIR "/lib/AccountsService/icons"
+#define ICONDIR LOCALSTATEDIR "/db/AccountsService/icons"
 
 enum {
         PROP_0,
@@ -430,9 +434,13 @@ account_type_from_pwent (struct passwd *pwent)
 {
         struct group *grp;
         gid_t wheel;
-        gid_t *groups;
         gint ngroups;
         gint i;
+#ifdef __OpenBSD__
+        gid_t groups[NGROUPS_MAX + 1];
+#else
+        gid_t *groups;
+#endif
 
         if (pwent->pw_uid == 0) {
                 g_debug ("user is root so account type is administrator");
@@ -446,16 +454,28 @@ account_type_from_pwent (struct passwd *pwent)
         }
         wheel = grp->gr_gid;
 
+#ifdef __OpenBSD__
+        ngroups = sizeof(groups) / sizeof(gid_t);
+        if (getgrouplist (pwent->pw_name, pwent->pw_gid, groups, &ngroups) == -1) {
+                g_warning ("too many groups");
+                return ACCOUNT_TYPE_STANDARD;
+        }
+#else
         ngroups = get_user_groups (pwent->pw_name, pwent->pw_gid, &groups);
+#endif
 
         for (i = 0; i < ngroups; i++) {
                 if (groups[i] == wheel) {
+#ifndef __OpenBSD__
                         g_free (groups);
+#endif
                         return ACCOUNT_TYPE_ADMINISTRATOR;
                 }
         }
 
+#ifndef __OpenBSD__
         g_free (groups);
+#endif
 
         return ACCOUNT_TYPE_STANDARD;
 }
@@ -464,7 +484,11 @@ void
 user_local_update_from_pwent (User          *user,
                               struct passwd *pwent)
 {
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
+        struct passwd *spent;
+#else
         struct spwd *spent;
+#endif
         gchar *real_name;
         gboolean changed;
         const gchar *passwd;
@@ -555,16 +579,31 @@ user_local_update_from_pwent (User          *user,
         }
 
         passwd = pwent->pw_passwd;
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
+        spent = getpwnam (pwent->pw_name);
+        if (spent)
+                passwd = spent->pw_passwd;
+#else
         spent = getspnam (pwent->pw_name);
         if (spent)
                 passwd = spent->sp_pwdp;
+#endif
 
+#ifdef __OpenBSD__
+        if (g_str_has_suffix (user->shell, "-") == 1) {
+                locked = TRUE;
+        }
+        else {
+                locked = FALSE;
+        }
+#else
         if (passwd && passwd[0] == '!') {
                 locked = TRUE;
         }
         else {
                 locked = FALSE;
         }
+#endif
 
         if (user->locked != locked) {
                 user->locked = locked;
@@ -579,11 +618,13 @@ user_local_update_from_pwent (User          *user,
                 mode = PASSWORD_MODE_REGULAR;
         }
 
+#if !defined(__FreeBSD__) && !defined(__OpenBSD__)
         if (spent) {
                 if (spent->sp_lstchg == 0) {
                         mode = PASSWORD_MODE_SET_AT_LOGIN;
                 }
         }
+#endif
 
         if (user->password_mode != mode) {
                 user->password_mode = mode;
@@ -686,7 +727,7 @@ save_extra_data (User *user)
         error = NULL;
         data = g_key_file_to_data (keyfile, NULL, &error);
         if (error == NULL) {
-                filename = g_build_filename ("/var/lib/AccountsService/users",
+                filename = g_build_filename ("/var/db/AccountsService/users",
                                              user->user_name,
                                              NULL);
                 g_file_set_contents (filename, data, -1, &error);
@@ -707,9 +748,9 @@ move_extra_data (const gchar *old_name,
         gchar *old_filename;
         gchar *new_filename;
 
-        old_filename = g_build_filename ("/var/lib/AccountsService/users",
+        old_filename = g_build_filename ("/var/db/AccountsService/users",
                                          old_name, NULL);
-        new_filename = g_build_filename ("/var/lib/AccountsService/users",
+        new_filename = g_build_filename ("/var/db/AccountsService/users",
                                          new_name, NULL);
 
         g_rename (old_filename, new_filename);
@@ -1550,16 +1591,33 @@ user_change_locked_authorized_cb (Daemon              
 {
         gboolean locked = GPOINTER_TO_INT (data);
         GError *error;
+
+#ifdef __OpenBSD__
+        gchar *argv[5];
+        gchar *lockshell, *nolockshell;
+        lockshell = g_strjoin (NULL, user->shell, "-", NULL);
+        nolockshell = g_strdup(user->shell);
+        if (nolockshell[strlen(nolockshell) - 1] == '-')
+               nolockshell[strlen(nolockshell)-1] = '\0';
+#else
         gchar *argv[4];
+#endif
 
         if (user->locked != locked) {
                 sys_log (context,
                          "%s account of user '%s' (%d)",
                          locked ? "locking" : "unlocking", user->user_name, user->uid);
                 argv[0] = "/usr/sbin/usermod";
+#ifdef __OpenBSD__
+                argv[1] = "-s";
+                argv[2] = locked ? lockshell : nolockshell;
+                argv[3] = user->user_name;
+                argv[4] = NULL;
+#else
                 argv[1] = locked ? "-L" : "-U";
                 argv[2] = user->user_name;
                 argv[3] = NULL;
+#endif
 
                 error = NULL;
                 if (!spawn_with_login_uid (context, argv, &error)) {
@@ -1568,6 +1626,10 @@ user_change_locked_authorized_cb (Daemon              
                         return;
                 }
 
+#ifdef __OpenBSD__
+               g_free (lockshell);
+               g_free (nolockshell);
+#endif
                 user->locked = locked;
 
                 g_signal_emit (user, signals[CHANGED], 0);
@@ -1634,7 +1696,11 @@ user_change_account_type_authorized_cb (Daemon        
                 }
                 switch (account_type) {
                 case ACCOUNT_TYPE_ADMINISTRATOR:
+#ifdef __OpenBSD__
+                        g_string_append_printf (str, "%s", "wheel");
+#else
                         g_string_append_printf (str, "%d", wheel);
+#endif
                         break;
                 default:
                         /* remove excess comma */
@@ -1753,9 +1819,16 @@ user_change_password_mode_authorized_cb (Daemon       
                 }
                 else if (user->locked) {
                         argv[0] = "/usr/sbin/usermod";
+#ifdef __OpenBSD__
+                        argv[1] = "-s";
+                        argv[2] = g_strndup (user->shell, sizeof(user->shell));
+                        argv[3] = user->user_name;
+                        argv[4] = NULL;
+#else
                         argv[1] = "-U";
                         argv[2] = user->user_name;
                         argv[3] = NULL;
+#endif
 
                         error = NULL;
                         if (!spawn_with_login_uid (context, argv, &error)) {
