Better error reporting if forkpty() fails.
git-svn-id: https://shellinabox.googlecode.com/svn/trunk@74 0da03de8-d603-11dd-86c2-0f8696b7b6f9
This commit is contained in:
parent
b0341e1549
commit
2d4768183b
2 changed files with 16 additions and 8 deletions
2
config.h
2
config.h
|
@ -95,7 +95,7 @@
|
||||||
#define STDC_HEADERS 1
|
#define STDC_HEADERS 1
|
||||||
|
|
||||||
/* Most recent revision number in the version control system */
|
/* Most recent revision number in the version control system */
|
||||||
#define VCS_REVISION "73"
|
#define VCS_REVISION "69"
|
||||||
|
|
||||||
/* Version number of package */
|
/* Version number of package */
|
||||||
#define VERSION "2.4"
|
#define VERSION "2.4"
|
||||||
|
|
|
@ -574,7 +574,7 @@ static int forkPty(int *pty, int useLogin, struct Utmp **utmp,
|
||||||
fname[9] = *ptr2;
|
fname[9] = *ptr2;
|
||||||
if ((*pty = NOINTR(open(fname, O_RDWR, 0))) < 0) {
|
if ((*pty = NOINTR(open(fname, O_RDWR, 0))) < 0) {
|
||||||
if (errno == ENOENT) {
|
if (errno == ENOENT) {
|
||||||
goto failure;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
grantpt(*pty);
|
grantpt(*pty);
|
||||||
|
@ -590,7 +590,6 @@ static int forkPty(int *pty, int useLogin, struct Utmp **utmp,
|
||||||
NOINTR(close(*pty));
|
NOINTR(close(*pty));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
failure:
|
|
||||||
*pty = -1;
|
*pty = -1;
|
||||||
*utmp = NULL;
|
*utmp = NULL;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1229,18 +1228,27 @@ static void launcherDaemon(int fd) {
|
||||||
struct Utmp *utmp;
|
struct Utmp *utmp;
|
||||||
if ((pid = forkPty(&pty,
|
if ((pid = forkPty(&pty,
|
||||||
services[request.service]->useLogin,
|
services[request.service]->useLogin,
|
||||||
&utmp, request.peerName)) < 0) {
|
&utmp, request.peerName)) == 0) {
|
||||||
} else if (pid == 0) {
|
|
||||||
childProcess(services[request.service], request.width, request.height,
|
childProcess(services[request.service], request.width, request.height,
|
||||||
utmp, request.peerName);
|
utmp, request.peerName);
|
||||||
_exit(1);
|
_exit(1);
|
||||||
} else {
|
} else {
|
||||||
// Remember the utmp entry so that we can clean up when the child
|
// Remember the utmp entry so that we can clean up when the child
|
||||||
// terminates.
|
// terminates.
|
||||||
|
if (pid > 0) {
|
||||||
if (!childProcesses) {
|
if (!childProcesses) {
|
||||||
childProcesses = newHashMap(destroyUtmpHashEntry, NULL);
|
childProcesses = newHashMap(destroyUtmpHashEntry, NULL);
|
||||||
}
|
}
|
||||||
addToHashMap(childProcesses, utmp->pid, (char *)utmp);
|
addToHashMap(childProcesses, utmp->pid, (char *)utmp);
|
||||||
|
} else {
|
||||||
|
int fds[2];
|
||||||
|
if (!pipe(fds)) {
|
||||||
|
write(fds[1], "forkpty() failed\r\n", 18);
|
||||||
|
NOINTR(close(fds[1]));
|
||||||
|
pty = fds[0];
|
||||||
|
pid = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Send file handle and process id back to parent
|
// Send file handle and process id back to parent
|
||||||
char cmsg_buf[CMSG_SPACE(sizeof(int))];
|
char cmsg_buf[CMSG_SPACE(sizeof(int))];
|
||||||
|
|
Loading…
Reference in a new issue