version 1.68, 2013/10/10 12:12:08 |
version 1.69, 2013/10/10 12:13:29 |
|
|
|
|
/* Dispatch imsgs when in wait state (before MSG_READY). */ |
/* Dispatch imsgs when in wait state (before MSG_READY). */ |
int |
int |
client_dispatch_wait(void *data) |
client_dispatch_wait(void *data0) |
{ |
{ |
struct imsg imsg; |
struct imsg imsg; |
ssize_t n, datalen; |
char *data; |
struct msg_shell_data shelldata; |
ssize_t n, datalen; |
struct msg_exit_data exitdata; |
struct msg_stdout_data stdoutdata; |
struct msg_stdout_data stdoutdata; |
struct msg_stderr_data stderrdata; |
struct msg_stderr_data stderrdata; |
int retval; |
const char *shellcmd = data; |
|
|
|
for (;;) { |
for (;;) { |
if ((n = imsg_get(&client_ibuf, &imsg)) == -1) |
if ((n = imsg_get(&client_ibuf, &imsg)) == -1) |
fatalx("imsg_get failed"); |
fatalx("imsg_get failed"); |
if (n == 0) |
if (n == 0) |
return (0); |
return (0); |
|
|
|
data = imsg.data; |
datalen = imsg.hdr.len - IMSG_HEADER_SIZE; |
datalen = imsg.hdr.len - IMSG_HEADER_SIZE; |
|
|
log_debug("got %d from server", imsg.hdr.type); |
log_debug("got %d from server", imsg.hdr.type); |
switch (imsg.hdr.type) { |
switch (imsg.hdr.type) { |
case MSG_EXIT: |
case MSG_EXIT: |
case MSG_SHUTDOWN: |
case MSG_SHUTDOWN: |
if (datalen != sizeof exitdata) { |
if (datalen != sizeof retval && datalen != 0) |
if (datalen != 0) |
fatalx("bad MSG_EXIT size"); |
fatalx("bad MSG_EXIT size"); |
if (datalen == sizeof retval) { |
} else { |
memcpy(&retval, data, sizeof retval); |
memcpy(&exitdata, imsg.data, sizeof exitdata); |
client_exitval = retval; |
client_exitval = exitdata.retcode; |
|
} |
} |
imsg_free(&imsg); |
imsg_free(&imsg); |
return (-1); |
return (-1); |
|
|
break; |
break; |
case MSG_STDOUT: |
case MSG_STDOUT: |
if (datalen != sizeof stdoutdata) |
if (datalen != sizeof stdoutdata) |
fatalx("bad MSG_STDOUT"); |
fatalx("bad MSG_STDOUT size"); |
memcpy(&stdoutdata, imsg.data, sizeof stdoutdata); |
memcpy(&stdoutdata, data, sizeof stdoutdata); |
|
|
client_write(STDOUT_FILENO, stdoutdata.data, stdoutdata.size); |
client_write(STDOUT_FILENO, stdoutdata.data, stdoutdata.size); |
break; |
break; |
case MSG_STDERR: |
case MSG_STDERR: |
if (datalen != sizeof stderrdata) |
if (datalen != sizeof stderrdata) |
fatalx("bad MSG_STDERR"); |
fatalx("bad MSG_STDERR size"); |
memcpy(&stderrdata, imsg.data, sizeof stderrdata); |
memcpy(&stderrdata, data, sizeof stderrdata); |
|
|
client_write(STDERR_FILENO, stderrdata.data, stderrdata.size); |
client_write(STDERR_FILENO, stderrdata.data, stderrdata.size); |
break; |
break; |
|
|
imsg_free(&imsg); |
imsg_free(&imsg); |
return (-1); |
return (-1); |
case MSG_SHELL: |
case MSG_SHELL: |
if (datalen != sizeof shelldata) |
if (data[datalen - 1] != '\0') |
fatalx("bad MSG_SHELL size"); |
fatalx("bad MSG_SHELL string"); |
memcpy(&shelldata, imsg.data, sizeof shelldata); |
|
shelldata.shell[(sizeof shelldata.shell) - 1] = '\0'; |
|
|
|
clear_signals(0); |
clear_signals(0); |
|
shell_exec(data, data0); |
shell_exec(shelldata.shell, shellcmd); |
|
/* NOTREACHED */ |
/* NOTREACHED */ |
case MSG_DETACH: |
case MSG_DETACH: |
client_write_server(MSG_EXITING, NULL, 0); |
client_write_server(MSG_EXITING, NULL, 0); |
|
|
int |
int |
client_dispatch_attached(void) |
client_dispatch_attached(void) |
{ |
{ |
struct imsg imsg; |
struct imsg imsg; |
struct msg_lock_data lockdata; |
struct sigaction sigact; |
struct sigaction sigact; |
char *data; |
ssize_t n, datalen; |
ssize_t n, datalen; |
|
|
for (;;) { |
for (;;) { |
if ((n = imsg_get(&client_ibuf, &imsg)) == -1) |
if ((n = imsg_get(&client_ibuf, &imsg)) == -1) |
fatalx("imsg_get failed"); |
fatalx("imsg_get failed"); |
if (n == 0) |
if (n == 0) |
return (0); |
return (0); |
|
|
|
data = imsg.data; |
datalen = imsg.hdr.len - IMSG_HEADER_SIZE; |
datalen = imsg.hdr.len - IMSG_HEADER_SIZE; |
|
|
log_debug("got %d from server", imsg.hdr.type); |
log_debug("got %d from server", imsg.hdr.type); |
|
|
client_write_server(MSG_EXITING, NULL, 0); |
client_write_server(MSG_EXITING, NULL, 0); |
break; |
break; |
case MSG_EXIT: |
case MSG_EXIT: |
if (datalen != 0 && |
if (datalen != 0 && datalen != sizeof (int)) |
datalen != sizeof (struct msg_exit_data)) |
|
fatalx("bad MSG_EXIT size"); |
fatalx("bad MSG_EXIT size"); |
|
|
client_write_server(MSG_EXITING, NULL, 0); |
client_write_server(MSG_EXITING, NULL, 0); |
|
|
kill(getpid(), SIGTSTP); |
kill(getpid(), SIGTSTP); |
break; |
break; |
case MSG_LOCK: |
case MSG_LOCK: |
if (datalen != sizeof lockdata) |
if (data[datalen - 1] != '\0') |
fatalx("bad MSG_LOCK size"); |
fatalx("bad MSG_LOCK string"); |
memcpy(&lockdata, imsg.data, sizeof lockdata); |
|
|
|
lockdata.cmd[(sizeof lockdata.cmd) - 1] = '\0'; |
system(data); |
system(lockdata.cmd); |
|
client_write_server(MSG_UNLOCK, NULL, 0); |
client_write_server(MSG_UNLOCK, NULL, 0); |
break; |
break; |
default: |
default: |