From 633445be1a9be37ae727c044417f5607706cf4ae Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Tue, 26 Jun 2018 00:25:28 +0000 Subject: Initial commit --- .gitignore | 10 + AUTHORS | 5 + COPYING | 13 + INSTALL | 175 +++++++++ Makefile | 154 ++++++++ NEWS | 6 + README | 28 ++ README.macosx | 4 + README.solaris | 12 + configure | 466 +++++++++++++++++++++++ doc/index.html | 163 ++++++++ doc/libnsss/index.html | 97 +++++ doc/overview.html | 35 ++ doc/upgrade.html | 28 ++ examples/openrc/nsssd | 6 + examples/s6-rc/nsssd-log/consumer-for | 1 + examples/s6-rc/nsssd-log/dependencies | 1 + examples/s6-rc/nsssd-log/run | 5 + examples/s6-rc/nsssd-log/type | 1 + examples/s6-rc/nsssd/dependencies | 1 + examples/s6-rc/nsssd/notification-fd | 1 + examples/s6-rc/nsssd/pipeline-name | 1 + examples/s6-rc/nsssd/producer-for | 1 + examples/s6-rc/nsssd/run | 7 + examples/s6-rc/nsssd/type | 1 + examples/s6/nsssd/log/run | 5 + examples/s6/nsssd/notification-fd | 1 + examples/s6/nsssd/run | 7 + package/deps-build | 1 + package/deps.mak | 160 ++++++++ package/info | 4 + package/modes | 2 + package/targets.mak | 7 + patch-for-solaris | 21 ++ src/include/grp.h | 27 ++ src/include/nsss/grp-all.h | 20 + src/include/nsss/grp-def.h | 16 + src/include/nsss/grp-switch.h | 20 + src/include/nsss/grp-unix.h | 20 + src/include/nsss/grp.h | 58 +++ src/include/nsss/nsss-all.h | 10 + src/include/nsss/nsss-switch.h | 93 +++++ src/include/nsss/nsss-unix.h | 61 +++ src/include/nsss/nsss.h | 10 + src/include/nsss/nsssd.h | 84 +++++ src/include/nsss/pwd-all.h | 20 + src/include/nsss/pwd-def.h | 19 + src/include/nsss/pwd-switch.h | 20 + src/include/nsss/pwd-unix.h | 20 + src/include/nsss/pwd.h | 58 +++ src/include/nsss/shadow-all.h | 18 + src/include/nsss/shadow-def.h | 21 ++ src/include/nsss/shadow-switch.h | 18 + src/include/nsss/shadow-unix.h | 18 + src/include/nsss/shadow.h | 52 +++ src/include/pwd.h | 20 + src/include/shadow.h | 26 ++ src/libnsss/deps-lib/nsss | 111 ++++++ src/libnsss/nsss-all-internal.h | 8 + src/libnsss/nsss-internal.h | 35 ++ src/libnsss/nsss-switch-internal.h | 21 ++ src/libnsss/nsss-unix-internal.h | 13 + src/libnsss/nsss_all_endgrent.c | 17 + src/libnsss/nsss_all_endpwent.c | 17 + src/libnsss/nsss_all_endspent.c | 17 + src/libnsss/nsss_all_errno.c | 5 + src/libnsss/nsss_all_getgrent.c | 28 ++ src/libnsss/nsss_all_getgrent_r.c | 44 +++ src/libnsss/nsss_all_getgrgid.c | 29 ++ src/libnsss/nsss_all_getgrgid_r.c | 41 ++ src/libnsss/nsss_all_getgrnam.c | 29 ++ src/libnsss/nsss_all_getgrnam_r.c | 41 ++ src/libnsss/nsss_all_getpwent.c | 26 ++ src/libnsss/nsss_all_getpwent_r.c | 42 +++ src/libnsss/nsss_all_getpwnam.c | 27 ++ src/libnsss/nsss_all_getpwnam_r.c | 39 ++ src/libnsss/nsss_all_getpwuid.c | 27 ++ src/libnsss/nsss_all_getpwuid_r.c | 39 ++ src/libnsss/nsss_all_getspent.c | 26 ++ src/libnsss/nsss_all_getspent_r.c | 42 +++ src/libnsss/nsss_all_getspnam.c | 27 ++ src/libnsss/nsss_all_getspnam_r.c | 39 ++ src/libnsss/nsss_all_setgrent.c | 22 ++ src/libnsss/nsss_all_setpwent.c | 22 ++ src/libnsss/nsss_all_setspent.c | 22 ++ src/libnsss/nsss_grp_copy.c | 27 ++ src/libnsss/nsss_grp_here.c | 10 + src/libnsss/nsss_pwd_copy.c | 19 + src/libnsss/nsss_pwd_here.c | 8 + src/libnsss/nsss_shadow_copy.c | 21 ++ src/libnsss/nsss_shadow_here.c | 8 + src/libnsss/nsss_switch_end.c | 17 + src/libnsss/nsss_switch_endgrent.c | 10 + src/libnsss/nsss_switch_endpwent.c | 10 + src/libnsss/nsss_switch_endspent.c | 10 + src/libnsss/nsss_switch_getgrent.c | 17 + src/libnsss/nsss_switch_getgrent_r.c | 36 ++ src/libnsss/nsss_switch_getgrgid.c | 22 ++ src/libnsss/nsss_switch_getgrgid_r.c | 36 ++ src/libnsss/nsss_switch_getgrnam.c | 22 ++ src/libnsss/nsss_switch_getgrnam_r.c | 36 ++ src/libnsss/nsss_switch_getpwent.c | 15 + src/libnsss/nsss_switch_getpwent_r.c | 34 ++ src/libnsss/nsss_switch_getpwnam.c | 20 + src/libnsss/nsss_switch_getpwnam_r.c | 34 ++ src/libnsss/nsss_switch_getpwuid.c | 20 + src/libnsss/nsss_switch_getpwuid_r.c | 34 ++ src/libnsss/nsss_switch_getspent.c | 15 + src/libnsss/nsss_switch_getspent_r.c | 34 ++ src/libnsss/nsss_switch_getspnam.c | 20 + src/libnsss/nsss_switch_getspnam_r.c | 34 ++ src/libnsss/nsss_switch_grp_end.c | 9 + src/libnsss/nsss_switch_grp_get.c | 17 + src/libnsss/nsss_switch_grp_getbygid.c | 19 + src/libnsss/nsss_switch_grp_getbyname.c | 24 ++ src/libnsss/nsss_switch_grp_read.c | 58 +++ src/libnsss/nsss_switch_grp_rewind.c | 9 + src/libnsss/nsss_switch_here.c | 6 + src/libnsss/nsss_switch_op.c | 16 + src/libnsss/nsss_switch_pwd_end.c | 9 + src/libnsss/nsss_switch_pwd_get.c | 17 + src/libnsss/nsss_switch_pwd_getbyname.c | 24 ++ src/libnsss/nsss_switch_pwd_getbyuid.c | 19 + src/libnsss/nsss_switch_pwd_read.c | 53 +++ src/libnsss/nsss_switch_pwd_rewind.c | 9 + src/libnsss/nsss_switch_setgrent.c | 12 + src/libnsss/nsss_switch_setpwent.c | 12 + src/libnsss/nsss_switch_setspent.c | 12 + src/libnsss/nsss_switch_shadow_end.c | 9 + src/libnsss/nsss_switch_shadow_get.c | 17 + src/libnsss/nsss_switch_shadow_getbyname.c | 24 ++ src/libnsss/nsss_switch_shadow_read.c | 56 +++ src/libnsss/nsss_switch_shadow_rewind.c | 9 + src/libnsss/nsss_switch_start.c | 26 ++ src/libnsss/nsss_unix_end.c | 11 + src/libnsss/nsss_unix_endgrent.c | 9 + src/libnsss/nsss_unix_endpwent.c | 9 + src/libnsss/nsss_unix_endspent.c | 9 + src/libnsss/nsss_unix_field.c | 14 + src/libnsss/nsss_unix_getgrent.c | 16 + src/libnsss/nsss_unix_getgrent_r.c | 35 ++ src/libnsss/nsss_unix_getgrgid.c | 21 ++ src/libnsss/nsss_unix_getgrgid_r.c | 35 ++ src/libnsss/nsss_unix_getgrnam.c | 21 ++ src/libnsss/nsss_unix_getgrnam_r.c | 35 ++ src/libnsss/nsss_unix_getpwent.c | 14 + src/libnsss/nsss_unix_getpwent_r.c | 33 ++ src/libnsss/nsss_unix_getpwnam.c | 19 + src/libnsss/nsss_unix_getpwnam_r.c | 33 ++ src/libnsss/nsss_unix_getpwuid.c | 19 + src/libnsss/nsss_unix_getpwuid_r.c | 33 ++ src/libnsss/nsss_unix_getspent.c | 14 + src/libnsss/nsss_unix_getspent_r.c | 33 ++ src/libnsss/nsss_unix_getspnam.c | 19 + src/libnsss/nsss_unix_getspnam_r.c | 33 ++ src/libnsss/nsss_unix_grp_get.c | 62 +++ src/libnsss/nsss_unix_grp_getbygid.c | 22 ++ src/libnsss/nsss_unix_grp_getbyname.c | 22 ++ src/libnsss/nsss_unix_grp_here.c | 5 + src/libnsss/nsss_unix_maybe_start.c | 9 + src/libnsss/nsss_unix_pwd_get.c | 45 +++ src/libnsss/nsss_unix_pwd_getbyname.c | 19 + src/libnsss/nsss_unix_pwd_getbyuid.c | 19 + src/libnsss/nsss_unix_pwd_here.c | 5 + src/libnsss/nsss_unix_rewind.c | 13 + src/libnsss/nsss_unix_setgrent.c | 11 + src/libnsss/nsss_unix_setpwent.c | 11 + src/libnsss/nsss_unix_setspent.c | 11 + src/libnsss/nsss_unix_shadow_get.c | 52 +++ src/libnsss/nsss_unix_shadow_getbyname.c | 19 + src/libnsss/nsss_unix_shadow_here.c | 5 + src/libnsss/nsss_unix_start.c | 13 + src/nsssd/deps-exe/nsssd-nslcd | 2 + src/nsssd/deps-exe/nsssd-unix | 3 + src/nsssd/deps-lib/nsssd | 3 + src/nsssd/nsssd-nslcd.c | 583 +++++++++++++++++++++++++++++ src/nsssd/nsssd-nslcd.h | 26 ++ src/nsssd/nsssd-unix.c | 170 +++++++++ src/nsssd/nsssd_convert.c | 41 ++ src/nsssd/nsssd_main.c | 419 +++++++++++++++++++++ tools/gen-deps.sh | 93 +++++ tools/install.sh | 64 ++++ 182 files changed, 6262 insertions(+) create mode 100644 .gitignore create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 INSTALL create mode 100644 Makefile create mode 100644 NEWS create mode 100644 README create mode 100644 README.macosx create mode 100644 README.solaris create mode 100755 configure create mode 100644 doc/index.html create mode 100644 doc/libnsss/index.html create mode 100644 doc/overview.html create mode 100644 doc/upgrade.html create mode 100755 examples/openrc/nsssd create mode 100644 examples/s6-rc/nsssd-log/consumer-for create mode 100644 examples/s6-rc/nsssd-log/dependencies create mode 100644 examples/s6-rc/nsssd-log/run create mode 100644 examples/s6-rc/nsssd-log/type create mode 100644 examples/s6-rc/nsssd/dependencies create mode 100644 examples/s6-rc/nsssd/notification-fd create mode 100644 examples/s6-rc/nsssd/pipeline-name create mode 100644 examples/s6-rc/nsssd/producer-for create mode 100644 examples/s6-rc/nsssd/run create mode 100644 examples/s6-rc/nsssd/type create mode 100755 examples/s6/nsssd/log/run create mode 100644 examples/s6/nsssd/notification-fd create mode 100755 examples/s6/nsssd/run create mode 100644 package/deps-build create mode 100644 package/deps.mak create mode 100644 package/info create mode 100644 package/modes create mode 100644 package/targets.mak create mode 100755 patch-for-solaris create mode 100644 src/include/grp.h create mode 100644 src/include/nsss/grp-all.h create mode 100644 src/include/nsss/grp-def.h create mode 100644 src/include/nsss/grp-switch.h create mode 100644 src/include/nsss/grp-unix.h create mode 100644 src/include/nsss/grp.h create mode 100644 src/include/nsss/nsss-all.h create mode 100644 src/include/nsss/nsss-switch.h create mode 100644 src/include/nsss/nsss-unix.h create mode 100644 src/include/nsss/nsss.h create mode 100644 src/include/nsss/nsssd.h create mode 100644 src/include/nsss/pwd-all.h create mode 100644 src/include/nsss/pwd-def.h create mode 100644 src/include/nsss/pwd-switch.h create mode 100644 src/include/nsss/pwd-unix.h create mode 100644 src/include/nsss/pwd.h create mode 100644 src/include/nsss/shadow-all.h create mode 100644 src/include/nsss/shadow-def.h create mode 100644 src/include/nsss/shadow-switch.h create mode 100644 src/include/nsss/shadow-unix.h create mode 100644 src/include/nsss/shadow.h create mode 100644 src/include/pwd.h create mode 100644 src/include/shadow.h create mode 100644 src/libnsss/deps-lib/nsss create mode 100644 src/libnsss/nsss-all-internal.h create mode 100644 src/libnsss/nsss-internal.h create mode 100644 src/libnsss/nsss-switch-internal.h create mode 100644 src/libnsss/nsss-unix-internal.h create mode 100644 src/libnsss/nsss_all_endgrent.c create mode 100644 src/libnsss/nsss_all_endpwent.c create mode 100644 src/libnsss/nsss_all_endspent.c create mode 100644 src/libnsss/nsss_all_errno.c create mode 100644 src/libnsss/nsss_all_getgrent.c create mode 100644 src/libnsss/nsss_all_getgrent_r.c create mode 100644 src/libnsss/nsss_all_getgrgid.c create mode 100644 src/libnsss/nsss_all_getgrgid_r.c create mode 100644 src/libnsss/nsss_all_getgrnam.c create mode 100644 src/libnsss/nsss_all_getgrnam_r.c create mode 100644 src/libnsss/nsss_all_getpwent.c create mode 100644 src/libnsss/nsss_all_getpwent_r.c create mode 100644 src/libnsss/nsss_all_getpwnam.c create mode 100644 src/libnsss/nsss_all_getpwnam_r.c create mode 100644 src/libnsss/nsss_all_getpwuid.c create mode 100644 src/libnsss/nsss_all_getpwuid_r.c create mode 100644 src/libnsss/nsss_all_getspent.c create mode 100644 src/libnsss/nsss_all_getspent_r.c create mode 100644 src/libnsss/nsss_all_getspnam.c create mode 100644 src/libnsss/nsss_all_getspnam_r.c create mode 100644 src/libnsss/nsss_all_setgrent.c create mode 100644 src/libnsss/nsss_all_setpwent.c create mode 100644 src/libnsss/nsss_all_setspent.c create mode 100644 src/libnsss/nsss_grp_copy.c create mode 100644 src/libnsss/nsss_grp_here.c create mode 100644 src/libnsss/nsss_pwd_copy.c create mode 100644 src/libnsss/nsss_pwd_here.c create mode 100644 src/libnsss/nsss_shadow_copy.c create mode 100644 src/libnsss/nsss_shadow_here.c create mode 100644 src/libnsss/nsss_switch_end.c create mode 100644 src/libnsss/nsss_switch_endgrent.c create mode 100644 src/libnsss/nsss_switch_endpwent.c create mode 100644 src/libnsss/nsss_switch_endspent.c create mode 100644 src/libnsss/nsss_switch_getgrent.c create mode 100644 src/libnsss/nsss_switch_getgrent_r.c create mode 100644 src/libnsss/nsss_switch_getgrgid.c create mode 100644 src/libnsss/nsss_switch_getgrgid_r.c create mode 100644 src/libnsss/nsss_switch_getgrnam.c create mode 100644 src/libnsss/nsss_switch_getgrnam_r.c create mode 100644 src/libnsss/nsss_switch_getpwent.c create mode 100644 src/libnsss/nsss_switch_getpwent_r.c create mode 100644 src/libnsss/nsss_switch_getpwnam.c create mode 100644 src/libnsss/nsss_switch_getpwnam_r.c create mode 100644 src/libnsss/nsss_switch_getpwuid.c create mode 100644 src/libnsss/nsss_switch_getpwuid_r.c create mode 100644 src/libnsss/nsss_switch_getspent.c create mode 100644 src/libnsss/nsss_switch_getspent_r.c create mode 100644 src/libnsss/nsss_switch_getspnam.c create mode 100644 src/libnsss/nsss_switch_getspnam_r.c create mode 100644 src/libnsss/nsss_switch_grp_end.c create mode 100644 src/libnsss/nsss_switch_grp_get.c create mode 100644 src/libnsss/nsss_switch_grp_getbygid.c create mode 100644 src/libnsss/nsss_switch_grp_getbyname.c create mode 100644 src/libnsss/nsss_switch_grp_read.c create mode 100644 src/libnsss/nsss_switch_grp_rewind.c create mode 100644 src/libnsss/nsss_switch_here.c create mode 100644 src/libnsss/nsss_switch_op.c create mode 100644 src/libnsss/nsss_switch_pwd_end.c create mode 100644 src/libnsss/nsss_switch_pwd_get.c create mode 100644 src/libnsss/nsss_switch_pwd_getbyname.c create mode 100644 src/libnsss/nsss_switch_pwd_getbyuid.c create mode 100644 src/libnsss/nsss_switch_pwd_read.c create mode 100644 src/libnsss/nsss_switch_pwd_rewind.c create mode 100644 src/libnsss/nsss_switch_setgrent.c create mode 100644 src/libnsss/nsss_switch_setpwent.c create mode 100644 src/libnsss/nsss_switch_setspent.c create mode 100644 src/libnsss/nsss_switch_shadow_end.c create mode 100644 src/libnsss/nsss_switch_shadow_get.c create mode 100644 src/libnsss/nsss_switch_shadow_getbyname.c create mode 100644 src/libnsss/nsss_switch_shadow_read.c create mode 100644 src/libnsss/nsss_switch_shadow_rewind.c create mode 100644 src/libnsss/nsss_switch_start.c create mode 100644 src/libnsss/nsss_unix_end.c create mode 100644 src/libnsss/nsss_unix_endgrent.c create mode 100644 src/libnsss/nsss_unix_endpwent.c create mode 100644 src/libnsss/nsss_unix_endspent.c create mode 100644 src/libnsss/nsss_unix_field.c create mode 100644 src/libnsss/nsss_unix_getgrent.c create mode 100644 src/libnsss/nsss_unix_getgrent_r.c create mode 100644 src/libnsss/nsss_unix_getgrgid.c create mode 100644 src/libnsss/nsss_unix_getgrgid_r.c create mode 100644 src/libnsss/nsss_unix_getgrnam.c create mode 100644 src/libnsss/nsss_unix_getgrnam_r.c create mode 100644 src/libnsss/nsss_unix_getpwent.c create mode 100644 src/libnsss/nsss_unix_getpwent_r.c create mode 100644 src/libnsss/nsss_unix_getpwnam.c create mode 100644 src/libnsss/nsss_unix_getpwnam_r.c create mode 100644 src/libnsss/nsss_unix_getpwuid.c create mode 100644 src/libnsss/nsss_unix_getpwuid_r.c create mode 100644 src/libnsss/nsss_unix_getspent.c create mode 100644 src/libnsss/nsss_unix_getspent_r.c create mode 100644 src/libnsss/nsss_unix_getspnam.c create mode 100644 src/libnsss/nsss_unix_getspnam_r.c create mode 100644 src/libnsss/nsss_unix_grp_get.c create mode 100644 src/libnsss/nsss_unix_grp_getbygid.c create mode 100644 src/libnsss/nsss_unix_grp_getbyname.c create mode 100644 src/libnsss/nsss_unix_grp_here.c create mode 100644 src/libnsss/nsss_unix_maybe_start.c create mode 100644 src/libnsss/nsss_unix_pwd_get.c create mode 100644 src/libnsss/nsss_unix_pwd_getbyname.c create mode 100644 src/libnsss/nsss_unix_pwd_getbyuid.c create mode 100644 src/libnsss/nsss_unix_pwd_here.c create mode 100644 src/libnsss/nsss_unix_rewind.c create mode 100644 src/libnsss/nsss_unix_setgrent.c create mode 100644 src/libnsss/nsss_unix_setpwent.c create mode 100644 src/libnsss/nsss_unix_setspent.c create mode 100644 src/libnsss/nsss_unix_shadow_get.c create mode 100644 src/libnsss/nsss_unix_shadow_getbyname.c create mode 100644 src/libnsss/nsss_unix_shadow_here.c create mode 100644 src/libnsss/nsss_unix_start.c create mode 100644 src/nsssd/deps-exe/nsssd-nslcd create mode 100644 src/nsssd/deps-exe/nsssd-unix create mode 100644 src/nsssd/deps-lib/nsssd create mode 100644 src/nsssd/nsssd-nslcd.c create mode 100644 src/nsssd/nsssd-nslcd.h create mode 100644 src/nsssd/nsssd-unix.c create mode 100644 src/nsssd/nsssd_convert.c create mode 100644 src/nsssd/nsssd_main.c create mode 100755 tools/gen-deps.sh create mode 100755 tools/install.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a3a3520 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*.o +*.lo +/config.mak +/src/include/nsss/config.h +/libnsss.a.xyzzy +/libnsss.so.xyzzy +/libnsssd.a.xyzzy +/libnsssd.so.xyzzy +/nsssd-unix +/nsssd-nslcd diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..1a38c57 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,5 @@ +Main author: + Laurent Bercot + +Thanks to: + A. Wilcox diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..361dcb6 --- /dev/null +++ b/COPYING @@ -0,0 +1,13 @@ +Copyright (c) 2018 Laurent Bercot + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..247834f --- /dev/null +++ b/INSTALL @@ -0,0 +1,175 @@ +Build Instructions +------------------ + +* Requirements + ------------ + + - A POSIX-compliant C development environment + - GNU make version 3.81 or later + - skalibs version 2.6.5.0 or later: http://skarnet.org/software/skalibs/ + + This software will run on any operating system that implements +POSIX.1-2008, available at: + http://pubs.opengroup.org/onlinepubs/9699919799/ + + +* Standard usage + -------------- + + ./configure && make && sudo make install + + will work for most users. + It will install the binaries in /bin and the static libraries in +/usr/lib/nsss. + + Please note that static libraries in /usr/lib/nsss *will not* +be found by a default linker invocation: you need -L/usr/lib/nsss. +Other skarnet.org software automatically handles that case if the +default configuration is used, but if you change the configuration, +remember to use the appropriate --with-lib configure option. + + You can strip the binaries and libraries of their extra symbols via +"make strip" before the "make install" phase. It will shave a few bytes +off them. + + +* Customization + ------------- + + You can customize paths via flags given to configure. + See ./configure --help for a list of all available configure options. + + +* Environment variables + --------------------- + + Controlling a build process via environment variables is a big and +dangerous hammer. You should try and pass flags to configure instead; +nevertheless, a few standard environment variables are recognized. + + If the CC environment variable is set, its value will override compiler +detection by configure. The --host=HOST option will still add a HOST- +prefix to the value of CC. + + The values of CFLAGS, CPPFLAGS and LDFLAGS will be appended to flags +auto-detected by configure. To entirely override the flags set by +configure instead, use make variables. + + +* Make variables + -------------- + + You can invoke make with a few variables for more configuration. + + CC, CFLAGS, CPPFLAGS, LDFLAGS, LDLIBS, AR, RANLIB, STRIP, INSTALL and +CROSS_COMPILE can all be overridden on the make command line. This is +an even bigger hammer than running ./configure with environment +variables, so it is advised to only do this when it is the only way of +obtaining the behaviour you want. + + DESTDIR can be given on the "make install" command line in order to +install to a staging directory. + + +* Shared libraries + ---------------- + + Software from skarnet.org is small enough that shared libraries are +generally not worth using. Static linking is simpler and incurs less +runtime overhead and less points of failure: so by default, shared +libraries are not built and binaries are linked against the static +versions of the skarnet.org libraries. Nevertheless, you can: + * build shared libraries: --enable-shared + * link binaries against shared libraries: --disable-allstatic + + +* Static binaries + --------------- + + By default, binaries are linked against static versions of all the +libraries they depend on, except for the libc. You can enforce +linking against the static libc with --enable-static-libc. + + (If you are using a GNU/Linux system, be aware that the GNU libc +behaves badly with static linking and produces huge executables, +which is why it is not the default. Other libcs are better suited +to static linking, for instance musl: http://musl-libc.org/. If +you're using nsss, chances are you're running musl, or a similar +libc, anyway.) + + +* Cross-compilation + ----------------- + + skarnet.org packages centralize all the difficulty of +cross-compilation in one place: skalibs. Once you have +cross-compiled skalibs, the rest is easy. + + * Use the --host=HOST option to configure, HOST being the triplet +for your target. + * Make sure your cross-toolchain binaries (i.e. prefixed with HOST-) +are accessible via your PATH environment variable. + * Make sure to use the correct version of skalibs for your target, +and the correct sysdeps directory, making use of the +--with-include, --with-lib, --with-dynlib and --with-sysdeps +options as necessary. + + +* The slashpackage convention + --------------------------- + + The slashpackage convention (http://cr.yp.to/slashpackage.html) +is a package installation scheme that provides a few guarantees +over other conventions such as the FHS, for instance fixed +absolute pathnames. skarnet.org packages support it: use the +--enable-slashpackage option to configure, or +--enable-slashpackage=DIR for a prefixed DIR/package tree. +This option will activate slashpackage support during the build +and set slashpackage-compatible installation directories. +If $package_home is the home of the package, defined as +DIR/package/$category/$package-$version with the variables +read from the package/info file, then: + + --dynlibdir is set to $package_home/library.so + --bindir is set to $package_home/command + --sbindir is also set to $package_home/command (slashpackage +differentiates root-only binaries by their Unix rights, not their +location in the filesystem) + --libexecdir is also set to $package_home/command (slashpackage +does not need a specific directory for internal binaries) + --libdir is set to $package_home/library + --includedir is set to $package_home/include + + --prefix is pretty much ignored when you use --enable-slashpackage. +You should probably not use both --enable-slashpackage and --prefix. + + When using slashpackage, two additional Makefile targets are +available after "make install": + - "make update" changes the default version of the software to the +freshly installed one. (This is useful when you have several installed +versions of the same software, which slashpackage supports.) + - "make -L global-links" adds links from /command and /library.so to the +default version of the binaries and shared libraries. The "-L" option to +make is necessary because targets are symbolic links, and the default make +behaviour is to check the pointed file's timestamp and not the symlink's +timestamp. + + +* Absolute pathnames + ------------------ + + You may want to use fixed absolute pathnames even if you're not +following the slashpackage convention: for instance, the Nix packaging +system prefers calling binaries with immutable paths rather than rely on +PATH resolution. If you are in that case, use the --enable-absolute-paths +option to configure. This will ensure that programs calling binaries from +this package will call them with their full installation path (in bindir) +without relying on a PATH search. + + +* Out-of-tree builds + ------------------ + + skarnet.org packages do not support out-of-tree builds. They +are small, so it does not cost much to duplicate the entire +source tree if parallel builds are needed. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..36b6402 --- /dev/null +++ b/Makefile @@ -0,0 +1,154 @@ +# +# This Makefile requires GNU make. +# +# Do not make changes here. +# Use the included .mak files. +# + +it: all + +make_need := 3.81 +ifeq "" "$(strip $(filter $(make_need), $(firstword $(sort $(make_need) $(MAKE_VERSION)))))" +fail := $(error Your make ($(MAKE_VERSION)) is too old. You need $(make_need) or newer) +endif + +CC = $(error Please use ./configure first) + +STATIC_LIBS := +SHARED_LIBS := +INTERNAL_LIBS := +EXTRA_TARGETS := +LIB_DEFS := + +define library_definition +LIB$(firstword $(subst =, ,$(1))) := lib$(lastword $(subst =, ,$(1))).$(if $(DO_ALLSTATIC),a,so).xyzzy +ifdef DO_SHARED +SHARED_LIBS += lib$(lastword $(subst =, ,$(1))).so.xyzzy +endif +ifdef DO_STATIC +STATIC_LIBS += lib$(lastword $(subst =, ,$(1))).a.xyzzy +endif +endef + +-include config.mak +include package/targets.mak + +$(foreach var,$(LIB_DEFS),$(eval $(call library_definition,$(var)))) + +include package/deps.mak + +version_m := $(basename $(version)) +version_M := $(basename $(version_m)) +version_l := $(basename $(version_M)) +CPPFLAGS_ALL := $(CPPFLAGS_AUTO) $(CPPFLAGS) +CFLAGS_ALL := $(CFLAGS_AUTO) $(CFLAGS) +ifeq ($(strip $(STATIC_LIBS_ARE_PIC)),) +CFLAGS_SHARED := -fPIC +else +CFLAGS_SHARED := +endif +LDFLAGS_ALL := $(LDFLAGS_AUTO) $(LDFLAGS) +REALCC = $(CROSS_COMPILE)$(CC) +AR := $(CROSS_COMPILE)ar +RANLIB := $(CROSS_COMPILE)ranlib +STRIP := $(CROSS_COMPILE)strip +INSTALL := ./tools/install.sh + +ALL_BINS := $(LIBEXEC_TARGETS) $(BIN_TARGETS) +ALL_LIBS := $(SHARED_LIBS) $(STATIC_LIBS) $(INTERNAL_LIBS) +ALL_INCLUDES := $(wildcard src/include/$(package)/*.h) + +all: $(ALL_LIBS) $(ALL_BINS) $(ALL_INCLUDES) src/include/pwd.h src/include/grp.h src/include/shadow.h + +clean: + @exec rm -f $(ALL_LIBS) $(ALL_BINS) $(wildcard src/*/*.o src/*/*.lo) $(EXTRA_TARGETS) + +distclean: clean + @exec rm -f config.mak src/include/$(package)/config.h + +tgz: distclean + @. package/info && \ + rm -rf /tmp/$$package-$$version && \ + cp -a . /tmp/$$package-$$version && \ + cd /tmp && \ + tar -zpcv --owner=0 --group=0 --numeric-owner --exclude=.git* -f /tmp/$$package-$$version.tar.gz $$package-$$version && \ + exec rm -rf /tmp/$$package-$$version + +strip: $(ALL_LIBS) $(ALL_BINS) +ifneq ($(strip $(STATIC_LIBS)),) + exec $(STRIP) -x -R .note -R .comment -R .note.GNU-stack $(STATIC_LIBS) +endif +ifneq ($(strip $(ALL_BINS)$(SHARED_LIBS)),) + exec $(STRIP) -R .note -R .comment -R .note.GNU-stack $(ALL_BINS) $(SHARED_LIBS) +endif + +install: install-dynlib install-libexec install-bin install-lib install-include +install-dynlib: $(SHARED_LIBS:lib%.so.xyzzy=$(DESTDIR)$(dynlibdir)/lib%.so) +install-libexec: $(LIBEXEC_TARGETS:%=$(DESTDIR)$(libexecdir)/%) +install-bin: $(BIN_TARGETS:%=$(DESTDIR)$(bindir)/%) +install-lib: $(STATIC_LIBS:lib%.a.xyzzy=$(DESTDIR)$(libdir)/lib%.a) +install-include: $(ALL_INCLUDES:src/include/$(package)/%.h=$(DESTDIR)$(includedir)/$(package)/%.h) $(DESTDIR)$(includedir)/utmpx.h +install-data: $(ALL_DATA:src/etc/%=$(DESTDIR)$(datadir)/%) + +ifneq ($(exthome),) + +$(DESTDIR)$(exthome): $(DESTDIR)$(home) + exec $(INSTALL) -l $(notdir $(home)) $(DESTDIR)$(exthome) + +update: $(DESTDIR)$(exthome) + +global-links: $(DESTDIR)$(exthome) $(SHARED_LIBS:lib%.so.xyzzy=$(DESTDIR)$(sproot)/library.so/lib%.so.$(version_M)) $(BIN_TARGETS:%=$(DESTDIR)$(sproot)/command/%) + +$(DESTDIR)$(sproot)/command/%: $(DESTDIR)$(home)/command/% + exec $(INSTALL) -D -l ..$(subst $(sproot),,$(exthome))/command/$( diff --git a/README.macosx b/README.macosx new file mode 100644 index 0000000..d71a096 --- /dev/null +++ b/README.macosx @@ -0,0 +1,4 @@ + + This package will compile and run on Darwin (MacOS X), but the building of +shared libraries is not supported. + Make sure you use the --disable-shared option to configure. diff --git a/README.solaris b/README.solaris new file mode 100644 index 0000000..91a5b26 --- /dev/null +++ b/README.solaris @@ -0,0 +1,12 @@ + + This package assumes the existence of a POSIX shell in /bin/sh. + On Solaris, /bin/sh is not POSIX. Most versions of Solaris provide +a POSIX shell in /usr/xpg4/bin/sh. + + To compile this package on Solaris, you will need to run + + ./patch-for-solaris + + before you run ./configure. This script will change the #! invocation +of the configure script and various tools so that a POSIX shell is used +for the compilation process. diff --git a/configure b/configure new file mode 100755 index 0000000..1080f58 --- /dev/null +++ b/configure @@ -0,0 +1,466 @@ +#!/bin/sh + +. package/info + +usage () { +cat </dev/null 2>&1 && { echo "$1" ; return 0 ; } +$1 +EOF + echo "$1" | sed -e "s/'/'\\\\''/g" -e "1s/^/'/" -e "\$s/\$/'/" -e "s#^'\([-[:alnum:]_,./:]*\)=\(.*\)\$#\1='\2#" -e "s|\*/|* /|g" +} + +fail () { + echo "$*" + exit 1 +} + +fnmatch () { + eval "case \"\$2\" in $1) return 0 ;; *) return 1 ;; esac" +} + +cmdexists () { + type "$1" >/dev/null 2>&1 +} + +trycc () { + test -z "$CC_AUTO" && cmdexists "$1" && CC_AUTO="$*" +} + +stripdir () { + while eval "fnmatch '*/' \"\${$1}\"" ; do + eval "$1=\${$1%/}" + done +} + +tryflag () { + echo "checking whether compiler accepts $2 ..." + echo "typedef int x;" > "$tmpc" + if $CC_AUTO $CPPFLAGS_AUTO $CPPFLAGS $CPPFLAGS_POST $CFLAGS_AUTO $CFLAGS $CFLAGS_POST "$2" -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then + echo " ... yes" + eval "$1=\"\${$1} \$2\"" + eval "$1=\${$1# }" + return 0 + else + echo " ... no" + return 1 + fi +} + +tryldflag () { + echo "checking whether linker accepts $2 ..." + echo "typedef int x;" > "$tmpc" + if $CC_AUTO $CFLAGS_AUTO $CFLAGS $CFLAGS_POST $LDFLAGS_AUTO $LDFLAGS $LDFLAGS_POST -nostdlib "$2" -o /dev/null "$tmpc" >/dev/null 2>&1 ; then + echo " ... yes" + eval "$1=\"\${$1} \$2\"" + eval "$1=\${$1# }" + return 0 + else + echo " ... no" + return 1 + fi +} + + +# Actual script + +CC_AUTO= +CPPFLAGS_AUTO="-D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -iquote src/include-local -Isrc/include" +CPPFLAGS_POST="$CPPFLAGS" +CPPFLAGS= +CFLAGS_AUTO="-pipe -Wall" +CFLAGS_POST="$CFLAGS" +CFLAGS=-O2 +LDFLAGS_AUTO= +LDFLAGS_POST="$LDFLAGS" +LDFLAGS= +LDFLAGS_NOSHARED= +LDFLAGS_SHARED=-shared +prefix= +exec_prefix='$prefix' +dynlibdir='$prefix/lib' +libexecdir='$exec_prefix/libexec' +bindir='$exec_prefix/bin' +libdir='$prefix/lib/$package' +includedir='$prefix/include' +sysdeps='$prefix/lib/skalibs/sysdeps' +manualsysdeps=false +shared=false +static=true +allpic=detect +slashpackage=false +abspath=false +sproot= +home= +exthome= +allstatic=true +evenmorestatic=false +addincpath='' +addlibspath='' +addlibdpath='' +vpaths='' +vpathd='' +build= +nsssdpath=/run/service/nsssd/s + +for arg ; do + case "$arg" in + --help) usage ;; + --prefix=*) prefix=${arg#*=} ;; + --exec-prefix=*) exec_prefix=${arg#*=} ;; + --dynlibdir=*) dynlibdir=${arg#*=} ;; + --libexecdir=*) libexecdir=${arg#*=} ;; + --bindir=*) bindir=${arg#*=} ;; + --libdir=*) libdir=${arg#*=} ;; + --includedir=*) includedir=${arg#*=} ;; + --with-sysdeps=*) sysdeps=${arg#*=} manualsysdeps=true ;; + --with-include=*) var=${arg#*=} ; stripdir var ; addincpath="$addincpath -I$var" ;; + --with-lib=*) var=${arg#*=} ; stripdir var ; addlibspath="$addlibspath -L$var" ; vpaths="$vpaths $var" ;; + --with-dynlib=*) var=${arg#*=} ; stripdir var ; addlibdpath="$addlibdpath -L$var" ; vpathd="$vpathd $var" ;; + --enable-shared|--enable-shared=yes) shared=true ;; + --disable-shared|--enable-shared=no) shared=false ;; + --enable-static|--enable-static=yes) static=true ;; + --disable-static|--enable-static=no) static=false ;; + --enable-allstatic|--enable-allstatic=yes) allstatic=true ;; + --disable-allstatic|--enable-allstatic=no) allstatic=false ; evenmorestatic=false ;; + --enable-static-libc|--enable-static-libc=yes) allstatic=true ; evenmorestatic=true ;; + --disable-static-libc|--enable-static-libc=no) evenmorestatic=false ;; + --enable-all-pic|--enable-all-pic=yes) allpic=true ;; + --disable-all-pic|--enable-all-pic=no) allpic=false ;; + --enable-slashpackage=*) sproot=${arg#*=} ; slashpackage=true ; ;; + --enable-slashpackage) sproot= ; slashpackage=true ;; + --disable-slashpackage) sproot= ; slashpackage=false ;; + --enable-absolute-paths|--enable-absolute-paths=yes) abspath=true ;; + --disable-absolute-paths|--enable-absolute-paths=no) abspath=false ;; + --enable-*|--disable-*|--with-*|--without-*|--*dir=*) ;; + --host=*|--target=*) target=${arg#*=} ;; + --build=*) build=${arg#*=} ;; + --with-nsssd-socket=*) nsssdpath=${arg#*=} ;; + -* ) echo "$0: unknown option $arg" ;; + *=*) ;; + *) target=$arg ;; + esac +done + +# Add /usr in the default default case +if test -z "$prefix" ; then + if test "$libdir" = '$prefix/lib/$package' ; then + libdir=/usr/lib/$package + fi + if test "$includedir" = '$prefix/include' ; then + includedir=/usr/include + fi + if test "$sysdeps" = '$prefix/lib/skalibs/sysdeps' ; then + sysdeps=/usr/lib/skalibs/sysdeps + fi +fi + +# Expand installation directories +stripdir prefix +for i in exec_prefix dynlibdir libexecdir bindir libdir includedir sysdeps sproot ; do + eval tmp=\${$i} + eval $i=$tmp + stripdir $i +done + +# Get usable temp filenames +i=0 +set -C +while : ; do + i=$(($i+1)) + tmpc="./tmp-configure-$$-$PPID-$i.c" + tmpe="./tmp-configure-$$-$PPID-$i.tmp" + 2>|/dev/null > "$tmpc" && break + 2>|/dev/null > "$tmpe" && break + test "$i" -gt 50 && fail "$0: cannot create temporary files" +done +set +C +trap 'rm -f "$tmpc" "$tmpe"' EXIT ABRT INT QUIT TERM HUP + +# Set slashpackage values +if $slashpackage ; then + home=${sproot}/package/${category}/${package}-${version} + exthome=${sproot}/package/${category}/${package} + if $manualsysdeps ; then + : + else + sysdeps=${sproot}/package/prog/skalibs/sysdeps + fi + extbinprefix=${exthome}/command + dynlibdir=${home}/library.so + bindir=${home}/command + libdir=${home}/library + libexecdir=$bindir + includedir=${home}/include + while read dep ; do + addincpath="$addincpath -I${sproot}${dep}/include" + vpaths="$vpaths ${sproot}${dep}/library" + addlibspath="$addlibspath -L${sproot}${dep}/library" + vpathd="$vpathd ${sproot}${dep}/library.so" + addlibdpath="$addlibdpath -L${sproot}${dep}/library.so" + done < package/deps-build +fi + +# Find a C compiler to use +if test -n "$target" && test x${build} != x${target} ; then + cross=${target}- +else + cross= +fi +echo "checking for C compiler..." +trycc ${cross}${CC} +trycc ${cross}gcc +trycc ${cross}clang +trycc ${cross}cc +test -n "$CC_AUTO" || { echo "$0: cannot find a C compiler" ; exit 1 ; } +echo " ... $CC_AUTO" +echo "checking whether C compiler works... " +echo "typedef int x;" > "$tmpc" +if $CC_AUTO $CPPFLAGS_AUTO $CPPFLAGS $CPPFLAGS_POST $CFLAGS_AUTO $CFLAGS $CFLAGS_POST -c -o /dev/null "$tmpc" 2>"$tmpe" ; then + echo " ... yes" +else + echo " ... no. Compiler output follows:" + cat < "$tmpe" + exit 1 +fi + +echo "checking target system type..." +if test -z "$target" ; then + if test -n "$build" ; then + target=$build ; + else + target=$($CC_AUTO -dumpmachine 2>/dev/null) || target=unknown + fi +fi +echo " ... $target" +if test ! -d $sysdeps || test ! -f $sysdeps/target ; then + echo "$0: error: $sysdeps is not a valid sysdeps directory" + exit 1 +fi +if [ "x$target" != "x$(cat $sysdeps/target)" ] ; then + echo "$0: error: target $target does not match the contents of $sysdeps/target" + exit 1 +fi + +if test $allpic = detect ; then + echo "Checking whether we need to build everything as PIC..." + if $CC_AUTO $CPPFLAGS_AUTO $CPPFLAGS $CPPFLAGS_POST $CFLAGS_AUTO $CFLAGS $CFLAGS_POST -dM -E - < /dev/null | grep -qF __PIE__ ; then + allpic=true + echo " ... yes" + else + allpic=false + echo " ... no" + fi +fi +if $allpic ; then + tryflag CFLAGS_AUTO -fPIC +fi + +spawn_lib=$(cat $sysdeps/spawn.lib) +socket_lib=$(cat $sysdeps/socket.lib) +sysclock_lib=$(cat $sysdeps/sysclock.lib) +tainnow_lib=$(cat $sysdeps/tainnow.lib) +timer_lib=$(cat $sysdeps/timer.lib) +util_lib=$(cat $sysdeps/util.lib) + +tryflag CFLAGS_AUTO -std=c99 +tryflag CFLAGS -fomit-frame-pointer +tryflag CFLAGS_AUTO -fno-exceptions +tryflag CFLAGS_AUTO -fno-unwind-tables +tryflag CFLAGS_AUTO -fno-asynchronous-unwind-tables +tryflag CFLAGS_AUTO -Wa,--noexecstack +tryflag CFLAGS -fno-stack-protector +tryflag CPPFLAGS_AUTO -Werror=implicit-function-declaration +tryflag CPPFLAGS_AUTO -Werror=implicit-int +tryflag CPPFLAGS_AUTO -Werror=pointer-sign +tryflag CPPFLAGS_AUTO -Werror=pointer-arith +tryflag CFLAGS_AUTO -ffunction-sections +tryflag CFLAGS_AUTO -fdata-sections + +tryldflag LDFLAGS_AUTO -Wl,--sort-section=alignment +tryldflag LDFLAGS_AUTO -Wl,--sort-common + +CPPFLAGS_AUTO="${CPPFLAGS_AUTO}${addincpath}" + +if $evenmorestatic ; then + LDFLAGS_NOSHARED=-static +fi + +if $shared ; then + tryldflag LDFLAGS -Wl,--hash-style=both +fi + +LDFLAGS_SHARED="${LDFLAGS_SHARED}${addlibdpath}" + +if $allstatic ; then + LDFLAGS_NOSHARED="${LDFLAGS_NOSHARED}${addlibspath}" + tryldflag LDFLAGS_NOSHARED -Wl,--gc-sections +else + LDFLAGS_NOSHARED="${LDFLAGS_NOSHARED}${addlibdpath}" +fi + +if test -z "$vpaths" ; then + while read dep ; do + base=$(basename $dep) ; + vpaths="$vpaths /usr/lib/$base" + addlibspath="$addlibspath -L/usr/lib/$base" + done < package/deps-build +fi + +echo "creating config.mak..." +cmdline=$(quote "$0") +for i ; do cmdline="$cmdline $(quote "$i")" ; done +exec 3>&1 1>config.mak +cat << EOF +# This file was generated by: +# $cmdline +# Any changes made here will be lost if configure is re-run. + +target := $target +package := $package +prefix := $prefix +exec_prefix := $exec_prefix +dynlibdir := $dynlibdir +libexecdir := $libexecdir +bindir := $bindir +libdir := $libdir +includedir := $includedir +sysdeps := $sysdeps +slashpackage := $slashpackage +sproot := $sproot +version := $version +home := $home +exthome := $exthome +SPAWN_LIB := ${spawn_lib} +SOCKET_LIB := ${socket_lib} +SYSCLOCK_LIB := ${sysclock_lib} +TAINNOW_LIB := ${tainnow_lib} +TIMER_LIB := ${timer_lib} +UTIL_LIB := ${util_lib} + +CC := ${CC_AUTO##${cross}} +CPPFLAGS_AUTO := $CPPFLAGS_AUTO +CPPFLAGS := $CPPFLAGS $CPPFLAGS_POST +CFLAGS_AUTO := $CFLAGS_AUTO +CFLAGS := $CFLAGS $CFLAGS_POST +LDFLAGS_AUTO := $LDFLAGS_AUTO +LDFLAGS := $LDFLAGS $LDFLAGS_POST +LDFLAGS_SHARED := $LDFLAGS_SHARED +LDFLAGS_NOSHARED := $LDFLAGS_NOSHARED +CROSS_COMPILE := $cross + +vpath lib%.a$vpaths +vpath lib%.so$vpathd +EOF +if $allstatic ; then + echo ".LIBPATTERNS := lib%.a" + echo "DO_ALLSTATIC := 1" +else + echo ".LIBPATTERNS := lib%.so" +fi +if $static ; then + echo "DO_STATIC := 1" +else + echo "DO_STATIC :=" +fi +if $shared ; then + echo "DO_SHARED := 1" +else + echo "DO_SHARED :=" +fi +if $allpic ; then + echo "STATIC_LIBS_ARE_PIC := 1" +else + echo "STATIC_LIBS_ARE_PIC :=" +fi + +exec 1>&3 3>&- +echo " ... done." + +echo "creating src/include/${package}/config.h..." +mkdir -p -m 0755 src/include/${package} +exec 3>&1 1> src/include/${package}/config.h +cat <&3 3>&- +echo " ... done." diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..49cf697 --- /dev/null +++ b/doc/index.html @@ -0,0 +1,163 @@ + + + + + + nsss - a secure NSS-like implementation for small libcs + + + + + + +

+Software
+skarnet.org +

+ +

nsss

+ +

What is it ?

+ +

+ nsss is an implementation of a subset of the pwd.h, +group.h and shadow.h family of functions, +performing user database access on Unix systems. +

+ +

+ Usually, user database access via getpwnam() and similar +function is provided by the system's libc. However, not all libcs implement +a configurable backend for the user/group database. For instance the +musl libc, on Linux, only supports +the standard /etc/passwd mechanism; it also supports the +nscd protocol but this is not quite enough to implement the +full set of database access functions with certain backends (such as a +LDAP server). +

+ +

+ nsss is a secure implementation of configurable user/group/shadow +database access, providing getpwnam() et al. functionality +by communicating over a Unix domain socket with a daemon; the daemon +can perform lookups in any database it chooses. +

+ +

+ Unlike NSS, nsss does not perform dynamic module +loading, only adds a small footprint to the application's binary, +and does not add any complex decision engine into the client's address +space. Applications can be statically linked against the nsss +library, and still benefit from configurable user database access +functions. +

+ +
+ + + +
+ +

Installation

+ +

Requirements

+ +
    +
  • A POSIX-compliant system with a standard C development environment
  • +
  • GNU make, version 3.81 or later
  • +
  • skalibs version +2.6.5.0 or later. It's a build-time requirement. It's also a run-time +requirement if you link against the shared version of the skalibs +library.
  • +
+ +

Licensing

+ +

+ nsss is free software. It is available under the +ISC license. +

+ +

Download

+ +
    +
  • The current released version of nsss is 0.0.1.0.
  • +
  • Alternatively, you can checkout a copy of the +nsss +git repository: +
     git clone git://git.skarnet.org/nsss 
  • +
  • There's also a +GitHub mirror +of the nsss git repository.
  • +
+ +

Compilation

+ +
    +
  • See the enclosed INSTALL file for installation details.
  • +
+ +

Upgrade notes

+ +
    +
  • This page lists the differences to be aware of between +the previous versions of nsss and the current one.
  • +
+ +
+ +

Reference

+ +

Commands

+ +
    +
+ +

Libraries

+ +
    +
  • The nsss library interface
  • +
  • The following primitives are also implemented: +
      +
    • endpwent()
    • +
    • setpwent()
    • +
    • getpwent()
    • +
    • getpwent_r()
    • +
    • getpwuid()
    • +
    • getpwuid_r()
    • +
    • getpwnam()
    • +
    • getpwnam_r()
    • +
    • endgrent()
    • +
    • setgrent()
    • +
    • getgrent()
    • +
    • getgrent_r()
    • +
    • getgrgid()
    • +
    • getgrgid_r()
    • +
    • getgrnam()
    • +
    • getgrnam_r()
    • +
    • endspent()
    • +
    • setspent()
    • +
    • getspent()
    • +
    • getspent_r()
    • +
    • getspnam()
    • +
    • getspnam_r()
    • +
  • +
+ +
+ + +

Related resources

+
+ +

nsss discussion

+ +
    +
  • nsss is discussed on the +skaware mailing-list.
  • +
+ + + diff --git a/doc/libnsss/index.html b/doc/libnsss/index.html new file mode 100644 index 0000000..0307725 --- /dev/null +++ b/doc/libnsss/index.html @@ -0,0 +1,97 @@ + + + + + + nsss: the nsss library interface + + + + + + +

+nsss
+Software
+skarnet.org +

+ +

The nsss library interface

+ +

General information

+ +

+ libnsss is a client library meant to be used by client +programs needing utmp functionality. It interacts with various +server-side daemons such as +nsssd-unix. +

+ +

+ Application programs can use it directly, but most existing programs +simply use the standard +pwd.h, +grp.h or +shadow.h +interfaces, which in nsss are implemented as a series of thin wrappers +around the nsss library. +

+ +

Compiling

+ +
    +
  • Make sure the nsss headers, as well as the skalibs headers, +are visible in your header search path.
  • +
  • Use #include <nsss/nsss.h>
  • +
  • To use the standard pwd.h interface, you can +just #include <pwd.h>, which will work as long +as the nsss/pwd.h header is accessible in your header +search path.
  • +
  • Same thing for grp.h and shadow.h.
  • +
+ +

Linking

+ +
    +
  • Make sure the nsss library, as well as the skalibs library, +are visible in your library search path.
  • +
  • Link against -lnsss, -lskarnet,
  • +`cat $SYSDEPS/socket.lib` and +`cat $SYSDEPS/tainnow.lib`, $SYSDEPS being your skalibs +sysdeps directory. +
+ +

Programming

+ +

+ The nsss/nsss.h header is actually a collection of headers: +

+ +
    +
  • nsss/nsss-unix.h implements basic access to the +/etc/passwd, /etc/group and /etc/shadow +database.
  • +
  • nsss/nsss-switch.h implements connection via a Unix +domain socket to a listening nsssd daemon, implementing an +authentication backend based on what implementation of +the daemon is listening.
  • +
  • nsss/nsss-all.h implements a safe policy: first a +connection via nsss-switch is attempted, and if no daemon +is listening, the safe nsss-unix backend is used.
  • +
+ +

+ By default, the getpwnam() et al. functions are aliased +to their nsss-all implementations. You can disable the +nsss-unix fallback by compiling with the NSSS_DISABLE_UNIX +macro defined (-DNSSS_DISABLE_UNIX). Or you can disable any +attempt to connect to a daemon by compiling with the +NSSS_DISABLE_SWITCH macro defined (-DNSSS_DISABLE_SWITCH). +

+ +

+ (To be completed.) +

+ + + diff --git a/doc/overview.html b/doc/overview.html new file mode 100644 index 0000000..222e296 --- /dev/null +++ b/doc/overview.html @@ -0,0 +1,35 @@ + + + + + + nsss: an overview + + + + + + +

+nsss
+Software
+skarnet.org +

+ +

An overview of nsss

+ +

+ nsss is a secure implementation of a subset of the +pwd.h, grp.h and shadow.h functionality, i.e. +user authentication on Unix systems. It includes full POSIX +functionality, a few GNU extensions, and an underlying +C client library with better error reporting +than the POSIX interface specifies. +

+ +

+ To be completed. +

+ + + diff --git a/doc/upgrade.html b/doc/upgrade.html new file mode 100644 index 0000000..5ff9e3b --- /dev/null +++ b/doc/upgrade.html @@ -0,0 +1,28 @@ + + + + + + How to upgrade nsss + + + + + + +

+nsss
+Software
+skarnet.org +

+ +

What has changed in nsss

+ +

in 0.0.1.0

+ +

+ Initial release. +

+ + + diff --git a/examples/openrc/nsssd b/examples/openrc/nsssd new file mode 100755 index 0000000..8a0c412 --- /dev/null +++ b/examples/openrc/nsssd @@ -0,0 +1,6 @@ +#!/sbin/openrc-run + +name="nsssd" +command="s6-ipcserver -- /run/service/nsssd/s nsssd-unix" +pidfile="/run/service/nsssd/nsssd.pid" +start_stop_daemon_args="-b -m -c nsssd -d /run/service/nsssd" diff --git a/examples/s6-rc/nsssd-log/consumer-for b/examples/s6-rc/nsssd-log/consumer-for new file mode 100644 index 0000000..e089e8b --- /dev/null +++ b/examples/s6-rc/nsssd-log/consumer-for @@ -0,0 +1 @@ +nsssd diff --git a/examples/s6-rc/nsssd-log/dependencies b/examples/s6-rc/nsssd-log/dependencies new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/examples/s6-rc/nsssd-log/dependencies @@ -0,0 +1 @@ + diff --git a/examples/s6-rc/nsssd-log/run b/examples/s6-rc/nsssd-log/run new file mode 100644 index 0000000..c133770 --- /dev/null +++ b/examples/s6-rc/nsssd-log/run @@ -0,0 +1,5 @@ +#!/bin/execlineb -P + +s6-setuidgid nssslog +exec -c +s6-log t /var/log/nsssd diff --git a/examples/s6-rc/nsssd-log/type b/examples/s6-rc/nsssd-log/type new file mode 100644 index 0000000..5883cff --- /dev/null +++ b/examples/s6-rc/nsssd-log/type @@ -0,0 +1 @@ +longrun diff --git a/examples/s6-rc/nsssd/dependencies b/examples/s6-rc/nsssd/dependencies new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/examples/s6-rc/nsssd/dependencies @@ -0,0 +1 @@ + diff --git a/examples/s6-rc/nsssd/notification-fd b/examples/s6-rc/nsssd/notification-fd new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/examples/s6-rc/nsssd/notification-fd @@ -0,0 +1 @@ +3 diff --git a/examples/s6-rc/nsssd/pipeline-name b/examples/s6-rc/nsssd/pipeline-name new file mode 100644 index 0000000..84fdc32 --- /dev/null +++ b/examples/s6-rc/nsssd/pipeline-name @@ -0,0 +1 @@ +nsssd-pipeline diff --git a/examples/s6-rc/nsssd/producer-for b/examples/s6-rc/nsssd/producer-for new file mode 100644 index 0000000..465ee2c --- /dev/null +++ b/examples/s6-rc/nsssd/producer-for @@ -0,0 +1 @@ +nsssd-log diff --git a/examples/s6-rc/nsssd/run b/examples/s6-rc/nsssd/run new file mode 100644 index 0000000..24074c6 --- /dev/null +++ b/examples/s6-rc/nsssd/run @@ -0,0 +1,7 @@ +#!/bin/execlineb -P + +fdmove -c 2 1 +s6-envuidgid nsss +fdmove 1 3 +s6-ipcserver -1 0U -- s +nsssd-unix diff --git a/examples/s6-rc/nsssd/type b/examples/s6-rc/nsssd/type new file mode 100644 index 0000000..5883cff --- /dev/null +++ b/examples/s6-rc/nsssd/type @@ -0,0 +1 @@ +longrun diff --git a/examples/s6/nsssd/log/run b/examples/s6/nsssd/log/run new file mode 100755 index 0000000..c133770 --- /dev/null +++ b/examples/s6/nsssd/log/run @@ -0,0 +1,5 @@ +#!/bin/execlineb -P + +s6-setuidgid nssslog +exec -c +s6-log t /var/log/nsssd diff --git a/examples/s6/nsssd/notification-fd b/examples/s6/nsssd/notification-fd new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/examples/s6/nsssd/notification-fd @@ -0,0 +1 @@ +3 diff --git a/examples/s6/nsssd/run b/examples/s6/nsssd/run new file mode 100755 index 0000000..626edd4 --- /dev/null +++ b/examples/s6/nsssd/run @@ -0,0 +1,7 @@ +#!/bin/execlineb -P + +fdmove -c 2 1 +s6-envuidgid nsss +fdmove 1 3 +s6-ipcserver -1 -U -- s +nsssd-unix diff --git a/package/deps-build b/package/deps-build new file mode 100644 index 0000000..05d5af4 --- /dev/null +++ b/package/deps-build @@ -0,0 +1 @@ +/package/prog/skalibs diff --git a/package/deps.mak b/package/deps.mak new file mode 100644 index 0000000..db56346 --- /dev/null +++ b/package/deps.mak @@ -0,0 +1,160 @@ +# +# This file has been generated by tools/gen-deps.sh +# + +src/include/nsss/grp-all.h: src/include/nsss/grp-def.h +src/include/nsss/grp-switch.h: src/include/nsss/grp-def.h +src/include/nsss/grp-unix.h: src/include/nsss/grp-def.h +src/include/nsss/grp.h: src/include/nsss/grp-all.h src/include/nsss/grp-switch.h src/include/nsss/grp-unix.h +src/include/nsss/nsss-all.h: src/include/nsss/grp-all.h src/include/nsss/pwd-all.h src/include/nsss/shadow-all.h +src/include/nsss/nsss-switch.h: src/include/nsss/grp-switch.h src/include/nsss/pwd-switch.h src/include/nsss/shadow-switch.h +src/include/nsss/nsss-unix.h: src/include/nsss/grp-unix.h src/include/nsss/pwd-unix.h src/include/nsss/shadow-unix.h +src/include/nsss/nsss.h: src/include/nsss/nsss-all.h src/include/nsss/nsss-switch.h src/include/nsss/nsss-unix.h +src/include/nsss/nsssd.h: src/include/nsss/grp-def.h src/include/nsss/pwd-def.h src/include/nsss/shadow-def.h +src/include/nsss/pwd-all.h: src/include/nsss/pwd-def.h +src/include/nsss/pwd-switch.h: src/include/nsss/pwd-def.h +src/include/nsss/pwd-unix.h: src/include/nsss/pwd-def.h +src/include/nsss/pwd.h: src/include/nsss/pwd-all.h src/include/nsss/pwd-switch.h src/include/nsss/pwd-unix.h +src/include/nsss/shadow-all.h: src/include/nsss/shadow-def.h +src/include/nsss/shadow-switch.h: src/include/nsss/shadow-def.h +src/include/nsss/shadow-unix.h: src/include/nsss/shadow-def.h +src/include/nsss/shadow.h: src/include/nsss/shadow-all.h src/include/nsss/shadow-switch.h src/include/nsss/shadow-unix.h +src/include/grp.h: src/include/nsss/grp.h +src/include/pwd.h: src/include/nsss/pwd.h +src/include/shadow.h: src/include/nsss/shadow.h +src/libnsss/nsss-internal.h: src/include/nsss/grp-def.h src/include/nsss/pwd-def.h src/include/nsss/shadow-def.h +src/libnsss/nsss-switch-internal.h: src/include/nsss/grp-def.h src/include/nsss/nsss-switch.h src/include/nsss/pwd-def.h src/include/nsss/shadow-def.h +src/libnsss/nsss-unix-internal.h: src/include/nsss/nsss-unix.h +src/libnsss/nsss_all_endgrent.o src/libnsss/nsss_all_endgrent.lo: src/libnsss/nsss_all_endgrent.c src/libnsss/nsss-all-internal.h src/include/nsss/grp-all.h src/include/nsss/grp-switch.h src/include/nsss/grp-unix.h +src/libnsss/nsss_all_endpwent.o src/libnsss/nsss_all_endpwent.lo: src/libnsss/nsss_all_endpwent.c src/libnsss/nsss-all-internal.h src/include/nsss/pwd-all.h src/include/nsss/pwd-switch.h src/include/nsss/pwd-unix.h +src/libnsss/nsss_all_endspent.o src/libnsss/nsss_all_endspent.lo: src/libnsss/nsss_all_endspent.c src/libnsss/nsss-all-internal.h src/include/nsss/shadow-all.h src/include/nsss/shadow-switch.h src/include/nsss/shadow-unix.h +src/libnsss/nsss_all_errno.o src/libnsss/nsss_all_errno.lo: src/libnsss/nsss_all_errno.c src/libnsss/nsss-all-internal.h +src/libnsss/nsss_all_getgrent.o src/libnsss/nsss_all_getgrent.lo: src/libnsss/nsss_all_getgrent.c src/libnsss/nsss-all-internal.h src/libnsss/nsss-internal.h src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/grp-all.h src/include/nsss/grp-unix.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_all_getgrent_r.o src/libnsss/nsss_all_getgrent_r.lo: src/libnsss/nsss_all_getgrent_r.c src/libnsss/nsss-all-internal.h src/libnsss/nsss-internal.h src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/grp-all.h src/include/nsss/grp-unix.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_all_getgrgid.o src/libnsss/nsss_all_getgrgid.lo: src/libnsss/nsss_all_getgrgid.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/grp-all.h src/include/nsss/grp-unix.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_all_getgrgid_r.o src/libnsss/nsss_all_getgrgid_r.lo: src/libnsss/nsss_all_getgrgid_r.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/grp-all.h src/include/nsss/grp-unix.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_all_getgrnam.o src/libnsss/nsss_all_getgrnam.lo: src/libnsss/nsss_all_getgrnam.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/grp-all.h src/include/nsss/grp-unix.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_all_getgrnam_r.o src/libnsss/nsss_all_getgrnam_r.lo: src/libnsss/nsss_all_getgrnam_r.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/grp-all.h src/include/nsss/grp-unix.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_all_getpwent.o src/libnsss/nsss_all_getpwent.lo: src/libnsss/nsss_all_getpwent.c src/libnsss/nsss-all-internal.h src/libnsss/nsss-internal.h src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/pwd-all.h src/include/nsss/pwd-unix.h +src/libnsss/nsss_all_getpwent_r.o src/libnsss/nsss_all_getpwent_r.lo: src/libnsss/nsss_all_getpwent_r.c src/libnsss/nsss-all-internal.h src/libnsss/nsss-internal.h src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/pwd-all.h src/include/nsss/pwd-unix.h +src/libnsss/nsss_all_getpwnam.o src/libnsss/nsss_all_getpwnam.lo: src/libnsss/nsss_all_getpwnam.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/pwd-all.h src/include/nsss/pwd-unix.h +src/libnsss/nsss_all_getpwnam_r.o src/libnsss/nsss_all_getpwnam_r.lo: src/libnsss/nsss_all_getpwnam_r.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/pwd-all.h src/include/nsss/pwd-unix.h +src/libnsss/nsss_all_getpwuid.o src/libnsss/nsss_all_getpwuid.lo: src/libnsss/nsss_all_getpwuid.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/pwd-all.h src/include/nsss/pwd-unix.h +src/libnsss/nsss_all_getpwuid_r.o src/libnsss/nsss_all_getpwuid_r.lo: src/libnsss/nsss_all_getpwuid_r.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/pwd-all.h src/include/nsss/pwd-unix.h +src/libnsss/nsss_all_getspent.o src/libnsss/nsss_all_getspent.lo: src/libnsss/nsss_all_getspent.c src/libnsss/nsss-all-internal.h src/libnsss/nsss-internal.h src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/shadow-all.h src/include/nsss/shadow-unix.h +src/libnsss/nsss_all_getspent_r.o src/libnsss/nsss_all_getspent_r.lo: src/libnsss/nsss_all_getspent_r.c src/libnsss/nsss-all-internal.h src/libnsss/nsss-internal.h src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/shadow-all.h src/include/nsss/shadow-unix.h +src/libnsss/nsss_all_getspnam.o src/libnsss/nsss_all_getspnam.lo: src/libnsss/nsss_all_getspnam.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/shadow-all.h src/include/nsss/shadow-unix.h +src/libnsss/nsss_all_getspnam_r.o src/libnsss/nsss_all_getspnam_r.lo: src/libnsss/nsss_all_getspnam_r.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/shadow-all.h src/include/nsss/shadow-unix.h +src/libnsss/nsss_all_setgrent.o src/libnsss/nsss_all_setgrent.lo: src/libnsss/nsss_all_setgrent.c src/libnsss/nsss-all-internal.h src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/grp-all.h src/include/nsss/grp-unix.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_all_setpwent.o src/libnsss/nsss_all_setpwent.lo: src/libnsss/nsss_all_setpwent.c src/libnsss/nsss-all-internal.h src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/pwd-all.h src/include/nsss/pwd-unix.h +src/libnsss/nsss_all_setspent.o src/libnsss/nsss_all_setspent.lo: src/libnsss/nsss_all_setspent.c src/libnsss/nsss-all-internal.h src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/shadow-all.h src/include/nsss/shadow-unix.h +src/libnsss/nsss_grp_copy.o src/libnsss/nsss_grp_copy.lo: src/libnsss/nsss_grp_copy.c src/libnsss/nsss-internal.h +src/libnsss/nsss_grp_here.o src/libnsss/nsss_grp_here.lo: src/libnsss/nsss_grp_here.c src/libnsss/nsss-internal.h src/include/nsss/grp-def.h +src/libnsss/nsss_pwd_copy.o src/libnsss/nsss_pwd_copy.lo: src/libnsss/nsss_pwd_copy.c src/libnsss/nsss-internal.h +src/libnsss/nsss_pwd_here.o src/libnsss/nsss_pwd_here.lo: src/libnsss/nsss_pwd_here.c src/libnsss/nsss-internal.h src/include/nsss/pwd-def.h +src/libnsss/nsss_shadow_copy.o src/libnsss/nsss_shadow_copy.lo: src/libnsss/nsss_shadow_copy.c src/libnsss/nsss-internal.h +src/libnsss/nsss_shadow_here.o src/libnsss/nsss_shadow_here.lo: src/libnsss/nsss_shadow_here.c src/libnsss/nsss-internal.h src/include/nsss/shadow-def.h +src/libnsss/nsss_switch_end.o src/libnsss/nsss_switch_end.lo: src/libnsss/nsss_switch_end.c src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_endgrent.o src/libnsss/nsss_switch_endgrent.lo: src/libnsss/nsss_switch_endgrent.c src/libnsss/nsss-switch-internal.h src/include/nsss/grp-switch.h +src/libnsss/nsss_switch_endpwent.o src/libnsss/nsss_switch_endpwent.lo: src/libnsss/nsss_switch_endpwent.c src/libnsss/nsss-switch-internal.h src/include/nsss/pwd-switch.h +src/libnsss/nsss_switch_endspent.o src/libnsss/nsss_switch_endspent.lo: src/libnsss/nsss_switch_endspent.c src/libnsss/nsss-switch-internal.h src/include/nsss/shadow-switch.h +src/libnsss/nsss_switch_getgrent.o src/libnsss/nsss_switch_getgrent.lo: src/libnsss/nsss_switch_getgrent.c src/libnsss/nsss-internal.h src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/grp-switch.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_getgrent_r.o src/libnsss/nsss_switch_getgrent_r.lo: src/libnsss/nsss_switch_getgrent_r.c src/libnsss/nsss-internal.h src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/grp-switch.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_getgrgid.o src/libnsss/nsss_switch_getgrgid.lo: src/libnsss/nsss_switch_getgrgid.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/grp-switch.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_getgrgid_r.o src/libnsss/nsss_switch_getgrgid_r.lo: src/libnsss/nsss_switch_getgrgid_r.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/grp-switch.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_getgrnam.o src/libnsss/nsss_switch_getgrnam.lo: src/libnsss/nsss_switch_getgrnam.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/grp-switch.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_getgrnam_r.o src/libnsss/nsss_switch_getgrnam_r.lo: src/libnsss/nsss_switch_getgrnam_r.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/grp-switch.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_getpwent.o src/libnsss/nsss_switch_getpwent.lo: src/libnsss/nsss_switch_getpwent.c src/libnsss/nsss-internal.h src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/pwd-switch.h +src/libnsss/nsss_switch_getpwent_r.o src/libnsss/nsss_switch_getpwent_r.lo: src/libnsss/nsss_switch_getpwent_r.c src/libnsss/nsss-internal.h src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/pwd-switch.h +src/libnsss/nsss_switch_getpwnam.o src/libnsss/nsss_switch_getpwnam.lo: src/libnsss/nsss_switch_getpwnam.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/pwd-switch.h +src/libnsss/nsss_switch_getpwnam_r.o src/libnsss/nsss_switch_getpwnam_r.lo: src/libnsss/nsss_switch_getpwnam_r.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/pwd-switch.h +src/libnsss/nsss_switch_getpwuid.o src/libnsss/nsss_switch_getpwuid.lo: src/libnsss/nsss_switch_getpwuid.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/pwd-switch.h +src/libnsss/nsss_switch_getpwuid_r.o src/libnsss/nsss_switch_getpwuid_r.lo: src/libnsss/nsss_switch_getpwuid_r.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/pwd-switch.h +src/libnsss/nsss_switch_getspent.o src/libnsss/nsss_switch_getspent.lo: src/libnsss/nsss_switch_getspent.c src/libnsss/nsss-internal.h src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/shadow-switch.h +src/libnsss/nsss_switch_getspent_r.o src/libnsss/nsss_switch_getspent_r.lo: src/libnsss/nsss_switch_getspent_r.c src/libnsss/nsss-internal.h src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/shadow-switch.h +src/libnsss/nsss_switch_getspnam.o src/libnsss/nsss_switch_getspnam.lo: src/libnsss/nsss_switch_getspnam.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/shadow-switch.h +src/libnsss/nsss_switch_getspnam_r.o src/libnsss/nsss_switch_getspnam_r.lo: src/libnsss/nsss_switch_getspnam_r.c src/libnsss/nsss-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/shadow-switch.h +src/libnsss/nsss_switch_grp_end.o src/libnsss/nsss_switch_grp_end.lo: src/libnsss/nsss_switch_grp_end.c src/libnsss/nsss-switch-internal.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_grp_get.o src/libnsss/nsss_switch_grp_get.lo: src/libnsss/nsss_switch_grp_get.c src/libnsss/nsss-switch-internal.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_grp_getbygid.o src/libnsss/nsss_switch_grp_getbygid.lo: src/libnsss/nsss_switch_grp_getbygid.c src/libnsss/nsss-switch-internal.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_grp_getbyname.o src/libnsss/nsss_switch_grp_getbyname.lo: src/libnsss/nsss_switch_grp_getbyname.c src/libnsss/nsss-switch-internal.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_grp_read.o src/libnsss/nsss_switch_grp_read.lo: src/libnsss/nsss_switch_grp_read.c src/libnsss/nsss-switch-internal.h src/include/nsss/grp-def.h +src/libnsss/nsss_switch_grp_rewind.o src/libnsss/nsss_switch_grp_rewind.lo: src/libnsss/nsss_switch_grp_rewind.c src/libnsss/nsss-switch-internal.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_here.o src/libnsss/nsss_switch_here.lo: src/libnsss/nsss_switch_here.c src/libnsss/nsss-switch-internal.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_op.o src/libnsss/nsss_switch_op.lo: src/libnsss/nsss_switch_op.c src/libnsss/nsss-switch-internal.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_pwd_end.o src/libnsss/nsss_switch_pwd_end.lo: src/libnsss/nsss_switch_pwd_end.c src/libnsss/nsss-switch-internal.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_pwd_get.o src/libnsss/nsss_switch_pwd_get.lo: src/libnsss/nsss_switch_pwd_get.c src/libnsss/nsss-switch-internal.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_pwd_getbyname.o src/libnsss/nsss_switch_pwd_getbyname.lo: src/libnsss/nsss_switch_pwd_getbyname.c src/libnsss/nsss-switch-internal.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_pwd_getbyuid.o src/libnsss/nsss_switch_pwd_getbyuid.lo: src/libnsss/nsss_switch_pwd_getbyuid.c src/libnsss/nsss-switch-internal.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_pwd_read.o src/libnsss/nsss_switch_pwd_read.lo: src/libnsss/nsss_switch_pwd_read.c src/libnsss/nsss-switch-internal.h src/include/nsss/pwd-def.h +src/libnsss/nsss_switch_pwd_rewind.o src/libnsss/nsss_switch_pwd_rewind.lo: src/libnsss/nsss_switch_pwd_rewind.c src/libnsss/nsss-switch-internal.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_setgrent.o src/libnsss/nsss_switch_setgrent.lo: src/libnsss/nsss_switch_setgrent.c src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/grp-switch.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_setpwent.o src/libnsss/nsss_switch_setpwent.lo: src/libnsss/nsss_switch_setpwent.c src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/pwd-switch.h +src/libnsss/nsss_switch_setspent.o src/libnsss/nsss_switch_setspent.lo: src/libnsss/nsss_switch_setspent.c src/libnsss/nsss-switch-internal.h src/include/nsss/config.h src/include/nsss/nsss-switch.h src/include/nsss/shadow-switch.h +src/libnsss/nsss_switch_shadow_end.o src/libnsss/nsss_switch_shadow_end.lo: src/libnsss/nsss_switch_shadow_end.c src/libnsss/nsss-switch-internal.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_shadow_get.o src/libnsss/nsss_switch_shadow_get.lo: src/libnsss/nsss_switch_shadow_get.c src/libnsss/nsss-switch-internal.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_shadow_getbyname.o src/libnsss/nsss_switch_shadow_getbyname.lo: src/libnsss/nsss_switch_shadow_getbyname.c src/libnsss/nsss-switch-internal.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_shadow_read.o src/libnsss/nsss_switch_shadow_read.lo: src/libnsss/nsss_switch_shadow_read.c src/libnsss/nsss-switch-internal.h src/include/nsss/shadow-def.h +src/libnsss/nsss_switch_shadow_rewind.o src/libnsss/nsss_switch_shadow_rewind.lo: src/libnsss/nsss_switch_shadow_rewind.c src/libnsss/nsss-switch-internal.h src/include/nsss/nsss-switch.h +src/libnsss/nsss_switch_start.o src/libnsss/nsss_switch_start.lo: src/libnsss/nsss_switch_start.c src/include/nsss/nsss-switch.h +src/libnsss/nsss_unix_end.o src/libnsss/nsss_unix_end.lo: src/libnsss/nsss_unix_end.c src/include/nsss/nsss-unix.h +src/libnsss/nsss_unix_endgrent.o src/libnsss/nsss_unix_endgrent.lo: src/libnsss/nsss_unix_endgrent.c src/libnsss/nsss-unix-internal.h src/include/nsss/grp-unix.h +src/libnsss/nsss_unix_endpwent.o src/libnsss/nsss_unix_endpwent.lo: src/libnsss/nsss_unix_endpwent.c src/libnsss/nsss-unix-internal.h src/include/nsss/pwd-unix.h +src/libnsss/nsss_unix_endspent.o src/libnsss/nsss_unix_endspent.lo: src/libnsss/nsss_unix_endspent.c src/libnsss/nsss-unix-internal.h src/include/nsss/shadow-unix.h +src/libnsss/nsss_unix_field.o src/libnsss/nsss_unix_field.lo: src/libnsss/nsss_unix_field.c src/libnsss/nsss-unix-internal.h +src/libnsss/nsss_unix_getgrent.o src/libnsss/nsss_unix_getgrent.lo: src/libnsss/nsss_unix_getgrent.c src/libnsss/nsss-internal.h src/libnsss/nsss-unix-internal.h src/include/nsss/grp-unix.h src/include/nsss/nsss-unix.h +src/libnsss/nsss_unix_getgrent_r.o src/libnsss/nsss_unix_getgrent_r.lo: src/libnsss/nsss_unix_getgrent_r.c src/libnsss/nsss-internal.h src/libnsss/nsss-unix-internal.h src/include/nsss/grp-unix.h src/include/nsss/nsss-unix.h +src/libnsss/nsss_unix_getgrgid.o src/libnsss/nsss_unix_getgrgid.lo: src/libnsss/nsss_unix_getgrgid.c src/libnsss/nsss-internal.h src/include/nsss/grp-unix.h src/include/nsss/nsss-unix.h +src/libnsss/nsss_unix_getgrgid_r.o src/libnsss/nsss_unix_getgrgid_r.lo: src/libnsss/nsss_unix_getgrgid_r.c src/libnsss/nsss-internal.h src/include/nsss/grp-unix.h src/include/nsss/nsss-unix.h +src/libnsss/nsss_unix_getgrnam.o src/libnsss/nsss_unix_getgrnam.lo: src/libnsss/nsss_unix_getgrnam.c src/libnsss/nsss-internal.h src/include/nsss/grp-unix.h src/include/nsss/nsss-unix.h +src/libnsss/nsss_unix_getgrnam_r.o src/libnsss/nsss_unix_getgrnam_r.lo: src/libnsss/nsss_unix_getgrnam_r.c src/libnsss/nsss-internal.h src/include/nsss/grp-unix.h src/include/nsss/nsss-unix.h +src/libnsss/nsss_unix_getpwent.o src/libnsss/nsss_unix_getpwent.lo: src/libnsss/nsss_unix_getpwent.c src/libnsss/nsss-internal.h src/libnsss/nsss-unix-internal.h src/include/nsss/nsss-unix.h src/include/nsss/pwd-unix.h +src/libnsss/nsss_unix_getpwent_r.o src/libnsss/nsss_unix_getpwent_r.lo: src/libnsss/nsss_unix_getpwent_r.c src/libnsss/nsss-internal.h src/libnsss/nsss-unix-internal.h src/include/nsss/nsss-unix.h src/include/nsss/pwd-unix.h +src/libnsss/nsss_unix_getpwnam.o src/libnsss/nsss_unix_getpwnam.lo: src/libnsss/nsss_unix_getpwnam.c src/libnsss/nsss-internal.h src/include/nsss/nsss-unix.h src/include/nsss/pwd-unix.h +src/libnsss/nsss_unix_getpwnam_r.o src/libnsss/nsss_unix_getpwnam_r.lo: src/libnsss/nsss_unix_getpwnam_r.c src/libnsss/nsss-internal.h src/include/nsss/nsss-unix.h src/include/nsss/pwd-unix.h +src/libnsss/nsss_unix_getpwuid.o src/libnsss/nsss_unix_getpwuid.lo: src/libnsss/nsss_unix_getpwuid.c src/libnsss/nsss-internal.h src/include/nsss/nsss-unix.h src/include/nsss/pwd-unix.h +src/libnsss/nsss_unix_getpwuid_r.o src/libnsss/nsss_unix_getpwuid_r.lo: src/libnsss/nsss_unix_getpwuid_r.c src/libnsss/nsss-internal.h src/include/nsss/nsss-unix.h src/include/nsss/pwd-unix.h +src/libnsss/nsss_unix_getspent.o src/libnsss/nsss_unix_getspent.lo: src/libnsss/nsss_unix_getspent.c src/libnsss/nsss-internal.h src/libnsss/nsss-unix-internal.h src/include/nsss/nsss-unix.h src/include/nsss/shadow-unix.h +src/libnsss/nsss_unix_getspent_r.o src/libnsss/nsss_unix_getspent_r.lo: src/libnsss/nsss_unix_getspent_r.c src/libnsss/nsss-internal.h src/libnsss/nsss-unix-internal.h src/include/nsss/nsss-unix.h src/include/nsss/shadow-unix.h +src/libnsss/nsss_unix_getspnam.o src/libnsss/nsss_unix_getspnam.lo: src/libnsss/nsss_unix_getspnam.c src/libnsss/nsss-internal.h src/include/nsss/nsss-unix.h src/include/nsss/shadow-unix.h +src/libnsss/nsss_unix_getspnam_r.o src/libnsss/nsss_unix_getspnam_r.lo: src/libnsss/nsss_unix_getspnam_r.c src/libnsss/nsss-internal.h src/include/nsss/nsss-unix.h src/include/nsss/shadow-unix.h +src/libnsss/nsss_unix_grp_get.o src/libnsss/nsss_unix_grp_get.lo: src/libnsss/nsss_unix_grp_get.c src/libnsss/nsss-unix-internal.h src/include/nsss/grp-def.h src/include/nsss/nsss-unix.h +src/libnsss/nsss_unix_grp_getbygid.o src/libnsss/nsss_unix_grp_getbygid.lo: src/libnsss/nsss_unix_grp_getbygid.c src/include/nsss/grp-def.h src/include/nsss/nsss-unix.h +src/libnsss/nsss_unix_grp_getbyname.o src/libnsss/nsss_unix_grp_getbyname.lo: src/libnsss/nsss_unix_grp_getbyname.c src/include/nsss/grp-def.h src/include/nsss/nsss-unix.h +src/libnsss/nsss_unix_grp_here.o src/libnsss/nsss_unix_grp_here.lo: src/libnsss/nsss_unix_grp_here.c src/libnsss/nsss-unix-internal.h +src/libnsss/nsss_unix_maybe_start.o src/libnsss/nsss_unix_maybe_start.lo: src/libnsss/nsss_unix_maybe_start.c src/include/nsss/nsss-unix.h +src/libnsss/nsss_unix_pwd_get.o src/libnsss/nsss_unix_pwd_get.lo: src/libnsss/nsss_unix_pwd_get.c src/libnsss/nsss-unix-internal.h src/include/nsss/nsss-unix.h src/include/nsss/pwd-def.h +src/libnsss/nsss_unix_pwd_getbyname.o src/libnsss/nsss_unix_pwd_getbyname.lo: src/libnsss/nsss_unix_pwd_getbyname.c src/include/nsss/nsss-unix.h src/include/nsss/pwd-def.h +src/libnsss/nsss_unix_pwd_getbyuid.o src/libnsss/nsss_unix_pwd_getbyuid.lo: src/libnsss/nsss_unix_pwd_getbyuid.c src/include/nsss/nsss-unix.h src/include/nsss/pwd-def.h +src/libnsss/nsss_unix_pwd_here.o src/libnsss/nsss_unix_pwd_here.lo: src/libnsss/nsss_unix_pwd_here.c src/libnsss/nsss-unix-internal.h +src/libnsss/nsss_unix_rewind.o src/libnsss/nsss_unix_rewind.lo: src/libnsss/nsss_unix_rewind.c src/include/nsss/nsss-unix.h +src/libnsss/nsss_unix_setgrent.o src/libnsss/nsss_unix_setgrent.lo: src/libnsss/nsss_unix_setgrent.c src/libnsss/nsss-unix-internal.h src/include/nsss/grp-unix.h src/include/nsss/nsss-unix.h +src/libnsss/nsss_unix_setpwent.o src/libnsss/nsss_unix_setpwent.lo: src/libnsss/nsss_unix_setpwent.c src/libnsss/nsss-unix-internal.h src/include/nsss/nsss-unix.h src/include/nsss/pwd-unix.h +src/libnsss/nsss_unix_setspent.o src/libnsss/nsss_unix_setspent.lo: src/libnsss/nsss_unix_setspent.c src/libnsss/nsss-unix-internal.h src/include/nsss/nsss-unix.h src/include/nsss/shadow-unix.h +src/libnsss/nsss_unix_shadow_get.o src/libnsss/nsss_unix_shadow_get.lo: src/libnsss/nsss_unix_shadow_get.c src/libnsss/nsss-unix-internal.h src/include/nsss/nsss-unix.h src/include/nsss/shadow-def.h +src/libnsss/nsss_unix_shadow_getbyname.o src/libnsss/nsss_unix_shadow_getbyname.lo: src/libnsss/nsss_unix_shadow_getbyname.c src/include/nsss/nsss-unix.h src/include/nsss/shadow-def.h +src/libnsss/nsss_unix_shadow_here.o src/libnsss/nsss_unix_shadow_here.lo: src/libnsss/nsss_unix_shadow_here.c src/libnsss/nsss-unix-internal.h +src/libnsss/nsss_unix_start.o src/libnsss/nsss_unix_start.lo: src/libnsss/nsss_unix_start.c src/include/nsss/nsss-unix.h +src/nsssd/nsssd-nslcd.o src/nsssd/nsssd-nslcd.lo: src/nsssd/nsssd-nslcd.c src/include/nsss/nsssd.h src/nsssd/nsssd-nslcd.h +src/nsssd/nsssd-unix.o src/nsssd/nsssd-unix.lo: src/nsssd/nsssd-unix.c src/include/nsss/grp-unix.h src/include/nsss/nsssd.h src/include/nsss/pwd-unix.h src/include/nsss/shadow-unix.h +src/nsssd/nsssd_convert.o src/nsssd/nsssd_convert.lo: src/nsssd/nsssd_convert.c src/include/nsss/grp-def.h src/include/nsss/nsssd.h src/include/nsss/pwd-def.h src/include/nsss/shadow-def.h +src/nsssd/nsssd_main.o src/nsssd/nsssd_main.lo: src/nsssd/nsssd_main.c src/include/nsss/grp-def.h src/include/nsss/nsss-switch.h src/include/nsss/nsssd.h src/include/nsss/pwd-def.h src/include/nsss/shadow-def.h + +ifeq ($(strip $(STATIC_LIBS_ARE_PIC)),) +libnsss.a.xyzzy: src/libnsss/nsss_all_endgrent.o src/libnsss/nsss_all_endpwent.o src/libnsss/nsss_all_endspent.o src/libnsss/nsss_all_errno.o src/libnsss/nsss_all_getgrent.o src/libnsss/nsss_all_getgrent_r.o src/libnsss/nsss_all_getgrgid.o src/libnsss/nsss_all_getgrgid_r.o src/libnsss/nsss_all_getgrnam.o src/libnsss/nsss_all_getgrnam_r.o src/libnsss/nsss_all_getpwent.o src/libnsss/nsss_all_getpwent_r.o src/libnsss/nsss_all_getpwnam.o src/libnsss/nsss_all_getpwnam_r.o src/libnsss/nsss_all_getpwuid.o src/libnsss/nsss_all_getpwuid_r.o src/libnsss/nsss_all_getspent.o src/libnsss/nsss_all_getspent_r.o src/libnsss/nsss_all_getspnam.o src/libnsss/nsss_all_getspnam_r.o src/libnsss/nsss_all_setgrent.o src/libnsss/nsss_all_setpwent.o src/libnsss/nsss_all_setspent.o src/libnsss/nsss_grp_copy.o src/libnsss/nsss_grp_here.o src/libnsss/nsss_pwd_copy.o src/libnsss/nsss_pwd_here.o src/libnsss/nsss_shadow_copy.o src/libnsss/nsss_shadow_here.o src/libnsss/nsss_switch_end.o src/libnsss/nsss_switch_endgrent.o src/libnsss/nsss_switch_endpwent.o src/libnsss/nsss_switch_endspent.o src/libnsss/nsss_switch_getgrent.o src/libnsss/nsss_switch_getgrent_r.o src/libnsss/nsss_switch_getgrgid.o src/libnsss/nsss_switch_getgrgid_r.o src/libnsss/nsss_switch_getgrnam.o src/libnsss/nsss_switch_getgrnam_r.o src/libnsss/nsss_switch_getpwent.o src/libnsss/nsss_switch_getpwent_r.o src/libnsss/nsss_switch_getpwnam.o src/libnsss/nsss_switch_getpwnam_r.o src/libnsss/nsss_switch_getpwuid.o src/libnsss/nsss_switch_getpwuid_r.o src/libnsss/nsss_switch_getspent.o src/libnsss/nsss_switch_getspent_r.o src/libnsss/nsss_switch_getspnam.o src/libnsss/nsss_switch_getspnam_r.o src/libnsss/nsss_switch_grp_end.o src/libnsss/nsss_switch_grp_get.o src/libnsss/nsss_switch_grp_getbygid.o src/libnsss/nsss_switch_grp_getbyname.o src/libnsss/nsss_switch_grp_read.o src/libnsss/nsss_switch_grp_rewind.o src/libnsss/nsss_switch_here.o src/libnsss/nsss_switch_op.o src/libnsss/nsss_switch_pwd_end.o src/libnsss/nsss_switch_pwd_get.o src/libnsss/nsss_switch_pwd_getbyname.o src/libnsss/nsss_switch_pwd_getbyuid.o src/libnsss/nsss_switch_pwd_read.o src/libnsss/nsss_switch_pwd_rewind.o src/libnsss/nsss_switch_setgrent.o src/libnsss/nsss_switch_setpwent.o src/libnsss/nsss_switch_setspent.o src/libnsss/nsss_switch_shadow_end.o src/libnsss/nsss_switch_shadow_get.o src/libnsss/nsss_switch_shadow_getbyname.o src/libnsss/nsss_switch_shadow_read.o src/libnsss/nsss_switch_shadow_rewind.o src/libnsss/nsss_switch_start.o src/libnsss/nsss_unix_end.o src/libnsss/nsss_unix_endgrent.o src/libnsss/nsss_unix_endpwent.o src/libnsss/nsss_unix_endspent.o src/libnsss/nsss_unix_field.o src/libnsss/nsss_unix_getgrent.o src/libnsss/nsss_unix_getgrent_r.o src/libnsss/nsss_unix_getgrgid.o src/libnsss/nsss_unix_getgrgid_r.o src/libnsss/nsss_unix_getgrnam.o src/libnsss/nsss_unix_getgrnam_r.o src/libnsss/nsss_unix_getpwent.o src/libnsss/nsss_unix_getpwent_r.o src/libnsss/nsss_unix_getpwnam.o src/libnsss/nsss_unix_getpwnam_r.o src/libnsss/nsss_unix_getpwuid.o src/libnsss/nsss_unix_getpwuid_r.o src/libnsss/nsss_unix_getspent.o src/libnsss/nsss_unix_getspent_r.o src/libnsss/nsss_unix_getspnam.o src/libnsss/nsss_unix_getspnam_r.o src/libnsss/nsss_unix_grp_get.o src/libnsss/nsss_unix_grp_getbygid.o src/libnsss/nsss_unix_grp_getbyname.o src/libnsss/nsss_unix_grp_here.o src/libnsss/nsss_unix_maybe_start.o src/libnsss/nsss_unix_pwd_get.o src/libnsss/nsss_unix_pwd_getbyname.o src/libnsss/nsss_unix_pwd_getbyuid.o src/libnsss/nsss_unix_pwd_here.o src/libnsss/nsss_unix_rewind.o src/libnsss/nsss_unix_setgrent.o src/libnsss/nsss_unix_setpwent.o src/libnsss/nsss_unix_setspent.o src/libnsss/nsss_unix_shadow_get.o src/libnsss/nsss_unix_shadow_getbyname.o src/libnsss/nsss_unix_shadow_here.o src/libnsss/nsss_unix_start.o +else +libnsss.a.xyzzy: src/libnsss/nsss_all_endgrent.lo src/libnsss/nsss_all_endpwent.lo src/libnsss/nsss_all_endspent.lo src/libnsss/nsss_all_errno.lo src/libnsss/nsss_all_getgrent.lo src/libnsss/nsss_all_getgrent_r.lo src/libnsss/nsss_all_getgrgid.lo src/libnsss/nsss_all_getgrgid_r.lo src/libnsss/nsss_all_getgrnam.lo src/libnsss/nsss_all_getgrnam_r.lo src/libnsss/nsss_all_getpwent.lo src/libnsss/nsss_all_getpwent_r.lo src/libnsss/nsss_all_getpwnam.lo src/libnsss/nsss_all_getpwnam_r.lo src/libnsss/nsss_all_getpwuid.lo src/libnsss/nsss_all_getpwuid_r.lo src/libnsss/nsss_all_getspent.lo src/libnsss/nsss_all_getspent_r.lo src/libnsss/nsss_all_getspnam.lo src/libnsss/nsss_all_getspnam_r.lo src/libnsss/nsss_all_setgrent.lo src/libnsss/nsss_all_setpwent.lo src/libnsss/nsss_all_setspent.lo src/libnsss/nsss_grp_copy.lo src/libnsss/nsss_grp_here.lo src/libnsss/nsss_pwd_copy.lo src/libnsss/nsss_pwd_here.lo src/libnsss/nsss_shadow_copy.lo src/libnsss/nsss_shadow_here.lo src/libnsss/nsss_switch_end.lo src/libnsss/nsss_switch_endgrent.lo src/libnsss/nsss_switch_endpwent.lo src/libnsss/nsss_switch_endspent.lo src/libnsss/nsss_switch_getgrent.lo src/libnsss/nsss_switch_getgrent_r.lo src/libnsss/nsss_switch_getgrgid.lo src/libnsss/nsss_switch_getgrgid_r.lo src/libnsss/nsss_switch_getgrnam.lo src/libnsss/nsss_switch_getgrnam_r.lo src/libnsss/nsss_switch_getpwent.lo src/libnsss/nsss_switch_getpwent_r.lo src/libnsss/nsss_switch_getpwnam.lo src/libnsss/nsss_switch_getpwnam_r.lo src/libnsss/nsss_switch_getpwuid.lo src/libnsss/nsss_switch_getpwuid_r.lo src/libnsss/nsss_switch_getspent.lo src/libnsss/nsss_switch_getspent_r.lo src/libnsss/nsss_switch_getspnam.lo src/libnsss/nsss_switch_getspnam_r.lo src/libnsss/nsss_switch_grp_end.lo src/libnsss/nsss_switch_grp_get.lo src/libnsss/nsss_switch_grp_getbygid.lo src/libnsss/nsss_switch_grp_getbyname.lo src/libnsss/nsss_switch_grp_read.lo src/libnsss/nsss_switch_grp_rewind.lo src/libnsss/nsss_switch_here.lo src/libnsss/nsss_switch_op.lo src/libnsss/nsss_switch_pwd_end.lo src/libnsss/nsss_switch_pwd_get.lo src/libnsss/nsss_switch_pwd_getbyname.lo src/libnsss/nsss_switch_pwd_getbyuid.lo src/libnsss/nsss_switch_pwd_read.lo src/libnsss/nsss_switch_pwd_rewind.lo src/libnsss/nsss_switch_setgrent.lo src/libnsss/nsss_switch_setpwent.lo src/libnsss/nsss_switch_setspent.lo src/libnsss/nsss_switch_shadow_end.lo src/libnsss/nsss_switch_shadow_get.lo src/libnsss/nsss_switch_shadow_getbyname.lo src/libnsss/nsss_switch_shadow_read.lo src/libnsss/nsss_switch_shadow_rewind.lo src/libnsss/nsss_switch_start.lo src/libnsss/nsss_unix_end.lo src/libnsss/nsss_unix_endgrent.lo src/libnsss/nsss_unix_endpwent.lo src/libnsss/nsss_unix_endspent.lo src/libnsss/nsss_unix_field.lo src/libnsss/nsss_unix_getgrent.lo src/libnsss/nsss_unix_getgrent_r.lo src/libnsss/nsss_unix_getgrgid.lo src/libnsss/nsss_unix_getgrgid_r.lo src/libnsss/nsss_unix_getgrnam.lo src/libnsss/nsss_unix_getgrnam_r.lo src/libnsss/nsss_unix_getpwent.lo src/libnsss/nsss_unix_getpwent_r.lo src/libnsss/nsss_unix_getpwnam.lo src/libnsss/nsss_unix_getpwnam_r.lo src/libnsss/nsss_unix_getpwuid.lo src/libnsss/nsss_unix_getpwuid_r.lo src/libnsss/nsss_unix_getspent.lo src/libnsss/nsss_unix_getspent_r.lo src/libnsss/nsss_unix_getspnam.lo src/libnsss/nsss_unix_getspnam_r.lo src/libnsss/nsss_unix_grp_get.lo src/libnsss/nsss_unix_grp_getbygid.lo src/libnsss/nsss_unix_grp_getbyname.lo src/libnsss/nsss_unix_grp_here.lo src/libnsss/nsss_unix_maybe_start.lo src/libnsss/nsss_unix_pwd_get.lo src/libnsss/nsss_unix_pwd_getbyname.lo src/libnsss/nsss_unix_pwd_getbyuid.lo src/libnsss/nsss_unix_pwd_here.lo src/libnsss/nsss_unix_rewind.lo src/libnsss/nsss_unix_setgrent.lo src/libnsss/nsss_unix_setpwent.lo src/libnsss/nsss_unix_setspent.lo src/libnsss/nsss_unix_shadow_get.lo src/libnsss/nsss_unix_shadow_getbyname.lo src/libnsss/nsss_unix_shadow_here.lo src/libnsss/nsss_unix_start.lo +endif +libnsss.so.xyzzy: EXTRA_LIBS := -lskarnet +libnsss.so.xyzzy: src/libnsss/nsss_all_endgrent.lo src/libnsss/nsss_all_endpwent.lo src/libnsss/nsss_all_endspent.lo src/libnsss/nsss_all_errno.lo src/libnsss/nsss_all_getgrent.lo src/libnsss/nsss_all_getgrent_r.lo src/libnsss/nsss_all_getgrgid.lo src/libnsss/nsss_all_getgrgid_r.lo src/libnsss/nsss_all_getgrnam.lo src/libnsss/nsss_all_getgrnam_r.lo src/libnsss/nsss_all_getpwent.lo src/libnsss/nsss_all_getpwent_r.lo src/libnsss/nsss_all_getpwnam.lo src/libnsss/nsss_all_getpwnam_r.lo src/libnsss/nsss_all_getpwuid.lo src/libnsss/nsss_all_getpwuid_r.lo src/libnsss/nsss_all_getspent.lo src/libnsss/nsss_all_getspent_r.lo src/libnsss/nsss_all_getspnam.lo src/libnsss/nsss_all_getspnam_r.lo src/libnsss/nsss_all_setgrent.lo src/libnsss/nsss_all_setpwent.lo src/libnsss/nsss_all_setspent.lo src/libnsss/nsss_grp_copy.lo src/libnsss/nsss_grp_here.lo src/libnsss/nsss_pwd_copy.lo src/libnsss/nsss_pwd_here.lo src/libnsss/nsss_shadow_copy.lo src/libnsss/nsss_shadow_here.lo src/libnsss/nsss_switch_end.lo src/libnsss/nsss_switch_endgrent.lo src/libnsss/nsss_switch_endpwent.lo src/libnsss/nsss_switch_endspent.lo src/libnsss/nsss_switch_getgrent.lo src/libnsss/nsss_switch_getgrent_r.lo src/libnsss/nsss_switch_getgrgid.lo src/libnsss/nsss_switch_getgrgid_r.lo src/libnsss/nsss_switch_getgrnam.lo src/libnsss/nsss_switch_getgrnam_r.lo src/libnsss/nsss_switch_getpwent.lo src/libnsss/nsss_switch_getpwent_r.lo src/libnsss/nsss_switch_getpwnam.lo src/libnsss/nsss_switch_getpwnam_r.lo src/libnsss/nsss_switch_getpwuid.lo src/libnsss/nsss_switch_getpwuid_r.lo src/libnsss/nsss_switch_getspent.lo src/libnsss/nsss_switch_getspent_r.lo src/libnsss/nsss_switch_getspnam.lo src/libnsss/nsss_switch_getspnam_r.lo src/libnsss/nsss_switch_grp_end.lo src/libnsss/nsss_switch_grp_get.lo src/libnsss/nsss_switch_grp_getbygid.lo src/libnsss/nsss_switch_grp_getbyname.lo src/libnsss/nsss_switch_grp_read.lo src/libnsss/nsss_switch_grp_rewind.lo src/libnsss/nsss_switch_here.lo src/libnsss/nsss_switch_op.lo src/libnsss/nsss_switch_pwd_end.lo src/libnsss/nsss_switch_pwd_get.lo src/libnsss/nsss_switch_pwd_getbyname.lo src/libnsss/nsss_switch_pwd_getbyuid.lo src/libnsss/nsss_switch_pwd_read.lo src/libnsss/nsss_switch_pwd_rewind.lo src/libnsss/nsss_switch_setgrent.lo src/libnsss/nsss_switch_setpwent.lo src/libnsss/nsss_switch_setspent.lo src/libnsss/nsss_switch_shadow_end.lo src/libnsss/nsss_switch_shadow_get.lo src/libnsss/nsss_switch_shadow_getbyname.lo src/libnsss/nsss_switch_shadow_read.lo src/libnsss/nsss_switch_shadow_rewind.lo src/libnsss/nsss_switch_start.lo src/libnsss/nsss_unix_end.lo src/libnsss/nsss_unix_endgrent.lo src/libnsss/nsss_unix_endpwent.lo src/libnsss/nsss_unix_endspent.lo src/libnsss/nsss_unix_field.lo src/libnsss/nsss_unix_getgrent.lo src/libnsss/nsss_unix_getgrent_r.lo src/libnsss/nsss_unix_getgrgid.lo src/libnsss/nsss_unix_getgrgid_r.lo src/libnsss/nsss_unix_getgrnam.lo src/libnsss/nsss_unix_getgrnam_r.lo src/libnsss/nsss_unix_getpwent.lo src/libnsss/nsss_unix_getpwent_r.lo src/libnsss/nsss_unix_getpwnam.lo src/libnsss/nsss_unix_getpwnam_r.lo src/libnsss/nsss_unix_getpwuid.lo src/libnsss/nsss_unix_getpwuid_r.lo src/libnsss/nsss_unix_getspent.lo src/libnsss/nsss_unix_getspent_r.lo src/libnsss/nsss_unix_getspnam.lo src/libnsss/nsss_unix_getspnam_r.lo src/libnsss/nsss_unix_grp_get.lo src/libnsss/nsss_unix_grp_getbygid.lo src/libnsss/nsss_unix_grp_getbyname.lo src/libnsss/nsss_unix_grp_here.lo src/libnsss/nsss_unix_maybe_start.lo src/libnsss/nsss_unix_pwd_get.lo src/libnsss/nsss_unix_pwd_getbyname.lo src/libnsss/nsss_unix_pwd_getbyuid.lo src/libnsss/nsss_unix_pwd_here.lo src/libnsss/nsss_unix_rewind.lo src/libnsss/nsss_unix_setgrent.lo src/libnsss/nsss_unix_setpwent.lo src/libnsss/nsss_unix_setspent.lo src/libnsss/nsss_unix_shadow_get.lo src/libnsss/nsss_unix_shadow_getbyname.lo src/libnsss/nsss_unix_shadow_here.lo src/libnsss/nsss_unix_start.lo +ifeq ($(strip $(STATIC_LIBS_ARE_PIC)),) +libnsssd.a.xyzzy: src/nsssd/nsssd_main.o src/nsssd/nsssd_convert.o +else +libnsssd.a.xyzzy: src/nsssd/nsssd_main.lo src/nsssd/nsssd_convert.lo +endif +libnsssd.so.xyzzy: EXTRA_LIBS := -lskarnet +libnsssd.so.xyzzy: src/nsssd/nsssd_main.lo src/nsssd/nsssd_convert.lo +nsssd-nslcd: EXTRA_LIBS := +nsssd-nslcd: src/nsssd/nsssd-nslcd.o ${LIBNSSSD} -lskarnet +nsssd-unix: EXTRA_LIBS := +nsssd-unix: src/nsssd/nsssd-unix.o ${LIBNSSS} ${LIBNSSSD} -lskarnet diff --git a/package/info b/package/info new file mode 100644 index 0000000..2242df4 --- /dev/null +++ b/package/info @@ -0,0 +1,4 @@ +package=nsss +version=0.0.1.0 +category=admin +package_macro_name=NSSS diff --git a/package/modes b/package/modes new file mode 100644 index 0000000..013611d --- /dev/null +++ b/package/modes @@ -0,0 +1,2 @@ +nsssd-unix 0755 +nsssd-nslcd 0755 diff --git a/package/targets.mak b/package/targets.mak new file mode 100644 index 0000000..2dd3b81 --- /dev/null +++ b/package/targets.mak @@ -0,0 +1,7 @@ +BIN_TARGETS := \ +nsssd-unix \ +nsssd-nslcd + +LIBEXEC_TARGETS := + +LIB_DEFS := NSSS=nsss NSSSD=nsssd diff --git a/patch-for-solaris b/patch-for-solaris new file mode 100755 index 0000000..2d1296b --- /dev/null +++ b/patch-for-solaris @@ -0,0 +1,21 @@ +#!/usr/xpg4/bin/sh + +patchit () { + echo '#!/usr/xpg4/bin/sh' > $1.tmp + tail -n +2 $1 >> $1.tmp + mv -f $1.tmp $1 + chmod 755 $1 +} + +# Solaris doesn't understand POSIX.1-2008 either. +sed -e 's/XOPEN_SOURCE=700/XOPEN_SOURCE=600/' < configure > configure.tmp +mv -f configure.tmp configure + +patchit ./configure +patchit ./tools/install.sh +patchit ./tools/gen-deps.sh + +echo 'SHELL := /usr/xpg4/bin/sh' > Makefile.tmp +echo >> Makefile.tmp +cat Makefile >> Makefile.tmp +mv -f Makefile.tmp Makefile diff --git a/src/include/grp.h b/src/include/grp.h new file mode 100644 index 0000000..4516a19 --- /dev/null +++ b/src/include/grp.h @@ -0,0 +1,27 @@ +/* ISC license. */ + +/* + This file is part of the nsss package. + See https://skarnet.org/software/nsss/ +*/ + +#ifndef GRP_H +#define GRP_H + +#include + +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +#include +extern int getgrouplist (char const *, gid_t, gid_t *, int *) ; +extern int setgroups (size_t, gid_t const *) ; +extern int initgroups (char const *, gid_t) ; +#endif + +#ifdef _GNU_SOURCE +#include +extern struct group *fgetgrent (FILE *) ; +extern int fgetgrent_r (FILE *, struct group *, char *, size_t, struct group **) ; +extern int putgrent (struct group const *, FILE *) ; +#endif + +#endif diff --git a/src/include/nsss/grp-all.h b/src/include/nsss/grp-all.h new file mode 100644 index 0000000..54ea213 --- /dev/null +++ b/src/include/nsss/grp-all.h @@ -0,0 +1,20 @@ +/* ISC license. */ + +#ifndef NSSS_GRP_ALL_H +#define NSSS_GRP_ALL_H + +#include + +/* switch then fallback on unix */ + +extern void nsss_all_setgrent (void) ; +extern struct group *nsss_all_getgrent (void) ; +extern int nsss_all_getgrent_r (struct group *, char *, size_t, struct group **) ; +extern void nsss_all_endgrent (void) ; + +extern struct group *nsss_all_getgrgid (gid_t) ; +extern struct group *nsss_all_getgrnam (char const *) ; +extern int nsss_all_getgrgid_r (gid_t, struct group *, char *, size_t, struct group **) ; +extern int nsss_all_getgrnam_r (char const *, struct group *, char *, size_t, struct group **) ; + +#endif diff --git a/src/include/nsss/grp-def.h b/src/include/nsss/grp-def.h new file mode 100644 index 0000000..0a6db50 --- /dev/null +++ b/src/include/nsss/grp-def.h @@ -0,0 +1,16 @@ +/* ISC license. */ + +#ifndef NSSS_GRP_DEF_H +#define NSSS_GRP_DEF_H + +#include + +struct group +{ + char *gr_name ; + char *gr_passwd ; + gid_t gr_gid ; + char **gr_mem ; +} ; + +#endif diff --git a/src/include/nsss/grp-switch.h b/src/include/nsss/grp-switch.h new file mode 100644 index 0000000..6a9ba10 --- /dev/null +++ b/src/include/nsss/grp-switch.h @@ -0,0 +1,20 @@ +/* ISC license. */ + +#ifndef NSSS_GRP_SWITCH_H +#define NSSS_GRP_SWITCH_H + +#include + + /* Group functions contacting the nsssd daemon */ + +extern void nsss_switch_setgrent (void) ; +extern struct group *nsss_switch_getgrent (void) ; +extern int nsss_switch_getgrent_r (struct group *, char *, size_t, struct group **) ; +extern void nsss_switch_endgrent (void) ; + +extern struct group *nsss_switch_getgrgid (gid_t) ; +extern struct group *nsss_switch_getgrnam (char const *) ; +extern int nsss_switch_getgrgid_r (gid_t, struct group *, char *, size_t, struct group **) ; +extern int nsss_switch_getgrnam_r (char const *, struct group *, char *, size_t, struct group **) ; + +#endif diff --git a/src/include/nsss/grp-unix.h b/src/include/nsss/grp-unix.h new file mode 100644 index 0000000..fe089f1 --- /dev/null +++ b/src/include/nsss/grp-unix.h @@ -0,0 +1,20 @@ +/* ISC license. */ + +#ifndef NSSS_GRP_UNIX_H +#define NSSS_GRP_UNIX_H + +#include + + /* /etc/group backend */ + +extern void nsss_unix_setgrent (void) ; +extern struct group *nsss_unix_getgrent (void) ; +extern int nsss_unix_getgrent_r (struct group *, char *, size_t, struct group **) ; +extern void nsss_unix_endgrent (void) ; + +extern struct group *nsss_unix_getgrgid (gid_t) ; +extern struct group *nsss_unix_getgrnam (char const *) ; +extern int nsss_unix_getgrgid_r (gid_t, struct group *, char *, size_t, struct group **) ; +extern int nsss_unix_getgrnam_r (char const *, struct group *, char *, size_t, struct group **) ; + +#endif diff --git a/src/include/nsss/grp.h b/src/include/nsss/grp.h new file mode 100644 index 0000000..ea963b6 --- /dev/null +++ b/src/include/nsss/grp.h @@ -0,0 +1,58 @@ +/* ISC license. */ + +#ifndef NSSS_GRP_H +#define NSSS_GRP_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef NSSS_DISABLE_SWITCH + +#include + +#define setgrent nsss_unix_setgrent +#define getgrent nsss_unix_getgrent +#define getgrent_r nsss_unix_getgrent_r +#define endgrent nsss_unix_endgrent +#define getgrgid nsss_unix_getgrgid +#define getgrgid_r nsss_unix_getgrgid_r +#define getgrnam nsss_unix_getgrnam +#define getgrnam_r nsss_unix_getgrnam_r + +#else +#ifdef NSSS_DISABLE_UNIX + +#include + +#define setgrent nsss_switch_setgrent +#define getgrent nsss_switch_getgrent +#define getgrent_r nsss_switch_getgrent_r +#define endgrent nsss_switch_endgrent +#define getgrgid nsss_switch_getgrgid +#define getgrgid_r nsss_switch_getgrgid_r +#define getgrnam nsss_switch_getgrnam +#define getgrnam_r nsss_switch_getgrnam_r + +#else + +#include + +#define setgrent nsss_all_setgrent +#define getgrent nsss_all_getgrent +#define getgrent_r nsss_all_getgrent_r +#define endgrent nsss_all_endgrent +#define getgrgid nsss_all_getgrgid +#define getgrgid_r nsss_all_getgrgid_r +#define getgrnam nsss_all_getgrnam +#define getgrnam_r nsss_all_getgrnam_r + +#endif +#endif + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/nsss/nsss-all.h b/src/include/nsss/nsss-all.h new file mode 100644 index 0000000..4530e97 --- /dev/null +++ b/src/include/nsss/nsss-all.h @@ -0,0 +1,10 @@ +/* ISC license. */ + +#ifndef NSSS_ALL_H +#define NSSS_ALL_H + +#include +#include +#include + +#endif diff --git a/src/include/nsss/nsss-switch.h b/src/include/nsss/nsss-switch.h new file mode 100644 index 0000000..1bfe50f --- /dev/null +++ b/src/include/nsss/nsss-switch.h @@ -0,0 +1,93 @@ +/* ISC license. */ + +#ifndef NSSS_SWITCH_H +#define NSSS_SWITCH_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NSSS_SWITCH_BUFSIZE 4096 +#define NSSS_SWITCH_NAME_MAXLEN LOGIN_NAME_MAX + +typedef struct nsss_switch_s nsss_switch_t, *nsss_switch_t_ref ; +struct nsss_switch_s +{ + unsigned int held ; + buffer b ; + char buf[NSSS_SWITCH_BUFSIZE] ; +} ; +#define NSSS_SWITCH_ZERO { .held = 0, .b = BUFFER_ZERO } + +#define NSSS_SWITCH_PWD 0 +#define NSSS_SWITCH_GRP 1 +#define NSSS_SWITCH_SHADOW 2 + +extern int nsss_switch_start (nsss_switch_t *, unsigned int, char const *, tain_t const *, tain_t *) ; +#define nsss_switch_start_g(a, what, s, deadline) nsss_switch_start(a, what, s, (deadline), &STAMP) +extern void nsss_switch_end (nsss_switch_t *, unsigned int) ; + + + /* Password */ + +#define NSSS_SWITCH_PWD_END '\0' +#define NSSS_SWITCH_PWD_REWIND '\001' +#define NSSS_SWITCH_PWD_GET '\002' +#define NSSS_SWITCH_PWD_GETBYNAME '\003' +#define NSSS_SWITCH_PWD_GETBYUID '\004' + +extern int nsss_switch_pwd_end (nsss_switch_t *, tain_t const *, tain_t *) ; +#define nsss_switch_pwd_end_g(a, deadline) nsss_switch_pwd_end(a, (deadline), &STAMP) +extern int nsss_switch_pwd_rewind (nsss_switch_t *, tain_t const *, tain_t *) ; +#define nsss_switch_pwd_rewind_g(a, deadline) nsss_switch_pwd_rewind(a, (deadline), &STAMP) +extern int nsss_switch_pwd_get (nsss_switch_t *, struct passwd *, stralloc *, tain_t const *, tain_t *) ; +#define nsss_switch_pwd_get_g(a, b, sa, deadline) nsss_switch_pwd_get(a, b, sa, (deadline), &STAMP) +extern int nsss_switch_pwd_getbyname (nsss_switch_t *, struct passwd *, stralloc *, char const *, tain_t const *, tain_t *) ; +#define nsss_switch_pwd_getbyname_g(a, b, sa, name, deadline) nsss_switch_pwd_getbyname(a, b, sa, name, (deadline), &STAMP) +extern int nsss_switch_pwd_getbyuid (nsss_switch_t *, struct passwd *, stralloc *, uid_t, tain_t const *, tain_t *) ; +#define nsss_switch_pwd_getbyuid_g(a, b, sa, u, deadline) nsss_switch_pwd_getbyuid(a, b, sa, u, (deadline), &STAMP) + + + /* Group */ + +#define NSSS_SWITCH_GRP_END '\020' +#define NSSS_SWITCH_GRP_REWIND '\021' +#define NSSS_SWITCH_GRP_GET '\022' +#define NSSS_SWITCH_GRP_GETBYNAME '\023' +#define NSSS_SWITCH_GRP_GETBYGID '\024' + +extern int nsss_switch_grp_end (nsss_switch_t *, tain_t const *, tain_t *) ; +#define nsss_switch_grp_end_g(a, deadline) nsss_switch_grp_end(a, (deadline), &STAMP) +extern int nsss_switch_grp_rewind (nsss_switch_t *, tain_t const *, tain_t *) ; +#define nsss_switch_grp_rewind_g(a, deadline) nsss_switch_grp_rewind(a, (deadline), &STAMP) +extern int nsss_switch_grp_get (nsss_switch_t *, struct group *, stralloc *, genalloc *, tain_t const *, tain_t *) ; +#define nsss_switch_grp_get_g(a, b, sa, ga, deadline) nsss_switch_grp_get(a, b, sa, ga, (deadline), &STAMP) +extern int nsss_switch_grp_getbyname (nsss_switch_t *, struct group *, stralloc *, genalloc *, char const *, tain_t const *, tain_t *) ; +#define nsss_switch_grp_getbyname_g(a, b, sa, ga, name, deadline) nsss_switch_grp_getbyname(a, b, sa, ga, name, (deadline), &STAMP) +extern int nsss_switch_grp_getbygid (nsss_switch_t *, struct group *, stralloc *, genalloc *, gid_t, tain_t const *, tain_t *) ; +#define nsss_switch_grp_getbygid_g(a, b, sa, ga, g, deadline) nsss_switch_grp_getbygid(a, b, sa, ga, g, (deadline), &STAMP) + + + /* Shadow */ + +#define NSSS_SWITCH_SHADOW_END '\040' +#define NSSS_SWITCH_SHADOW_REWIND '\041' +#define NSSS_SWITCH_SHADOW_GET '\042' +#define NSSS_SWITCH_SHADOW_GETBYNAME '\043' + +extern int nsss_switch_shadow_end (nsss_switch_t *, tain_t const *, tain_t *) ; +#define nsss_switch_shadow_end_g(a, deadline) nsss_switch_shadow_end(a, (deadline), &STAMP) +extern int nsss_switch_shadow_rewind (nsss_switch_t *, tain_t const *, tain_t *) ; +#define nsss_switch_shadow_rewind_g(a, deadline) nsss_switch_shadow_rewind(a, (deadline), &STAMP) +extern int nsss_switch_shadow_get (nsss_switch_t *, struct spwd *, stralloc *, tain_t const *, tain_t *) ; +#define nsss_switch_shadow_get_g(a, b, sa, deadline) nsss_switch_shadow_get(a, b, sa, (deadline), &STAMP) +extern int nsss_switch_shadow_getbyname (nsss_switch_t *, struct spwd *, stralloc *, char const *, tain_t const *, tain_t *) ; +#define nsss_switch_shadow_getbyname_g(a, b, sa, name, deadline) nsss_switch_shadow_getbyname(a, b, sa, name, (deadline), &STAMP) + +#endif diff --git a/src/include/nsss/nsss-unix.h b/src/include/nsss/nsss-unix.h new file mode 100644 index 0000000..786bf88 --- /dev/null +++ b/src/include/nsss/nsss-unix.h @@ -0,0 +1,61 @@ +/* ISC license. */ + +#ifndef NSSS_UNIX_H +#define NSSS_UNIX_H + +#include +#include +#include +#include +#include +#include +#include + +#define NSSS_UNIX_BUFSIZE 4096 + +typedef struct nsss_unix_s nsss_unix_t, *nsss_unix_t_ref ; +struct nsss_unix_s +{ + buffer b ; + char buf[NSSS_UNIX_BUFSIZE] ; +} ; +#define NSSS_UNIX_ZERO { .b = BUFFER_ZERO } + +extern int nsss_unix_start (nsss_unix_t *, char const *) ; +extern int nsss_unix_maybe_start (nsss_unix_t *, char const *) ; +extern void nsss_unix_end (nsss_unix_t *) ; +extern int nsss_unix_rewind (nsss_unix_t *) ; + + + /* Password */ + +#define nsss_unix_pwd_start(a) nsss_unix_start(a, "/etc/passwd") +#define nsss_unix_pwd_maybe_start(a) nsss_unix_maybe_start(a, "/etc/passwd") +#define nsss_unix_pwd_end(a) nsss_unix_end(a) +#define nsss_unix_pwd_rewind(a) nsss_unix_rewind(a) +extern int nsss_unix_pwd_get (nsss_unix_t *, struct passwd *, stralloc *) ; +extern int nsss_unix_pwd_getbyname (nsss_unix_t *, struct passwd *, stralloc *, char const *) ; +extern int nsss_unix_pwd_getbyuid (nsss_unix_t *, struct passwd *, stralloc *, uid_t) ; + + + /* Group */ + +#define nsss_unix_grp_start(a) nsss_unix_start(a, "/etc/group") +#define nsss_unix_grp_maybe_start(a) nsss_unix_maybe_start(a, "/etc/group") +#define nsss_unix_grp_end(a) nsss_unix_end(a) +#define nsss_unix_grp_rewind(a) nsss_unix_rewind(a) +extern int nsss_unix_grp_get (nsss_unix_t *, struct group *, stralloc *, genalloc *) ; +extern int nsss_unix_grp_getbyname (nsss_unix_t *, struct group *, stralloc *, genalloc *, char const *) ; +extern int nsss_unix_grp_getbygid (nsss_unix_t *, struct group *, stralloc *, genalloc *, gid_t) ; + + + /* Shadow */ + +#define nsss_unix_shadow_start(a) nsss_unix_start(a, "/etc/shadow") +#define nsss_unix_shadow_maybe_start(a) nsss_unix_maybe_start(a, "/etc/shadow") +#define nsss_unix_shadow_end(a) nsss_unix_end(a) +#define nsss_unix_shadow_rewind(a) nsss_unix_rewind(a) +extern int nsss_unix_shadow_get (nsss_unix_t *, struct spwd *, stralloc *) ; +extern int nsss_unix_shadow_getbyname (nsss_unix_t *, struct spwd *, stralloc *, char const *) ; + +#endif diff --git a/src/include/nsss/nsss.h b/src/include/nsss/nsss.h new file mode 100644 index 0000000..56e7c08 --- /dev/null +++ b/src/include/nsss/nsss.h @@ -0,0 +1,10 @@ +/* ISC license. */ + +#ifndef NSSS_H +#define NSSS_H + +#include +#include +#include + +#endif diff --git a/src/include/nsss/nsssd.h b/src/include/nsss/nsssd.h new file mode 100644 index 0000000..7649873 --- /dev/null +++ b/src/include/nsss/nsssd.h @@ -0,0 +1,84 @@ +/* ISC license. */ + +#ifndef NSSSD_H +#define NSSSD_H + +#include +#include +#include +#include + +#define NSSSD_EOF 255 + +typedef struct nsssd_passwd_s nsssd_passwd_t, *nsssd_passwd_t_ref ; +struct nsssd_passwd_s +{ + size_t pw_name ; + size_t pw_passwd ; + uid_t pw_uid ; + uid_t pw_gid ; + size_t pw_gecos ; + size_t pw_dir ; + size_t pw_shell ; +} ; + +typedef struct nsssd_group_s nsssd_group_t, *nsssd_group_t_ref ; +struct nsssd_group_s +{ + size_t gr_name ; + size_t gr_passwd ; + gid_t gr_gid ; + size_t gr_mem ; + size_t gr_mem_n ; +} ; + +typedef struct nsssd_spwd_s nsssd_spwd_t, *nsssd_spwd_t_ref ; +struct nsssd_spwd_s +{ + size_t sp_namp ; + size_t sp_pwdp ; + long sp_lstchg ; + long sp_min ; + long sp_max ; + long sp_warn ; + long sp_inact ; + long sp_expire ; + unsigned long sp_flag ; +} ; + + +/* Functions provided by libnsssd */ + +extern int nsssd_main (char const *const *, char const *const *) ; +extern void nsssd_passwd_convert (struct passwd *, nsssd_passwd_t const *, char const *) ; +extern void nsssd_group_convert (struct group *, char **, nsssd_group_t const *, char const *, size_t const *) ; +extern void nsssd_spwd_convert (struct spwd *, nsssd_spwd_t const *, char const *) ; + + +/* Functions that must be provided by the backend */ + +extern void *nsssd_handle_init (void) ; +extern int nsssd_handle_start (void *, char const *const *, char const *const *) ; +extern void nsssd_handle_end (void *) ; + +extern int nsssd_pwd_start (void *) ; +extern int nsssd_pwd_rewind (void *) ; +extern int nsssd_pwd_get (void *, struct passwd *) ; +extern int nsssd_pwd_getbyuid (void *, struct passwd *, uid_t) ; +extern int nsssd_pwd_getbyname (void *, struct passwd *, char const *) ; +extern void nsssd_pwd_end (void *) ; + +extern int nsssd_grp_start (void *) ; +extern int nsssd_grp_rewind (void *) ; +extern int nsssd_grp_get (void *, struct group *) ; +extern int nsssd_grp_getbygid (void *, struct group *, gid_t) ; +extern int nsssd_grp_getbyname (void *, struct group *, char const *) ; +extern void nsssd_grp_end (void *) ; + +extern int nsssd_shadow_start (void *) ; +extern int nsssd_shadow_rewind (void *) ; +extern int nsssd_shadow_get (void *, struct spwd *) ; +extern int nsssd_shadow_getbyname (void *, struct spwd *, char const *) ; +extern void nsssd_shadow_end (void *) ; + +#endif diff --git a/src/include/nsss/pwd-all.h b/src/include/nsss/pwd-all.h new file mode 100644 index 0000000..02d38a3 --- /dev/null +++ b/src/include/nsss/pwd-all.h @@ -0,0 +1,20 @@ +/* ISC license. */ + +#ifndef NSSS_PWD_ALL_H +#define NSSS_PWD_ALL_H + +#include + + /* switch then fallback on unix */ + +extern void nsss_all_setpwent (void) ; +extern struct passwd *nsss_all_getpwent (void) ; +extern int nsss_all_getpwent_r (struct passwd *, char *, size_t, struct passwd **) ; +extern void nsss_all_endpwent (void) ; + +extern struct passwd *nsss_all_getpwuid (uid_t) ; +extern int nsss_all_getpwuid_r (uid_t, struct passwd *, char *, size_t, struct passwd **) ; +extern struct passwd *nsss_all_getpwnam (char const *) ; +extern int nsss_all_getpwnam_r (char const *, struct passwd *, char *, size_t, struct passwd **) ; + +#endif diff --git a/src/include/nsss/pwd-def.h b/src/include/nsss/pwd-def.h new file mode 100644 index 0000000..44a4538 --- /dev/null +++ b/src/include/nsss/pwd-def.h @@ -0,0 +1,19 @@ +/* ISC license. */ + +#ifndef NSSS_PWD_DEF_H +#define NSSS_PWD_DEF_H + +#include + +struct passwd +{ + char *pw_name ; + char *pw_passwd ; + uid_t pw_uid ; + gid_t pw_gid ; + char *pw_gecos ; + char *pw_dir ; + char *pw_shell ; +} ; + +#endif diff --git a/src/include/nsss/pwd-switch.h b/src/include/nsss/pwd-switch.h new file mode 100644 index 0000000..f9ac48c --- /dev/null +++ b/src/include/nsss/pwd-switch.h @@ -0,0 +1,20 @@ +/* ISC license. */ + +#ifndef NSSS_PWD_SWITCH_H +#define NSSS_PWD_SWITCH_H + +#include + + /* Password functions contacting the nsssd daemon */ + +extern void nsss_switch_setpwent (void) ; +extern struct passwd *nsss_switch_getpwent (void) ; +extern int nsss_switch_getpwent_r (struct passwd *, char *, size_t, struct passwd **) ; +extern void nsss_switch_endpwent (void) ; + +extern struct passwd *nsss_switch_getpwuid (uid_t) ; +extern int nsss_switch_getpwuid_r (uid_t, struct passwd *, char *, size_t, struct passwd **) ; +extern struct passwd *nsss_switch_getpwnam (char const *) ; +extern int nsss_switch_getpwnam_r (char const *, struct passwd *, char *, size_t, struct passwd **) ; + +#endif diff --git a/src/include/nsss/pwd-unix.h b/src/include/nsss/pwd-unix.h new file mode 100644 index 0000000..9b1d60c --- /dev/null +++ b/src/include/nsss/pwd-unix.h @@ -0,0 +1,20 @@ +/* ISC license. */ + +#ifndef NSSS_PWD_UNIX_H +#define NSSS_PWD_UNIX_H + +#include + + /* /etc/passwd backend */ + +extern void nsss_unix_setpwent (void) ; +extern struct passwd *nsss_unix_getpwent (void) ; +extern int nsss_unix_getpwent_r (struct passwd *, char *, size_t, struct passwd **) ; +extern void nsss_unix_endpwent (void) ; + +extern struct passwd *nsss_unix_getpwuid (uid_t) ; +extern int nsss_unix_getpwuid_r (uid_t, struct passwd *, char *, size_t, struct passwd **) ; +extern struct passwd *nsss_unix_getpwnam (char const *) ; +extern int nsss_unix_getpwnam_r (char const *, struct passwd *, char *, size_t, struct passwd **) ; + +#endif diff --git a/src/include/nsss/pwd.h b/src/include/nsss/pwd.h new file mode 100644 index 0000000..950a5ce --- /dev/null +++ b/src/include/nsss/pwd.h @@ -0,0 +1,58 @@ +/* ISC license. */ + +#ifndef NSSS_PWD_H +#define NSSS_PWD_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef NSSS_DISABLE_SWITCH + +#include + +#define setpwent nsss_unix_setpwent +#define getpwent nsss_unix_getpwent +#define getpwent_r nsss_unix_getpwent_r +#define endpwent nsss_unix_endpwent +#define getpwuid nsss_unix_getpwuid +#define getpwuid_r nsss_unix_getpwuid_r +#define getpwnam nsss_unix_getpwnam +#define getpwnam_r nsss_unix_getpwnam_r + +#else +#ifdef NSSS_DISABLE_UNIX + +#include + +#define setpwent nsss_switch_setpwent +#define getpwent nsss_switch_getpwent +#define getpwent_r nsss_switch_getpwent_r +#define endpwent nsss_switch_endpwent +#define getpwuid nsss_switch_getpwuid +#define getpwuid_r nsss_switch_getpwuid_r +#define getpwnam nsss_switch_getpwnam +#define getpwnam_r nsss_switch_getpwnam_r + +#else + +#include + +#define setpwent nsss_all_setpwent +#define getpwent nsss_all_getpwent +#define getpwent_r nsss_all_getpwent_r +#define endpwent nsss_all_endpwent +#define getpwuid nsss_all_getpwuid +#define getpwuid_r nsss_all_getpwuid_r +#define getpwnam nsss_all_getpwnam +#define getpwnam_r nsss_all_getpwnam_r + +#endif +#endif + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/nsss/shadow-all.h b/src/include/nsss/shadow-all.h new file mode 100644 index 0000000..09da550 --- /dev/null +++ b/src/include/nsss/shadow-all.h @@ -0,0 +1,18 @@ +/* ISC license. */ + +#ifndef NSSS_SHADOW_ALL_H +#define NSSS_SHADOW_ALL_H + +#include + +/* switch then fallback on unix */ + +extern void nsss_all_setspent (void) ; +extern struct spwd *nsss_all_getspent (void) ; +extern int nsss_all_getspent_r (struct spwd *, char *, size_t, struct spwd **) ; +extern void nsss_all_endspent (void) ; + +extern struct spwd *nsss_all_getspnam (char const *) ; +extern int nsss_all_getspnam_r (char const *, struct spwd *, char *, size_t, struct spwd **) ; + +#endif diff --git a/src/include/nsss/shadow-def.h b/src/include/nsss/shadow-def.h new file mode 100644 index 0000000..7b73b95 --- /dev/null +++ b/src/include/nsss/shadow-def.h @@ -0,0 +1,21 @@ +/* ISC license. */ + +#ifndef NSSS_SHADOW_DEF_H +#define NSSS_SHADOW_DEF_H + +#include + +struct spwd +{ + char *sp_namp ; + char *sp_pwdp ; + long sp_lstchg ; + long sp_min ; + long sp_max ; + long sp_warn ; + long sp_inact ; + long sp_expire ; + unsigned long sp_flag ; +} ; + +#endif diff --git a/src/include/nsss/shadow-switch.h b/src/include/nsss/shadow-switch.h new file mode 100644 index 0000000..0126125 --- /dev/null +++ b/src/include/nsss/shadow-switch.h @@ -0,0 +1,18 @@ +/* ISC license. */ + +#ifndef NSSS_SHADOW_SWITCH_H +#define NSSS_SHADOW_SWITCH_H + +#include + + /* Shadow functions contacting the nsssd daemon */ + +extern void nsss_switch_setspent (void) ; +extern struct spwd *nsss_switch_getspent (void) ; +extern int nsss_switch_getspent_r (struct spwd *, char *, size_t, struct spwd **) ; +extern void nsss_switch_endspent (void) ; + +extern struct spwd *nsss_switch_getspnam (char const *) ; +extern int nsss_switch_getspnam_r (char const *, struct spwd *, char *, size_t, struct spwd **) ; + +#endif diff --git a/src/include/nsss/shadow-unix.h b/src/include/nsss/shadow-unix.h new file mode 100644 index 0000000..6b7a111 --- /dev/null +++ b/src/include/nsss/shadow-unix.h @@ -0,0 +1,18 @@ +/* ISC license. */ + +#ifndef NSSS_SHADOW_UNIX_H +#define NSSS_SHADOW_UNIX_H + +#include + + /* /etc/shadow functions */ + +extern void nsss_unix_setspent (void) ; +extern struct spwd *nsss_unix_getspent (void) ; +extern int nsss_unix_getspent_r (struct spwd *, char *, size_t, struct spwd **) ; +extern void nsss_unix_endspent (void) ; + +extern struct spwd *nsss_unix_getspnam (char const *) ; +extern int nsss_unix_getspnam_r (char const *, struct spwd *, char *, size_t, struct spwd **) ; + +#endif diff --git a/src/include/nsss/shadow.h b/src/include/nsss/shadow.h new file mode 100644 index 0000000..c3357fd --- /dev/null +++ b/src/include/nsss/shadow.h @@ -0,0 +1,52 @@ +/* ISC license. */ + +#ifndef NSSS_SHADOW_H +#define NSSS_SHADOW_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef NSSS_DISABLE_SWITCH + +#include + +#define setspent nsss_unix_setspent +#define getspent nsss_unix_getspent +#define getspent_r nsss_unix_getspent_r +#define endspent nsss_unix_endspent +#define getspnam nsss_unix_getspnam +#define getspnam_r nsss_unix_getspnam_r + +#else +#ifdef NSSS_DISABLE_UNIX + +#include + +#define setspent nsss_switch_setspent +#define getspent nsss_switch_getspent +#define getspent_r nsss_switch_getspent_r +#define endspent nsss_switch_endspent +#define getspnam nsss_switch_getspnam +#define getspnam_r nsss_switch_getspnam_r + +#else + +#include + +#define setspent nsss_all_setspent +#define getspent nsss_all_getspent +#define getspent_r nsss_all_getspent_r +#define endspent nsss_all_endspent +#define getspnam nsss_all_getspnam +#define getspnam_r nsss_all_getspnam_r + +#endif +#endif + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/include/pwd.h b/src/include/pwd.h new file mode 100644 index 0000000..6ad4faf --- /dev/null +++ b/src/include/pwd.h @@ -0,0 +1,20 @@ +/* ISC license. */ + +/* + This file is part of the nsss package. + See https://skarnet.org/software/nsss/ +*/ + +#ifndef PWD_H +#define PWD_H + +#include + +#ifdef _GNU_SOURCE +#include +extern struct passwd *fgetpwent (FILE *) ; +extern int fgetpwent_r (FILE *, struct passwd *, char *, size_t, struct passwd **) ; +extern int putpwent (struct passwd const *, FILE *) ; +#endif + +#endif diff --git a/src/include/shadow.h b/src/include/shadow.h new file mode 100644 index 0000000..00d1944 --- /dev/null +++ b/src/include/shadow.h @@ -0,0 +1,26 @@ +/* ISC license. */ + +/* + This file is part of the nsss package. + See https://skarnet.org/software/nsss/ +*/ + +#ifndef SHADOW_H +#define SHADOW_H + +#include + +#include + +extern struct spwd *fgetspent (FILE *) ; +extern struct spwd *sgetspent (char const *) ; +extern int putspent (struct spwd const *, FILE *) ; +extern int lckpwdf (void) ; +extern int ulckpwdf (void) ; + +#ifdef _DEFAULT_SOURCE +extern int fgetspent_r(FILE *, struct spwd *, char *, size_t, struct spwd **) ; +extern int sgetspent_r (char const *, struct spwd *, char *, size_t, struct spwd **) ; +#endif + +#endif diff --git a/src/libnsss/deps-lib/nsss b/src/libnsss/deps-lib/nsss new file mode 100644 index 0000000..6a51e6a --- /dev/null +++ b/src/libnsss/deps-lib/nsss @@ -0,0 +1,111 @@ +nsss_all_endgrent.o +nsss_all_endpwent.o +nsss_all_endspent.o +nsss_all_errno.o +nsss_all_getgrent.o +nsss_all_getgrent_r.o +nsss_all_getgrgid.o +nsss_all_getgrgid_r.o +nsss_all_getgrnam.o +nsss_all_getgrnam_r.o +nsss_all_getpwent.o +nsss_all_getpwent_r.o +nsss_all_getpwnam.o +nsss_all_getpwnam_r.o +nsss_all_getpwuid.o +nsss_all_getpwuid_r.o +nsss_all_getspent.o +nsss_all_getspent_r.o +nsss_all_getspnam.o +nsss_all_getspnam_r.o +nsss_all_setgrent.o +nsss_all_setpwent.o +nsss_all_setspent.o +nsss_grp_copy.o +nsss_grp_here.o +nsss_pwd_copy.o +nsss_pwd_here.o +nsss_shadow_copy.o +nsss_shadow_here.o +nsss_switch_end.o +nsss_switch_endgrent.o +nsss_switch_endpwent.o +nsss_switch_endspent.o +nsss_switch_getgrent.o +nsss_switch_getgrent_r.o +nsss_switch_getgrgid.o +nsss_switch_getgrgid_r.o +nsss_switch_getgrnam.o +nsss_switch_getgrnam_r.o +nsss_switch_getpwent.o +nsss_switch_getpwent_r.o +nsss_switch_getpwnam.o +nsss_switch_getpwnam_r.o +nsss_switch_getpwuid.o +nsss_switch_getpwuid_r.o +nsss_switch_getspent.o +nsss_switch_getspent_r.o +nsss_switch_getspnam.o +nsss_switch_getspnam_r.o +nsss_switch_grp_end.o +nsss_switch_grp_get.o +nsss_switch_grp_getbygid.o +nsss_switch_grp_getbyname.o +nsss_switch_grp_read.o +nsss_switch_grp_rewind.o +nsss_switch_here.o +nsss_switch_op.o +nsss_switch_pwd_end.o +nsss_switch_pwd_get.o +nsss_switch_pwd_getbyname.o +nsss_switch_pwd_getbyuid.o +nsss_switch_pwd_read.o +nsss_switch_pwd_rewind.o +nsss_switch_setgrent.o +nsss_switch_setpwent.o +nsss_switch_setspent.o +nsss_switch_shadow_end.o +nsss_switch_shadow_get.o +nsss_switch_shadow_getbyname.o +nsss_switch_shadow_read.o +nsss_switch_shadow_rewind.o +nsss_switch_start.o +nsss_unix_end.o +nsss_unix_endgrent.o +nsss_unix_endpwent.o +nsss_unix_endspent.o +nsss_unix_field.o +nsss_unix_getgrent.o +nsss_unix_getgrent_r.o +nsss_unix_getgrgid.o +nsss_unix_getgrgid_r.o +nsss_unix_getgrnam.o +nsss_unix_getgrnam_r.o +nsss_unix_getpwent.o +nsss_unix_getpwent_r.o +nsss_unix_getpwnam.o +nsss_unix_getpwnam_r.o +nsss_unix_getpwuid.o +nsss_unix_getpwuid_r.o +nsss_unix_getspent.o +nsss_unix_getspent_r.o +nsss_unix_getspnam.o +nsss_unix_getspnam_r.o +nsss_unix_grp_get.o +nsss_unix_grp_getbygid.o +nsss_unix_grp_getbyname.o +nsss_unix_grp_here.o +nsss_unix_maybe_start.o +nsss_unix_pwd_get.o +nsss_unix_pwd_getbyname.o +nsss_unix_pwd_getbyuid.o +nsss_unix_pwd_here.o +nsss_unix_rewind.o +nsss_unix_setgrent.o +nsss_unix_setpwent.o +nsss_unix_setspent.o +nsss_unix_shadow_get.o +nsss_unix_shadow_getbyname.o +nsss_unix_shadow_here.o +nsss_unix_start.o +-lskarnet diff --git a/src/libnsss/nsss-all-internal.h b/src/libnsss/nsss-all-internal.h new file mode 100644 index 0000000..91bd552 --- /dev/null +++ b/src/libnsss/nsss-all-internal.h @@ -0,0 +1,8 @@ +/* ISC license. */ + +#ifndef NSSS_ALL_INTERNAL_H +#define NSSS_ALL_INTERNAL_H + +extern int nsss_all_errno ; + +#endif diff --git a/src/libnsss/nsss-internal.h b/src/libnsss/nsss-internal.h new file mode 100644 index 0000000..f9dbeb3 --- /dev/null +++ b/src/libnsss/nsss-internal.h @@ -0,0 +1,35 @@ +/* ISC license. */ + +#ifndef NSSS_INTERNAL_H +#define NSSS_INTERNAL_H + +#include +#include +#include +#include +#include +#include + + + /* Password */ + +extern struct passwd nsss_pwd_here ; +extern stralloc nsss_pwd_sa_here ; +extern int nsss_pwd_copy (struct passwd *, char *, size_t, struct passwd const *, char const *, size_t) ; + + + /* Group */ + +extern struct group nsss_grp_here ; +extern stralloc nsss_grp_sa_here ; +extern genalloc nsss_grp_ga_here ; +extern int nsss_grp_copy (struct group *, char *, size_t, struct group const *, char const *, size_t, char *const *, size_t) ; + + + /* Shadow */ + +extern struct spwd nsss_shadow_here ; +extern stralloc nsss_shadow_sa_here ; +extern int nsss_shadow_copy (struct spwd *, char *, size_t, struct spwd const *, char const *, size_t) ; + +#endif diff --git a/src/libnsss/nsss-switch-internal.h b/src/libnsss/nsss-switch-internal.h new file mode 100644 index 0000000..e005ffc --- /dev/null +++ b/src/libnsss/nsss-switch-internal.h @@ -0,0 +1,21 @@ +/* ISC license. */ + +#ifndef NSSS_SWITCH_INTERNAL_H +#define NSSS_SWITCH_INTERNAL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +extern nsss_switch_t nsss_switch_here ; +extern int nsss_switch_op (nsss_switch_t *, char, tain_t const *, tain_t *) ; +extern int nsss_switch_pwd_read (buffer *, struct passwd *, stralloc *, tain_t const *, tain_t *) ; +extern int nsss_switch_grp_read (buffer *, struct group *, stralloc *, genalloc *, tain_t const *, tain_t *) ; +extern int nsss_switch_shadow_read (buffer *, struct spwd *, stralloc *, tain_t const *, tain_t *) ; + +#endif diff --git a/src/libnsss/nsss-unix-internal.h b/src/libnsss/nsss-unix-internal.h new file mode 100644 index 0000000..9413a3b --- /dev/null +++ b/src/libnsss/nsss-unix-internal.h @@ -0,0 +1,13 @@ +/* ISC license. */ + +#ifndef NSSS_UNIX_INTERNAL_H +#define NSSS_UNIX_INTERNAL_H + +#include + +extern int nsss_unix_field (char **, char **) ; +extern nsss_unix_t nsss_unix_pwd_here ; +extern nsss_unix_t nsss_unix_grp_here ; +extern nsss_unix_t nsss_unix_shadow_here ; + +#endif diff --git a/src/libnsss/nsss_all_endgrent.c b/src/libnsss/nsss_all_endgrent.c new file mode 100644 index 0000000..059eca4 --- /dev/null +++ b/src/libnsss/nsss_all_endgrent.c @@ -0,0 +1,17 @@ +/* ISC license. */ + +#include +#include +#include +#include "nsss-all-internal.h" + +void nsss_all_endgrent (void) +{ + if (nsss_all_errno) goto fallback ; + nsss_switch_endgrent() ; + return ; + + fallback: + nsss_unix_endgrent() ; + nsss_all_errno = 0 ; +} diff --git a/src/libnsss/nsss_all_endpwent.c b/src/libnsss/nsss_all_endpwent.c new file mode 100644 index 0000000..c3ce953 --- /dev/null +++ b/src/libnsss/nsss_all_endpwent.c @@ -0,0 +1,17 @@ +/* ISC license. */ + +#include +#include +#include +#include "nsss-all-internal.h" + +void nsss_all_endpwent (void) +{ + if (nsss_all_errno) goto fallback ; + nsss_switch_endpwent() ; + return ; + + fallback: + nsss_unix_endpwent() ; + nsss_all_errno = 0 ; +} diff --git a/src/libnsss/nsss_all_endspent.c b/src/libnsss/nsss_all_endspent.c new file mode 100644 index 0000000..c5587cb --- /dev/null +++ b/src/libnsss/nsss_all_endspent.c @@ -0,0 +1,17 @@ +/* ISC license. */ + +#include +#include +#include +#include "nsss-all-internal.h" + +void nsss_all_endspent (void) +{ + if (nsss_all_errno) goto fallback ; + nsss_switch_endspent() ; + return ; + + fallback: + nsss_unix_endspent() ; + nsss_all_errno = 0 ; +} diff --git a/src/libnsss/nsss_all_errno.c b/src/libnsss/nsss_all_errno.c new file mode 100644 index 0000000..8c50835 --- /dev/null +++ b/src/libnsss/nsss_all_errno.c @@ -0,0 +1,5 @@ +/* ISC license. */ + +#include "nsss-all-internal.h" + +int nsss_all_errno = 0 ; diff --git a/src/libnsss/nsss_all_getgrent.c b/src/libnsss/nsss_all_getgrent.c new file mode 100644 index 0000000..15b5894 --- /dev/null +++ b/src/libnsss/nsss_all_getgrent.c @@ -0,0 +1,28 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include "nsss-internal.h" +#include "nsss-switch-internal.h" +#include "nsss-all-internal.h" + +struct group *nsss_all_getgrent (void) +{ + int e = errno ; + if (nsss_all_errno) goto fallback ; + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_GRP, NSSS_NSSSD_PATH, 0, 0)) goto efallback ; + nsss_grp_sa_here.len = 0 ; + genalloc_setlen(char *, &nsss_grp_ga_here, 0) ; + if (!nsss_switch_grp_get(&nsss_switch_here, &nsss_grp_here, &nsss_grp_sa_here, &nsss_grp_ga_here, 0, 0)) return 0 ; + return &nsss_grp_here ; + + efallback: + nsss_all_errno = errno ; + errno = e ; + fallback: + return nsss_unix_getgrent() ; +} diff --git a/src/libnsss/nsss_all_getgrent_r.c b/src/libnsss/nsss_all_getgrent_r.c new file mode 100644 index 0000000..8cdcad6 --- /dev/null +++ b/src/libnsss/nsss_all_getgrent_r.c @@ -0,0 +1,44 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include +#include "nsss-internal.h" +#include "nsss-switch-internal.h" +#include "nsss-all-internal.h" + +int nsss_all_getgrent_r (struct group *gr, char *buf, size_t buflen, struct group **grp) +{ + struct group gr2 ; + stralloc sa = STRALLOC_ZERO ; + genalloc ga = GENALLOC_ZERO ; + int e = errno ; + if (nsss_all_errno) goto fallback ; + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_GRP, NSSS_NSSSD_PATH, 0, 0)) goto efallback ; + errno = 0 ; + if (!nsss_switch_grp_get(&nsss_switch_here, &gr2, &sa, &ga, 0, 0)) + { + *grp = 0 ; + if (!errno) errno = ENOENT ; + return errno ; + } + if (!nsss_grp_copy(gr, buf, buflen, &gr2, sa.s, sa.len, genalloc_s(char *, &ga), genalloc_len(char *, &ga))) + { + stralloc_free(&sa) ; + *grp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *grp = gr ; + return (errno = e, 0) ; + + efallback: + nsss_all_errno = errno ; + errno = e ; + fallback: + return nsss_unix_getgrent_r(gr, buf, buflen, grp) ; +} diff --git a/src/libnsss/nsss_all_getgrgid.c b/src/libnsss/nsss_all_getgrgid.c new file mode 100644 index 0000000..da67518 --- /dev/null +++ b/src/libnsss/nsss_all_getgrgid.c @@ -0,0 +1,29 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +struct group *nsss_all_getgrgid (gid_t gid) +{ + nsss_switch_t a = NSSS_SWITCH_ZERO ; + int e = errno ; + if (!nsss_switch_start(&a, NSSS_SWITCH_GRP, NSSS_NSSSD_PATH, 0, 0)) goto fallback ; + nsss_grp_sa_here.len = 0 ; + genalloc_setlen(char *, &nsss_grp_ga_here, 0) ; + if (!nsss_switch_grp_getbygid(&a, &nsss_grp_here, &nsss_grp_sa_here, &nsss_grp_ga_here, gid, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_GRP) ; + return 0 ; + } + nsss_switch_end(&a, NSSS_SWITCH_GRP) ; + return &nsss_grp_here ; + + fallback: + errno = e ; + return nsss_unix_getgrgid(gid) ; +} diff --git a/src/libnsss/nsss_all_getgrgid_r.c b/src/libnsss/nsss_all_getgrgid_r.c new file mode 100644 index 0000000..bd48322 --- /dev/null +++ b/src/libnsss/nsss_all_getgrgid_r.c @@ -0,0 +1,41 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +int nsss_all_getgrgid_r (gid_t gid, struct group *gr, char *buf, size_t buflen, struct group **grp) +{ + struct group gr2 ; + stralloc sa = STRALLOC_ZERO ; + genalloc ga = GENALLOC_ZERO ; + nsss_switch_t a = NSSS_SWITCH_ZERO ; + int e = errno ; + if (!nsss_switch_start(&a, NSSS_SWITCH_GRP, NSSS_NSSSD_PATH, 0, 0)) goto fallback ; + errno = 0 ; + if (!nsss_switch_grp_getbygid(&a, &gr2, &sa, &ga, gid, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_GRP) ; + *grp = 0 ; + return errno ? errno : (errno = e, 0) ; + } + nsss_switch_end(&a, NSSS_SWITCH_GRP) ; + if (!nsss_grp_copy(gr, buf, buflen, &gr2, sa.s, sa.len, genalloc_s(char *, &ga), genalloc_len(char *, &ga))) + { + stralloc_free(&sa) ; + *grp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *grp = gr ; + return (errno = e, 0) ; + + fallback: + errno = e ; + return nsss_unix_getgrgid_r(gid, gr, buf, buflen, grp) ; +} diff --git a/src/libnsss/nsss_all_getgrnam.c b/src/libnsss/nsss_all_getgrnam.c new file mode 100644 index 0000000..a729bff --- /dev/null +++ b/src/libnsss/nsss_all_getgrnam.c @@ -0,0 +1,29 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +struct group *nsss_all_getgrnam (char const *name) +{ + nsss_switch_t a = NSSS_SWITCH_ZERO ; + int e = errno ; + if (!nsss_switch_start(&a, NSSS_SWITCH_GRP, NSSS_NSSSD_PATH, 0, 0)) goto fallback ; + nsss_grp_sa_here.len = 0 ; + genalloc_setlen(char *, &nsss_grp_ga_here, 0) ; + if (!nsss_switch_grp_getbyname(&a, &nsss_grp_here, &nsss_grp_sa_here, &nsss_grp_ga_here, name, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_GRP) ; + return 0 ; + } + nsss_switch_end(&a, NSSS_SWITCH_GRP) ; + return &nsss_grp_here ; + + fallback: + errno = e ; + return nsss_unix_getgrnam(name) ; +} diff --git a/src/libnsss/nsss_all_getgrnam_r.c b/src/libnsss/nsss_all_getgrnam_r.c new file mode 100644 index 0000000..d129d3c --- /dev/null +++ b/src/libnsss/nsss_all_getgrnam_r.c @@ -0,0 +1,41 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +int nsss_all_getgrnam_r (char const *name, struct group *gr, char *buf, size_t buflen, struct group **grp) +{ + struct group gr2 ; + stralloc sa = STRALLOC_ZERO ; + genalloc ga = GENALLOC_ZERO ; + nsss_switch_t a = NSSS_SWITCH_ZERO ; + int e = errno ; + if (!nsss_switch_start(&a, NSSS_SWITCH_GRP, NSSS_NSSSD_PATH, 0, 0)) goto fallback ; + errno = 0 ; + if (!nsss_switch_grp_getbyname(&a, &gr2, &sa, &ga, name, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_GRP) ; + *grp = 0 ; + return errno ? errno : (errno = e, 0) ; + } + nsss_switch_end(&a, NSSS_SWITCH_GRP) ; + if (!nsss_grp_copy(gr, buf, buflen, &gr2, sa.s, sa.len, genalloc_s(char *, &ga), genalloc_len(char *, &ga))) + { + stralloc_free(&sa) ; + *grp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *grp = gr ; + return (errno = e, 0) ; + + fallback: + errno = e ; + return nsss_unix_getgrnam_r(name, gr, buf, buflen, grp) ; +} diff --git a/src/libnsss/nsss_all_getpwent.c b/src/libnsss/nsss_all_getpwent.c new file mode 100644 index 0000000..b68a4b3 --- /dev/null +++ b/src/libnsss/nsss_all_getpwent.c @@ -0,0 +1,26 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-internal.h" +#include "nsss-switch-internal.h" +#include "nsss-all-internal.h" + +struct passwd *nsss_all_getpwent (void) +{ + int e = errno ; + if (nsss_all_errno) goto fallback ; + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_PWD, NSSS_NSSSD_PATH, 0, 0)) goto efallback ; + nsss_pwd_sa_here.len = 0 ; + if (!nsss_switch_pwd_get(&nsss_switch_here, &nsss_pwd_here, &nsss_pwd_sa_here, 0, 0)) return 0 ; + return &nsss_pwd_here ; + + efallback: + nsss_all_errno = errno ; + errno = e ; + fallback: + return nsss_unix_getpwent() ; +} diff --git a/src/libnsss/nsss_all_getpwent_r.c b/src/libnsss/nsss_all_getpwent_r.c new file mode 100644 index 0000000..08e69dc --- /dev/null +++ b/src/libnsss/nsss_all_getpwent_r.c @@ -0,0 +1,42 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include "nsss-internal.h" +#include "nsss-switch-internal.h" +#include "nsss-all-internal.h" + +int nsss_all_getpwent_r (struct passwd *pw, char *buf, size_t buflen, struct passwd **pwp) +{ + struct passwd pw2 ; + stralloc sa = STRALLOC_ZERO ; + int e = errno ; + if (nsss_all_errno) goto fallback ; + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_PWD, NSSS_NSSSD_PATH, 0, 0)) goto efallback ; + errno = 0 ; + if (!nsss_switch_pwd_get(&nsss_switch_here, &pw2, &sa, 0, 0)) + { + *pwp = 0 ; + if (!errno) errno = ENOENT ; + return errno ; + } + if (!nsss_pwd_copy(pw, buf, buflen, &pw2, sa.s, sa.len)) + { + stralloc_free(&sa) ; + *pwp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *pwp = pw ; + return (errno = e, 0) ; + + efallback: + nsss_all_errno = errno ; + errno = e ; + fallback: + return nsss_unix_getpwent_r(pw, buf, buflen, pwp) ; +} diff --git a/src/libnsss/nsss_all_getpwnam.c b/src/libnsss/nsss_all_getpwnam.c new file mode 100644 index 0000000..db855d7 --- /dev/null +++ b/src/libnsss/nsss_all_getpwnam.c @@ -0,0 +1,27 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +struct passwd *nsss_all_getpwnam (char const *name) +{ + nsss_switch_t a = NSSS_SWITCH_ZERO ; + int e = errno ; + if (!nsss_switch_start(&a, NSSS_SWITCH_PWD, NSSS_NSSSD_PATH, 0, 0)) goto fallback ; + nsss_pwd_sa_here.len = 0 ; + if (!nsss_switch_pwd_getbyname(&a, &nsss_pwd_here, &nsss_pwd_sa_here, name, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_PWD) ; + return 0 ; + } + nsss_switch_end(&a, NSSS_SWITCH_PWD) ; + return &nsss_pwd_here ; + + fallback: + errno = e ; + return nsss_unix_getpwnam(name) ; +} diff --git a/src/libnsss/nsss_all_getpwnam_r.c b/src/libnsss/nsss_all_getpwnam_r.c new file mode 100644 index 0000000..e3169b1 --- /dev/null +++ b/src/libnsss/nsss_all_getpwnam_r.c @@ -0,0 +1,39 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +int nsss_all_getpwnam_r (char const *name, struct passwd *pw, char *buf, size_t buflen, struct passwd **pwp) +{ + struct passwd pw2 ; + stralloc sa = STRALLOC_ZERO ; + nsss_switch_t a = NSSS_SWITCH_ZERO ; + int e = errno ; + if (!nsss_switch_start(&a, NSSS_SWITCH_PWD, NSSS_NSSSD_PATH, 0, 0)) goto fallback ; + errno = 0 ; + if (!nsss_switch_pwd_getbyname(&a, &pw2, &sa, name, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_PWD) ; + *pwp = 0 ; + return errno ? errno : (errno = e, 0) ; + } + nsss_switch_end(&a, NSSS_SWITCH_PWD) ; + if (!nsss_pwd_copy(pw, buf, buflen, &pw2, sa.s, sa.len)) + { + stralloc_free(&sa) ; + *pwp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *pwp = pw ; + return (errno = e, 0) ; + + fallback: + errno = e ; + return nsss_unix_getpwnam_r(name, pw, buf, buflen, pwp) ; +} diff --git a/src/libnsss/nsss_all_getpwuid.c b/src/libnsss/nsss_all_getpwuid.c new file mode 100644 index 0000000..26f0e21 --- /dev/null +++ b/src/libnsss/nsss_all_getpwuid.c @@ -0,0 +1,27 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +struct passwd *nsss_all_getpwuid (uid_t uid) +{ + nsss_switch_t a = NSSS_SWITCH_ZERO ; + int e = errno ; + if (!nsss_switch_start(&a, NSSS_SWITCH_PWD, NSSS_NSSSD_PATH, 0, 0)) goto fallback ; + nsss_pwd_sa_here.len = 0 ; + if (!nsss_switch_pwd_getbyuid(&a, &nsss_pwd_here, &nsss_pwd_sa_here, uid, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_PWD) ; + return 0 ; + } + nsss_switch_end(&a, NSSS_SWITCH_PWD) ; + return &nsss_pwd_here ; + + fallback: + errno = e ; + return nsss_unix_getpwuid(uid) ; +} diff --git a/src/libnsss/nsss_all_getpwuid_r.c b/src/libnsss/nsss_all_getpwuid_r.c new file mode 100644 index 0000000..2da32e1 --- /dev/null +++ b/src/libnsss/nsss_all_getpwuid_r.c @@ -0,0 +1,39 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +int nsss_all_getpwuid_r (uid_t uid, struct passwd *pw, char *buf, size_t buflen, struct passwd **pwp) +{ + struct passwd pw2 ; + stralloc sa = STRALLOC_ZERO ; + nsss_switch_t a = NSSS_SWITCH_ZERO ; + int e = errno ; + if (!nsss_switch_start(&a, NSSS_SWITCH_PWD, NSSS_NSSSD_PATH, 0, 0)) goto fallback ; + errno = 0 ; + if (!nsss_switch_pwd_getbyuid(&a, &pw2, &sa, uid, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_PWD) ; + *pwp = 0 ; + return errno ? errno : (errno = e, 0) ; + } + nsss_switch_end(&a, NSSS_SWITCH_PWD) ; + if (!nsss_pwd_copy(pw, buf, buflen, &pw2, sa.s, sa.len)) + { + stralloc_free(&sa) ; + *pwp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *pwp = pw ; + return (errno = e, 0) ; + + fallback: + errno = e ; + return nsss_unix_getpwuid_r(uid, pw, buf, buflen, pwp) ; +} diff --git a/src/libnsss/nsss_all_getspent.c b/src/libnsss/nsss_all_getspent.c new file mode 100644 index 0000000..7ca5048 --- /dev/null +++ b/src/libnsss/nsss_all_getspent.c @@ -0,0 +1,26 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-internal.h" +#include "nsss-switch-internal.h" +#include "nsss-all-internal.h" + +struct spwd *nsss_all_getspent (void) +{ + int e = errno ; + if (nsss_all_errno) goto fallback ; + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_SHADOW, NSSS_NSSSD_PATH, 0, 0)) goto efallback ; + nsss_shadow_sa_here.len = 0 ; + if (!nsss_switch_shadow_get(&nsss_switch_here, &nsss_shadow_here, &nsss_shadow_sa_here, 0, 0)) return 0 ; + return &nsss_shadow_here ; + + efallback: + nsss_all_errno = errno ; + errno = e ; + fallback: + return nsss_unix_getspent() ; +} diff --git a/src/libnsss/nsss_all_getspent_r.c b/src/libnsss/nsss_all_getspent_r.c new file mode 100644 index 0000000..ab3e531 --- /dev/null +++ b/src/libnsss/nsss_all_getspent_r.c @@ -0,0 +1,42 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include "nsss-internal.h" +#include "nsss-switch-internal.h" +#include "nsss-all-internal.h" + +int nsss_all_getspent_r (struct spwd *sp, char *buf, size_t buflen, struct spwd **spp) +{ + struct spwd sp2 ; + stralloc sa = STRALLOC_ZERO ; + int e = errno ; + if (nsss_all_errno) goto fallback ; + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_SHADOW, NSSS_NSSSD_PATH, 0, 0)) goto efallback ; + errno = 0 ; + if (!nsss_switch_shadow_get(&nsss_switch_here, &sp2, &sa, 0, 0)) + { + *spp = 0 ; + if (!errno) errno = ENOENT ; + return errno ; + } + if (!nsss_shadow_copy(sp, buf, buflen, &sp2, sa.s, sa.len)) + { + stralloc_free(&sa) ; + *spp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *spp = sp ; + return (errno = e, 0) ; + + efallback: + nsss_all_errno = errno ; + errno = e ; + fallback: + return nsss_unix_getspent_r(sp, buf, buflen, spp) ; +} diff --git a/src/libnsss/nsss_all_getspnam.c b/src/libnsss/nsss_all_getspnam.c new file mode 100644 index 0000000..040d5e4 --- /dev/null +++ b/src/libnsss/nsss_all_getspnam.c @@ -0,0 +1,27 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +struct spwd *nsss_all_getspnam (char const *name) +{ + nsss_switch_t a = NSSS_SWITCH_ZERO ; + int e = errno ; + if (!nsss_switch_start(&a, NSSS_SWITCH_SHADOW, NSSS_NSSSD_PATH, 0, 0)) goto fallback ; + nsss_shadow_sa_here.len = 0 ; + if (!nsss_switch_shadow_getbyname(&a, &nsss_shadow_here, &nsss_shadow_sa_here, name, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_SHADOW) ; + return 0 ; + } + nsss_switch_end(&a, NSSS_SWITCH_SHADOW) ; + return &nsss_shadow_here ; + + fallback: + errno = e ; + return nsss_unix_getspnam(name) ; +} diff --git a/src/libnsss/nsss_all_getspnam_r.c b/src/libnsss/nsss_all_getspnam_r.c new file mode 100644 index 0000000..0cee461 --- /dev/null +++ b/src/libnsss/nsss_all_getspnam_r.c @@ -0,0 +1,39 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +int nsss_all_getspnam_r (char const *name, struct spwd *sp, char *buf, size_t buflen, struct spwd **spp) +{ + struct spwd sp2 ; + stralloc sa = STRALLOC_ZERO ; + nsss_switch_t a = NSSS_SWITCH_ZERO ; + int e = errno ; + if (!nsss_switch_start(&a, NSSS_SWITCH_SHADOW, NSSS_NSSSD_PATH, 0, 0)) goto fallback ; + errno = 0 ; + if (!nsss_switch_shadow_getbyname(&a, &sp2, &sa, name, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_SHADOW) ; + *spp = 0 ; + return errno ? errno : (errno = e, 0) ; + } + nsss_switch_end(&a, NSSS_SWITCH_SHADOW) ; + if (!nsss_shadow_copy(sp, buf, buflen, &sp2, sa.s, sa.len)) + { + stralloc_free(&sa) ; + *spp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *spp = sp ; + return (errno = e, 0) ; + + fallback: + errno = e ; + return nsss_unix_getspnam_r(name, sp, buf, buflen, spp) ; +} diff --git a/src/libnsss/nsss_all_setgrent.c b/src/libnsss/nsss_all_setgrent.c new file mode 100644 index 0000000..78fee56 --- /dev/null +++ b/src/libnsss/nsss_all_setgrent.c @@ -0,0 +1,22 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-switch-internal.h" +#include "nsss-all-internal.h" + +void nsss_all_setgrent (void) +{ + int e = errno ; + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_GRP, NSSS_NSSSD_PATH, 0, 0)) goto fallback ; + nsss_switch_grp_rewind(&nsss_switch_here, 0, 0) ; + return ; + + fallback: + nsss_all_errno = errno ; + errno = e ; + nsss_unix_setgrent() ; +} diff --git a/src/libnsss/nsss_all_setpwent.c b/src/libnsss/nsss_all_setpwent.c new file mode 100644 index 0000000..e22411a --- /dev/null +++ b/src/libnsss/nsss_all_setpwent.c @@ -0,0 +1,22 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-switch-internal.h" +#include "nsss-all-internal.h" + +void nsss_all_setpwent (void) +{ + int e = errno ; + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_PWD, NSSS_NSSSD_PATH, 0, 0)) goto fallback ; + nsss_switch_pwd_rewind(&nsss_switch_here, 0, 0) ; + return ; + + fallback: + nsss_all_errno = errno ; + errno = e ; + nsss_unix_setpwent() ; +} diff --git a/src/libnsss/nsss_all_setspent.c b/src/libnsss/nsss_all_setspent.c new file mode 100644 index 0000000..ab6c456 --- /dev/null +++ b/src/libnsss/nsss_all_setspent.c @@ -0,0 +1,22 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-switch-internal.h" +#include "nsss-all-internal.h" + +void nsss_all_setspent (void) +{ + int e = errno ; + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_SHADOW, NSSS_NSSSD_PATH, 0, 0)) goto fallback ; + nsss_switch_shadow_rewind(&nsss_switch_here, 0, 0) ; + return ; + + fallback: + nsss_all_errno = errno ; + errno = e ; + nsss_unix_setspent() ; +} diff --git a/src/libnsss/nsss_grp_copy.c b/src/libnsss/nsss_grp_copy.c new file mode 100644 index 0000000..684996e --- /dev/null +++ b/src/libnsss/nsss_grp_copy.c @@ -0,0 +1,27 @@ +/* ISC license. */ + +#include +#include +#include +#include "nsss-internal.h" + +int nsss_grp_copy (struct group *gr, char *buf, size_t buflen, struct group const *gr2, char const *s, size_t len, char *const *p, size_t n) +{ + char **q ; + size_t offset = (uintptr_t)buf % 16 ; + offset = offset ? 16 - offset : 0 ; + if (buflen < offset) return (errno = ERANGE, 0) ; + buf += offset ; buflen -= offset ; + offset = (n+1) * sizeof(char *) ; + if (buflen < offset || buflen - offset < len) return (errno = ERANGE, 0) ; + q = (char **)buf ; + gr->gr_mem = q ; + buf += offset ; + memcpy(buf, s, len) ; + for (size_t i = 0 ; i < n ; i++) q[i] = buf + (p[i] - s) ; + q[n] = 0 ; + gr->gr_name = buf + (gr2->gr_name - s) ; + gr->gr_passwd = buf + (gr2->gr_passwd - s) ; + gr->gr_gid = gr2->gr_gid ; + return 1 ; +} diff --git a/src/libnsss/nsss_grp_here.c b/src/libnsss/nsss_grp_here.c new file mode 100644 index 0000000..9b64ffd --- /dev/null +++ b/src/libnsss/nsss_grp_here.c @@ -0,0 +1,10 @@ +/* ISC license. */ + +#include +#include +#include +#include "nsss-internal.h" + +struct group nsss_grp_here ; +stralloc nsss_grp_sa_here = STRALLOC_ZERO ; +genalloc nsss_grp_ga_here = GENALLOC_ZERO ; diff --git a/src/libnsss/nsss_pwd_copy.c b/src/libnsss/nsss_pwd_copy.c new file mode 100644 index 0000000..e163cf2 --- /dev/null +++ b/src/libnsss/nsss_pwd_copy.c @@ -0,0 +1,19 @@ +/* ISC license. */ + +#include +#include +#include "nsss-internal.h" + +int nsss_pwd_copy (struct passwd *pw, char *buf, size_t buflen, struct passwd const *pw2, char const *s, size_t len) +{ + if (len > buflen) return (errno = ERANGE, 0) ; + memcpy(buf, s, len) ; + pw->pw_name = buf + (pw2->pw_name - s) ; + pw->pw_passwd = buf + (pw2->pw_passwd - s) ; + pw->pw_uid = pw2->pw_uid ; + pw->pw_gid = pw2->pw_gid ; + pw->pw_gecos = buf + (pw2->pw_gecos - s) ; + pw->pw_dir = buf + (pw2->pw_dir - s) ; + pw->pw_shell = buf + (pw2->pw_shell - s) ; + return 1 ; +} diff --git a/src/libnsss/nsss_pwd_here.c b/src/libnsss/nsss_pwd_here.c new file mode 100644 index 0000000..fdb95a4 --- /dev/null +++ b/src/libnsss/nsss_pwd_here.c @@ -0,0 +1,8 @@ +/* ISC license. */ + +#include +#include +#include "nsss-internal.h" + +struct passwd nsss_pwd_here ; +stralloc nsss_pwd_sa_here = STRALLOC_ZERO ; diff --git a/src/libnsss/nsss_shadow_copy.c b/src/libnsss/nsss_shadow_copy.c new file mode 100644 index 0000000..bb629db --- /dev/null +++ b/src/libnsss/nsss_shadow_copy.c @@ -0,0 +1,21 @@ +/* ISC license. */ + +#include +#include +#include "nsss-internal.h" + +int nsss_shadow_copy (struct spwd *sp, char *buf, size_t buflen, struct spwd const *sp2, char const *s, size_t len) +{ + if (len > buflen) return (errno = ERANGE, 0) ; + memcpy(buf, s, len) ; + sp->sp_namp = buf + (sp2->sp_namp - s) ; + sp->sp_pwdp = buf + (sp2->sp_pwdp - s) ; + sp->sp_lstchg = sp2->sp_lstchg ; + sp->sp_min = sp2->sp_min ; + sp->sp_max = sp2->sp_max ; + sp->sp_warn = sp2->sp_warn ; + sp->sp_inact = sp2->sp_inact ; + sp->sp_expire = sp2->sp_expire ; + sp->sp_flag = sp2->sp_flag ; + return 1 ; +} diff --git a/src/libnsss/nsss_shadow_here.c b/src/libnsss/nsss_shadow_here.c new file mode 100644 index 0000000..ecf83c9 --- /dev/null +++ b/src/libnsss/nsss_shadow_here.c @@ -0,0 +1,8 @@ +/* ISC license. */ + +#include +#include +#include "nsss-internal.h" + +struct spwd nsss_shadow_here ; +stralloc nsss_shadow_sa_here = STRALLOC_ZERO ; diff --git a/src/libnsss/nsss_switch_end.c b/src/libnsss/nsss_switch_end.c new file mode 100644 index 0000000..3922721 --- /dev/null +++ b/src/libnsss/nsss_switch_end.c @@ -0,0 +1,17 @@ +/* ISC license. */ + +#include +#include +#include + +static inline void nsss_switch_disconnect (nsss_switch_t *a) +{ + fd_close(buffer_fd(&a->b)) ; + a->b.fd = -1 ; +} + +void nsss_switch_end (nsss_switch_t *a, unsigned int what) +{ + a->held &= ~(1U << what) ; + if (!a->held) nsss_switch_disconnect(a) ; +} diff --git a/src/libnsss/nsss_switch_endgrent.c b/src/libnsss/nsss_switch_endgrent.c new file mode 100644 index 0000000..8ae43ea --- /dev/null +++ b/src/libnsss/nsss_switch_endgrent.c @@ -0,0 +1,10 @@ +/* ISC license. */ + +#include +#include "nsss-switch-internal.h" + +void nsss_switch_endgrent (void) +{ + nsss_switch_grp_end(&nsss_switch_here, 0, 0) ; + nsss_switch_end(&nsss_switch_here, NSSS_SWITCH_GRP) ; +} diff --git a/src/libnsss/nsss_switch_endpwent.c b/src/libnsss/nsss_switch_endpwent.c new file mode 100644 index 0000000..8dbec92 --- /dev/null +++ b/src/libnsss/nsss_switch_endpwent.c @@ -0,0 +1,10 @@ +/* ISC license. */ + +#include +#include "nsss-switch-internal.h" + +void nsss_switch_endpwent (void) +{ + nsss_switch_pwd_end(&nsss_switch_here, 0, 0) ; + nsss_switch_end(&nsss_switch_here, NSSS_SWITCH_PWD) ; +} diff --git a/src/libnsss/nsss_switch_endspent.c b/src/libnsss/nsss_switch_endspent.c new file mode 100644 index 0000000..8527072 --- /dev/null +++ b/src/libnsss/nsss_switch_endspent.c @@ -0,0 +1,10 @@ +/* ISC license. */ + +#include +#include "nsss-switch-internal.h" + +void nsss_switch_endspent (void) +{ + nsss_switch_shadow_end(&nsss_switch_here, 0, 0) ; + nsss_switch_end(&nsss_switch_here, NSSS_SWITCH_SHADOW) ; +} diff --git a/src/libnsss/nsss_switch_getgrent.c b/src/libnsss/nsss_switch_getgrent.c new file mode 100644 index 0000000..6a6c8dc --- /dev/null +++ b/src/libnsss/nsss_switch_getgrent.c @@ -0,0 +1,17 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include "nsss-internal.h" +#include "nsss-switch-internal.h" + +struct group *nsss_switch_getgrent (void) +{ + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_GRP, NSSS_NSSSD_PATH, 0, 0)) return 0 ; + nsss_grp_sa_here.len = 0 ; + genalloc_setlen(char *, &nsss_grp_ga_here, 0) ; + if (!nsss_switch_grp_get(&nsss_switch_here, &nsss_grp_here, &nsss_grp_sa_here, &nsss_grp_ga_here, 0, 0)) return 0 ; + return &nsss_grp_here ; +} diff --git a/src/libnsss/nsss_switch_getgrent_r.c b/src/libnsss/nsss_switch_getgrent_r.c new file mode 100644 index 0000000..97a7bbd --- /dev/null +++ b/src/libnsss/nsss_switch_getgrent_r.c @@ -0,0 +1,36 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include "nsss-internal.h" +#include "nsss-switch-internal.h" + +int nsss_switch_getgrent_r (struct group *gr, char *buf, size_t buflen, struct group **grp) +{ + struct group gr2 ; + stralloc sa = STRALLOC_ZERO ; + genalloc ga = GENALLOC_ZERO ; + int e ; + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_GRP, NSSS_NSSSD_PATH, 0, 0)) return errno ; + e = errno ; + errno = 0 ; + if (!nsss_switch_grp_get(&nsss_switch_here, &gr2, &sa, &ga, 0, 0)) + { + *grp = 0 ; + if (!errno) errno = ENOENT ; + return errno ; + } + if (!nsss_grp_copy(gr, buf, buflen, &gr2, sa.s, sa.len, genalloc_s(char *, &ga), genalloc_len(char *, &ga))) + { + stralloc_free(&sa) ; + *grp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *grp = gr ; + return (errno = e, 0) ; +} diff --git a/src/libnsss/nsss_switch_getgrgid.c b/src/libnsss/nsss_switch_getgrgid.c new file mode 100644 index 0000000..65dbeef --- /dev/null +++ b/src/libnsss/nsss_switch_getgrgid.c @@ -0,0 +1,22 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include "nsss-internal.h" + +struct group *nsss_switch_getgrgid (gid_t gid) +{ + nsss_switch_t a = NSSS_SWITCH_ZERO ; + if (!nsss_switch_start(&a, NSSS_SWITCH_GRP, NSSS_NSSSD_PATH, 0, 0)) return 0 ; + nsss_grp_sa_here.len = 0 ; + genalloc_setlen(char *, &nsss_grp_ga_here, 0) ; + if (!nsss_switch_grp_getbygid(&a, &nsss_grp_here, &nsss_grp_sa_here, &nsss_grp_ga_here, gid, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_GRP) ; + return 0 ; + } + nsss_switch_end(&a, NSSS_SWITCH_GRP) ; + return &nsss_grp_here ; +} diff --git a/src/libnsss/nsss_switch_getgrgid_r.c b/src/libnsss/nsss_switch_getgrgid_r.c new file mode 100644 index 0000000..c87b57d --- /dev/null +++ b/src/libnsss/nsss_switch_getgrgid_r.c @@ -0,0 +1,36 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +int nsss_switch_getgrgid_r (gid_t gid, struct group *gr, char *buf, size_t buflen, struct group **grp) +{ + struct group gr2 ; + stralloc sa = STRALLOC_ZERO ; + genalloc ga = GENALLOC_ZERO ; + nsss_switch_t a = NSSS_SWITCH_ZERO ; + int e = errno ; + if (!nsss_switch_start(&a, NSSS_SWITCH_GRP, NSSS_NSSSD_PATH, 0, 0)) return errno ; + errno = 0 ; + if (!nsss_switch_grp_getbygid(&a, &gr2, &sa, &ga, gid, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_GRP) ; + *grp = 0 ; + return errno ? errno : (errno = e, 0) ; + } + nsss_switch_end(&a, NSSS_SWITCH_GRP) ; + if (!nsss_grp_copy(gr, buf, buflen, &gr2, sa.s, sa.len, genalloc_s(char *, &ga), genalloc_len(char *, &ga))) + { + stralloc_free(&sa) ; + *grp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *grp = gr ; + return (errno = e, 0) ; +} diff --git a/src/libnsss/nsss_switch_getgrnam.c b/src/libnsss/nsss_switch_getgrnam.c new file mode 100644 index 0000000..396f44e --- /dev/null +++ b/src/libnsss/nsss_switch_getgrnam.c @@ -0,0 +1,22 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include "nsss-internal.h" + +struct group *nsss_switch_getgrnam (char const *name) +{ + nsss_switch_t a = NSSS_SWITCH_ZERO ; + if (!nsss_switch_start(&a, NSSS_SWITCH_GRP, NSSS_NSSSD_PATH, 0, 0)) return 0 ; + nsss_grp_sa_here.len = 0 ; + genalloc_setlen(char *, &nsss_grp_ga_here, 0) ; + if (!nsss_switch_grp_getbyname(&a, &nsss_grp_here, &nsss_grp_sa_here, &nsss_grp_ga_here, name, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_GRP) ; + return 0 ; + } + nsss_switch_end(&a, NSSS_SWITCH_GRP) ; + return &nsss_grp_here ; +} diff --git a/src/libnsss/nsss_switch_getgrnam_r.c b/src/libnsss/nsss_switch_getgrnam_r.c new file mode 100644 index 0000000..e6d00ec --- /dev/null +++ b/src/libnsss/nsss_switch_getgrnam_r.c @@ -0,0 +1,36 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +int nsss_switch_getgrnam_r (char const *name, struct group *gr, char *buf, size_t buflen, struct group **grp) +{ + struct group gr2 ; + stralloc sa = STRALLOC_ZERO ; + genalloc ga = GENALLOC_ZERO ; + nsss_switch_t a = NSSS_SWITCH_ZERO ; + int e = errno ; + if (!nsss_switch_start(&a, NSSS_SWITCH_GRP, NSSS_NSSSD_PATH, 0, 0)) return errno ; + errno = 0 ; + if (!nsss_switch_grp_getbyname(&a, &gr2, &sa, &ga, name, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_GRP) ; + *grp = 0 ; + return errno ? errno : (errno = e, 0) ; + } + nsss_switch_end(&a, NSSS_SWITCH_GRP) ; + if (!nsss_grp_copy(gr, buf, buflen, &gr2, sa.s, sa.len, genalloc_s(char *, &ga), genalloc_len(char *, &ga))) + { + stralloc_free(&sa) ; + *grp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *grp = gr ; + return (errno = e, 0) ; +} diff --git a/src/libnsss/nsss_switch_getpwent.c b/src/libnsss/nsss_switch_getpwent.c new file mode 100644 index 0000000..89cabfd --- /dev/null +++ b/src/libnsss/nsss_switch_getpwent.c @@ -0,0 +1,15 @@ +/* ISC license. */ + +#include +#include +#include +#include "nsss-internal.h" +#include "nsss-switch-internal.h" + +struct passwd *nsss_switch_getpwent (void) +{ + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_PWD, NSSS_NSSSD_PATH, 0, 0)) return 0 ; + nsss_pwd_sa_here.len = 0 ; + if (!nsss_switch_pwd_get(&nsss_switch_here, &nsss_pwd_here, &nsss_pwd_sa_here, 0, 0)) return 0 ; + return &nsss_pwd_here ; +} diff --git a/src/libnsss/nsss_switch_getpwent_r.c b/src/libnsss/nsss_switch_getpwent_r.c new file mode 100644 index 0000000..7795af0 --- /dev/null +++ b/src/libnsss/nsss_switch_getpwent_r.c @@ -0,0 +1,34 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-internal.h" +#include "nsss-switch-internal.h" + +int nsss_switch_getpwent_r (struct passwd *pw, char *buf, size_t buflen, struct passwd **pwp) +{ + struct passwd pw2 ; + stralloc sa = STRALLOC_ZERO ; + int e ; + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_PWD, NSSS_NSSSD_PATH, 0, 0)) return errno ; + e = errno ; + errno = 0 ; + if (!nsss_switch_pwd_get(&nsss_switch_here, &pw2, &sa, 0, 0)) + { + *pwp = 0 ; + if (!errno) errno = ENOENT ; + return errno ; + } + if (!nsss_pwd_copy(pw, buf, buflen, &pw2, sa.s, sa.len)) + { + stralloc_free(&sa) ; + *pwp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *pwp = pw ; + return (errno = e, 0) ; +} diff --git a/src/libnsss/nsss_switch_getpwnam.c b/src/libnsss/nsss_switch_getpwnam.c new file mode 100644 index 0000000..393503d --- /dev/null +++ b/src/libnsss/nsss_switch_getpwnam.c @@ -0,0 +1,20 @@ +/* ISC license. */ + +#include +#include +#include +#include "nsss-internal.h" + +struct passwd *nsss_switch_getpwnam (char const *name) +{ + nsss_switch_t a = NSSS_SWITCH_ZERO ; + if (!nsss_switch_start(&a, NSSS_SWITCH_PWD, NSSS_NSSSD_PATH, 0, 0)) return 0 ; + nsss_pwd_sa_here.len = 0 ; + if (!nsss_switch_pwd_getbyname(&a, &nsss_pwd_here, &nsss_pwd_sa_here, name, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_PWD) ; + return 0 ; + } + nsss_switch_end(&a, NSSS_SWITCH_PWD) ; + return &nsss_pwd_here ; +} diff --git a/src/libnsss/nsss_switch_getpwnam_r.c b/src/libnsss/nsss_switch_getpwnam_r.c new file mode 100644 index 0000000..e1c1e71 --- /dev/null +++ b/src/libnsss/nsss_switch_getpwnam_r.c @@ -0,0 +1,34 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +int nsss_switch_getpwnam_r (char const *name, struct passwd *pw, char *buf, size_t buflen, struct passwd **pwp) +{ + struct passwd pw2 ; + stralloc sa = STRALLOC_ZERO ; + nsss_switch_t a = NSSS_SWITCH_ZERO ; + int e = errno ; + if (!nsss_switch_start(&a, NSSS_SWITCH_PWD, NSSS_NSSSD_PATH, 0, 0)) return errno ; + errno = 0 ; + if (!nsss_switch_pwd_getbyname(&a, &pw2, &sa, name, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_PWD) ; + *pwp = 0 ; + return errno ? errno : (errno = e, 0) ; + } + nsss_switch_end(&a, NSSS_SWITCH_PWD) ; + if (!nsss_pwd_copy(pw, buf, buflen, &pw2, sa.s, sa.len)) + { + stralloc_free(&sa) ; + *pwp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *pwp = pw ; + return (errno = e, 0) ; +} diff --git a/src/libnsss/nsss_switch_getpwuid.c b/src/libnsss/nsss_switch_getpwuid.c new file mode 100644 index 0000000..3d765bf --- /dev/null +++ b/src/libnsss/nsss_switch_getpwuid.c @@ -0,0 +1,20 @@ +/* ISC license. */ + +#include +#include +#include +#include "nsss-internal.h" + +struct passwd *nsss_switch_getpwuid (uid_t uid) +{ + nsss_switch_t a = NSSS_SWITCH_ZERO ; + if (!nsss_switch_start(&a, NSSS_SWITCH_PWD, NSSS_NSSSD_PATH, 0, 0)) return 0 ; + nsss_pwd_sa_here.len = 0 ; + if (!nsss_switch_pwd_getbyuid(&a, &nsss_pwd_here, &nsss_pwd_sa_here, uid, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_PWD) ; + return 0 ; + } + nsss_switch_end(&a, NSSS_SWITCH_PWD) ; + return &nsss_pwd_here ; +} diff --git a/src/libnsss/nsss_switch_getpwuid_r.c b/src/libnsss/nsss_switch_getpwuid_r.c new file mode 100644 index 0000000..8e63a75 --- /dev/null +++ b/src/libnsss/nsss_switch_getpwuid_r.c @@ -0,0 +1,34 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +int nsss_switch_getpwuid_r (uid_t uid, struct passwd *pw, char *buf, size_t buflen, struct passwd **pwp) +{ + struct passwd pw2 ; + stralloc sa = STRALLOC_ZERO ; + nsss_switch_t a = NSSS_SWITCH_ZERO ; + int e = errno ; + if (!nsss_switch_start(&a, NSSS_SWITCH_PWD, NSSS_NSSSD_PATH, 0, 0)) return errno ; + errno = 0 ; + if (!nsss_switch_pwd_getbyuid(&a, &pw2, &sa, uid, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_PWD) ; + *pwp = 0 ; + return errno ? errno : (errno = e, 0) ; + } + nsss_switch_end(&a, NSSS_SWITCH_PWD) ; + if (!nsss_pwd_copy(pw, buf, buflen, &pw2, sa.s, sa.len)) + { + stralloc_free(&sa) ; + *pwp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *pwp = pw ; + return (errno = e, 0) ; +} diff --git a/src/libnsss/nsss_switch_getspent.c b/src/libnsss/nsss_switch_getspent.c new file mode 100644 index 0000000..65064a1 --- /dev/null +++ b/src/libnsss/nsss_switch_getspent.c @@ -0,0 +1,15 @@ +/* ISC license. */ + +#include +#include +#include +#include "nsss-internal.h" +#include "nsss-switch-internal.h" + +struct spwd *nsss_switch_getspent (void) +{ + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_SHADOW, NSSS_NSSSD_PATH, 0, 0)) return 0 ; + nsss_shadow_sa_here.len = 0 ; + if (!nsss_switch_shadow_get(&nsss_switch_here, &nsss_shadow_here, &nsss_shadow_sa_here, 0, 0)) return 0 ; + return &nsss_shadow_here ; +} diff --git a/src/libnsss/nsss_switch_getspent_r.c b/src/libnsss/nsss_switch_getspent_r.c new file mode 100644 index 0000000..118e095 --- /dev/null +++ b/src/libnsss/nsss_switch_getspent_r.c @@ -0,0 +1,34 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-internal.h" +#include "nsss-switch-internal.h" + +int nsss_switch_getspent_r (struct spwd *sp, char *buf, size_t buflen, struct spwd **spp) +{ + struct spwd sp2 ; + stralloc sa = STRALLOC_ZERO ; + int e ; + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_SHADOW, NSSS_NSSSD_PATH, 0, 0)) return errno ; + e = errno ; + errno = 0 ; + if (!nsss_switch_shadow_get(&nsss_switch_here, &sp2, &sa, 0, 0)) + { + *spp = 0 ; + if (!errno) errno = ENOENT ; + return errno ; + } + if (!nsss_shadow_copy(sp, buf, buflen, &sp2, sa.s, sa.len)) + { + stralloc_free(&sa) ; + *spp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *spp = sp ; + return (errno = e, 0) ; +} diff --git a/src/libnsss/nsss_switch_getspnam.c b/src/libnsss/nsss_switch_getspnam.c new file mode 100644 index 0000000..01184ec --- /dev/null +++ b/src/libnsss/nsss_switch_getspnam.c @@ -0,0 +1,20 @@ +/* ISC license. */ + +#include +#include +#include +#include "nsss-internal.h" + +struct spwd *nsss_switch_getspnam (char const *name) +{ + nsss_switch_t a = NSSS_SWITCH_ZERO ; + if (!nsss_switch_start(&a, NSSS_SWITCH_SHADOW, NSSS_NSSSD_PATH, 0, 0)) return 0 ; + nsss_shadow_sa_here.len = 0 ; + if (!nsss_switch_shadow_getbyname(&a, &nsss_shadow_here, &nsss_shadow_sa_here, name, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_SHADOW) ; + return 0 ; + } + nsss_switch_end(&a, NSSS_SWITCH_SHADOW) ; + return &nsss_shadow_here ; +} diff --git a/src/libnsss/nsss_switch_getspnam_r.c b/src/libnsss/nsss_switch_getspnam_r.c new file mode 100644 index 0000000..9c6b86f --- /dev/null +++ b/src/libnsss/nsss_switch_getspnam_r.c @@ -0,0 +1,34 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +int nsss_switch_getspnam_r (char const *name, struct spwd *sp, char *buf, size_t buflen, struct spwd **spp) +{ + struct spwd sp2 ; + stralloc sa = STRALLOC_ZERO ; + nsss_switch_t a = NSSS_SWITCH_ZERO ; + int e = errno ; + if (!nsss_switch_start(&a, NSSS_SWITCH_SHADOW, NSSS_NSSSD_PATH, 0, 0)) return errno ; + errno = 0 ; + if (!nsss_switch_shadow_getbyname(&a, &sp2, &sa, name, 0, 0)) + { + nsss_switch_end(&a, NSSS_SWITCH_SHADOW) ; + *spp = 0 ; + return errno ? errno : (errno = e, 0) ; + } + nsss_switch_end(&a, NSSS_SWITCH_SHADOW) ; + if (!nsss_shadow_copy(sp, buf, buflen, &sp2, sa.s, sa.len)) + { + stralloc_free(&sa) ; + *spp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *spp = sp ; + return (errno = e, 0) ; +} diff --git a/src/libnsss/nsss_switch_grp_end.c b/src/libnsss/nsss_switch_grp_end.c new file mode 100644 index 0000000..3b25cdf --- /dev/null +++ b/src/libnsss/nsss_switch_grp_end.c @@ -0,0 +1,9 @@ +/* ISC license. */ + +#include +#include "nsss-switch-internal.h" + +int nsss_grent_end (nsss_switch_t *a, tain_t const *deadline, tain_t *stamp) +{ + return nsss_switch_op(a, NSSS_SWITCH_GRP_END, deadline, stamp) ; +} diff --git a/src/libnsss/nsss_switch_grp_get.c b/src/libnsss/nsss_switch_grp_get.c new file mode 100644 index 0000000..4cfb67e --- /dev/null +++ b/src/libnsss/nsss_switch_grp_get.c @@ -0,0 +1,17 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include "nsss-switch-internal.h" + +int nsss_switch_grp_get (nsss_switch_t *a, struct group *gr, stralloc *sa, genalloc *ga, tain_t const *deadline, tain_t *stamp) +{ + char c = NSSS_SWITCH_GRP_GET ; + if (!ipc_timed_send(buffer_fd(&a->b), &c, 1, deadline, stamp)) return 0 ; + if (!buffer_timed_get(&a->b, &c, 1, deadline, stamp)) return 0 ; + if ((unsigned char)c == 255) return 0 ; + if (c) return (errno = c, 0) ; + return nsss_switch_grp_read(&a->b, gr, sa, ga, deadline, stamp) ; +} diff --git a/src/libnsss/nsss_switch_grp_getbygid.c b/src/libnsss/nsss_switch_grp_getbygid.c new file mode 100644 index 0000000..3b9802b --- /dev/null +++ b/src/libnsss/nsss_switch_grp_getbygid.c @@ -0,0 +1,19 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-switch-internal.h" + +int nsss_switch_grp_getbygid (nsss_switch_t *a, struct group *gr, stralloc *sa, genalloc *ga, gid_t gid, tain_t const *deadline, tain_t *stamp) +{ + char buf[5] = { NSSS_SWITCH_GRP_GETBYGID } ; + uint32_pack_big(buf + 1, gid) ; + if (!ipc_timed_send(buffer_fd(&a->b), buf, 5, deadline, stamp)) return 0 ; + if (!buffer_timed_get(&a->b, &buf[0], 1, deadline, stamp)) return 0 ; + if ((unsigned char)buf[0] == 255) return 0 ; + if (buf[0]) return (errno = buf[0], 0) ; + return nsss_switch_grp_read(&a->b, gr, sa, ga, deadline, stamp) ; +} diff --git a/src/libnsss/nsss_switch_grp_getbyname.c b/src/libnsss/nsss_switch_grp_getbyname.c new file mode 100644 index 0000000..2ece9d2 --- /dev/null +++ b/src/libnsss/nsss_switch_grp_getbyname.c @@ -0,0 +1,24 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include +#include "nsss-switch-internal.h" + +int nsss_switch_grp_getbyname (nsss_switch_t *a, struct group *gr, stralloc *sa, genalloc *ga, char const *name, tain_t const *deadline, tain_t *stamp) +{ + char buf[5] = { NSSS_SWITCH_GRP_GETBYNAME } ; + size_t len = strlen(name) ; + struct iovec v[2] = { { .iov_base = buf, .iov_len = 5 }, { .iov_base = (char *)name, .iov_len = len + 1 } } ; + if (len > NSSS_SWITCH_NAME_MAXLEN - 1) return (errno = EINVAL, 0) ; + uint32_pack_big(buf + 1, len + 1) ; + if (!ipc_timed_sendv(buffer_fd(&a->b), v, 2, deadline, stamp)) return 0 ; + if (!buffer_timed_get(&a->b, &buf[0], 1, deadline, stamp)) return 0 ; + if ((unsigned char)buf[0] == 255) return 0 ; + if (buf[0]) return (errno = buf[0], 0) ; + return nsss_switch_grp_read(&a->b, gr, sa, ga, deadline, stamp) ; +} diff --git a/src/libnsss/nsss_switch_grp_read.c b/src/libnsss/nsss_switch_grp_read.c new file mode 100644 index 0000000..6152484 --- /dev/null +++ b/src/libnsss/nsss_switch_grp_read.c @@ -0,0 +1,58 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "nsss-switch-internal.h" + +/* + Expects: + 4 bytes gr_gid + 4 bytes total length of strings (including \0's) + 4 bytes number of strings in gr_mem (n) + \0-terminated gr_name + \0-terminated gr_passwd + sequence of n \0-terminated elements in gr_mem +*/ + +int nsss_switch_grp_read (buffer *b, struct group *gr, stralloc *sa, genalloc *ga, tain_t const *deadline, tain_t *stamp) +{ + struct group grtmp ; + uint32_t total, len, n, x ; + char **q ; + char *p ; + char buf[12] ; + if (!buffer_timed_get(b, buf, 12, deadline, stamp)) return 0 ; + uint32_unpack_big(buf, &x) ; grtmp.gr_gid = x ; + uint32_unpack_big(buf + 4, &total) ; + uint32_unpack_big(buf + 8, &n) ; + if (n >= 0x30000000u) return (errno = EPROTO, 0) ; + if (!stralloc_readyplus(sa, total)) return 0 ; + if (!genalloc_readyplus(char *, ga, n+1)) return 0 ; + if (!buffer_timed_get(b, sa->s + sa->len, total, deadline, stamp)) return 0 ; + if (sa->s[sa->len + total - 1]) return (errno = EPROTO, 0) ; + p = sa->s + sa->len ; len = total ; + q = genalloc_s(char *, ga) + genalloc_len(char *, ga) ; + grtmp.gr_mem = q ; + grtmp.gr_name = p ; x = strnlen(p, len) + 1 ; p += x ; len -= x ; + if (!len) return (errno = EPROTO, 0) ; + grtmp.gr_passwd = p ; x = strnlen(p, len) + 1 ; p += x ; len -= x ; + for (uint32_t i = 0 ; i < n ; i++) + { + if (!len) return (errno = EPROTO, 0) ; + q[i] = p ; x = strnlen(p, len) + 1 ; p += x ; len -= x ; + } + if (len) return (errno = EPROTO, 0) ; + q[n] = 0 ; + sa->len += total ; + genalloc_setlen(char *, ga, genalloc_len(char *, ga) + n + 1) ; + *gr = grtmp ; + return 1 ; +} diff --git a/src/libnsss/nsss_switch_grp_rewind.c b/src/libnsss/nsss_switch_grp_rewind.c new file mode 100644 index 0000000..347b071 --- /dev/null +++ b/src/libnsss/nsss_switch_grp_rewind.c @@ -0,0 +1,9 @@ +/* ISC license. */ + +#include +#include "nsss-switch-internal.h" + +int nsss_switch_grp_rewind (nsss_switch_t *a, tain_t const *deadline, tain_t *stamp) +{ + return nsss_switch_op(a, NSSS_SWITCH_GRP_REWIND, deadline, stamp) ; +} diff --git a/src/libnsss/nsss_switch_here.c b/src/libnsss/nsss_switch_here.c new file mode 100644 index 0000000..994974b --- /dev/null +++ b/src/libnsss/nsss_switch_here.c @@ -0,0 +1,6 @@ +/* ISC license. */ + +#include +#include "nsss-switch-internal.h" + +nsss_switch_t nsss_switch_here = NSSS_SWITCH_ZERO ; diff --git a/src/libnsss/nsss_switch_op.c b/src/libnsss/nsss_switch_op.c new file mode 100644 index 0000000..8b5bee3 --- /dev/null +++ b/src/libnsss/nsss_switch_op.c @@ -0,0 +1,16 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include "nsss-switch-internal.h" + +int nsss_switch_op (nsss_switch_t *a, char op, tain_t const *deadline, tain_t *stamp) +{ + char c ; + if (!ipc_timed_send(buffer_fd(&a->b), &op, 1, deadline, stamp)) return 0 ; + if (!buffer_timed_get(&a->b, &c, 1, deadline, stamp)) return 0 ; + if (c) return (errno = c, 0) ; + return 1 ; +} diff --git a/src/libnsss/nsss_switch_pwd_end.c b/src/libnsss/nsss_switch_pwd_end.c new file mode 100644 index 0000000..a082474 --- /dev/null +++ b/src/libnsss/nsss_switch_pwd_end.c @@ -0,0 +1,9 @@ +/* ISC license. */ + +#include +#include "nsss-switch-internal.h" + +int nsss_switch_pwd_end (nsss_switch_t *a, tain_t const *deadline, tain_t *stamp) +{ + return nsss_switch_op(a, NSSS_SWITCH_PWD_END, deadline, stamp) ; +} diff --git a/src/libnsss/nsss_switch_pwd_get.c b/src/libnsss/nsss_switch_pwd_get.c new file mode 100644 index 0000000..0c630f8 --- /dev/null +++ b/src/libnsss/nsss_switch_pwd_get.c @@ -0,0 +1,17 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include "nsss-switch-internal.h" + +int nsss_switch_pwd_get (nsss_switch_t *a, struct passwd *pw, stralloc *sa, tain_t const *deadline, tain_t *stamp) +{ + char c = NSSS_SWITCH_PWD_GET ; + if (!ipc_timed_send(buffer_fd(&a->b), &c, 1, deadline, stamp)) return 0 ; + if (!buffer_timed_get(&a->b, &c, 1, deadline, stamp)) return 0 ; + if ((unsigned char)c == 255) return 0 ; + if (c) return (errno = c, 0) ; + return nsss_switch_pwd_read(&a->b, pw, sa, deadline, stamp) ; +} diff --git a/src/libnsss/nsss_switch_pwd_getbyname.c b/src/libnsss/nsss_switch_pwd_getbyname.c new file mode 100644 index 0000000..a10d129 --- /dev/null +++ b/src/libnsss/nsss_switch_pwd_getbyname.c @@ -0,0 +1,24 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include +#include "nsss-switch-internal.h" + +int nsss_switch_pwd_getbyname (nsss_switch_t *a, struct passwd *pw, stralloc *sa, char const *name, tain_t const *deadline, tain_t *stamp) +{ + char buf[5] = { NSSS_SWITCH_PWD_GETBYNAME } ; + size_t len = strlen(name) ; + struct iovec v[2] = { { .iov_base = buf, .iov_len = 5 }, { .iov_base = (char *)name, .iov_len = len + 1 } } ; + if (len > NSSS_SWITCH_NAME_MAXLEN - 1) return (errno = EINVAL, 0) ; + uint32_pack_big(buf + 1, len + 1) ; + if (!ipc_timed_sendv(buffer_fd(&a->b), v, 2, deadline, stamp)) return 0 ; + if (!buffer_timed_get(&a->b, &buf[0], 1, deadline, stamp)) return 0 ; + if ((unsigned char)buf[0] == 255) return 0 ; + if (buf[0]) return (errno = buf[0], 0) ; + return nsss_switch_pwd_read(&a->b, pw, sa, deadline, stamp) ; +} diff --git a/src/libnsss/nsss_switch_pwd_getbyuid.c b/src/libnsss/nsss_switch_pwd_getbyuid.c new file mode 100644 index 0000000..b1d98cf --- /dev/null +++ b/src/libnsss/nsss_switch_pwd_getbyuid.c @@ -0,0 +1,19 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-switch-internal.h" + +int nsss_switch_pwd_getbyuid (nsss_switch_t *a, struct passwd *pw, stralloc *sa, uid_t uid, tain_t const *deadline, tain_t *stamp) +{ + char buf[5] = { NSSS_SWITCH_PWD_GETBYUID } ; + uint32_pack_big(buf + 1, uid) ; + if (!ipc_timed_send(buffer_fd(&a->b), buf, 5, deadline, stamp)) return 0 ; + if (!buffer_timed_get(&a->b, &buf[0], 1, deadline, stamp)) return 0 ; + if ((unsigned char)buf[0] == 255) return 0 ; + if (buf[0]) return (errno = buf[0], 0) ; + return nsss_switch_pwd_read(&a->b, pw, sa, deadline, stamp) ; +} diff --git a/src/libnsss/nsss_switch_pwd_read.c b/src/libnsss/nsss_switch_pwd_read.c new file mode 100644 index 0000000..936b0f4 --- /dev/null +++ b/src/libnsss/nsss_switch_pwd_read.c @@ -0,0 +1,53 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "nsss-switch-internal.h" + +/* + Expects: + 4 bytes pw_uid + 4 bytes pw_gid + 4 bytes total length of strings (including \0's) + \0-terminated pw_name + \0-terminated pw_passwd + \0-terminated pw_gecos + \0-terminated pw_dir + \0-terminated pw_shell +*/ + +int nsss_switch_pwd_read (buffer *b, struct passwd *pw, stralloc *sa, tain_t const *deadline, tain_t *stamp) +{ + struct passwd pwtmp ; + uint32_t total, len, x ; + char *p ; + char buf[12] ; + if (!buffer_timed_get(b, buf, 12, deadline, stamp)) return 0 ; + uint32_unpack_big(buf, &x) ; pwtmp.pw_uid = x ; + uint32_unpack_big(buf + 4, &x) ; pwtmp.pw_gid = x ; + uint32_unpack_big(buf + 8, &total) ; + if (!stralloc_readyplus(sa, total)) return 0 ; + if (!buffer_timed_get(b, sa->s + sa->len, total, deadline, stamp)) return 0 ; + if (sa->s[sa->len + total - 1]) return (errno = EPROTO, 0) ; + p = sa->s + sa->len ; len = total ; + pwtmp.pw_name = p ; x = strnlen(p, len) + 1 ; p += x ; len -= x ; + if (!len) return (errno = EPROTO, 0) ; + pwtmp.pw_passwd = p ; x = strnlen(p, len) + 1 ; p += x ; len -= x ; + if (!len) return (errno = EPROTO, 0) ; + pwtmp.pw_gecos = p ; x = strnlen(p, len) + 1 ; p += x ; len -= x ; + if (!len) return (errno = EPROTO, 0) ; + pwtmp.pw_dir = p ; x = strnlen(p, len) + 1 ; p += x ; len -= x ; + if (!len) return (errno = EPROTO, 0) ; + pwtmp.pw_shell = p ; x = strnlen(p, len) + 1 ; p += x ; len -= x ; + if (len) return (errno = EPROTO, 0) ; + sa->len += total ; + *pw = pwtmp ; + return 1 ; +} diff --git a/src/libnsss/nsss_switch_pwd_rewind.c b/src/libnsss/nsss_switch_pwd_rewind.c new file mode 100644 index 0000000..9920760 --- /dev/null +++ b/src/libnsss/nsss_switch_pwd_rewind.c @@ -0,0 +1,9 @@ +/* ISC license. */ + +#include +#include "nsss-switch-internal.h" + +int nsss_switch_pwd_rewind (nsss_switch_t *a, tain_t const *deadline, tain_t *stamp) +{ + return nsss_switch_op(a, NSSS_SWITCH_PWD_REWIND, deadline, stamp) ; +} diff --git a/src/libnsss/nsss_switch_setgrent.c b/src/libnsss/nsss_switch_setgrent.c new file mode 100644 index 0000000..a930568 --- /dev/null +++ b/src/libnsss/nsss_switch_setgrent.c @@ -0,0 +1,12 @@ +/* ISC license. */ + +#include +#include +#include +#include "nsss-switch-internal.h" + +void nsss_switch_setgrent (void) +{ + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_GRP, NSSS_NSSSD_PATH, 0, 0)) return ; + nsss_switch_grp_rewind(&nsss_switch_here, 0, 0) ; +} diff --git a/src/libnsss/nsss_switch_setpwent.c b/src/libnsss/nsss_switch_setpwent.c new file mode 100644 index 0000000..371423e --- /dev/null +++ b/src/libnsss/nsss_switch_setpwent.c @@ -0,0 +1,12 @@ +/* ISC license. */ + +#include +#include +#include +#include "nsss-switch-internal.h" + +void nsss_switch_setpwent (void) +{ + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_PWD, NSSS_NSSSD_PATH, 0, 0)) return ; + nsss_switch_pwd_rewind(&nsss_switch_here, 0, 0) ; +} diff --git a/src/libnsss/nsss_switch_setspent.c b/src/libnsss/nsss_switch_setspent.c new file mode 100644 index 0000000..5f5ed8a --- /dev/null +++ b/src/libnsss/nsss_switch_setspent.c @@ -0,0 +1,12 @@ +/* ISC license. */ + +#include +#include +#include +#include "nsss-switch-internal.h" + +void nsss_switch_setspent (void) +{ + if (!nsss_switch_start(&nsss_switch_here, NSSS_SWITCH_SHADOW, NSSS_NSSSD_PATH, 0, 0)) return ; + nsss_switch_shadow_rewind(&nsss_switch_here, 0, 0) ; +} diff --git a/src/libnsss/nsss_switch_shadow_end.c b/src/libnsss/nsss_switch_shadow_end.c new file mode 100644 index 0000000..eb3454d --- /dev/null +++ b/src/libnsss/nsss_switch_shadow_end.c @@ -0,0 +1,9 @@ +/* ISC license. */ + +#include +#include "nsss-switch-internal.h" + +int nsss_switch_shadow_end (nsss_switch_t *a, tain_t const *deadline, tain_t *stamp) +{ + return nsss_switch_op(a, NSSS_SWITCH_SHADOW_END, deadline, stamp) ; +} diff --git a/src/libnsss/nsss_switch_shadow_get.c b/src/libnsss/nsss_switch_shadow_get.c new file mode 100644 index 0000000..e510232 --- /dev/null +++ b/src/libnsss/nsss_switch_shadow_get.c @@ -0,0 +1,17 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include "nsss-switch-internal.h" + +int nsss_switch_shadow_get (nsss_switch_t *a, struct spwd *sp, stralloc *sa, tain_t const *deadline, tain_t *stamp) +{ + char c = NSSS_SWITCH_SHADOW_GET ; + if (!ipc_timed_send(buffer_fd(&a->b), &c, 1, deadline, stamp)) return 0 ; + if (!buffer_timed_get(&a->b, &c, 1, deadline, stamp)) return 0 ; + if ((unsigned char)c == 255) return 0 ; + if (c) return (errno = c, 0) ; + return nsss_switch_shadow_read(&a->b, sp, sa, deadline, stamp) ; +} diff --git a/src/libnsss/nsss_switch_shadow_getbyname.c b/src/libnsss/nsss_switch_shadow_getbyname.c new file mode 100644 index 0000000..33fa426 --- /dev/null +++ b/src/libnsss/nsss_switch_shadow_getbyname.c @@ -0,0 +1,24 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include +#include "nsss-switch-internal.h" + +int nsss_switch_shadow_getbyname (nsss_switch_t *a, struct spwd *sp, stralloc *sa, char const *name, tain_t const *deadline, tain_t *stamp) +{ + char buf[5] = { NSSS_SWITCH_SHADOW_GETBYNAME } ; + size_t len = strlen(name) ; + struct iovec v[2] = { { .iov_base = buf, .iov_len = 5 }, { .iov_base = (char *)name, .iov_len = len + 1 } } ; + if (len > NSSS_SWITCH_NAME_MAXLEN - 1) return (errno = EINVAL, 0) ; + uint32_pack_big(buf + 1, len + 1) ; + if (!ipc_timed_sendv(buffer_fd(&a->b), v, 2, deadline, stamp)) return 0 ; + if (!buffer_timed_get(&a->b, &buf[0], 1, deadline, stamp)) return 0 ; + if ((unsigned char)buf[0] == 255) return 0 ; + if (buf[0]) return (errno = buf[0], 0) ; + return nsss_switch_shadow_read(&a->b, sp, sa, deadline, stamp) ; +} diff --git a/src/libnsss/nsss_switch_shadow_read.c b/src/libnsss/nsss_switch_shadow_read.c new file mode 100644 index 0000000..1806c6d --- /dev/null +++ b/src/libnsss/nsss_switch_shadow_read.c @@ -0,0 +1,56 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "nsss-switch-internal.h" + +/* + Expects: + 8 bytes sp_lstchg + 8 bytes sp_min + 8 bytes sp_max + 8 bytes sp_warn + 8 bytes sp_inact + 8 bytes sp_expire + 8 bytes sp_flag + 4 bytes total length of strings (including \0's) + \0-terminated sp_namp + \0-terminated sp_pwdp +*/ + +int nsss_switch_shadow_read (buffer *b, struct spwd *sp, stralloc *sa, tain_t const *deadline, tain_t *stamp) +{ + struct spwd sptmp ; + uint64_t x ; + uint32_t total, len ; + char *p ; + char buf[60] ; + if (!buffer_timed_get(b, buf, 60, deadline, stamp)) return 0 ; + uint64_unpack_big(buf, &x) ; sptmp.sp_lstchg = x ; + uint64_unpack_big(buf + 8, &x) ; sptmp.sp_min = x ; + uint64_unpack_big(buf + 16, &x) ; sptmp.sp_max = x ; + uint64_unpack_big(buf + 24, &x) ; sptmp.sp_warn = x ; + uint64_unpack_big(buf + 32, &x) ; sptmp.sp_inact = x ; + uint64_unpack_big(buf + 40, &x) ; sptmp.sp_expire = x ; + uint64_unpack_big(buf + 48, &x) ; sptmp.sp_flag = x ; + uint32_unpack_big(buf + 56, &total) ; + if (!stralloc_readyplus(sa, total)) return 0 ; + if (!buffer_timed_get(b, sa->s + sa->len, total, deadline, stamp)) return 0 ; + if (sa->s[sa->len + total - 1]) return (errno = EPROTO, 0) ; + p = sa->s + sa->len ; len = total ; + sptmp.sp_namp = p ; x = strnlen(p, len) + 1 ; p += x ; len -= x ; + if (!len) return (errno = EPROTO, 0) ; + sptmp.sp_pwdp = p ; x = strnlen(p, len) + 1 ; p += x ; len -= x ; + if (len) return (errno = EPROTO, 0) ; + sa->len += total ; + *sp = sptmp ; + return 1 ; +} diff --git a/src/libnsss/nsss_switch_shadow_rewind.c b/src/libnsss/nsss_switch_shadow_rewind.c new file mode 100644 index 0000000..449f25c --- /dev/null +++ b/src/libnsss/nsss_switch_shadow_rewind.c @@ -0,0 +1,9 @@ +/* ISC license. */ + +#include +#include "nsss-switch-internal.h" + +int nsss_switch_shadow_rewind (nsss_switch_t *a, tain_t const *deadline, tain_t *stamp) +{ + return nsss_switch_op(a, NSSS_SWITCH_SHADOW_REWIND, deadline, stamp) ; +} diff --git a/src/libnsss/nsss_switch_start.c b/src/libnsss/nsss_switch_start.c new file mode 100644 index 0000000..5d7a183 --- /dev/null +++ b/src/libnsss/nsss_switch_start.c @@ -0,0 +1,26 @@ +/* ISC license. */ + +#include +#include +#include +#include + +static inline int nsss_switch_connect (nsss_switch_t *a, char const *path, tain_t const *deadline, tain_t *stamp) +{ + int fd = ipc_stream_nbcoe() ; + if (fd < 0) return 0 ; + if (!ipc_timed_connect(fd, path, deadline, stamp)) + { + fd_close(fd) ; + return 0 ; + } + buffer_init(&a->b, &buffer_read, fd, a->buf, NSSS_SWITCH_BUFSIZE) ; + return 1 ; +} + +int nsss_switch_start (nsss_switch_t *a, unsigned int what, char const *path, tain_t const *deadline, tain_t *stamp) +{ + if (!a->held && !nsss_switch_connect(a, path, deadline, stamp)) return 0 ; + a->held |= (1U << what) ; + return 1 ; +} diff --git a/src/libnsss/nsss_unix_end.c b/src/libnsss/nsss_unix_end.c new file mode 100644 index 0000000..1d6b867 --- /dev/null +++ b/src/libnsss/nsss_unix_end.c @@ -0,0 +1,11 @@ +/* ISC license. */ + +#include +#include +#include + +void nsss_unix_end (nsss_unix_t *a) +{ + fd_close(buffer_fd(&a->b)) ; + a->b.fd = -1 ; +} diff --git a/src/libnsss/nsss_unix_endgrent.c b/src/libnsss/nsss_unix_endgrent.c new file mode 100644 index 0000000..58c2422 --- /dev/null +++ b/src/libnsss/nsss_unix_endgrent.c @@ -0,0 +1,9 @@ +/* ISC license. */ + +#include +#include "nsss-unix-internal.h" + +void nsss_unix_endgrent (void) +{ + nsss_unix_grp_end(&nsss_unix_grp_here) ; +} diff --git a/src/libnsss/nsss_unix_endpwent.c b/src/libnsss/nsss_unix_endpwent.c new file mode 100644 index 0000000..c7d87af --- /dev/null +++ b/src/libnsss/nsss_unix_endpwent.c @@ -0,0 +1,9 @@ +/* ISC license. */ + +#include +#include "nsss-unix-internal.h" + +void nsss_unix_endpwent (void) +{ + nsss_unix_pwd_end(&nsss_unix_pwd_here) ; +} diff --git a/src/libnsss/nsss_unix_endspent.c b/src/libnsss/nsss_unix_endspent.c new file mode 100644 index 0000000..3e28e75 --- /dev/null +++ b/src/libnsss/nsss_unix_endspent.c @@ -0,0 +1,9 @@ +/* ISC license. */ + +#include +#include "nsss-unix-internal.h" + +void nsss_unix_endspent (void) +{ + nsss_unix_shadow_end(&nsss_unix_shadow_here) ; +} diff --git a/src/libnsss/nsss_unix_field.c b/src/libnsss/nsss_unix_field.c new file mode 100644 index 0000000..b77bb04 --- /dev/null +++ b/src/libnsss/nsss_unix_field.c @@ -0,0 +1,14 @@ +/* ISC license. */ + +#include +#include "nsss-unix-internal.h" + +int nsss_unix_field (char **field, char **s) +{ + char *p = strchr(*s, ':') ; + if (!p) return 0 ; + *p++ = 0 ; + *field = *s ; + *s = p ; + return 1 ; +} diff --git a/src/libnsss/nsss_unix_getgrent.c b/src/libnsss/nsss_unix_getgrent.c new file mode 100644 index 0000000..e531510 --- /dev/null +++ b/src/libnsss/nsss_unix_getgrent.c @@ -0,0 +1,16 @@ +/* ISC license. */ + +#include +#include +#include +#include "nsss-internal.h" +#include "nsss-unix-internal.h" + +struct group *nsss_unix_getgrent (void) +{ + if (!nsss_unix_grp_maybe_start(&nsss_unix_grp_here)) return 0 ; + nsss_grp_sa_here.len = 0 ; + genalloc_setlen(char *, &nsss_grp_ga_here, 0) ; + if (!nsss_unix_grp_get(&nsss_unix_grp_here, &nsss_grp_here, &nsss_grp_sa_here, &nsss_grp_ga_here)) return 0 ; + return &nsss_grp_here ; +} diff --git a/src/libnsss/nsss_unix_getgrent_r.c b/src/libnsss/nsss_unix_getgrent_r.c new file mode 100644 index 0000000..5ddc526 --- /dev/null +++ b/src/libnsss/nsss_unix_getgrent_r.c @@ -0,0 +1,35 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-internal.h" +#include "nsss-unix-internal.h" + +int nsss_unix_getgrent_r (struct group *gr, char *buf, size_t buflen, struct group **grp) +{ + struct group gr2 ; + stralloc sa = STRALLOC_ZERO ; + genalloc ga = GENALLOC_ZERO ; + int e ; + if (!nsss_unix_grp_maybe_start(&nsss_unix_grp_here)) return errno ; + e = errno ; + errno = 0 ; + if (!nsss_unix_grp_get(&nsss_unix_grp_here, &gr2, &sa, &ga)) + { + *grp = 0 ; + if (!errno) errno = ENOENT ; + return errno ; + } + if (!nsss_grp_copy(gr, buf, buflen, &gr2, sa.s, sa.len, genalloc_s(char *, &ga), genalloc_len(char *, &ga))) + { + stralloc_free(&sa) ; + *grp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *grp = gr ; + return (errno = e, 0) ; +} diff --git a/src/libnsss/nsss_unix_getgrgid.c b/src/libnsss/nsss_unix_getgrgid.c new file mode 100644 index 0000000..e6d8979 --- /dev/null +++ b/src/libnsss/nsss_unix_getgrgid.c @@ -0,0 +1,21 @@ +/* ISC license. */ + +#include +#include +#include +#include "nsss-internal.h" + +struct group *nsss_unix_getgrgid (gid_t gid) +{ + nsss_unix_t a = NSSS_UNIX_ZERO ; + if (!nsss_unix_grp_start(&a)) return 0 ; + nsss_grp_sa_here.len = 0 ; + genalloc_setlen(char *, &nsss_grp_ga_here, 0) ; + if (!nsss_unix_grp_getbygid(&a, &nsss_grp_here, &nsss_grp_sa_here, &nsss_grp_ga_here, gid)) + { + nsss_unix_grp_end(&a) ; + return 0 ; + } + nsss_unix_grp_end(&a) ; + return &nsss_grp_here ; +} diff --git a/src/libnsss/nsss_unix_getgrgid_r.c b/src/libnsss/nsss_unix_getgrgid_r.c new file mode 100644 index 0000000..5d3dbe5 --- /dev/null +++ b/src/libnsss/nsss_unix_getgrgid_r.c @@ -0,0 +1,35 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +int nsss_unix_getgrgid_r (gid_t gid, struct group *gr, char *buf, size_t buflen, struct group **grp) +{ + struct group gr2 ; + stralloc sa = STRALLOC_ZERO ; + genalloc ga = GENALLOC_ZERO ; + nsss_unix_t a = NSSS_UNIX_ZERO ; + int e = errno ; + if (!nsss_unix_grp_start(&a)) return errno ; + errno = 0 ; + if (!nsss_unix_grp_getbygid(&a, &gr2, &sa, &ga, gid)) + { + nsss_unix_grp_end(&a) ; + *grp = 0 ; + return errno ? errno : (errno = e, 0) ; + } + nsss_unix_grp_end(&a) ; + if (!nsss_grp_copy(gr, buf, buflen, &gr2, sa.s, sa.len, genalloc_s(char *, &ga), genalloc_len(char *, &ga))) + { + stralloc_free(&sa) ; + *grp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *grp = gr ; + return (errno = e, 0) ; +} diff --git a/src/libnsss/nsss_unix_getgrnam.c b/src/libnsss/nsss_unix_getgrnam.c new file mode 100644 index 0000000..ca9d9b9 --- /dev/null +++ b/src/libnsss/nsss_unix_getgrnam.c @@ -0,0 +1,21 @@ +/* ISC license. */ + +#include +#include +#include +#include "nsss-internal.h" + +struct group *nsss_unix_getgrnam (char const *name) +{ + nsss_unix_t a = NSSS_UNIX_ZERO ; + if (!nsss_unix_grp_start(&a)) return 0 ; + nsss_grp_sa_here.len = 0 ; + genalloc_setlen(char *, &nsss_grp_ga_here, 0) ; + if (!nsss_unix_grp_getbyname(&a, &nsss_grp_here, &nsss_grp_sa_here, &nsss_grp_ga_here, name)) + { + nsss_unix_grp_end(&a) ; + return 0 ; + } + nsss_unix_grp_end(&a) ; + return &nsss_grp_here ; +} diff --git a/src/libnsss/nsss_unix_getgrnam_r.c b/src/libnsss/nsss_unix_getgrnam_r.c new file mode 100644 index 0000000..bc63d78 --- /dev/null +++ b/src/libnsss/nsss_unix_getgrnam_r.c @@ -0,0 +1,35 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-internal.h" + +int nsss_unix_getgrnam_r (char const *name, struct group *gr, char *buf, size_t buflen, struct group **grp) +{ + struct group gr2 ; + stralloc sa = STRALLOC_ZERO ; + genalloc ga = GENALLOC_ZERO ; + nsss_unix_t a = NSSS_UNIX_ZERO ; + int e = errno ; + if (!nsss_unix_grp_start(&a)) return errno ; + errno = 0 ; + if (!nsss_unix_grp_getbyname(&a, &gr2, &sa, &ga, name)) + { + nsss_unix_grp_end(&a) ; + *grp = 0 ; + return errno ? errno : (errno = e, 0) ; + } + nsss_unix_grp_end(&a) ; + if (!nsss_grp_copy(gr, buf, buflen, &gr2, sa.s, sa.len, genalloc_s(char *, &ga), genalloc_len(char *, &ga))) + { + stralloc_free(&sa) ; + *grp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *grp = gr ; + return (errno = e, 0) ; +} diff --git a/src/libnsss/nsss_unix_getpwent.c b/src/libnsss/nsss_unix_getpwent.c new file mode 100644 index 0000000..4271f0b --- /dev/null +++ b/src/libnsss/nsss_unix_getpwent.c @@ -0,0 +1,14 @@ +/* ISC license. */ + +#include +#include +#include "nsss-internal.h" +#include "nsss-unix-internal.h" + +struct passwd *nsss_unix_getpwent (void) +{ + if (!nsss_unix_pwd_maybe_start(&nsss_unix_pwd_here)) return 0 ; + nsss_pwd_sa_here.len = 0 ; + if (!nsss_unix_pwd_get(&nsss_unix_pwd_here, &nsss_pwd_here, &nsss_pwd_sa_here)) return 0 ; + return &nsss_pwd_here ; +} diff --git a/src/libnsss/nsss_unix_getpwent_r.c b/src/libnsss/nsss_unix_getpwent_r.c new file mode 100644 index 0000000..183bfd7 --- /dev/null +++ b/src/libnsss/nsss_unix_getpwent_r.c @@ -0,0 +1,33 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include "nsss-internal.h" +#include "nsss-unix-internal.h" + +int nsss_unix_getpwent_r (struct passwd *pw, char *buf, size_t buflen, struct passwd **pwp) +{ + struct passwd pw2 ; + stralloc sa = STRALLOC_ZERO ; + int e ; + if (!nsss_unix_pwd_maybe_start(&nsss_unix_pwd_here)) return errno ; + e = errno ; + errno = 0 ; + if (!nsss_unix_pwd_get(&nsss_unix_pwd_here, &pw2, &sa)) + { + *pwp = 0 ; + if (!errno) errno = ENOENT ; + return errno ; + } + if (!nsss_pwd_copy(pw, buf, buflen, &pw2, sa.s, sa.len)) + { + stralloc_free(&sa) ; + *pwp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *pwp = pw ; + return (errno = e, 0) ; +} diff --git a/src/libnsss/nsss_unix_getpwnam.c b/src/libnsss/nsss_unix_getpwnam.c new file mode 100644 index 0000000..eb5d6b1 --- /dev/null +++ b/src/libnsss/nsss_unix_getpwnam.c @@ -0,0 +1,19 @@ +/* ISC license. */ + +#include +#include +#include "nsss-internal.h" + +struct passwd *nsss_unix_getpwnam (char const *name) +{ + nsss_unix_t a = NSSS_UNIX_ZERO ; + if (!nsss_unix_pwd_start(&a)) return 0 ; + nsss_pwd_sa_here.len = 0 ; + if (!nsss_unix_pwd_getbyname(&a, &nsss_pwd_here, &nsss_pwd_sa_here, name)) + { + nsss_unix_pwd_end(&a) ; + return 0 ; + } + nsss_unix_pwd_end(&a) ; + return &nsss_pwd_here ; +} diff --git a/src/libnsss/nsss_unix_getpwnam_r.c b/src/libnsss/nsss_unix_getpwnam_r.c new file mode 100644 index 0000000..b41ce70 --- /dev/null +++ b/src/libnsss/nsss_unix_getpwnam_r.c @@ -0,0 +1,33 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include "nsss-internal.h" + +int nsss_unix_getpwnam_r (char const *name, struct passwd *pw, char *buf, size_t buflen, struct passwd **pwp) +{ + struct passwd pw2 ; + stralloc sa = STRALLOC_ZERO ; + nsss_unix_t a = NSSS_UNIX_ZERO ; + int e = errno ; + if (!nsss_unix_pwd_start(&a)) return errno ; + errno = 0 ; + if (!nsss_unix_pwd_getbyname(&a, &pw2, &sa, name)) + { + nsss_unix_pwd_end(&a) ; + *pwp = 0 ; + return errno ? errno : (errno = e, 0) ; + } + nsss_unix_pwd_end(&a) ; + if (!nsss_pwd_copy(pw, buf, buflen, &pw2, sa.s, sa.len)) + { + stralloc_free(&sa) ; + *pwp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *pwp = pw ; + return (errno = e, 0) ; +} diff --git a/src/libnsss/nsss_unix_getpwuid.c b/src/libnsss/nsss_unix_getpwuid.c new file mode 100644 index 0000000..35f019d --- /dev/null +++ b/src/libnsss/nsss_unix_getpwuid.c @@ -0,0 +1,19 @@ +/* ISC license. */ + +#include +#include +#include "nsss-internal.h" + +struct passwd *nsss_unix_getpwuid (uid_t uid) +{ + nsss_unix_t a = NSSS_UNIX_ZERO ; + if (!nsss_unix_pwd_start(&a)) return 0 ; + nsss_pwd_sa_here.len = 0 ; + if (!nsss_unix_pwd_getbyuid(&a, &nsss_pwd_here, &nsss_pwd_sa_here, uid)) + { + nsss_unix_pwd_end(&a) ; + return 0 ; + } + nsss_unix_pwd_end(&a) ; + return &nsss_pwd_here ; +} diff --git a/src/libnsss/nsss_unix_getpwuid_r.c b/src/libnsss/nsss_unix_getpwuid_r.c new file mode 100644 index 0000000..0601008 --- /dev/null +++ b/src/libnsss/nsss_unix_getpwuid_r.c @@ -0,0 +1,33 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include "nsss-internal.h" + +int nsss_unix_getpwuid_r (uid_t uid, struct passwd *pw, char *buf, size_t buflen, struct passwd **pwp) +{ + struct passwd pw2 ; + stralloc sa = STRALLOC_ZERO ; + nsss_unix_t a = NSSS_UNIX_ZERO ; + int e = errno ; + if (!nsss_unix_pwd_start(&a)) return errno ; + errno = 0 ; + if (!nsss_unix_pwd_getbyuid(&a, &pw2, &sa, uid)) + { + nsss_unix_pwd_end(&a) ; + *pwp = 0 ; + return errno ? errno : (errno = e, 0) ; + } + nsss_unix_pwd_end(&a) ; + if (!nsss_pwd_copy(pw, buf, buflen, &pw2, sa.s, sa.len)) + { + stralloc_free(&sa) ; + *pwp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *pwp = pw ; + return (errno = e, 0) ; +} diff --git a/src/libnsss/nsss_unix_getspent.c b/src/libnsss/nsss_unix_getspent.c new file mode 100644 index 0000000..f442a40 --- /dev/null +++ b/src/libnsss/nsss_unix_getspent.c @@ -0,0 +1,14 @@ +/* ISC license. */ + +#include +#include +#include "nsss-internal.h" +#include "nsss-unix-internal.h" + +struct spwd *nsss_unix_getspent (void) +{ + if (!nsss_unix_shadow_maybe_start(&nsss_unix_shadow_here)) return 0 ; + nsss_shadow_sa_here.len = 0 ; + if (!nsss_unix_shadow_get(&nsss_unix_shadow_here, &nsss_shadow_here, &nsss_shadow_sa_here)) return 0 ; + return &nsss_shadow_here ; +} diff --git a/src/libnsss/nsss_unix_getspent_r.c b/src/libnsss/nsss_unix_getspent_r.c new file mode 100644 index 0000000..6ae4f8a --- /dev/null +++ b/src/libnsss/nsss_unix_getspent_r.c @@ -0,0 +1,33 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include "nsss-internal.h" +#include "nsss-unix-internal.h" + +int nsss_unix_getspent_r (struct spwd *sp, char *buf, size_t buflen, struct spwd **spp) +{ + struct spwd sp2 ; + stralloc sa = STRALLOC_ZERO ; + int e ; + if (!nsss_unix_shadow_maybe_start(&nsss_unix_shadow_here)) return errno ; + e = errno ; + errno = 0 ; + if (!nsss_unix_shadow_get(&nsss_unix_shadow_here, &sp2, &sa)) + { + *spp = 0 ; + if (!errno) errno = ENOENT ; + return errno ; + } + if (!nsss_shadow_copy(sp, buf, buflen, &sp2, sa.s, sa.len)) + { + stralloc_free(&sa) ; + *spp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *spp = sp ; + return (errno = e, 0) ; +} diff --git a/src/libnsss/nsss_unix_getspnam.c b/src/libnsss/nsss_unix_getspnam.c new file mode 100644 index 0000000..810d45f --- /dev/null +++ b/src/libnsss/nsss_unix_getspnam.c @@ -0,0 +1,19 @@ +/* ISC license. */ + +#include +#include +#include "nsss-internal.h" + +struct spwd *nsss_unix_getspnam (char const *name) +{ + nsss_unix_t a = NSSS_UNIX_ZERO ; + if (!nsss_unix_shadow_start(&a)) return 0 ; + nsss_shadow_sa_here.len = 0 ; + if (!nsss_unix_shadow_getbyname(&a, &nsss_shadow_here, &nsss_shadow_sa_here, name)) + { + nsss_unix_shadow_end(&a) ; + return 0 ; + } + nsss_unix_shadow_end(&a) ; + return &nsss_shadow_here ; +} diff --git a/src/libnsss/nsss_unix_getspnam_r.c b/src/libnsss/nsss_unix_getspnam_r.c new file mode 100644 index 0000000..f0bfed4 --- /dev/null +++ b/src/libnsss/nsss_unix_getspnam_r.c @@ -0,0 +1,33 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include "nsss-internal.h" + +int nsss_unix_getspnam_r (char const *name, struct spwd *sp, char *buf, size_t buflen, struct spwd **spp) +{ + struct spwd sp2 ; + stralloc sa = STRALLOC_ZERO ; + nsss_unix_t a = NSSS_UNIX_ZERO ; + int e = errno ; + if (!nsss_unix_shadow_start(&a)) return errno ; + errno = 0 ; + if (!nsss_unix_shadow_getbyname(&a, &sp2, &sa, name)) + { + nsss_unix_shadow_end(&a) ; + *spp = 0 ; + return errno ? errno : (errno = e, 0) ; + } + nsss_unix_shadow_end(&a) ; + if (!nsss_shadow_copy(sp, buf, buflen, &sp2, sa.s, sa.len)) + { + stralloc_free(&sa) ; + *spp = 0 ; + return errno ; + } + stralloc_free(&sa) ; + *spp = sp ; + return (errno = e, 0) ; +} diff --git a/src/libnsss/nsss_unix_grp_get.c b/src/libnsss/nsss_unix_grp_get.c new file mode 100644 index 0000000..f7984a4 --- /dev/null +++ b/src/libnsss/nsss_unix_grp_get.c @@ -0,0 +1,62 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include +#include "nsss-unix-internal.h" + +static inline char **grp_parsemem (char *s, genalloc *ga) +{ + char **grmem ; + char **p ; + size_t n = 0 ; + for (char *t = s ; *t ; t++) if (*t == ',') { n++ ; *t = 0 ; } ; + if (*s) n++ ; + if (!genalloc_readyplus(char *, ga, n+1)) return 0 ; + p = genalloc_s(char *, ga) + genalloc_len(char *, ga) ; + grmem = p ; + for (size_t i = 0 ; i < n ; i++) { *p++ = s ; s += strlen(s) + 1 ; } + *p++ = 0 ; + genalloc_setlen(char *, ga, genalloc_len(char *, ga) + n+1) ; + return grmem ; +} + +static inline int grp_parseline (struct group *gr, char *s, size_t max, genalloc *ga) +{ + struct group gr2 ; + char *p ; + s[max-1] = 0 ; + if (!nsss_unix_field(&gr2.gr_name, &s)) return 0 ; + if (!nsss_unix_field(&gr2.gr_passwd, &s)) return 0 ; + if (!nsss_unix_field(&p, &s)) return 0 ; + if (!gid0_scan(p, &gr2.gr_gid)) return 0 ; + gr2.gr_mem = grp_parsemem(s, ga) ; + if (!gr2.gr_mem) return 0 ; + *gr = gr2 ; + return 1 ; +} + +int nsss_unix_grp_get (nsss_unix_t *a, struct group *gr, stralloc *sa, genalloc *ga) +{ + int cs ; + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs) ; + for (;;) + { + size_t sabase = sa->len ; + size_t gabase = genalloc_len(char *, ga) ; + if (skagetln_loose(&a->b, sa, '\n') <= 0) goto err ; + if (grp_parseline(gr, sa->s + sabase, sa->len - sabase, ga)) break ; + sa->len = sabase ; + genalloc_setlen(char *, ga, gabase) ; + } + pthread_setcancelstate(cs, 0) ; + return 1 ; + + err: + pthread_setcancelstate(cs, 0) ; + return 0 ; +} diff --git a/src/libnsss/nsss_unix_grp_getbygid.c b/src/libnsss/nsss_unix_grp_getbygid.c new file mode 100644 index 0000000..48cfecf --- /dev/null +++ b/src/libnsss/nsss_unix_grp_getbygid.c @@ -0,0 +1,22 @@ +/* ISC license. */ + +#include +#include +#include +#include + +int nsss_unix_grp_getbygid (nsss_unix_t *a, struct group *gr, stralloc *sa, genalloc *ga, gid_t gid) +{ + struct group gr2 ; + for (;;) + { + size_t sabase = sa->len ; + size_t gabase = genalloc_len(char *, ga) ; + if (!nsss_unix_grp_get(a, &gr2, sa, ga)) return 0 ; + if (gid == gr2.gr_gid) break ; + sa->len = sabase ; + genalloc_setlen(char *, ga, gabase) ; + } + *gr = gr2 ; + return 1 ; +} diff --git a/src/libnsss/nsss_unix_grp_getbyname.c b/src/libnsss/nsss_unix_grp_getbyname.c new file mode 100644 index 0000000..0b8e3b8 --- /dev/null +++ b/src/libnsss/nsss_unix_grp_getbyname.c @@ -0,0 +1,22 @@ +/* ISC license. */ + +#include +#include +#include +#include + +int nsss_unix_grp_getbyname (nsss_unix_t *a, struct group *gr, stralloc *sa, genalloc *ga, char const *name) +{ + struct group gr2 ; + for (;;) + { + size_t sabase = sa->len ; + size_t gabase = genalloc_len(char *, ga) ; + if (!nsss_unix_grp_get(a, &gr2, sa, ga)) return 0 ; + if (!strcmp(name, gr2.gr_name)) break ; + sa->len = sabase ; + genalloc_setlen(char *, ga, gabase) ; + } + *gr = gr2 ; + return 1 ; +} diff --git a/src/libnsss/nsss_unix_grp_here.c b/src/libnsss/nsss_unix_grp_here.c new file mode 100644 index 0000000..b2adfe9 --- /dev/null +++ b/src/libnsss/nsss_unix_grp_here.c @@ -0,0 +1,5 @@ +/* ISC license. */ + +#include "nsss-unix-internal.h" + +nsss_unix_t nsss_unix_grp_here = NSSS_UNIX_ZERO ; diff --git a/src/libnsss/nsss_unix_maybe_start.c b/src/libnsss/nsss_unix_maybe_start.c new file mode 100644 index 0000000..9aad8d4 --- /dev/null +++ b/src/libnsss/nsss_unix_maybe_start.c @@ -0,0 +1,9 @@ +/* ISC license. */ + +#include +#include + +int nsss_unix_maybe_start (nsss_unix_t *a, char const *path) +{ + return buffer_fd(&a->b) >= 0 || nsss_unix_start(a, path) ; +} diff --git a/src/libnsss/nsss_unix_pwd_get.c b/src/libnsss/nsss_unix_pwd_get.c new file mode 100644 index 0000000..b0c1200 --- /dev/null +++ b/src/libnsss/nsss_unix_pwd_get.c @@ -0,0 +1,45 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-unix-internal.h" + +static inline int pwd_parseline (struct passwd *pw, char *s, size_t max) +{ + struct passwd pw2 ; + char *p ; + s[max-1] = 0 ; + if (!nsss_unix_field(&pw2.pw_name, &s)) return 0 ; + if (!nsss_unix_field(&pw2.pw_passwd, &s)) return 0 ; + if (!nsss_unix_field(&p, &s)) return 0 ; + if (!uid0_scan(p, &pw2.pw_uid)) return 0 ; + if (!nsss_unix_field(&p, &s)) return 0 ; + if (!gid0_scan(p, &pw2.pw_gid)) return 0 ; + if (!nsss_unix_field(&pw2.pw_gecos, &s)) return 0 ; + if (!nsss_unix_field(&pw2.pw_dir, &s)) return 0 ; + pw2.pw_shell = s ; + *pw = pw2 ; + return 1 ; +} + +int nsss_unix_pwd_get (nsss_unix_t *a, struct passwd *pw, stralloc *sa) +{ + int cs ; + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs) ; + for (;;) + { + size_t base = sa->len ; + if (skagetln_loose(&a->b, sa, '\n') <= 0) goto err ; + if (pwd_parseline(pw, sa->s + base, sa->len - base)) break ; + sa->len = base ; + } + pthread_setcancelstate(cs, 0) ; + return 1 ; + + err: + pthread_setcancelstate(cs, 0) ; + return 0 ; +} diff --git a/src/libnsss/nsss_unix_pwd_getbyname.c b/src/libnsss/nsss_unix_pwd_getbyname.c new file mode 100644 index 0000000..4d60e8c --- /dev/null +++ b/src/libnsss/nsss_unix_pwd_getbyname.c @@ -0,0 +1,19 @@ +/* ISC license. */ + +#include +#include +#include + +int nsss_unix_pwd_getbyname (nsss_unix_t *a, struct passwd *pw, stralloc *sa, char const *name) +{ + struct passwd pw2 ; + for (;;) + { + size_t base = sa->len ; + if (!nsss_unix_pwd_get(a, &pw2, sa)) return 0 ; + if (!strcmp(name, pw2.pw_name)) break ; + sa->len = base ; + } + *pw = pw2 ; + return 1 ; +} diff --git a/src/libnsss/nsss_unix_pwd_getbyuid.c b/src/libnsss/nsss_unix_pwd_getbyuid.c new file mode 100644 index 0000000..4964cdd --- /dev/null +++ b/src/libnsss/nsss_unix_pwd_getbyuid.c @@ -0,0 +1,19 @@ +/* ISC license. */ + +#include +#include +#include + +int nsss_unix_pwd_getbyuid (nsss_unix_t *a, struct passwd *pw, stralloc *sa, uid_t uid) +{ + struct passwd pw2 ; + for (;;) + { + size_t base = sa->len ; + if (!nsss_unix_pwd_get(a, &pw2, sa)) return 0 ; + if (uid == pw2.pw_uid) break ; + sa->len = base ; + } + *pw = pw2 ; + return 1 ; +} diff --git a/src/libnsss/nsss_unix_pwd_here.c b/src/libnsss/nsss_unix_pwd_here.c new file mode 100644 index 0000000..33aa911 --- /dev/null +++ b/src/libnsss/nsss_unix_pwd_here.c @@ -0,0 +1,5 @@ +/* ISC license. */ + +#include "nsss-unix-internal.h" + +nsss_unix_t nsss_unix_pwd_here = NSSS_UNIX_ZERO ; diff --git a/src/libnsss/nsss_unix_rewind.c b/src/libnsss/nsss_unix_rewind.c new file mode 100644 index 0000000..2b8c6b3 --- /dev/null +++ b/src/libnsss/nsss_unix_rewind.c @@ -0,0 +1,13 @@ +/* ISC license. */ + +#include +#include +#include + +int nsss_unix_rewind (nsss_unix_t *a) +{ + int fd = buffer_fd(&a->b) ; + if (lseek(fd, 0, SEEK_SET) < 0) return 0 ; + buffer_init(&a->b, &buffer_read, fd, a->buf, NSSS_UNIX_BUFSIZE) ; + return 1 ; +} diff --git a/src/libnsss/nsss_unix_setgrent.c b/src/libnsss/nsss_unix_setgrent.c new file mode 100644 index 0000000..e01744f --- /dev/null +++ b/src/libnsss/nsss_unix_setgrent.c @@ -0,0 +1,11 @@ +/* ISC license. */ + +#include +#include +#include "nsss-unix-internal.h" + +void nsss_unix_setgrent (void) +{ + if (!nsss_unix_grp_maybe_start(&nsss_unix_grp_here)) return ; + nsss_unix_grp_rewind(&nsss_unix_grp_here) ; +} diff --git a/src/libnsss/nsss_unix_setpwent.c b/src/libnsss/nsss_unix_setpwent.c new file mode 100644 index 0000000..666680b --- /dev/null +++ b/src/libnsss/nsss_unix_setpwent.c @@ -0,0 +1,11 @@ +/* ISC license. */ + +#include +#include +#include "nsss-unix-internal.h" + +void nsss_unix_setpwent (void) +{ + if (!nsss_unix_pwd_maybe_start(&nsss_unix_pwd_here)) return ; + nsss_unix_pwd_rewind(&nsss_unix_pwd_here) ; +} diff --git a/src/libnsss/nsss_unix_setspent.c b/src/libnsss/nsss_unix_setspent.c new file mode 100644 index 0000000..2b38e8d --- /dev/null +++ b/src/libnsss/nsss_unix_setspent.c @@ -0,0 +1,11 @@ +/* ISC license. */ + +#include +#include +#include "nsss-unix-internal.h" + +void nsss_unix_setspent (void) +{ + if (!nsss_unix_shadow_maybe_start(&nsss_unix_shadow_here)) return ; + nsss_unix_shadow_rewind(&nsss_unix_shadow_here) ; +} diff --git a/src/libnsss/nsss_unix_shadow_get.c b/src/libnsss/nsss_unix_shadow_get.c new file mode 100644 index 0000000..0d87088 --- /dev/null +++ b/src/libnsss/nsss_unix_shadow_get.c @@ -0,0 +1,52 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include "nsss-unix-internal.h" + +static inline int shadow_parseline (struct spwd *sp, char *s, size_t max) +{ + struct spwd sp2 ; + char *p ; + s[max-1] = 0 ; + if (!nsss_unix_field(&sp2.sp_namp, &s)) return 0 ; + if (!nsss_unix_field(&sp2.sp_pwdp, &s)) return 0 ; + if (!nsss_unix_field(&p, &s)) return 0 ; + if (!ulong0_scan(p, (unsigned long *)&sp2.sp_lstchg)) return 0 ; + if (!nsss_unix_field(&p, &s)) return 0 ; + if (!ulong0_scan(p, (unsigned long *)&sp2.sp_min)) return 0 ; + if (!nsss_unix_field(&p, &s)) return 0 ; + if (!ulong0_scan(p, (unsigned long *)&sp2.sp_max)) return 0 ; + if (!nsss_unix_field(&p, &s)) return 0 ; + if (!ulong0_scan(p, (unsigned long *)&sp2.sp_warn)) return 0 ; + if (!nsss_unix_field(&p, &s)) return 0 ; + if (!ulong0_scan(p, (unsigned long *)&sp2.sp_inact)) return 0 ; + if (!nsss_unix_field(&p, &s)) return 0 ; + if (!ulong0_scan(p, (unsigned long *)&sp2.sp_expire)) return 0 ; + if (!nsss_unix_field(&p, &s)) return 0 ; + if (!ulong0_scan(p, &sp2.sp_flag)) return 0 ; + *sp = sp2 ; + return 1 ; +} + +int nsss_unix_shadow_get (nsss_unix_t *a, struct spwd *sp, stralloc *sa) +{ + int cs ; + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs) ; + for (;;) + { + size_t base = sa->len ; + if (skagetln_loose(&a->b, sa, '\n') <= 0) goto err ; + if (shadow_parseline(sp, sa->s + base, sa->len - base)) break ; + sa->len = base ; + } + pthread_setcancelstate(cs, 0) ; + return 1 ; + + err: + pthread_setcancelstate(cs, 0) ; + return 0 ; +} diff --git a/src/libnsss/nsss_unix_shadow_getbyname.c b/src/libnsss/nsss_unix_shadow_getbyname.c new file mode 100644 index 0000000..154e5ec --- /dev/null +++ b/src/libnsss/nsss_unix_shadow_getbyname.c @@ -0,0 +1,19 @@ +/* ISC license. */ + +#include +#include +#include + +int nsss_unix_shadow_getbyname (nsss_unix_t *a, struct spwd *sp, stralloc *sa, char const *name) +{ + struct spwd sp2 ; + for (;;) + { + size_t base = sa->len ; + if (!nsss_unix_shadow_get(a, &sp2, sa)) return 0 ; + if (!strcmp(name, sp2.sp_namp)) break ; + sa->len = base ; + } + *sp = sp2 ; + return 1 ; +} diff --git a/src/libnsss/nsss_unix_shadow_here.c b/src/libnsss/nsss_unix_shadow_here.c new file mode 100644 index 0000000..2f500f4 --- /dev/null +++ b/src/libnsss/nsss_unix_shadow_here.c @@ -0,0 +1,5 @@ +/* ISC license. */ + +#include "nsss-unix-internal.h" + +nsss_unix_t nsss_unix_shadow_here = NSSS_UNIX_ZERO ; diff --git a/src/libnsss/nsss_unix_start.c b/src/libnsss/nsss_unix_start.c new file mode 100644 index 0000000..1f6c5df --- /dev/null +++ b/src/libnsss/nsss_unix_start.c @@ -0,0 +1,13 @@ +/* ISC license. */ + +#include +#include +#include + +int nsss_unix_start (nsss_unix_t *a, char const *path) +{ + int fd = open_readb(path) ; + if (fd < 0) return 0 ; + buffer_init(&a->b, &buffer_read, fd, a->buf, NSSS_UNIX_BUFSIZE) ; + return 1 ; +} diff --git a/src/nsssd/deps-exe/nsssd-nslcd b/src/nsssd/deps-exe/nsssd-nslcd new file mode 100644 index 0000000..8a77503 --- /dev/null +++ b/src/nsssd/deps-exe/nsssd-nslcd @@ -0,0 +1,2 @@ +${LIBNSSSD} +-lskarnet diff --git a/src/nsssd/deps-exe/nsssd-unix b/src/nsssd/deps-exe/nsssd-unix new file mode 100644 index 0000000..deff087 --- /dev/null +++ b/src/nsssd/deps-exe/nsssd-unix @@ -0,0 +1,3 @@ +${LIBNSSS} +${LIBNSSSD} +-lskarnet diff --git a/src/nsssd/deps-lib/nsssd b/src/nsssd/deps-lib/nsssd new file mode 100644 index 0000000..7b2e85b --- /dev/null +++ b/src/nsssd/deps-lib/nsssd @@ -0,0 +1,3 @@ +nsssd_main.o +nsssd_convert.o +-lskarnet diff --git a/src/nsssd/nsssd-nslcd.c b/src/nsssd/nsssd-nslcd.c new file mode 100644 index 0000000..dd8fdce --- /dev/null +++ b/src/nsssd/nsssd-nslcd.c @@ -0,0 +1,583 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "nsssd-nslcd.h" + +#define USAGE "nsssd-nslcd [ -t timeout ] path-to-nslcd-socket" +#define dieusage() strerr_dieusage(100, USAGE) + +typedef struct nslcd_handle_s nslcd_handle_t, *nslcd_handle_t_ref ; +struct nslcd_handle_s +{ + char const *socketpath ; + genalloc entries[3] ; /* nsss_passwd_t, nsss_group_t, nsss_spwd_t */ + stralloc data[3] ; + size_t head[3] ; + genalloc grmemc ; /* size_t */ + genalloc grmem ; /* char * */ + size_t grhead ; + unsigned int needdata ; +} ; +#define NSLCD_HANDLE_ZERO \ +{ \ + .socketpath = 0, \ + .entries = { GENALLOC_ZERO, GENALLOC_ZERO, GENALLOC_ZERO }, \ + .data = { STRALLOC_ZERO, STRALLOC_ZERO, STRALLOC_ZERO }, \ + .head = { 0, 0, 0 }, \ + .grmemc = GENALLOC_ZERO, \ + .grmem = GENALLOC_ZERO, \ + .grhead = 0, \ + .needdata = 0 \ +} + +static tain_t tto = TAIN_INFINITE_RELATIVE ; + +void *nsssd_handle_init (void) +{ + static nslcd_handle_t a = NSLCD_HANDLE_ZERO ; + return &a ; +} + +int nsssd_handle_start (void *handle, char const *const *argv, char const *const *envp) +{ + nslcd_handle_t *a = handle ; + if (!argv[0]) strerr_dieusage(100, USAGE) ; + a->socketpath = argv[0] ; + return 1 ; +} + +void nsssd_handle_end (void *handle) +{ + static const nslcd_handle_t nslcd_handle_zero = NSLCD_HANDLE_ZERO ; + nslcd_handle_t *a = handle ; + genalloc_free(nsssd_passwd_t, &a->entries[0]) ; + genalloc_free(nsssd_group_t, &a->entries[1]) ; + genalloc_free(nsssd_spwd_t, &a->entries[2]) ; + stralloc_free(&a->data[0]) ; + stralloc_free(&a->data[1]) ; + stralloc_free(&a->data[2]) ; + genalloc_free(size_t, &a->grmemc) ; + genalloc_free(char *, &a->grmem) ; + *a = nslcd_handle_zero ; +} + +static int read_uint32 (buffer *b, uint32_t *x, tain_t const *deadline) +{ + char pack[4] ; + if (buffer_timed_get_g(b, pack, 4, deadline) < 4) return 0 ; + uint32_unpack_big(pack, x) ; + return 1 ; +} + +static int read_string (buffer *b, size_t *value, stralloc *sa, tain_t const *deadline) +{ + uint32_t len ; + if (!read_uint32(b, &len, deadline)) return 0 ; + if (!stralloc_readyplus(sa, len+1)) return 0 ; + if (buffer_timed_get_g(b, sa->s + sa->len, len, deadline) < len) return 0 ; + *value = sa->len ; + sa->len += len ; + sa->s[sa->len++] = 0 ; + return 1 ; +} + +static inline int read_stringlist (buffer *b, size_t *head, size_t *n, stralloc *sa, genalloc *ga, tain_t const *deadline) +{ + uint32_t i ; + size_t *p ; + if (!read_uint32(b, &i, deadline)) return 0 ; + if (!genalloc_readyplus(size_t, ga, i)) return 0 ; + *head = genalloc_len(size_t, ga) ; + p = genalloc_s(size_t, ga) + *head ; + *n = i ; + while (i--) if (!read_string(b, p++, sa, deadline)) return 0 ; + return 1 ; +} + +static inline int read_header (buffer *b, uint32_t action, tain_t const *deadline) +{ + uint32_t x ; + char pack[8] ; + if (buffer_timed_get_g(b, pack, 8, deadline) < 8) return 0 ; + uint32_unpack_big(pack, &x) ; + if (x != NSLCD_VERSION) return (errno = EPROTO, 0) ; + uint32_unpack_big(pack+4, &x) ; + if (x != action) return (errno = EPROTO, 0) ; + return 1 ; +} + +static int read_beginend (buffer *b, tain_t const *deadline) +{ + uint32_t x ; + if (!read_uint32(b, &x, deadline)) return -1 ; + switch (x) + { + case NSLCD_RESULT_BEGIN : return 1 ; + case NSLCD_RESULT_END : return 0 ; + default : return (errno = EPROTO, -1) ; + } +} + +static int read_eof (buffer *b, tain_t const *deadline) +{ + char c ; + ssize_t r = buffer_timed_get_g(b, &c, 1, deadline) ; + if (r < 0) return 0 ; + if (r) return (errno = EPROTO, 0) ; + return 1 ; +} + +static int read_endeof(buffer *b, tain_t const *deadline) +{ + int r = read_beginend(b, deadline) ; + if (r < 0) return 0 ; + if (r) return (errno = EPROTO, 0) ; + return read_eof(b, deadline) ; +} + +static int read_pw (buffer *b, nsssd_passwd_t *pw, stralloc *sa, tain_t const *deadline) +{ + uint32_t x ; + if (!read_string(b, &pw->pw_name, sa, deadline)) return 0 ; + if (!read_string(b, &pw->pw_passwd, sa, deadline)) return 0 ; + if (!read_uint32(b, &x, deadline)) return 0 ; + pw->pw_uid = x ; + if (!read_uint32(b, &x, deadline)) return 0 ; + pw->pw_gid = x ; + if (!read_string(b, &pw->pw_gecos, sa, deadline)) return 0 ; + if (!read_string(b, &pw->pw_dir, sa, deadline)) return 0 ; + if (!read_string(b, &pw->pw_shell, sa, deadline)) return 0 ; + return 1 ; +} + +static int read_gr (buffer *b, nsssd_group_t *gr, stralloc *sa, genalloc *ga, tain_t const *deadline) +{ + uint32_t x ; + if (!read_string(b, &gr->gr_name, sa, deadline)) return 0 ; + if (!read_string(b, &gr->gr_passwd, sa, deadline)) return 0 ; + if (!read_uint32(b, &x, deadline)) return 0 ; + gr->gr_gid = x ; + if (!read_stringlist(b, &gr->gr_mem, &gr->gr_mem_n, sa, ga, deadline)) return 0 ; + return 1 ; +} + +static int read_sp (buffer *b, nsssd_spwd_t *sp, stralloc *sa, tain_t const *deadline) +{ + uint32_t x ; + if (!read_string(b, &sp->sp_namp, sa, deadline)) return 0 ; + if (!read_string(b, &sp->sp_pwdp, sa, deadline)) return 0 ; + if (!read_uint32(b, &x, deadline)) return 0 ; + sp->sp_lstchg = x ; + if (!read_uint32(b, &x, deadline)) return 0 ; + sp->sp_min = x ; + if (!read_uint32(b, &x, deadline)) return 0 ; + sp->sp_max = x ; + if (!read_uint32(b, &x, deadline)) return 0 ; + sp->sp_warn = x ; + if (!read_uint32(b, &x, deadline)) return 0 ; + sp->sp_inact = x ; + if (!read_uint32(b, &x, deadline)) return 0 ; + sp->sp_expire = x ; + if (!read_uint32(b, &x, deadline)) return 0 ; + sp->sp_flag = x ; + return 1 ; +} + +static int nslcd_connect (nslcd_handle_t *a, uint32_t action, struct iovec const *v, unsigned int n, tain_t const *deadline) +{ + char pack[8] ; + int fd = ipc_stream_nbcoe() ; + struct iovec vv[n+1] ; + if (fd < 0) return 0 ; + vv[0].iov_base = pack ; + vv[0].iov_len = 8 ; + for (unsigned int i = 0 ; i < n ; i++) vv[i+1] = v[i] ; + if (!ipc_timed_connect_g(fd, a->socketpath, deadline)) goto err ; + uint32_pack_big(pack, NSLCD_VERSION) ; + uint32_pack_big(pack + 4, action) ; + if (!ipc_timed_sendv_g(fd, vv, n+1, deadline)) goto err ; + if (shutdown(fd, SHUT_WR) < 0) goto err ; + return fd ; + + err: + fd_close(fd) ; + return -1 ; +} + +int nsssd_pwd_start (void *handle) +{ + nslcd_handle_t *a = handle ; + a->head[0] = 0 ; + a->needdata |= 1 ; + return 1 ; +} + +int nsssd_pwd_rewind (void *handle) +{ + nslcd_handle_t *a = handle ; + a->head[0] = 0 ; + a->needdata |= 1 ; + return 1 ; +} + +static inline int pwd_getall (nslcd_handle_t *a) +{ + tain_t deadline ; + int fd ; + buffer b ; + char buf[8192] ; + tain_add_g(&deadline, &tto) ; + fd = nslcd_connect(a, NSLCD_ACTION_PASSWD_ALL, 0, 0, &deadline) ; + if (fd < 0) return 0 ; + buffer_init(&b, &buffer_read, fd, buf, 8192) ; + if (!read_header(&b, NSLCD_ACTION_PASSWD_ALL, &deadline)) goto err ; + genalloc_setlen(nsssd_passwd_t, &a->entries[0], 0) ; + a->data[0].len = 0 ; + for (;;) + { + int r = read_beginend(&b, &deadline) ; + if (r < 0) goto err ; + if (!r) break ; + if (!genalloc_readyplus(nsssd_passwd_t, &a->entries[0], 1)) goto err ; + if (!read_pw(&b, genalloc_s(nsssd_passwd_t, &a->entries[0]) + genalloc_len(nsssd_passwd_t, &a->entries[0]), &a->data[0], &deadline)) goto err ; + genalloc_setlen(nsssd_passwd_t, &a->entries[0], genalloc_len(nsssd_passwd_t, &a->entries[0]) + 1) ; + } + if (!read_eof(&b, &deadline)) goto err ; + fd_close(fd) ; + return 1 ; + + err: + fd_close(fd) ; + return 0 ; +} + +int nsssd_pwd_get (void *handle, struct passwd *pw) +{ + nslcd_handle_t *a = handle ; + if (a->needdata & 1) + { + if (!pwd_getall(a)) return 0 ; + a->needdata &= ~1 ; + } + if (a->head[0] >= genalloc_len(nsssd_passwd_t, &a->entries[0])) return 0 ; + nsssd_passwd_convert(pw, genalloc_s(nsssd_passwd_t, &a->entries[0]) + a->head[0]++, a->data[0].s) ; + return 1 ; +} + +int nsssd_pwd_getbyuid (void *handle, struct passwd *pw, uid_t uid) +{ + nslcd_handle_t *a = handle ; + nsssd_passwd_t pwc ; + tain_t deadline ; + int fd ; + buffer b ; + char buf[4096] ; + struct iovec v = { .iov_base = buf, .iov_len = 4 } ; + tain_add_g(&deadline, &tto) ; + uint32_pack_big(buf, uid) ; + fd = nslcd_connect(a, NSLCD_ACTION_PASSWD_BYUID, &v, 1, &deadline) ; + if (fd < 0) return 0 ; + buffer_init(&b, &buffer_read, fd, buf, 4096) ; + if (!read_header(&b, NSLCD_ACTION_PASSWD_BYUID, &deadline)) goto err ; + if (read_beginend(&b, &deadline) <= 0) goto err ; + a->data[0].len = 0 ; + if (!read_pw(&b, &pwc, &a->data[0], &deadline)) goto err ; + if (!read_endeof(&b, &deadline)) goto err ; + fd_close(fd) ; + nsssd_passwd_convert(pw, &pwc, a->data[0].s) ; + return 1 ; + + err: + fd_close(fd) ; + return 0 ; +} + +int nsssd_pwd_getbyname (void *handle, struct passwd *pw, char const *name) +{ + nslcd_handle_t *a = handle ; + nsssd_passwd_t pwc ; + tain_t deadline ; + int fd ; + buffer b ; + char buf[4096] ; + struct iovec v[2] = { { .iov_base = buf, .iov_len = 4 }, { .iov_base = (char *)name, .iov_len = strlen(name) } } ; + tain_add_g(&deadline, &tto) ; + fd = nslcd_connect(a, NSLCD_ACTION_PASSWD_BYNAME, v, 2, &deadline) ; + if (fd < 0) return 0 ; + buffer_init(&b, &buffer_read, fd, buf, 4096) ; + if (!read_header(&b, NSLCD_ACTION_PASSWD_BYNAME, &deadline)) goto err ; + if (read_beginend(&b, &deadline) <= 0) goto err ; + a->data[0].len = 0 ; + if (!read_pw(&b, &pwc, &a->data[0], &deadline)) goto err ; + if (!read_endeof(&b, &deadline)) goto err ; + fd_close(fd) ; + nsssd_passwd_convert(pw, &pwc, a->data[0].s) ; + return 1 ; + + err: + fd_close(fd) ; + return 0 ; +} + +void nsssd_pwd_end (void *handle) +{ +} + +int nsssd_grp_start (void *handle) +{ + nslcd_handle_t *a = handle ; + a->head[1] = 0 ; + a->grhead = 0 ; + a->needdata |= 2 ; + return 1 ; +} + +int nsssd_grp_rewind (void *handle) +{ + nslcd_handle_t *a = handle ; + a->head[1] = 0 ; + a->grhead = 0 ; + a->needdata |= 2 ; + return 1 ; +} + +static inline int grp_getall (nslcd_handle_t *a) +{ + tain_t deadline ; + int fd ; + buffer b ; + char buf[8192] ; + tain_add_g(&deadline, &tto) ; + fd = nslcd_connect(a, NSLCD_ACTION_GROUP_ALL, 0, 0, &deadline) ; + if (fd < 0) return 0 ; + buffer_init(&b, &buffer_read, fd, buf, 8192) ; + if (!read_header(&b, NSLCD_ACTION_GROUP_ALL, &deadline)) goto err ; + genalloc_setlen(nsssd_group_t, &a->entries[1], 0) ; + a->data[1].len = 0 ; + genalloc_setlen(size_t, &a->grmemc, 0) ; + for (;;) + { + int r = read_beginend(&b, &deadline) ; + if (r < 0) goto err ; + if (!r) break ; + if (!genalloc_readyplus(nsssd_group_t, &a->entries[1], 1)) goto err ; + if (!read_gr(&b, genalloc_s(nsssd_group_t, &a->entries[1]) + genalloc_len(nsssd_group_t, &a->entries[1]), &a->data[1], &a->grmemc, &deadline)) goto err ; + genalloc_setlen(nsssd_group_t, &a->entries[1], genalloc_len(nsssd_group_t, &a->entries[1]) + 1) ; + } + if (!read_eof(&b, &deadline)) goto err ; + fd_close(fd) ; + return 1 ; + + err: + fd_close(fd) ; + return 0 ; +} + +int nsssd_grp_get (void *handle, struct group *gr) +{ + nslcd_handle_t *a = handle ; + nsssd_group_t *grc ; + if (a->needdata & 2) + { + if (!grp_getall(a)) return 0 ; + a->needdata &= ~2 ; + } + if (a->head[1] >= genalloc_len(nsssd_group_t, &a->entries[1])) return 0 ; + grc = genalloc_s(nsssd_group_t, &a->entries[1]) + a->head[1]++ ; + if (!genalloc_ready(char *, &a->grmem, grc->gr_mem_n + 1)) return 0 ; + nsssd_group_convert(gr, genalloc_s(char *, &a->grmem), grc, a->data[1].s, genalloc_s(size_t, &a->grmemc) + a->grhead) ; + a->grhead += grc->gr_mem_n ; + return 1 ; +} + +int nsssd_grp_getbygid (void *handle, struct group *gr, gid_t gid) +{ + nslcd_handle_t *a = handle ; + nsssd_group_t grc ; + tain_t deadline ; + int fd ; + buffer b ; + char buf[4096] ; + struct iovec v = { .iov_base = buf, .iov_len = 4 } ; + tain_add_g(&deadline, &tto) ; + uint32_pack_big(buf, gid) ; + fd = nslcd_connect(a, NSLCD_ACTION_GROUP_BYGID, &v, 1, &deadline) ; + if (fd < 0) return 0 ; + buffer_init(&b, &buffer_read, fd, buf, 4096) ; + if (!read_header(&b, NSLCD_ACTION_GROUP_BYGID, &deadline)) goto err ; + if (read_beginend(&b, &deadline) <= 0) goto err ; + a->data[1].len = 0 ; + genalloc_setlen(size_t, &a->grmemc, 0) ; + if (!read_gr(&b, &grc, &a->data[1], &a->grmemc, &deadline)) goto err ; + if (!read_endeof(&b, &deadline)) goto err ; + fd_close(fd) ; + if (!genalloc_ready(char *, &a->grmem, grc.gr_mem_n + 1)) return 0 ; + nsssd_group_convert(gr, genalloc_s(char *, &a->grmem), &grc, a->data[1].s, genalloc_s(size_t, &a->grmemc)) ; + return 1 ; + + err: + fd_close(fd) ; + return 0 ; +} + +int nsssd_grp_getbyname (void *handle, struct group *gr, char const *name) +{ + nslcd_handle_t *a = handle ; + nsssd_group_t grc ; + tain_t deadline ; + int fd ; + buffer b ; + char buf[4096] ; + struct iovec v[2] = { { .iov_base = buf, .iov_len = 4 }, { .iov_base = (char *)name, .iov_len = strlen(name) } } ; + tain_add_g(&deadline, &tto) ; + fd = nslcd_connect(a, NSLCD_ACTION_GROUP_BYNAME, v, 2, &deadline) ; + if (fd < 0) return 0 ; + buffer_init(&b, &buffer_read, fd, buf, 4096) ; + if (!read_header(&b, NSLCD_ACTION_GROUP_BYNAME, &deadline)) goto err ; + if (read_beginend(&b, &deadline) <= 0) goto err ; + a->data[1].len = 0 ; + genalloc_setlen(size_t, &a->grmemc, 0) ; + if (!read_gr(&b, &grc, &a->data[1], &a->grmemc, &deadline)) goto err ; + if (!read_endeof(&b, &deadline)) goto err ; + fd_close(fd) ; + if (!genalloc_ready(char *, &a->grmem, grc.gr_mem_n + 1)) return 0 ; + nsssd_group_convert(gr, genalloc_s(char *, &a->grmem), &grc, a->data[1].s, genalloc_s(size_t, &a->grmem)) ; + return 1 ; + + err: + fd_close(fd) ; + return 0 ; +} + +void nsssd_grp_end (void *handle) +{ +} + +int nsssd_shadow_start (void *handle) +{ + nslcd_handle_t *a = handle ; + a->head[2] = 0 ; + a->needdata |= 4 ; + return 1 ; +} + +int nsssd_shadow_rewind (void *handle) +{ + nslcd_handle_t *a = handle ; + a->head[2] = 0 ; + a->needdata |= 4 ; + return 1 ; +} + +static inline int shadow_getall (nslcd_handle_t *a) +{ + tain_t deadline ; + int fd ; + buffer b ; + char buf[8192] ; + tain_add_g(&deadline, &tto) ; + fd = nslcd_connect(a, NSLCD_ACTION_SHADOW_ALL, 0, 0, &deadline) ; + if (fd < 0) return 0 ; + buffer_init(&b, &buffer_read, fd, buf, 8192) ; + if (!read_header(&b, NSLCD_ACTION_SHADOW_ALL, &deadline)) goto err ; + genalloc_setlen(nsssd_spwd_t, &a->entries[2], 0) ; + a->data[2].len = 0 ; + for (;;) + { + int r = read_beginend(&b, &deadline) ; + if (r < 0) goto err ; + if (!r) break ; + if (!genalloc_readyplus(nsssd_spwd_t, &a->entries[2], 1)) goto err ; + if (!read_sp(&b, genalloc_s(nsssd_spwd_t, &a->entries[2]) + genalloc_len(nsssd_spwd_t, &a->entries[2]), &a->data[2], &deadline)) goto err ; + genalloc_setlen(nsssd_spwd_t, &a->entries[2], genalloc_len(nsssd_spwd_t, &a->entries[2]) + 1) ; + } + if (!read_eof(&b, &deadline)) goto err ; + fd_close(fd) ; + return 1 ; + + err: + fd_close(fd) ; + return 0 ; +} + +int nsssd_shadow_get (void *handle, struct spwd *sp) +{ + nslcd_handle_t *a = handle ; + if (a->needdata & 4) + { + if (!shadow_getall(a)) return 0 ; + a->needdata &= ~4 ; + } + if (a->head[2] >= genalloc_len(nsssd_spwd_t, &a->entries[2])) return 0 ; + nsssd_spwd_convert(sp, genalloc_s(nsssd_spwd_t, &a->entries[2]) + a->head[2]++, a->data[2].s) ; + return 1 ; +} + +int nsssd_shadow_getbyname (void *handle, struct spwd *sp, char const *name) +{ + nslcd_handle_t *a = handle ; + nsssd_spwd_t spc ; + tain_t deadline ; + int fd ; + buffer b ; + char buf[4096] ; + struct iovec v[2] = { { .iov_base = buf, .iov_len = 4 }, { .iov_base = (char *)name, .iov_len = strlen(name) } } ; + tain_add_g(&deadline, &tto) ; + fd = nslcd_connect(a, NSLCD_ACTION_SHADOW_BYNAME, v, 2, &deadline) ; + if (fd < 0) return 0 ; + buffer_init(&b, &buffer_read, fd, buf, 4096) ; + if (!read_header(&b, NSLCD_ACTION_SHADOW_BYNAME, &deadline)) goto err ; + if (read_beginend(&b, &deadline) <= 0) goto err ; + a->data[2].len = 0 ; + if (!read_sp(&b, &spc, &a->data[2], &deadline)) goto err ; + if (!read_endeof(&b, &deadline)) goto err ; + fd_close(fd) ; + nsssd_spwd_convert(sp, &spc, a->data[2].s) ; + return 1 ; + + err: + fd_close(fd) ; + return 0 ; +} + +void nsssd_shadow_end (void *handle) +{ +} + +int main (int argc, char const *const *argv, char const *const *envp) +{ + PROG = "nsssd-nslcd" ; + { + subgetopt_t l = SUBGETOPT_ZERO ; + uint32_t t = 0 ; + for (;;) + { + int opt = subgetopt_r(argc, argv, "d", &l) ; + if (opt == -1) break ; + switch (opt) + { + case 't' : if (!uint320_scan(l.arg, &t)) dieusage() ; break ; + default : dieusage() ; + } + } + argc -= l.ind ; argv += l.ind ; + if (t) tain_from_millisecs(&tto, t) ; + } + + return nsssd_main(argv, envp) ; +} diff --git a/src/nsssd/nsssd-nslcd.h b/src/nsssd/nsssd-nslcd.h new file mode 100644 index 0000000..6980703 --- /dev/null +++ b/src/nsssd/nsssd-nslcd.h @@ -0,0 +1,26 @@ +/* ISC license. */ + +#ifndef NSSSD_NSLCD_H +#define NSSSD_NSLCD_H + + + /* Taken from nslcd.h */ + +#define NSLCD_VERSION 0x00000002 + +#define NSLCD_ACTION_PASSWD_BYNAME 0x00080001 +#define NSLCD_ACTION_PASSWD_BYUID 0x00080002 +#define NSLCD_ACTION_PASSWD_ALL 0x00080008 + +#define NSLCD_ACTION_GROUP_BYNAME 0x00040001 +#define NSLCD_ACTION_GROUP_BYGID 0x00040002 +#define NSLCD_ACTION_GROUP_BYMEMBER 0x00040006 +#define NSLCD_ACTION_GROUP_ALL 0x00040008 + +#define NSLCD_ACTION_SHADOW_BYNAME 0x000c0001 +#define NSLCD_ACTION_SHADOW_ALL 0x000c0008 + +#define NSLCD_RESULT_BEGIN 1 +#define NSLCD_RESULT_END 2 + +#endif diff --git a/src/nsssd/nsssd-unix.c b/src/nsssd/nsssd-unix.c new file mode 100644 index 0000000..e158c9f --- /dev/null +++ b/src/nsssd/nsssd-unix.c @@ -0,0 +1,170 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include + +void *nsssd_handle_init (void) +{ + return 0 ; +} + +int nsssd_handle_start (void *handle, char const *const *argv, char const *const *envp) +{ + (void)handle ; + (void)argv ; + (void)envp ; + return 1 ; +} + +void nsssd_handle_end (void *handle) +{ + (void)handle ; +} + +int nsssd_pwd_start (void *handle) +{ + (void)handle ; + return 1 ; +} + +int nsssd_pwd_rewind (void *handle) +{ + nsss_unix_setpwent() ; + (void)handle ; + return 1 ; +} + +int nsssd_pwd_get (void *handle, struct passwd *pw) +{ + struct passwd *pw2 = nsss_unix_getpwent() ; + if (!pw2) return 0 ; + *pw = *pw2 ; + (void)handle ; + return 1 ; +} + +int nsssd_pwd_getbyuid (void *handle, struct passwd *pw, uid_t uid) +{ + struct passwd *pw2 = nsss_unix_getpwuid(uid) ; + if (!pw2) return 0 ; + *pw = *pw2 ; + (void)handle ; + return 1 ; +} + +int nsssd_pwd_getbyname (void *handle, struct passwd *pw, char const *name) +{ + struct passwd *pw2 = nsss_unix_getpwnam(name) ; + if (!pw2) return 0 ; + *pw = *pw2 ; + (void)handle ; + return 1 ; +} + +void nsssd_pwd_end (void *handle) +{ + nsss_unix_endpwent() ; + (void)handle ; +} + +void nsssd_grp_handle_init (void *handle) +{ + (void)handle ; +} + +int nsssd_grp_start (void *handle) +{ + (void)handle ; + return 1 ; +} + +int nsssd_grp_rewind (void *handle) +{ + nsss_unix_setgrent() ; + (void)handle ; + return 1 ; +} + +int nsssd_grp_get (void *handle, struct group *gr) +{ + struct group *gr2 = nsss_unix_getgrent() ; + if (!gr2) return 0 ; + *gr = *gr2 ; + (void)handle ; + return 1 ; +} + +int nsssd_grp_getbygid (void *handle, struct group *gr, gid_t gid) +{ + struct group *gr2 = nsss_unix_getgrgid(gid) ; + if (!gr2) return 0 ; + *gr = *gr2 ; + (void)handle ; + return 1 ; +} + +int nsssd_grp_getbyname (void *handle, struct group *gr, char const *name) +{ + struct group *gr2 = nsss_unix_getgrnam(name) ; + if (!gr2) return 0 ; + *gr = *gr2 ; + (void)handle ; + return 1 ; +} + +void nsssd_grp_end (void *handle) +{ + nsss_unix_endgrent() ; + (void)handle ; +} + +void nsssd_shadow_handle_init (void *handle) +{ + (void)handle ; +} + +int nsssd_shadow_start (void *handle) +{ + (void)handle ; + return 1 ; +} + +int nsssd_shadow_rewind (void *handle) +{ + nsss_unix_setspent() ; + (void)handle ; + return 1 ; +} + +int nsssd_shadow_get (void *handle, struct spwd *sp) +{ + struct spwd *sp2 = nsss_unix_getspent() ; + if (!sp2) return 0 ; + *sp = *sp2 ; + (void)handle ; + return 1 ; +} + +int nsssd_shadow_getbyname (void *handle, struct spwd *sp, char const *name) +{ + struct spwd *sp2 = nsss_unix_getspnam(name) ; + if (!sp2) return 0 ; + *sp = *sp2 ; + (void)handle ; + return 1 ; +} + +void nsssd_shadow_end (void *handle) +{ + nsss_unix_endspent() ; + (void)handle ; +} + +int main (int argc, char const *const *argv, char const *const *envp) +{ + PROG = "nsssd-unix" ; + return nsssd_main(argv+1, envp) ; +} diff --git a/src/nsssd/nsssd_convert.c b/src/nsssd/nsssd_convert.c new file mode 100644 index 0000000..2113c6e --- /dev/null +++ b/src/nsssd/nsssd_convert.c @@ -0,0 +1,41 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include + +void nsssd_passwd_convert (struct passwd *pw, nsssd_passwd_t const *p, char const *s) +{ + pw->pw_name = (char *)s + p->pw_name ; + pw->pw_passwd = (char *)s + p->pw_passwd ; + pw->pw_uid = p->pw_uid ; + pw->pw_gid = p->pw_gid ; + pw->pw_gecos = (char *)s + p->pw_gecos ; + pw->pw_dir = (char *)s + p->pw_dir ; + pw->pw_shell = (char *)s + p->pw_shell ; +} + +void nsssd_group_convert (struct group *gr, char **q, nsssd_group_t const *p, char const *s, size_t const *membase) +{ + gr->gr_name = (char *)s + p->gr_name ; + gr->gr_passwd = (char *)s + p->gr_passwd ; + gr->gr_gid = p->gr_gid ; + gr->gr_mem = q ; + for (size_t i = 0 ; i < p->gr_mem_n ; i++) *q++ = (char *)s + membase[p->gr_mem + i] ; + *q++ = 0 ; +} + +void nsssd_spwd_convert (struct spwd *sp, nsssd_spwd_t const *p, char const *s) +{ + sp->sp_namp = (char *)s + p->sp_namp ; + sp->sp_pwdp = (char *)s + p->sp_pwdp ; + sp->sp_lstchg = p->sp_lstchg ; + sp->sp_min = p->sp_min ; + sp->sp_max = p->sp_max ; + sp->sp_warn = p->sp_warn ; + sp->sp_inact = p->sp_inact ; + sp->sp_expire = p->sp_expire ; + sp->sp_flag = p->sp_flag ; +} diff --git a/src/nsssd/nsssd_main.c b/src/nsssd/nsssd_main.c new file mode 100644 index 0000000..8673df4 --- /dev/null +++ b/src/nsssd/nsssd_main.c @@ -0,0 +1,419 @@ +/* ISC license. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static unsigned int initted = 0 ; + +static void get0 (char *s, size_t n) +{ + tain_t deadline ; + tain_ulong(&deadline, 30) ; + tain_add_g(&deadline, &deadline) ; + if (buffer_timed_get_g(buffer_0small, s, n, &deadline) < n) + strerr_diefu1sys(111, "read from stdin") ; +} + +static void put1 (char const *s, size_t n) +{ + size_t w = 0 ; + tain_t deadline ; + tain_ulong(&deadline, 30) ; + tain_add_g(&deadline, &deadline) ; + while (!buffer_putall(buffer_1, s, n, &w)) + { + if (!buffer_timed_flush_g(buffer_1, &deadline)) + strerr_diefu1sys(111, "write to stdout") ; + } +} + +static void flush1 (void) +{ + tain_t deadline ; + tain_ulong(&deadline, 2) ; + tain_add_g(&deadline, &deadline) ; + if (!buffer_timed_flush_g(buffer_1, &deadline)) + strerr_diefu1sys(111, "write to stdout") ; +} + +static void answer (int e) +{ + unsigned char c = e ; + buffer_putnoflush(buffer_1, (char *)&c, 1) ; + flush1() ; +} + +static inline void print_pw (struct passwd const *pw) +{ + size_t len, namelen, passwdlen, gecoslen, dirlen, shelllen ; + char pack[12] ; + namelen = strlen(pw->pw_name) + 1 ; + passwdlen = strlen(pw->pw_passwd) + 1 ; + gecoslen = strlen(pw->pw_gecos) + 1 ; + dirlen = strlen(pw->pw_dir) + 1 ; + shelllen = strlen(pw->pw_shell) + 1 ; + len = namelen + passwdlen + gecoslen + dirlen + shelllen ; + if (len > 0xffffffff) { answer(ENAMETOOLONG) ; return ; } + put1("", 1) ; + uint32_pack_big(pack, pw->pw_uid) ; + uint32_pack_big(pack + 4, pw->pw_gid) ; + uint32_pack_big(pack + 8, len) ; + put1(pack, 12) ; + put1(pw->pw_name, namelen) ; + put1(pw->pw_passwd, passwdlen) ; + put1(pw->pw_gecos, gecoslen) ; + put1(pw->pw_dir, dirlen) ; + put1(pw->pw_shell, shelllen) ; + flush1() ; +} + +static inline void print_gr (struct group const *gr) +{ + size_t len, namelen, passwdlen ; + size_t n = 0 ; + char pack[12] ; + namelen = strlen(gr->gr_name) + 1 ; + passwdlen = strlen(gr->gr_passwd) + 1 ; + len = namelen + passwdlen ; + for (char **p = gr->gr_mem ; *p ; n++, p++) len += strlen(*p) + 1 ; + if (len > 0xffffffffu || n > 0x30000000u) { answer(ENAMETOOLONG) ; return ; } + put1("", 1) ; + uint32_pack_big(pack, gr->gr_gid) ; + uint32_pack_big(pack, len) ; + uint32_pack_big(pack, n) ; + put1(pack, 12) ; + put1(gr->gr_name, namelen) ; + put1(gr->gr_passwd, passwdlen) ; + for (size_t i = 0 ; i < n ; i++) + put1(gr->gr_mem[i], strlen(gr->gr_mem[i]) + 1) ; + flush1() ; +} + +static inline void print_sp (struct spwd const *sp) +{ + size_t len, namplen, pwdplen ; + char pack[60] ; + namplen = strlen(sp->sp_namp) + 1 ; + pwdplen = strlen(sp->sp_pwdp) + 1 ; + len = namplen + pwdplen ; + if (len > 0xffffffff) { answer(ENAMETOOLONG) ; return ; } + put1("", 1) ; + uint64_pack_big(pack, sp->sp_lstchg) ; + uint64_pack_big(pack + 8, sp->sp_min) ; + uint64_pack_big(pack + 16, sp->sp_max) ; + uint64_pack_big(pack + 24, sp->sp_warn) ; + uint64_pack_big(pack + 32, sp->sp_inact) ; + uint64_pack_big(pack + 40, sp->sp_expire) ; + uint64_pack_big(pack + 48, sp->sp_flag) ; + uint32_pack_big(pack + 56, len) ; + put1(pack, 60) ; + put1(sp->sp_namp, namplen) ; + put1(sp->sp_pwdp, pwdplen) ; + flush1() ; +} + + +static inline void do_pwend (void *a) +{ + nsssd_pwd_end(a) ; + answer(0) ; +} + +static inline void do_pwrewind (void *a) +{ + if (!(initted & 1)) + { + if (!nsssd_pwd_start(a)) + { + answer(errno) ; + return ; + } + initted |= 1 ; + } + if (!nsssd_pwd_rewind(a)) + { + answer(errno) ; + return ; + } + answer(0) ; +} + +static inline void do_pwget (void *a) +{ + struct passwd pw ; + if (!(initted & 1)) + { + if (!nsssd_pwd_start(a)) + { + answer(errno ? errno : NSSSD_EOF) ; + return ; + } + initted |= 1 ; + } + if (!nsssd_pwd_get(a, &pw)) + { + answer(errno ? errno : NSSSD_EOF) ; + return ; + } + print_pw(&pw) ; +} + +static inline void do_pwnam (void *a) +{ + struct passwd pw ; + uint32_t len ; + char buf[4] ; + get0(buf, 4) ; + uint32_unpack_big(buf, &len) ; + if (!len || len > NSSS_SWITCH_NAME_MAXLEN - 1) + { + answer(EPROTO) ; + return ; + } + { + char name[len] ; + get0(name, len) ; + if (name[len-1]) + { + answer(EPROTO) ; + return ; + } + if (!nsssd_pwd_getbyname(a, &pw, name)) + { + answer(errno ? errno : NSSSD_EOF) ; + return ; + } + } + print_pw(&pw) ; +} + +static inline void do_pwuid (void *a) +{ + struct passwd pw ; + uint32_t uid ; + char buf[4] ; + get0(buf, 4) ; + uint32_unpack_big(buf, &uid) ; + if (!nsssd_pwd_getbyuid(a, &pw, uid)) + { + answer(errno ? errno : NSSSD_EOF) ; + return ; + } + print_pw(&pw) ; +} + +static inline void do_grend (void *a) +{ + nsssd_grp_end(a) ; + answer(0) ; +} + +static inline void do_grrewind (void *a) +{ + if (!(initted & 2)) + { + if (!nsssd_grp_start(a)) + { + answer(errno) ; + return ; + } + initted |= 2 ; + } + if (!nsssd_grp_rewind(a)) + { + answer(errno) ; + return ; + } + answer(0) ; +} + +static inline void do_grget (void *a) +{ + struct group gr ; + if (!(initted & 2)) + { + if (!nsssd_grp_start(a)) + { + answer(errno) ; + return ; + } + initted |= 2 ; + } + if (!nsssd_grp_get(a, &gr)) + { + answer(errno ? errno : NSSSD_EOF) ; + return ; + } + print_gr(&gr) ; +} + +static inline void do_grnam (void *a) +{ + struct group gr ; + uint32_t len ; + char buf[4] ; + get0(buf, 4) ; + uint32_unpack_big(buf, &len) ; + if (!len || len > NSSS_SWITCH_NAME_MAXLEN - 1) + { + answer(EPROTO) ; + return ; + } + { + char name[len] ; + get0(name, len) ; + if (name[len-1]) + { + answer(EPROTO) ; + return ; + } + if (!nsssd_grp_getbyname(a, &gr, name)) + { + answer(errno ? errno : NSSSD_EOF) ; + return ; + } + } + print_gr(&gr) ; +} + +static inline void do_grgid (void *a) +{ + struct group gr ; + uint32_t gid ; + char buf[4] ; + get0(buf, 4) ; + uint32_unpack_big(buf, &gid) ; + if (!nsssd_grp_getbygid(a, &gr, gid)) + { + answer(errno ? errno : NSSSD_EOF) ; + return ; + } + print_gr(&gr) ; +} + +static inline void do_spend (void *a) +{ + nsssd_shadow_end(a) ; + answer(0) ; +} + +static inline void do_sprewind (void *a) +{ + if (!(initted & 4)) + { + if (!nsssd_shadow_start(a)) + { + answer(errno) ; + return ; + } + initted |= 4 ; + } + if (!nsssd_shadow_rewind(a)) + { + answer(errno) ; + return ; + } + answer(0) ; +} + +static inline void do_spget (void *a) +{ + struct spwd sp ; + if (!(initted & 4)) + { + if (!nsssd_shadow_start(a)) + { + answer(errno) ; + return ; + } + initted |= 4 ; + } + if (!nsssd_shadow_get(a, &sp)) + { + answer(errno ? errno : NSSSD_EOF) ; + return ; + } + print_sp(&sp) ; +} +static inline void do_spnam (void *a) +{ + struct spwd sp ; + uint32_t len ; + char buf[4] ; + get0(buf, 4) ; + uint32_unpack_big(buf, &len) ; + if (!len || len > NSSS_SWITCH_NAME_MAXLEN - 1) + { + answer(EPROTO) ; + return ; + } + { + char name[len] ; + get0(name, len) ; + if (name[len-1]) + { + answer(EPROTO) ; + return ; + } + if (!nsssd_shadow_getbyname(a, &sp, name)) + { + answer(errno ? errno : NSSSD_EOF) ; + return ; + } + } + print_sp(&sp) ; +} + + +int nsssd_main (char const *const *argv, char const *const *envp) +{ + void *a = nsssd_handle_init() ; + if (ndelay_on(0) < 0) strerr_diefu1sys(111, "set stdin non-blocking") ; + tain_now_g() ; + if (!nsssd_handle_start(a, argv, envp)) + strerr_diefu1sys(111, "nsssd_handle_start") ; + + for (;;) + { + tain_t deadline ; + char c ; + tain_add_g(&deadline, &tain_infinite_relative) ; + if (!buffer_timed_get_g(buffer_0small, &c, 1, &deadline)) break ; + errno = 0 ; + switch (c) + { + case NSSS_SWITCH_PWD_END : do_pwend(a) ; break ; + case NSSS_SWITCH_PWD_REWIND : do_pwrewind(a) ; break ; + case NSSS_SWITCH_PWD_GET : do_pwget(a) ; break ; + case NSSS_SWITCH_PWD_GETBYNAME : do_pwnam(a) ; break ; + case NSSS_SWITCH_PWD_GETBYUID : do_pwuid(a) ; break ; + case NSSS_SWITCH_GRP_END : do_grend(a) ; break ; + case NSSS_SWITCH_GRP_REWIND : do_grrewind(a) ; break ; + case NSSS_SWITCH_GRP_GET : do_grget(a) ; break ; + case NSSS_SWITCH_GRP_GETBYNAME : do_grnam(a) ; break ; + case NSSS_SWITCH_GRP_GETBYGID : do_grgid(a) ; break ; + case NSSS_SWITCH_SHADOW_END : do_spend(a) ; break ; + case NSSS_SWITCH_SHADOW_REWIND : do_sprewind(a) ; break ; + case NSSS_SWITCH_SHADOW_GET : do_spget(a) ; break ; + case NSSS_SWITCH_SHADOW_GETBYNAME : do_spnam(a) ; break ; + default : + errno = EPROTO ; + strerr_diefu1sys(1, "interpret stdin") ; + } + } + nsssd_handle_end(a) ; + return 0 ; +} diff --git a/tools/gen-deps.sh b/tools/gen-deps.sh new file mode 100755 index 0000000..6383ac2 --- /dev/null +++ b/tools/gen-deps.sh @@ -0,0 +1,93 @@ +#!/bin/sh -e + +. package/info + +echo '#' +echo '# This file has been generated by tools/gen-deps.sh' +echo '#' +echo + +for dir in src/include/${package} src/* ; do + for file in $(ls -1 $dir | grep -- \\.h$) ; do + { + grep -F -- "#include <${package}/" < ${dir}/$file | cut -d'<' -f2 | cut -d'>' -f1 ; + grep -- '#include ".*\.h"' < ${dir}/$file | cut -d'"' -f2 + } | sort -u | { + deps= + while read dep ; do + if echo $dep | grep -q "^${package}/" ; then + deps="$deps src/include/$dep" + elif test -f "${dir}/$dep" ; then + deps="$deps ${dir}/$dep" + else + deps="$deps src/include-local/$dep" + fi + done + if test -n "$deps" ; then + echo "${dir}/${file}:${deps}" + fi + } + done +done + +for dir in src/* ; do + for file in $(ls -1 $dir | grep -- \\.c$) ; do + { + grep -F -- "#include <${package}/" < ${dir}/$file | cut -d'<' -f2 | cut -d'>' -f1 ; + grep -- '#include ".*\.h"' < ${dir}/$file | cut -d'"' -f2 + } | sort -u | { + deps=" ${dir}/$file" + while read dep ; do + if echo $dep | grep -q "^${package}/" ; then + deps="$deps src/include/$dep" + elif test -f "${dir}/$dep" ; then + deps="$deps ${dir}/$dep" + else + deps="$deps src/include-local/$dep" + fi + done + o=$(echo $file | sed s/\\.c$/.o/) + lo=$(echo $file | sed s/\\.c$/.lo/) + echo "${dir}/${o} ${dir}/${lo}:${deps}" + } + done +done +echo + +for dir in $(ls -1 src | grep -v ^include) ; do + for file in $(ls -1 src/$dir/deps-lib) ; do + deps= + libs= + while read dep ; do + if echo $dep | grep -q -e ^-l -e '^\${.*_LIB}' ; then + libs="$libs $dep" + else + deps="$deps src/$dir/$dep" + fi + done < src/$dir/deps-lib/$file + echo 'ifeq ($(strip $(STATIC_LIBS_ARE_PIC)),)' + echo "lib${file}.a.xyzzy:$deps" + echo else + echo "lib${file}.a.xyzzy:$(echo "$deps" | sed 's/\.o/.lo/g')" + echo endif + echo "lib${file}.so.xyzzy: EXTRA_LIBS :=$libs" + echo "lib${file}.so.xyzzy:$(echo "$deps" | sed 's/\.o/.lo/g')" + done + + for file in $(ls -1 src/$dir/deps-exe) ; do + deps= + libs= + while read dep ; do + if echo $dep | grep -q -- \\.o$ ; then + dep="src/$dir/$dep" + fi + if echo $dep | grep -q -- '^\${.*_LIB}' ; then + libs="$libs $dep" + else + deps="$deps $dep" + fi + done < src/$dir/deps-exe/$file + echo "$file: EXTRA_LIBS :=$libs" + echo "$file: src/$dir/$file.o$deps" + done +done diff --git a/tools/install.sh b/tools/install.sh new file mode 100755 index 0000000..89f9428 --- /dev/null +++ b/tools/install.sh @@ -0,0 +1,64 @@ +#!/bin/sh + +usage() { + echo "usage: $0 [-D] [-l] [-m mode] src dst" 1>&2 + exit 1 +} + +mkdirp=false +symlink=false +mode=0755 + +while getopts Dlm: name ; do + case "$name" in + D) mkdirp=true ;; + l) symlink=true ;; + m) mode=$OPTARG ;; + ?) usage ;; + esac +done +shift $(($OPTIND - 1)) + +test "$#" -eq 2 || usage +src=$1 +dst=$2 +tmp="$dst.tmp.$$" + +case "$dst" in + */) echo "$0: $dst ends in /" 1>&2 ; exit 1 ;; +esac + +set -C +set -e + +if $mkdirp ; then + umask 022 + case "$2" in + */*) mkdir -p "${dst%/*}" ;; + esac +fi + +trap 'rm -f "$tmp"' EXIT INT QUIT TERM HUP + +umask 077 + +if $symlink ; then + ln -s "$src" "$tmp" +else + cat < "$1" > "$tmp" + chmod "$mode" "$tmp" +fi + +mv -f "$tmp" "$dst" +if test -d "$dst" ; then + rm -f "$dst/$(basename $tmp)" + if $symlink ; then + mkdir "$tmp" + ln -s "$src" "$tmp/$(basename $dst)" + mv -f "$tmp/$(basename $dst)" "${dst%/*}" + rmdir "$tmp" + else + echo "$0: $dst is a directory" 1>&2 + exit 1 + fi +fi -- cgit v1.3.1