ttcpd

Trivial tcp daemon
git clone git://git.finwo.net/app/ttcpd
Log | Files | Refs | LICENSE

commit 8af8847355874ef9102203174cdc1d0904f20136
parent 1561f5b08353acf2e4d1408152db0bb0ff88036d
Author: finwo <finwo@pm.me>
Date:   Wed, 15 Nov 2017 19:34:42 +0100

Copied main code from finwo/bchroot

Diffstat:
A.dep | 4++++
A.gitignore | 6++++++
Abuild/50-Makefile | 2++
Asrc/main.c | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 70 insertions(+), 0 deletions(-)

diff --git a/.dep b/.dep @@ -0,0 +1,4 @@ +AUTHOR="Robin Bron" +NAME="tcpd" +DEPS=() +DEPS+=("cdeps/cc-simple") diff --git a/.gitignore b/.gitignore @@ -0,0 +1,6 @@ +*.o +*.d +*.swp +/lib +/Makefile +/tcpd diff --git a/build/50-Makefile b/build/50-Makefile @@ -0,0 +1,2 @@ +tcpd: $(OBJS) + $(CC) $(OBJS) $(CFLAGS) -o $@ diff --git a/src/main.c b/src/main.c @@ -0,0 +1,58 @@ +#include <netinet/in.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/socket.h> +#include <sys/wait.h> +#include <unistd.h> + +int error( char *str ) { + printf("%s\n", str); + exit(1); +} + +int main( int argc, char **argv ) { + if(argc<3) error("Not enough arguments"); + int i, port = 8080; + char *cmd = 0; + char **args = 0; + for(i=0;i<4&&i<argc;i++) { + switch(i) { + case 0: break; + case 1: port = atoi(*(argv+i)); break; + case 2: cmd=*(argv+i); break; + case 3: args=argv+i; break; + } + } + + int sockfd = socket( AF_INET, SOCK_STREAM, 0 ); + if(sockfd<0) error("socket"); + struct sockaddr_in saddr, caddr; + bzero((char *) &saddr, sizeof(saddr)); + saddr.sin_family = AF_INET; + saddr.sin_addr.s_addr = INADDR_ANY; + saddr.sin_port = htons(port); + + if(bind(sockfd,(struct sockaddr *) &saddr, sizeof(saddr)) < 0) { + error("bind"); + } + + listen(sockfd,5); + printf("Listening on port %d\n", port); + socklen_t clen = sizeof(caddr); + int nsock; + while( (nsock=accept(sockfd,(struct sockaddr *) &caddr,&clen)) >= 0 ) { + if(fork()) { + close(nsock); + waitpid(-1,NULL,WNOHANG); + } else { + dup2(nsock,0); + dup2(nsock,1); + close(nsock); + execvp( cmd, args ); + return 3; + } + } + + return 0; +}