jailsetup: use portable getent implementation
authorKyle J. McKay <mackyle@gmail.com>
Sat, 24 Aug 2013 03:12:41 +0000 (23 20:12 -0700)
committerKyle J. McKay <mackyle@gmail.com>
Sat, 24 Aug 2013 03:12:41 +0000 (23 20:12 -0700)
Not all systems have a getent utility.  Since this utility is only
used by the jailsetup.sh script, replace it with a limited emulation
of getent that should compile on all systems and supports the use
jailsetup.sh makes of it.

install.sh
jailsetup.sh
src/.gitignore
src/Makefile
src/getent.c [new file with mode: 0644]

index 302f9fb..f00b9f6 100755 (executable)
@@ -23,11 +23,16 @@ fi
 
 
 echo "*** Checking for compiled utilities..."
-if [ ! -f src/can_user_push ]; then
+if [ ! -x src/can_user_push ]; then
        echo "ERROR: src/can_user_push is not built! Did you _REALLY_ read INSTALL?" >&2
        echo "ERROR: perhaps you forgot to run make?" >&2
        exit 1
 fi
+if [ ! -x src/getent ]; then
+       echo "ERROR: src/getent is not built! Did you _REALLY_ read INSTALL?" >&2
+       echo "ERROR: perhaps you forgot to run make?" >&2
+       exit 1
+fi
 
 
 echo "*** Checking for ezcert..."
index 37582cd..baedf9b 100755 (executable)
@@ -43,13 +43,13 @@ if ! "$getent" passwd "$cfg_mirror_user" >/dev/null; then
        echo "*** Error: You do not have \"$cfg_mirror_user\" user in system yet." >&2
        exit 1
 fi
-if ! getent passwd "$cfg_cgi_user" >/dev/null; then
+if ! "$getent" passwd "$cfg_cgi_user" >/dev/null; then
        echo "*** Error: You do not have \"$cfg_cgi_user\" user in system yet." >&2
        exit 1
 fi
 if [ -n "$dbonly" -a -z "$cfg_owning_group" ]; then
-       cfg_owning_group="$(getent passwd "$cfg_mirror_user" | cut -d : -f 4)"
-elif ! getent group "$cfg_owning_group" >/dev/null; then
+       cfg_owning_group="$("$getent" passwd "$cfg_mirror_user" | cut -d : -f 4)"
+elif ! "$getent" group "$cfg_owning_group" >/dev/null; then
        echo "*** Error: You do not have \"$cfg_owning_group\" group in system yet." >&2
        exit 1
 fi
@@ -87,7 +87,7 @@ fi
 
 if [ ! -s etc/group ]; then
        cat >etc/group <<EOT
-_repo:x:$(getent group "$cfg_owning_group" | cut -d : -f 3):$cfg_mirror_user
+_repo:x:$("$getent" group "$cfg_owning_group" | cut -d : -f 3):$cfg_mirror_user
 EOT
 fi
 
index 960aabb..3633632 100644 (file)
@@ -1,3 +1,6 @@
 can_user_push.d*
 can_user_push.o
 can_user_push
+getent.d*
+getent.o
+getent
index 59f8b8c..9c98523 100644 (file)
@@ -3,12 +3,16 @@ CFLAGS ?= -O
 
 .PHONY : all clean install
 
-all : can_user_push
+all : can_user_push getent
 
 clean :
        rm -rf can_user_push.o* can_user_push.d* can_user_push
+       rm -rf getent.o* getent.d* getent
 
 install :
 
 can_user_push : can_user_push.c
        $(CC) -o $@ $(CFLAGS) $?
+
+getent : getent.c
+       $(CC) -o $@ $(CFLAGS) $?
diff --git a/src/getent.c b/src/getent.c
new file mode 100644 (file)
index 0000000..73b9f83
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+
+getent.c -- getent utility simulation
+Copyright (c) 2013 Kyle J. McKay.  All rights reserved.
+
+This program 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
+of the License, or (at your option) any later version.
+
+This program 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 program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+*/
+
+/*
+  A very simple emulation of getent passwd and getent group.  No other databases
+  are supported.  Only a single key is supported.
+
+  USAGE: getent passwd|group key
+  Exit code 0 for success (and the /etc/passwd|/etc/group format line is written
+  to stdout), 1 for bad command, 2 for key not found.
+  Wrong number of or bad arguments exits with 1.
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <grp.h>
+#include <pwd.h>
+
+int main(int argc, char *argv[])
+{
+  const char *db;
+  const char *key;
+  int found = 0;
+
+  if (argc != 3)
+    return 1;
+
+  db = argv[1];
+  key = argv[2];
+  if (!db || !*db || !key || !*key)
+    return 1;
+
+  if (!strcmp(db, "passwd")) {
+    struct passwd *pwent = getpwnam(key);
+    if (pwent) {
+      found = 1;
+      printf("%s:%s:%d:%d:%s:%s:%s\n", pwent->pw_name, pwent->pw_passwd,
+        (int)pwent->pw_uid, (int)pwent->pw_gid, pwent->pw_gecos, pwent->pw_dir,
+        pwent->pw_shell);
+    }
+  } else if (!strcmp(db, "group")) {
+    struct group *grent = getgrnam(key);
+    if (grent) {
+      char **memb = grent->gr_mem;
+      found = 1;
+      printf("%s:%s:%d:", grent->gr_name, grent->gr_passwd, grent->gr_gid);
+      if (memb) {
+        int first = 1;
+        for (; *memb; ++memb) {
+          if (first)
+            first = 0;
+          else
+            putchar(',');
+          fputs(*memb, stdout);
+        }
+      }
+      putchar('\n');
+    }
+  } else {
+    return 1;
+  }
+  return found ? 0 : 2;
+}