chiark / gitweb /
do not die straight away on errors
[chiark-utils.git] / cprogs / really.c
index b240ea4..f4cfa08 100644 (file)
@@ -1,4 +1,22 @@
-/**/
+/*
+ * really.c - program for gaining privilege
+ *
+ * Copyright (C) 1992-3 Ian Jackson <iwj10@cus.cam.ac.uk>
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2,
+ * or (at your option) any later version.
+ *
+ * This 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 this file; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -6,8 +24,8 @@
 #include <unistd.h>
 #include <pwd.h>
 #include <grp.h>
-#include <errno.h>
 #include <sys/types.h>
+#include <errno.h>
 
 #include "myopt.h"
 
@@ -30,6 +48,15 @@ static const char *opt_user, *opt_useronly;
 static int opt_groupsclear= 0, opt_ngids= 0, opt_uidonly= -1;
 static int opt_gids[512];
 
+static void af_uidonly(const struct cmdinfo *cip, const char *value) {
+  unsigned long ul;
+  char *ep;
+
+  ul= strtoul(value,&ep,10);
+  if (*ep) { fprintf(stderr,"bad uid `%s'\n",value); exit(-1); }
+  opt_uidonly= ul;
+}
+
 static void af_group(const struct cmdinfo *cip, const char *value) {
   struct group *gr;
 
@@ -58,7 +85,7 @@ static void af_help(const struct cmdinfo *cip, const char *value) {
 static const struct cmdinfo cmdinfos[]= {
   { "user",         'u',  1,  0, &opt_user,          0,           },
   { "useronly",     'i',  1,  0, &opt_useronly,      0            },
-  { "uidonly",      'I',  1,  &opt_uidonly, 0,       0            },
+  { "uidonly",      'I',  1,  0, 0,                  af_uidonly   },
   { "groupsclear",  'z',  0,  &opt_groupsclear, 0,   0,        1  },
   { "group",        'g',  1,  0, 0,                  af_group     },
   { "gid",          'G',  1,  0, 0,                  af_gid       },
@@ -76,7 +103,7 @@ static void checkroot(void) {
 #ifdef REALLY_CHECK_GID
 static void checkroot(void) {
   gid_t groups[512];
-  int r;
+  int r, i;
 
   r= getgid(); if (r==REALLY_CHECK_GID) return;
   if (r<0) { perror("getgid check"); exit(-1); }