version 1.299, 2007/06/14 21:43:25 |
version 1.300, 2007/06/14 22:48:05 |
|
|
control_client(const char *path) |
control_client(const char *path) |
{ |
{ |
struct sockaddr_un addr; |
struct sockaddr_un addr; |
int i, r, fd, sock, exitval, num_env; |
int i, r, fd, sock, exitval[2], num_env; |
Buffer m; |
Buffer m; |
char *term; |
char *term; |
extern char **environ; |
extern char **environ; |
|
|
if (tty_flag) |
if (tty_flag) |
enter_raw_mode(); |
enter_raw_mode(); |
|
|
/* Stick around until the controlee closes the client_fd */ |
/* |
exitval = 0; |
* Stick around until the controlee closes the client_fd. |
|
* Before it does, it is expected to write this process' exit |
|
* value (one int). This process must read the value and wait for |
|
* the closure of the client_fd; if this one closes early, the |
|
* multiplex master will terminate early too (possibly losing data). |
|
*/ |
|
exitval[0] = 0; |
for (i = 0; !control_client_terminate && i < (int)sizeof(exitval);) { |
for (i = 0; !control_client_terminate && i < (int)sizeof(exitval);) { |
r = read(sock, (char *)&exitval + i, sizeof(exitval) - i); |
r = read(sock, (char *)exitval + i, sizeof(exitval) - i); |
if (r == 0) { |
if (r == 0) { |
debug2("Received EOF from master"); |
debug2("Received EOF from master"); |
break; |
break; |
|
|
} |
} |
i += r; |
i += r; |
} |
} |
|
|
close(sock); |
close(sock); |
leave_raw_mode(); |
leave_raw_mode(); |
|
if (i > (int)sizeof(int)) |
|
fatal("%s: master returned too much data (%d > %lu)", |
|
__func__, i, sizeof(int)); |
if (control_client_terminate) { |
if (control_client_terminate) { |
debug2("Exiting on signal %d", control_client_terminate); |
debug2("Exiting on signal %d", control_client_terminate); |
exitval = 255; |
exitval[0] = 255; |
} else if (i < (int)sizeof(exitval)) { |
} else if (i < (int)sizeof(int)) { |
debug2("Control master terminated unexpectedly"); |
debug2("Control master terminated unexpectedly"); |
exitval = 255; |
exitval[0] = 255; |
} else |
} else |
debug2("Received exit status from master %d", exitval); |
debug2("Received exit status from master %d", exitval[0]); |
|
|
if (tty_flag && options.log_level != SYSLOG_LEVEL_QUIET) |
if (tty_flag && options.log_level != SYSLOG_LEVEL_QUIET) |
fprintf(stderr, "Shared connection to %s closed.\r\n", |
fprintf(stderr, "Shared connection to %s closed.\r\n", host); |
host); |
|
|
|
exit(exitval); |
exit(exitval[0]); |
} |
} |