LDFLAGS = -s ${LIBS}
 COMPATSRC = explicit_bzero.c
 
-# On *BSD remove -DHAVE_SHADOW_H from CPPFLAGS and add -DHAVE_BSD_AUTH
+# On *BSD remove -DHAVE_SHADOW_H from CPPFLAGS
 # On OpenBSD and Darwin remove -lcrypt from LIBS
 #LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXext -lXrandr
-#CPPFLAGS = -DVERSION=\"${VERSION}\" -DHAVE_BSD_AUTH -D_BSD_SOURCE
+#CPPFLAGS = -DVERSION=\"${VERSION}\" -D_BSD_SOURCE
 #COMPATSRC =
 
 # compiler and linker
 CC = cc
-
-# Install mode. On BSD systems MODE=2755 and GROUP=auth
-# On others MODE=4755 and GROUP=root
-#MODE=2755
-#GROUP=auth
 
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 
-#if HAVE_BSD_AUTH
-#include <login_cap.h>
-#include <bsd_auth.h>
-#endif
-
 #include "arg.h"
 #include "util.h"
 
 }
 #endif
 
-#ifndef HAVE_BSD_AUTH
 /* only run as root */
 static const char *
 getpw(void)
        const char *rval;
        struct passwd *pw;
 
+       /* Check if the current user has a password entry */
        errno = 0;
        if (!(pw = getpwuid(getuid()))) {
                if (errno)
        if (rval[0] == 'x' && rval[1] == '\0') {
                struct spwd *sp;
                if (!(sp = getspnam(getenv("USER"))))
-                       die("slock: cannot retrieve shadow entry (make sure to suid or sgid slock)\n");
+                       die("slock: getspnam: cannot retrieve shadow entry (make sure to suid or sgid slock)\n");
                rval = sp->sp_pwdp;
        }
-#endif
+#else
+       if (rval[0] == '*' && rval[1] == '\0') {
+#ifdef __OpenBSD__
+               if (!(pw = getpwnam_shadow(getenv("USER"))))
+                       die("slock: getpwnam_shadow: cannot retrieve shadow entry (make sure to suid or sgid slock)\n");
+               rval = pw->pw_passwd;
+#else
+               die("slock: getpwuid: cannot retrieve shadow entry (make sure to suid or sgid slock)\n");
+#endif /* __OpenBSD__ */
+       }
+#endif /* HAVE_SHADOW_H */
 
        /* drop privileges */
        if (geteuid() == 0 &&
                die("slock: cannot drop privileges\n");
        return rval;
 }
-#endif
 
 static void
-#ifdef HAVE_BSD_AUTH
-readpw(Display *dpy)
-#else
 readpw(Display *dpy, const char *pws)
-#endif
 {
        char buf[32], passwd[256], *encrypted;
        int num, screen, running, failure;
                        switch (ksym) {
                        case XK_Return:
                                passwd[len] = 0;
-#ifdef HAVE_BSD_AUTH
-                               running = !auth_userokay(getlogin(), NULL, "auth-slock", passwd);
-#else
                                errno = 0;
                                if (!(encrypted = crypt(passwd, pws)))
                                        fprintf(stderr, "slock: crypt: %s\n", strerror(errno));
                                else
                                        running = !!strcmp(encrypted, pws);
-#endif
                                if (running) {
                                        XBell(dpy, 100);
                                        failure = True;
 
 int
 main(int argc, char **argv) {
-#ifndef HAVE_BSD_AUTH
        const char *pws;
-#endif
        Display *dpy;
        int s, nlocks;
 
        dontkillme();
 #endif
 
-       /* Check if the current user has a password entry */
-       errno = 0;
-       if (!getpwuid(getuid())) {
-               if (errno == 0)
-                       die("slock: no password entry for current user\n");
-               else
-                       die("slock: getpwuid: %s\n", strerror(errno));
-       }
-
-#ifndef HAVE_BSD_AUTH
        pws = getpw();
        if (strlen(pws) < 2)
                die("slock: failed to get user password hash.\n");
-#endif
 
        if (!(dpy = XOpenDisplay(NULL)))
                die("slock: cannot open display\n");
        }
 
        /* everything is now blank. Wait for the correct password */
-#ifdef HAVE_BSD_AUTH
-       readpw(dpy);
-#else
        readpw(dpy, pws);
-#endif
 
        /* password ok, unlock everything and quit */
        cleanup(dpy);