X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=reposerve;a=blobdiff_plain;f=server%2Fsrc%2Fmain.c;h=c1e19d904df51b23e3d88a81c4a19ac2e7d1cb75;hp=ab5c05568dbf19017b0974e8b9583c7ae9ac654b;hb=ec7b115817aa06ede0c2bf933ccdeeb893fdd831;hpb=779888af6bc05f2395e0c9fc0c53067e0674cb27 diff --git a/server/src/main.c b/server/src/main.c index ab5c055..c1e19d9 100644 --- a/server/src/main.c +++ b/server/src/main.c @@ -4,20 +4,25 @@ #include #include #include +#include #include +#include #include #include #include #include +#include #include "repo.h" #include "client.h" static const char *guess_repo_name(const char *path); +static void sighandler(int s); static int parse_args(int argc, char **argv); static const char *repo_name; static int lis = -1; static int port = 64357; +static int quit; static struct client *clients; @@ -32,6 +37,12 @@ int main(int argc, char **argv) return 1; } + signal(SIGINT, sighandler); + signal(SIGQUIT, sighandler); + signal(SIGILL, sighandler); + signal(SIGSEGV, sighandler); + signal(SIGTERM, sighandler); + if(repo_init(repo_path) == -1) { return 1; } @@ -49,6 +60,7 @@ int main(int argc, char **argv) fprintf(stderr, "failed to create socket: %s\n", strerror(errno)); return 1; } + fcntl(lis, F_SETFL, fcntl(lis, F_GETFL) | O_NONBLOCK); memset(&addr, 0, sizeof addr); addr.sin_family = AF_INET; @@ -80,7 +92,7 @@ int main(int argc, char **argv) perror("select failed"); break; } - + if(quit) break; if(res <= 0) continue; dummy.next = clients; @@ -90,7 +102,10 @@ int main(int argc, char **argv) if(handle_client(c->next) == -1) { struct client *tmp = c->next; c->next = tmp->next; + + printf("Client %s disconnected\n", tmp->addr ? tmp->addr : "unknown"); close(tmp->s); + free(tmp->addr); free(tmp); continue; } @@ -100,10 +115,15 @@ int main(int argc, char **argv) clients = dummy.next; if(FD_ISSET(lis, &rdset)) { - if((s = accept(lis, 0, 0)) == -1) { + struct sockaddr_in addr; + unsigned int addrsz = sizeof addr; + + if((s = accept(lis, (struct sockaddr*)&addr, &addrsz)) == -1) { perror("failed to accept connection"); continue; } + fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK); + if(!(c = calloc(1, sizeof *c))) { perror("failed to allocate memory for client structure"); close(s); @@ -111,12 +131,16 @@ int main(int argc, char **argv) } c->s = s; c->next = clients; + c->addr = strdup(inet_ntoa(addr.sin_addr)); clients = c; send_string(c, "reposerve-0.1 protocol:0\n"); + + printf("Connection from: %s\n", c->addr ? c->addr : "unknown"); } } + printf("Shutting down\n"); return 0; } @@ -146,6 +170,11 @@ fail: return 0; } +static void sighandler(int s) +{ + quit = 1; +} + static void print_usage(const char *argv0) { printf("Usage: %s [options] [repo path]\n", argv0);