diff --git a/Makefile b/Makefile index 3c05cb0..c1d4fc3 100755 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ CC ?= gcc CFLAGS += -O2 -pedantic -g -Wall -Wextra CPPFLAGS += -DVERSION=$(VERSION) -D_FORTIFY_SOURCE=2 #CPPFLAGS += -DVERSION=$(VERSION) -LDFLAGS += -lm +LDFLAGS += -lm -lpthread BIN ?= slidescript SRCS=$(wildcard src/*.c) diff --git a/src/network.c b/src/network.c index 6523a70..d6b2494 100644 --- a/src/network.c +++ b/src/network.c @@ -61,7 +61,7 @@ void snet_process_connection(int sockfd, char *srch, char *resp) syn_error("ss:net:call to exit"); } - if (strncmp(srch, buff, strlen(srch)) == 0) + if (strncmp(srch, buff, strlen(srch)-1) == 0) { wr = write(sockfd, resp, sizeof(resp)); if(wr == -1) syn_error("ss:error:network write error!"); @@ -76,7 +76,7 @@ void snet_process_connection(int sockfd, char *srch, char *resp) /* Main netlisten function */ void snet_listen(int port, char *srch, char *resp) { - int sockfd, connfd, length; + int sockfd, connfd, length, pid; struct sockaddr_in servaddr; struct sockaddr_in cliaddr; @@ -111,15 +111,26 @@ void snet_listen(int port, char *srch, char *resp) fflush(stdout); } - for( ; ; ) { - length = sizeof(cliaddr); - // Accept the data packet from client and verification - if((connfd = accept(sockfd, (struct sockaddr*)&cliaddr, (socklen_t*) &length)) < 0) + length = sizeof(cliaddr); + // Accept the data packet from client and verification + while ( (connfd = accept(sockfd, (struct sockaddr*)&cliaddr, (socklen_t*) &length)) ) + { + if((pid = fork()) == -1) { - syn_error("ss:error:network accept failed"); + syn_warn("ss:warn:netlisten failed to fork"); + close(connfd); + continue; + } + else if(pid > 0) + { + close(connfd); + continue; + } + else if(pid == 0) + { + snet_process_connection(connfd, srch, resp); + close(connfd); } - - snet_process_connection(connfd, srch, resp); } // After chatting close the socket @@ -163,6 +174,32 @@ void snet_toss(char *address, int port, char *string) // If write reports -1, exit on error. if(write(sockfd, string, strlen(string)) < 0) syn_warn("ss:warn:network, socket write error!"); + while(sockfd != -1) + { + char *buf = malloc(16129); + int listener = read(sockfd, buf, sizeof(buf)); + + if(listener < 0) + { + syn_warn("ss:warn:nettoss, server killed socket"); + free(buf); + break; + } + else if(listener > 0) + { + if(strncmp("kill", buf, 4) == 0) + { + printf("ss:net: %s called!\n", buf); + free(buf); + break; + } + + printf("ss:net: %s\n", buf); + free(buf); + fflush(stdout); + } + } + // close the socket after pushing content close(sockfd); }