On Wed, Jun 10, 2015 at 04:44:17PM +0000, Joakim Tjernlund wrote:
> I wonder if it would be possible to use the script from 
> sys-apps/getent(included below)
> to impl. getent in user.eclass instead of using glibc's getent? I
> cannot see any downside, is there one?
> 
> This would help a lot(just seed your groups/users is in 
> ROOT/etc/{passwd,group ...} first)
> when cross building or ROOT != / as it would be trivial for the script to 
> respect ROOT/EPREFIX 
This would totally break when those services come from an NSS provider
other than files or compat.

There was a non-upstream patch to support NSS on non-root filesystems,
which would probably help a lot more; I haven't seen that original patch
in a while, so here's a very quick and completely untested
re-implementation of it.

In your case, you probably should MAKE sure that regardless of the
system nsswitch settings, the NSS file provider gets used.

Usage: NSS_FILES_ROOT=$ROOT/etc getent -s files passwd ...

-- 
Robin Hugh Johnson
Gentoo Linux: Developer, Infrastructure Lead
E-Mail     : robb...@gentoo.org
GnuPG FP   : 11ACBA4F 4778E3F6 E4EDF38E B27B944E 34884E85
nss_files: non-/ root support via env

In building systems eg cross-compile, it can be very useful to run getent on a
different root path.

This is a very rough, completely untested patch to implement it, based on a
patch I recall seeing many years ago, but can't find anywhere not.

Untested-By: Robin H. Johnson <robb...@gentoo.org>
Original-Author: Robin H. Johnson <robb...@gentoo.org>
Not-Signed-Off-By: Robin H. Johnson <robb...@gentoo.org>

diff -Nuar glibc-2.21.orig/nss/nss_files/files-XXX.c glibc-2.21/nss/nss_files/files-XXX.c
--- glibc-2.21.orig/nss/nss_files/files-XXX.c	2015-06-10 11:16:59.282269957 -0700
+++ glibc-2.21/nss/nss_files/files-XXX.c	2015-06-10 11:43:55.582631857 -0700
@@ -38,7 +38,8 @@
 
 #define ENTNAME_r	CONCAT(ENTNAME,_r)
 
-#define DATAFILE	"/etc/" DATABASE
+#define NSS_FILES_ROOT	"/etc/"
+#define DATAFILE	NSS_FILES_ROOT DATABASE
 
 #ifdef NEED_H_ERRNO
 # include <netdb.h>
@@ -75,7 +76,19 @@
 
   if (stream == NULL)
     {
-      stream = fopen (DATAFILE, "rce");
+      char* datafile = DATAFILE;
+      const char* datafile_root;
+      if(datafile_root = secure_getenv("NSS_FILES_ROOT")) {
+#define merged_datafile_len 1024
+	char merged_datafile[merged_datafile_len];
+	strncpy(merged_datafile, datafile_root, merged_datafile_len);
+	strncat(merged_datafile, DATABASE, merged_datafile_len - strlen(merged_datafile));
+	datafile = &merged_datafile;
+	/* If we are using a different root to the files, do not cache */
+        keep_stream = 0; 
+	stayopen = 0;
+      }
+      stream = fopen (datafile, "rce");
 
       if (stream == NULL)
 	status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;

Reply via email to