version 1.48, 2011/01/03 23:35:21 |
version 1.49, 2011/01/08 01:52:36 |
|
|
server_client_create(int fd) |
server_client_create(int fd) |
{ |
{ |
struct client *c; |
struct client *c; |
int mode; |
|
u_int i; |
u_int i; |
|
|
if ((mode = fcntl(fd, F_GETFL)) == -1) |
setblocking(fd, 0); |
fatal("fcntl failed"); |
|
if (fcntl(fd, F_SETFL, mode|O_NONBLOCK) == -1) |
|
fatal("fcntl failed"); |
|
|
|
c = xcalloc(1, sizeof *c); |
c = xcalloc(1, sizeof *c); |
c->references = 0; |
c->references = 0; |
|
|
if (c->flags & CLIENT_TERMINAL) |
if (c->flags & CLIENT_TERMINAL) |
tty_free(&c->tty); |
tty_free(&c->tty); |
|
|
if (c->stdin_fd != -1) |
if (c->stdin_fd != -1) { |
|
setblocking(c->stdin_fd, 1); |
close(c->stdin_fd); |
close(c->stdin_fd); |
|
} |
if (c->stdin_event != NULL) |
if (c->stdin_event != NULL) |
bufferevent_free(c->stdin_event); |
bufferevent_free(c->stdin_event); |
if (c->stdout_fd != -1) |
if (c->stdout_fd != -1) { |
|
setblocking(c->stdout_fd, 1); |
close(c->stdout_fd); |
close(c->stdout_fd); |
|
} |
if (c->stdout_event != NULL) |
if (c->stdout_event != NULL) |
bufferevent_free(c->stdout_event); |
bufferevent_free(c->stdout_event); |
if (c->stderr_fd != -1) |
if (c->stderr_fd != -1) { |
|
setblocking(c->stderr_fd, 1); |
close(c->stderr_fd); |
close(c->stderr_fd); |
|
} |
if (c->stderr_event != NULL) |
if (c->stderr_event != NULL) |
bufferevent_free(c->stderr_event); |
bufferevent_free(c->stderr_event); |
|
|
|
|
return; |
return; |
|
|
bufferevent_disable(c->stdin_event, EV_READ|EV_WRITE); |
bufferevent_disable(c->stdin_event, EV_READ|EV_WRITE); |
|
setblocking(c->stdin_fd, 1); |
close(c->stdin_fd); |
close(c->stdin_fd); |
c->stdin_fd = -1; |
c->stdin_fd = -1; |
|
|
|
|
struct client *c = data; |
struct client *c = data; |
|
|
bufferevent_disable(c->stdout_event, EV_READ|EV_WRITE); |
bufferevent_disable(c->stdout_event, EV_READ|EV_WRITE); |
|
setblocking(c->stdout_fd, 1); |
close(c->stdout_fd); |
close(c->stdout_fd); |
c->stdout_fd = -1; |
c->stdout_fd = -1; |
} |
} |
|
|
struct client *c = data; |
struct client *c = data; |
|
|
bufferevent_disable(c->stderr_event, EV_READ|EV_WRITE); |
bufferevent_disable(c->stderr_event, EV_READ|EV_WRITE); |
|
setblocking(c->stderr_fd, 1); |
close(c->stderr_fd); |
close(c->stderr_fd); |
c->stderr_fd = -1; |
c->stderr_fd = -1; |
} |
} |
|
|
struct msg_identify_data identifydata; |
struct msg_identify_data identifydata; |
struct msg_environ_data environdata; |
struct msg_environ_data environdata; |
ssize_t n, datalen; |
ssize_t n, datalen; |
int mode; |
|
|
|
if ((n = imsg_read(&c->ibuf)) == -1 || n == 0) |
if ((n = imsg_read(&c->ibuf)) == -1 || n == 0) |
return (-1); |
return (-1); |
|
|
NULL, NULL, server_client_in_callback, c); |
NULL, NULL, server_client_in_callback, c); |
if (c->stdin_event == NULL) |
if (c->stdin_event == NULL) |
fatalx("failed to create stdin event"); |
fatalx("failed to create stdin event"); |
|
setblocking(c->stdin_fd, 0); |
|
|
if ((mode = fcntl(c->stdin_fd, F_GETFL)) != -1) |
|
fcntl(c->stdin_fd, F_SETFL, mode|O_NONBLOCK); |
|
|
|
server_client_msg_identify(c, &identifydata, imsg.fd); |
server_client_msg_identify(c, &identifydata, imsg.fd); |
break; |
break; |
case MSG_STDOUT: |
case MSG_STDOUT: |
|
|
NULL, NULL, server_client_out_callback, c); |
NULL, NULL, server_client_out_callback, c); |
if (c->stdout_event == NULL) |
if (c->stdout_event == NULL) |
fatalx("failed to create stdout event"); |
fatalx("failed to create stdout event"); |
|
setblocking(c->stdout_fd, 0); |
|
|
if ((mode = fcntl(c->stdout_fd, F_GETFL)) != -1) |
|
fcntl(c->stdout_fd, F_SETFL, mode|O_NONBLOCK); |
|
break; |
break; |
case MSG_STDERR: |
case MSG_STDERR: |
if (datalen != 0) |
if (datalen != 0) |
|
|
NULL, NULL, server_client_err_callback, c); |
NULL, NULL, server_client_err_callback, c); |
if (c->stderr_event == NULL) |
if (c->stderr_event == NULL) |
fatalx("failed to create stderr event"); |
fatalx("failed to create stderr event"); |
|
setblocking(c->stderr_fd, 0); |
|
|
if ((mode = fcntl(c->stderr_fd, F_GETFL)) != -1) |
|
fcntl(c->stderr_fd, F_SETFL, mode|O_NONBLOCK); |
|
break; |
break; |
case MSG_RESIZE: |
case MSG_RESIZE: |
if (datalen != 0) |
if (datalen != 0) |