chiark / gitweb /
server, common: New header slip.h contains definitions for SLIP.
[tripe] / common / util.c
index 1745655104b5e8f6dc43d71a5adee6473fb47324..92b9853d2cb789e3e7fdd0ace0ec2adef7d0a190 100644 (file)
@@ -1,13 +1,11 @@
 /* -*-c-*-
- *
- * $Id: util.c,v 1.3 2004/04/08 01:36:17 mdw Exp $
  *
  * Utilities for the client and the server
  *
  * (c) 2001 Straylight/Edgeware
  */
 
-/*----- Licensing notice --------------------------------------------------* 
+/*----- Licensing notice --------------------------------------------------*
  *
  * This file is part of Trivial IP Encryption (TrIPE).
  *
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * TrIPE is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with TrIPE; if not, write to the Free Software Foundation,
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 #include <stdlib.h>
 #include <string.h>
 
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <pwd.h>
+#include <grp.h>
+
 #include <mLib/dstr.h>
+#include <mLib/report.h>
 
 #include "util.h"
 
@@ -67,4 +72,83 @@ void u_quotify(dstr *d, const char *p)
   }
 }
 
+/* --- @u_getuser@ --- *
+ *
+ * Arguments:  @const char *name@ = user name or id requested
+ *             @gid_t *gg@ = where to store corresponding gid
+ *
+ * Returns:    Corresponding uid.
+ *
+ * Use:                Resolves a user name into a uid.  Dies on failure; suitable
+ *             for use in argument parsing.
+ */
+
+uid_t u_getuser(const char *name, gid_t *gg)
+{
+  struct passwd *pw;
+  char *p;
+  unsigned long i = strtoul(name, &p, 0);
+
+  if (!*p)
+    pw = getpwuid(i);
+  else
+    pw = getpwnam(name);
+  if (!pw)
+    die(EXIT_FAILURE, "user `%s' not found", name);
+  if (gg && *gg == -1)
+    *gg = pw->pw_gid;
+  return (pw->pw_uid);
+}
+
+/* --- @u_getgroup@ --- *
+ *
+ * Arguments:  @const char *name@ = user name or id requested
+ *
+ * Returns:    Corresponding gid.
+ *
+ * Use:                Resolves a group name into a gid.  Dies on failure; suitable
+ *             for use in argument parsing.
+ */
+
+gid_t u_getgroup(const char *name)
+{
+  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));
+    }
+  }
+}
+
 /*----- That's all, folks -------------------------------------------------*/