+/* user and group to drop privileges to */
+static const char *user  = "nobody";
+static const char *group = "nogroup";
+
 static const char *colorname[NUMCOLS] = {
        "black",     /* after initialization */
        "#005577",   /* during input */
 
 LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr
 
 # flags
-CPPFLAGS = -DVERSION=\"${VERSION}\" -DHAVE_SHADOW_H
+CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H
 CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
 LDFLAGS = -s ${LIBS}
 COMPATSRC = explicit_bzero.c
 
 
 #include <ctype.h>
 #include <errno.h>
+#include <grp.h>
 #include <pwd.h>
 #include <stdarg.h>
 #include <stdlib.h>
 }
 #endif
 
-/* only run as root */
 static const char *
 getpw(void)
 {
        }
 #endif /* HAVE_SHADOW_H */
 
-       /* drop privileges */
-       if (geteuid() == 0 &&
-           ((getegid() != pw->pw_gid && setgid(pw->pw_gid) < 0) || setuid(pw->pw_uid) < 0))
-               die("slock: cannot drop privileges\n");
        return rval;
 }
 
 
 int
 main(int argc, char **argv) {
+       struct passwd *pwd;
+       struct group *grp;
+       uid_t duid;
+       gid_t dgid;
        const char *pws;
        Display *dpy;
        int s, nlocks;
                usage();
        } ARGEND
 
+       /* validate drop-user and -group */
+       errno = 0;
+       if (!(pwd = getpwnam(user)))
+               die("slock: getpwnam %s: %s\n", user, errno ?
+                   strerror(errno) : "user entry not found");
+       duid = pwd->pw_uid;
+       errno = 0;
+       if (!(grp = getgrnam(group)))
+               die("slock: getgrnam %s: %s\n", group, errno ?
+                   strerror(errno) : "group entry not found");
+       dgid = grp->gr_gid;
+
 #ifdef __linux__
        dontkillme();
 #endif
        if (!(dpy = XOpenDisplay(NULL)))
                die("slock: cannot open display\n");
 
+       /* drop privileges */
+       if (setgroups(0, NULL) < 0)
+               die("slock: setgroups: %s\n", strerror(errno));
+       if (setgid(dgid) < 0)
+               die("slock: setgid: %s\n", strerror(errno));
+       if (setuid(duid) < 0)
+               die("slock: setuid: %s\n", strerror(errno));
+
        /* check for Xrandr support */
        rr = XRRQueryExtension(dpy, &rrevbase, &rrerrbase);