chiark / gitweb /
server/keyexch.c: Check that all of the algorithms match when setting up.
[tripe] / common / util.c
index ceeb0bd519ca7780e570f92fddeaed9c86ab27ee..3de554d72a35d1530f09bc86b7af0b54604ac79f 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 <sys/types.h>
 #include <unistd.h>
-#include <fcntl.h>
 
-#include "util.h"
+#include <pwd.h>
+#include <grp.h>
 
-#include <sys/ioctl.h>
+#include <mLib/dstr.h>
+#include <mLib/report.h>
+
+#include "util.h"
 
 /*----- Main code ---------------------------------------------------------*/
 
-/* --- @u_detach@ --- *
+/* --- @u_quotify@ --- *
  *
- * Arguments:  ---
+ * Arguments:  @dstr *d@ = where to write the answer
+ *             @const char *p@ = string to quotify
  *
  * Returns:    ---
  *
- * Use:                Detaches from the current terminal and ensures it can never
- *             acquire a new one.  Calls @fork@.
+ * Use:                Quotes the given string if necessary, according to our
+ *             quoting rules.
  */
 
-void u_detach(void)
+void u_quotify(dstr *d, const char *p)
 {
-#ifdef TIOCNOTTY
-  {
-    int fd;
-    if ((fd = open("/dev/tty", O_RDONLY)) >= 0) {
-      ioctl(fd, TIOCNOTTY);
-      close(fd);
+  if (d->len)
+    dstr_putc(d, ' ');
+  if (*p && !p[strcspn(p, "\"' \t\n\v")])
+    dstr_puts(d, p);
+  else {
+    dstr_putc(d, '\"');
+    while (*p) {
+      if (*p == '\\' || *p == '\"')
+       dstr_putc(d, '\\');
+      dstr_putc(d, *p++);
     }
+    dstr_putc(d, '\"');
   }
-#endif
-  setsid();
-  if (fork() > 0)
-    _exit(0);
+  dstr_putz(d);
+}
+
+/* --- @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_daemon@ --- *
+/* --- @u_getgroup@ --- *
  *
- * Arguments:  ---
+ * Arguments:  @const char *name@ = user name or id requested
  *
- * Returns:    Zero if OK, nonzero on failure.
+ * Returns:    Corresponding gid.
  *
- * Use:                Becomes a daemon.
+ * Use:                Resolves a group name into a gid.  Dies on failure; suitable
+ *             for use in argument parsing.
  */
 
-int u_daemon(void)
+gid_t u_getgroup(const char *name)
 {
-  pid_t kid;
-
-  if ((kid = fork()) < 0)
-    return (-1);
-  if (kid)
-    _exit(0);
-  u_detach();
-  return (0);
+  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)
+{
+  uid_t cu = geteuid();
+
+  if (cu == 0 && 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 -------------------------------------------------*/