Created
September 24, 2015 15:18
-
-
Save abhisek/e365e73650d25d242d3a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
#include <sys/time.h> | |
#include <netinet/in.h> | |
#include <unistd.h> | |
#include <signal.h> | |
#include <assert.h> | |
#define SRV_ADDR "0.0.0.0" | |
#define SRV_PORT 9001 | |
void handle_client(int sock) | |
{ | |
char *args[] = { "sbox", NULL }; | |
dup2(sock, 0); dup2(sock, 1); dup2(sock, 2); | |
//close(0); close(1); close(2); | |
execv(args[0], args); | |
perror("execv"); | |
} | |
void child_handler(int signo) | |
{ | |
printf("Child exit (%d)\n", signo); | |
} | |
void segv_handler(int signo) | |
{ | |
printf("SIGSEGV (%d)\n", signo); | |
exit(EXIT_FAILURE); | |
} | |
void abrt_handler(int signo) | |
{ | |
printf("SIGABRT (%d)\n", signo); | |
exit(EXIT_FAILURE); | |
} | |
int srv_run() | |
{ | |
struct sockaddr_in sin; | |
struct sockaddr_in cin; | |
int srv_fd, cln_fd; | |
int tmp; | |
int sop; | |
srv_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); | |
assert(srv_fd > 0); | |
sop = 1; | |
setsockopt(srv_fd, SOL_SOCKET, SO_REUSEADDR, (void*) &sop, sizeof(sop)); | |
sin.sin_addr.s_addr = inet_addr(SRV_ADDR); | |
sin.sin_port = htons(SRV_PORT); | |
sin.sin_family = AF_INET; | |
assert(!bind(srv_fd, (struct sockaddr*) &sin, sizeof(sin))); | |
listen(srv_fd, 100); | |
//signal(SIGCHLD, child_handler); | |
signal(SIGCHLD, SIG_IGN); | |
while(1) { | |
tmp = sizeof(cin); | |
cln_fd = accept(srv_fd, (struct sockaddr*) &cin, &tmp); | |
if(cln_fd < 0) | |
continue; | |
printf("Received connection from %s:%d\n", (char*) inet_ntoa(cin.sin_addr), ntohs(cin.sin_port)); | |
if(!fork()) { | |
printf("Processing client: pid: %d socket: %d\n", getpid(), cln_fd); | |
//signal(SIGSEGV, segv_handler); | |
//signal(SIGABRT, abrt_handler); | |
close(srv_fd); | |
handle_client(cln_fd); | |
shutdown(cln_fd, SHUT_RDWR); | |
close(cln_fd); | |
exit(0); | |
} | |
close(cln_fd); | |
} | |
} | |
int main(int argc, char **argv) | |
{ | |
return srv_run(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment