X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=server%2Fsrc%2Fmain.c;h=c1e19d904df51b23e3d88a81c4a19ac2e7d1cb75;hb=ec7b115817aa06ede0c2bf933ccdeeb893fdd831;hp=12bb01f087f564986e64aff3bf7fafeddb4b0ac8;hpb=fdbff4437ad74ce1457051d2f743e50672be1ec4;p=reposerve diff --git a/server/src/main.c b/server/src/main.c index 12bb01f..c1e19d9 100644 --- a/server/src/main.c +++ b/server/src/main.c @@ -4,23 +4,31 @@ #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_path, *repo_name; +static const char *repo_name; static int lis = -1; static int port = 64357; +static int quit; static struct client *clients; +const char *repo_path; + + int main(int argc, char **argv) { struct sockaddr_in addr; @@ -29,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; } @@ -46,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; @@ -77,7 +92,7 @@ int main(int argc, char **argv) perror("select failed"); break; } - + if(quit) break; if(res <= 0) continue; dummy.next = clients; @@ -87,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; } @@ -97,21 +115,32 @@ 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; } - if(!(c = malloc(sizeof *c))) { + 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); continue; } 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; } @@ -141,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);