respond to shutdown signals

ulab-original
jsorg71 20 years ago
parent 7ac2f6506f
commit 6b9be46dd2

@ -1,7 +1,8 @@
SESMANOBJ = sesman.o ../common/os_calls.o ../common/d3des.o SESMANOBJ = sesman.o os_calls.o d3des.o
CFLAGS = -Wall -O2 -I../common CFLAGS = -Wall -O2 -I../common
C_OS_FLAGS = $(CFLAGS) -c
LDFLAGS = -L /usr/gnu/lib LDFLAGS = -L /usr/gnu/lib
LIBS = -lpam_userpass -lpam LIBS = -lpam_userpass -lpam
PAMLIB = PAMLIB =
@ -14,3 +15,9 @@ sesman: $(SESMANOBJ)
clean: clean:
rm -f $(SESMANOBJ) sesman rm -f $(SESMANOBJ) sesman
os_calls.o:
$(CC) $(C_OS_FLAGS) ../common/os_calls.c
d3des.o:
$(CC) $(C_OS_FLAGS) ../common/d3des.c

@ -45,6 +45,9 @@
#define SERVICE "xrdp" #define SERVICE "xrdp"
int g_sck;
int g_pid;
struct session_item struct session_item
{ {
char name[256]; char name[256];
@ -402,6 +405,19 @@ int start_session(int width, int height, int bpp, char* username,
return display; return display;
} }
/******************************************************************************/
void sesman_shutdown(int sig)
{
if (getpid() != g_pid)
{
return;
}
g_printf("shutting down\n\r");
g_printf("signal %d pid %d\n\r", sig, getpid());
g_tcp_close(g_sck);
}
/******************************************************************************/ /******************************************************************************/
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
@ -425,7 +441,11 @@ int main(int argc, char** argv)
char pass[256]; char pass[256];
struct session_item* s_item; struct session_item* s_item;
signal(2, sesman_shutdown);
signal(9, sesman_shutdown);
signal(15, sesman_shutdown);
g_memset(&session_items, 0, sizeof(session_items)); g_memset(&session_items, 0, sizeof(session_items));
g_pid = getpid();
if (argc == 1) if (argc == 1)
{ {
g_printf("xrdp session manager v0.1\n"); g_printf("xrdp session manager v0.1\n");
@ -441,19 +461,19 @@ start session\n");
make_stream(out_s); make_stream(out_s);
init_stream(out_s, 8192); init_stream(out_s, 8192);
g_printf("listening\n"); g_printf("listening\n");
sck = g_tcp_socket(); g_sck = g_tcp_socket();
g_tcp_set_non_blocking(sck); g_tcp_set_non_blocking(g_sck);
error = g_tcp_bind(sck, "3350"); error = g_tcp_bind(g_sck, "3350");
if (error == 0) if (error == 0)
{ {
error = g_tcp_listen(sck); error = g_tcp_listen(g_sck);
if (error == 0) if (error == 0)
{ {
in_sck = g_tcp_accept(sck); in_sck = g_tcp_accept(g_sck);
while (in_sck == -1 && g_tcp_last_error_would_block(sck)) while (in_sck == -1 && g_tcp_last_error_would_block(g_sck))
{ {
g_sleep(1000); g_sleep(1000);
in_sck = g_tcp_accept(sck); in_sck = g_tcp_accept(g_sck);
} }
while (in_sck > 0) while (in_sck > 0)
{ {
@ -513,12 +533,12 @@ start session\n");
} }
} }
} }
close(in_sck); g_tcp_close(in_sck);
in_sck = g_tcp_accept(sck); in_sck = g_tcp_accept(g_sck);
while (in_sck == -1 && g_tcp_last_error_would_block(sck)) while (in_sck == -1 && g_tcp_last_error_would_block(g_sck))
{ {
g_sleep(1000); g_sleep(1000);
in_sck = g_tcp_accept(sck); in_sck = g_tcp_accept(g_sck);
} }
} }
} }
@ -531,7 +551,7 @@ start session\n");
{ {
g_printf("bind error\n"); g_printf("bind error\n");
} }
g_tcp_close(sck); g_tcp_close(g_sck);
free_stream(in_s); free_stream(in_s);
free_stream(out_s); free_stream(out_s);
} }

Loading…
Cancel
Save