X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=userv.git;a=blobdiff_plain;f=servexec.c;h=2b110126abc0fa5fabf93d530eb5c6ff8733c77c;hp=48a6e294db691bef6fcb228279c66850367369ee;hb=c44b074953734e3b487946b974d44e51f4fd3859;hpb=9f56f874416db295bdb50d448bd99cdd34db969d diff --git a/servexec.c b/servexec.c index 48a6e29..2b11012 100644 --- a/servexec.c +++ b/servexec.c @@ -34,6 +34,7 @@ #include "common.h" #include "daemon.h" #include "lib.h" +#include "version.h" static void NONRETURNING serv_syscallfail(const char *msg) { fputs("uservd(service): ",stderr); @@ -41,6 +42,92 @@ static void NONRETURNING serv_syscallfail(const char *msg) { _exit(-1); } +static void NONRETURNING serv_checkstdoutexit(void) { + if (ferror(stdout) || fclose(stdout)) serv_syscallfail("write stdout"); + _exit(0); +} + +void bisexec_environment(const char *const *argv) { + execlp("env","env",(char*)0); + serv_syscallfail("execute `env'"); +} + +void bisexec_parameter(const char *const *argv) { + always_dumpparameter(execargs[0],execargs+1); + serv_checkstdoutexit(); +} + +void bisexec_version(const char *const *argv) { + const unsigned char *p; + int i; + + printf("uservd version " VERSION "; copyright (C)1996-1997 Ian Jackson.\n" +#ifdef DEBUG + "DEBUGGING VERSION" +#else + "production version" +#endif + " - protocol magic number %08lx\n" + "maximums: fd %-10d general string %d\n" + " gids %-10d override length %d\n" + " args or variables %-10d error message %d\n" + " nested inclusion %-10d errno string reserve %d\n" + "protocol checksum: ", + BASE_MAGIC, + MAX_ALLOW_FD, MAX_GENERAL_STRING, + MAX_GIDS, MAX_OVERRIDE_LEN, + MAX_ARGSDEFVAR, ERRMSG_RESERVE_ERRNO, + MAX_INCLUDE_NEST, MAX_ERRMSG_LEN); + for (i=0, p=protocolchecksumversion; i0) { putchar(' '); nspaces--; } + putchar(c); + lnl= 0; + break; + } + } + assert(lnl); + serv_checkstdoutexit(); +} + +void bisexec_toplevel(const char *const *argv) { + dumpconfig(TOPLEVEL_CONFIGURATION); +} + +void bisexec_override(const char *const *argv) { + dumpconfig(TOPLEVEL_OVERRIDDEN_CONFIGURATION); +} + +void bisexec_reset(const char *const *argv) { + dumpconfig(RESET_CONFIGURATION); +} + +void bisexec_execute(const char *const *argv) { + always_dumpexecsettings(); + serv_checkstdoutexit(); +} + static void serv_resetsignal(int signo) { struct sigaction sig; @@ -54,10 +141,6 @@ static const char *see_logname(void) { return serviceuser; } static const char *see_home(void) { return serviceuser_dir; } static const char *see_shell(void) { return serviceuser_shell; } -static const char *see_path(void) { - return serviceuser_uid ? DEFAULTPATH_USER : DEFAULTPATH_ROOT; -} - static const char *see_service(void) { return service; } static const char *see_c_cwd(void) { return cwd; } static const char *see_c_logname(void) { return logname; } @@ -104,7 +187,7 @@ static const struct serv_envinfo { { "LOGNAME", see_logname }, { "HOME", see_home }, { "SHELL", see_shell }, - { "PATH", see_path }, + { "PATH", defaultpath }, { "USERV_SERVICE", see_service }, { "USERV_CWD", see_c_cwd }, { "USERV_USER", see_c_logname }, @@ -190,10 +273,10 @@ void execservice(const int synchsocket[], int clientfd) { for (sei= serv_envinfos; sei->name; sei++) if (setenv(sei->name,sei->fn(),1)) serv_syscallfail("setenv standard"); for (i=0; ienvvarbufsize) { envvarbufsize= l; envvarbuf= xrealloc(envvarbuf,l); } - snyprintf(envvarbuf,l,"USERV_U_%s",defvararray[i][0]); - if (setenv(envvarbuf,defvararray[i][1],1)) serv_syscallfail("setenv defvar"); + snyprintf(envvarbuf,l,"USERV_U_%s",defvararray[i].key); + if (setenv(envvarbuf,defvararray[i].value,1)) serv_syscallfail("setenv defvar"); } nargs= 0; @@ -209,7 +292,10 @@ void execservice(const int synchsocket[], int clientfd) { if (!suppressargs) for (i=0; i