+ struct group *gr;
+ char *p;
+ unsigned long i = strtoul(name, &p, 0);
+
+ if (!*p)
+ gr = getgrgid(i);
+ else
+ gr = getgrnam(name);
+ if (!gr)
+ die(EXIT_FAILURE, "group `%s' not found", name);
+ return (gr->gr_gid);
+}
+
+/* --- @u_setugid@ --- *
+ *
+ * Arguments: @uid_t u@ = user to set
+ * @gid_t g@ = group to set
+ *
+ * Returns: ---
+ *
+ * Use: Sets user and group to the given values; aborts on failure.
+ */
+
+void u_setugid(uid_t u, gid_t g)
+{
+ if (g != (gid_t)-1) {
+ if (setgid(g) || (getuid() == 0 && setgroups(1, &g))) {
+ die(EXIT_FAILURE, "couldn't setgid to %u: %s",
+ (unsigned)g, strerror(errno));
+ }
+ }
+ if (u != (uid_t)-1) {
+ if (setuid(u)) {
+ die(EXIT_FAILURE, "couldn't setuid to %u: %s",
+ (unsigned)u, strerror(errno));
+ }
+ }