static int ignore = 0;
static char *mgroup = NULL;
-static char *dirname = "htpub";
+static char *dirname = NULL;
static char **childspec;
static uid_t minuid = 0;
+static int usesyslog = 0;
static struct user *users = NULL;
static void login(struct passwd *pwd)
flog(LOG_ERR, "could not change to home directory for %s: %s", pwd->pw_name, strerror(errno));
exit(1);
}
+ if(usesyslog)
+ putenv("ASHD_USESYSLOG=1");
+ else
+ unsetenv("ASHD_USESYSLOG");
putenv(sprintf2("HOME=%s", pwd->pw_dir));
putenv(sprintf2("SHELL=%s", pwd->pw_shell));
putenv(sprintf2("USER=%s", pwd->pw_name));
if(usr->fd < 0)
usr->fd = forkchild(usr->name);
if(sendreq(usr->fd, req, fd)) {
- if(errno == EPIPE) {
+ if((errno == EPIPE) || (errno == ECONNRESET)) {
/* Assume that the child has crashed and restart it. */
close(usr->fd);
usr->fd = forkchild(usr->name);
free(usrnm);
}
+static void sighandler(int sig)
+{
+}
+
static void usage(FILE *out)
{
- fprintf(out, "usage: userplex [-hI] [-g GROUP] [-m MIN-UID] [-d PUB-DIR] [PROGRAM ARGS...]\n");
+ fprintf(out, "usage: userplex [-hIs] [-g GROUP] [-m MIN-UID] [-d PUB-DIR] [PROGRAM ARGS...]\n");
}
int main(int argc, char **argv)
int fd;
struct charvbuf csbuf;
- while((c = getopt(argc, argv, "+hIg:m:d:")) >= 0) {
+ while((c = getopt(argc, argv, "+hIsg:m:d:")) >= 0) {
switch(c) {
case 'I':
ignore = 1;
break;
+ case 's':
+ usesyslog = 1;
+ break;
case 'm':
if((minuid = atoi(optarg)) < 1) {
fprintf(stderr, "userplex: argument to -m must be greater than 0\n");
}
if(optind < argc) {
childspec = argv + optind;
- dirname = NULL;
} else {
+ if(dirname == NULL)
+ dirname = "htpub";
bufinit(csbuf);
bufadd(csbuf, "dirplex");
bufadd(csbuf, dirname);
childspec = csbuf.b;
}
signal(SIGCHLD, SIG_IGN);
+ signal(SIGPIPE, sighandler);
while(1) {
if((fd = recvreq(0, &req)) < 0) {
if(errno != 0)