summaryrefslogtreecommitdiff
path: root/src/nsssd/nsssd_main.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2021-09-09 19:58:12 +0000
committerLaurent Bercot <ska@appnovation.com>2021-09-09 19:58:12 +0000
commit6fdb4834cdb5557d9bd7562f61984da8bd0d9c80 (patch)
treec9ac0c6bc512beed2e550b9aba09eb2af090e6a7 /src/nsssd/nsssd_main.c
parent1f213b642deb1d8e6139d2b7daac8f639c8717e7 (diff)
downloadnsss-6fdb4834cdb5557d9bd7562f61984da8bd0d9c80.tar.xz
Prepare for 0.2.0.0, lots of changes.
- Make _r functions completely thread-safe. - Save a lot of forking by having a persistent nsss_switch_query - Introduce a timeout to make the server expire - Start writing nsss-switch, not working yet. Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/nsssd/nsssd_main.c')
-rw-r--r--src/nsssd/nsssd_main.c41
1 files changed, 32 insertions, 9 deletions
diff --git a/src/nsssd/nsssd_main.c b/src/nsssd/nsssd_main.c
index 9dbc27c..ba23e05 100644
--- a/src/nsssd/nsssd_main.c
+++ b/src/nsssd/nsssd_main.c
@@ -1,5 +1,6 @@
/* ISC license. */
+#include <stdint.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
@@ -23,12 +24,13 @@
#include <nsss/nsssd.h>
static unsigned int initted = 0 ;
+static tain tto = TAIN_INFINITE_RELATIVE ;
+static tain outertto = TAIN_INFINITE_RELATIVE ;
static void get0 (char *s, size_t n)
{
tain deadline ;
- tain_ulong(&deadline, 30) ;
- tain_add_g(&deadline, &deadline) ;
+ tain_add_g(&deadline, &tto) ;
if (buffer_timed_get_g(buffer_0small, s, n, &deadline) < n)
strerr_diefu1sys(111, "read from stdin") ;
}
@@ -37,8 +39,7 @@ static void put1 (char const *s, size_t n)
{
size_t w = 0 ;
tain deadline ;
- tain_ulong(&deadline, 30) ;
- tain_add_g(&deadline, &deadline) ;
+ tain_add_g(&deadline, &tto) ;
while (!buffer_putall(buffer_1, s, n, &w))
{
if (!buffer_timed_flush_g(buffer_1, &deadline))
@@ -49,8 +50,7 @@ static void put1 (char const *s, size_t n)
static void flush1 (void)
{
tain deadline ;
- tain_ulong(&deadline, 2) ;
- tain_add_g(&deadline, &deadline) ;
+ tain_add_g(&deadline, &tto) ;
if (!buffer_timed_flush_g(buffer_1, &deadline))
strerr_diefu1sys(111, "write to stdout") ;
}
@@ -131,6 +131,16 @@ static inline void print_sp (struct spwd const *sp)
flush1() ;
}
+static inline void do_set_timeout (void)
+{
+ uint32_t t ;
+ char buf[4] ;
+ get0(buf, 4) ;
+ uint32_unpack_big(buf, &t) ;
+ if (t) tain_from_millisecs(&outertto, t) ;
+ else outertto = tain_infinite_relative ;
+ answer(0) ;
+}
static inline void do_pwend (void *a)
{
@@ -402,6 +412,7 @@ static inline void do_spget (void *a)
}
print_sp(&sp) ;
}
+
static inline void do_spnam (void *a)
{
struct spwd sp ;
@@ -432,7 +443,7 @@ static inline void do_spnam (void *a)
}
-int nsssd_main (char const *const *argv, char const *const *envp)
+int nsssd_main (char const *const *argv)
{
void *a ;
@@ -452,22 +463,34 @@ int nsssd_main (char const *const *argv, char const *const *envp)
if (setuid(uid) == -1) strerr_diefu2sys(111, "setuid to ", x) ;
}
+ {
+ char const *x = getenv("NSSSD_TIMEOUT") ;
+ if (x)
+ {
+ uint32_t t ;
+ if (!uint320_scan(x, &t))
+ strerr_dief1x(100, "invalid NSSSD_TIMEOUT") ;
+ if (t) tain_from_millisecs(&tto, t) ;
+ }
+ }
+
tain_now_set_stopwatch_g() ;
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))
+ if (!nsssd_handle_start(a, argv))
strerr_diefu1sys(111, "nsssd_handle_start") ;
for (;;)
{
tain deadline ;
char c ;
- tain_add_g(&deadline, &tain_infinite_relative) ;
+ tain_add_g(&deadline, &outertto) ;
if (!buffer_timed_get_g(buffer_0small, &c, 1, &deadline)) break ;
errno = 0 ;
switch (c)
{
+ case NSSS_SWITCH_SET_TIMEOUT : do_set_timeout() ; break ;
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 ;