version 1.81, 2010/01/30 19:05:18 |
version 1.82, 2010/02/06 17:15:33 |
|
|
int |
int |
server_start(char *path) |
server_start(char *path) |
{ |
{ |
struct client *c; |
struct window_pane *wp; |
int pair[2]; |
int pair[2], retval; |
char *cause, rpathbuf[MAXPATHLEN]; |
char rpathbuf[MAXPATHLEN]; |
struct timeval tv; |
struct timeval tv; |
|
u_int i; |
|
|
/* The first client is special and gets a socketpair; create it. */ |
/* The first client is special and gets a socketpair; create it. */ |
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0) |
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0) |
|
|
server_fd = server_create_socket(); |
server_fd = server_create_socket(); |
server_client_create(pair[1]); |
server_client_create(pair[1]); |
|
|
if (access(SYSTEM_CFG, R_OK) == 0) { |
retval = 0; |
if (load_cfg(SYSTEM_CFG, NULL, &cause) != 0) |
if (access(SYSTEM_CFG, R_OK) == 0) |
goto error; |
load_cfg(SYSTEM_CFG, NULL, &cfg_ncauses, &cfg_causes); |
} else if (errno != ENOENT) { |
else if (errno != ENOENT) { |
xasprintf(&cause, "%s: %s", strerror(errno), SYSTEM_CFG); |
cfg_add_cause(&cfg_ncauses, &cfg_causes, |
goto error; |
"%s: %s", strerror(errno), SYSTEM_CFG); |
} |
} |
if (cfg_file != NULL && load_cfg(cfg_file, NULL, &cause) != 0) |
if (cfg_file != NULL) |
goto error; |
load_cfg(cfg_file, NULL, &cfg_ncauses, &cfg_causes); |
|
|
|
/* |
|
* If there is a session already, put the current window and pane into |
|
* more mode. |
|
*/ |
|
if (!ARRAY_EMPTY(&sessions) && cfg_ncauses != 0) { |
|
wp = ARRAY_FIRST(&sessions)->curw->window->active; |
|
window_pane_set_mode(wp, &window_more_mode); |
|
for (i = 0; i < cfg_ncauses; i++) { |
|
window_more_add(wp, "%s", cfg_causes[i]); |
|
xfree(cfg_causes[i]); |
|
} |
|
xfree(cfg_causes); |
|
cfg_ncauses = 0; |
|
} |
|
cfg_finished = 1; |
|
|
event_set(&server_ev_accept, |
event_set(&server_ev_accept, |
server_fd, EV_READ|EV_PERSIST, server_accept_callback, NULL); |
server_fd, EV_READ|EV_PERSIST, server_accept_callback, NULL); |
event_add(&server_ev_accept, NULL); |
event_add(&server_ev_accept, NULL); |
|
|
server_signal_set(); |
server_signal_set(); |
server_loop(); |
server_loop(); |
exit(0); |
exit(0); |
|
|
error: |
|
/* Write the error and shutdown the server. */ |
|
c = ARRAY_FIRST(&clients); |
|
|
|
server_write_error(c, cause); |
|
server_write_client(c, MSG_EXIT, NULL, 0); |
|
xfree(cause); |
|
|
|
server_shutdown = 1; |
|
|
|
server_signal_set(); |
|
server_loop(); |
|
exit(1); |
|
} |
} |
|
|
/* Main server loop. */ |
/* Main server loop. */ |