version 1.41, 2009/09/23 06:18:47 |
version 1.42, 2009/09/23 08:21:57 |
|
|
int server_create_socket(void); |
int server_create_socket(void); |
int server_main(int); |
int server_main(int); |
void server_shutdown(void); |
void server_shutdown(void); |
|
int server_should_shutdown(void); |
void server_child_signal(void); |
void server_child_signal(void); |
void server_fill_windows(struct pollfd **); |
void server_fill_windows(struct pollfd **); |
void server_handle_windows(struct pollfd **); |
void server_handle_windows(struct pollfd **); |
|
|
struct window *w; |
struct window *w; |
struct pollfd *pfds, *pfd; |
struct pollfd *pfds, *pfd; |
int nfds, xtimeout; |
int nfds, xtimeout; |
u_int i, n; |
u_int i; |
time_t now, last; |
time_t now, last; |
|
|
siginit(); |
siginit(); |
|
|
if (sigterm) |
if (sigterm) |
server_shutdown(); |
server_shutdown(); |
|
|
|
/* Stop if no sessions or clients left. */ |
|
if (server_should_shutdown()) |
|
break; |
|
|
/* Handle child exit. */ |
/* Handle child exit. */ |
if (sigchld) { |
if (sigchld) { |
server_child_signal(); |
server_child_signal(); |
|
|
|
|
/* Collect dead clients and sessions. */ |
/* Collect dead clients and sessions. */ |
server_clean_dead(); |
server_clean_dead(); |
|
|
/* |
|
* If we have no sessions and clients left, let's get out |
|
* of here... |
|
*/ |
|
n = 0; |
|
for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { |
|
if (ARRAY_ITEM(&sessions, i) != NULL) |
|
n++; |
|
} |
|
for (i = 0; i < ARRAY_LENGTH(&clients); i++) { |
|
if (ARRAY_ITEM(&clients, i) != NULL) |
|
n++; |
|
} |
|
if (n == 0) |
|
break; |
|
} |
} |
if (pfds != NULL) |
if (pfds != NULL) |
xfree(pfds); |
xfree(pfds); |
|
|
struct client *c; |
struct client *c; |
u_int i, j; |
u_int i, j; |
|
|
|
for (i = 0; i < ARRAY_LENGTH(&clients); i++) { |
|
c = ARRAY_ITEM(&clients, i); |
|
if (c != NULL) { |
|
if (c->flags & (CLIENT_BAD|CLIENT_SUSPENDED)) |
|
server_lost_client(c); |
|
else |
|
server_write_client(c, MSG_SHUTDOWN, NULL, 0); |
|
} |
|
} |
|
|
for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { |
for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { |
s = ARRAY_ITEM(&sessions, i); |
s = ARRAY_ITEM(&sessions, i); |
for (j = 0; j < ARRAY_LENGTH(&clients); j++) { |
for (j = 0; j < ARRAY_LENGTH(&clients); j++) { |
|
|
if (s != NULL) |
if (s != NULL) |
session_destroy(s); |
session_destroy(s); |
} |
} |
|
} |
|
|
|
/* Check if the server should be shutting down (no more clients or windows). */ |
|
int |
|
server_should_shutdown(void) |
|
{ |
|
u_int i; |
|
|
|
for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { |
|
if (ARRAY_ITEM(&sessions, i) != NULL) |
|
return (0); |
|
} |
for (i = 0; i < ARRAY_LENGTH(&clients); i++) { |
for (i = 0; i < ARRAY_LENGTH(&clients); i++) { |
c = ARRAY_ITEM(&clients, i); |
if (ARRAY_ITEM(&clients, i) != NULL) |
if (c != NULL) { |
return (0); |
if (c->flags & CLIENT_BAD) |
|
server_lost_client(c); |
|
else |
|
server_write_client(c, MSG_SHUTDOWN, NULL, 0); |
|
} |
|
} |
} |
|
return (1); |
} |
} |
|
|
/* Handle SIGCHLD. */ |
/* Handle SIGCHLD. */ |