diff --git a/Makefile b/Makefile index 2e6bc17..001c7e0 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ CPPFLAGS += -DVERSION=$(VERSION) -DVERSION_EXTRA=$(VERSION_EXTRA) -D_FORTIFY LDFLAGS += -Wl,-O1,--sort-common,--hash-style=gnu,-z,relro BIN ?= slidescript -OBJECTS = src/main.o src/functions.o src/util.o src/vars.o src/enc.o src/md5.o src/pipe.o +OBJECTS = src/main.o src/functions.o src/util.o src/vars.o src/enc.o src/md5.o src/pipe.o src/network.o all: main diff --git a/src/deps.h b/src/deps.h index 1606921..36f5e87 100644 --- a/src/deps.h +++ b/src/deps.h @@ -10,6 +10,9 @@ #include #include #include +// Networking +#include +#include #define MAX_VAR_NAME_LEN 128 #define MAX_VAR_NAME_BUFSIZE (MAX_VAR_NAME_LEN + 1) diff --git a/src/functions.c b/src/functions.c index 9b6e41f..26e797f 100644 --- a/src/functions.c +++ b/src/functions.c @@ -11,6 +11,7 @@ #include "vars.h" #include "enc.h" #include "md5.h" +#include "network.h" char *process_line(char *line) { @@ -65,7 +66,56 @@ char *process_line(char *line) { tok_srch[strlen(tok_srch)-1] = 0; } - sleep(atoi(tok_srch)); + sleep(atoi(parse_vars(tok_srch))); + return NULL; + } + + /* Networking, listen */ + else if(strncmp("netlisten",tok_srch,9) == 0) + { + tok_srch = strtok(NULL, " "); + if(strcmp(tok_srch, "\n") == 0 || + strcmp(tok_srch, " \n") == 0 || tok_srch == NULL) + syn_error("ss:error:sleep syntax error, need trailing integer for operation"); + + /* if there is a new line, remove it */ + if(tok_srch[strlen(tok_srch)-1] == '\n') + { + tok_srch[strlen(tok_srch)-1] = 0; + } + snet_listen(atoi(parse_vars(tok_srch))); + return NULL; + } + + /* Networking, connect */ + else if(strncmp("netconnect",tok_srch,10) == 0) + { + char address[128]; + char *port; + /* strtok to filename of function */ + tok_srch = strtok(NULL, "\""); + /* Check to see if syntax is correct */ + if(strcmp(tok_srch, "\n") == 0 || + strcmp(tok_srch, " \n") == 0 || tok_srch == NULL) + syn_error("ss:error:netconnect syntax error, requires address followed by port; both in quotes"); + + /* open file */ + strcpy(address, parse_vars(tok_srch)); + + /* strtok to the content that will be written to file */ + tok_srch = strtok(NULL, "\""); + tok_srch = strtok(NULL, "\""); + if(strcmp(tok_srch, "\n") == 0 || + strcmp(tok_srch, " \n") == 0 || tok_srch == NULL) { + syn_error("ss:error:netconnect syntax error on data entry (are you quoted?)"); + } + + if(strtok(NULL, "\"") == NULL) + syn_error("ss:error:netconnect syntax error, missing end quote"); + + port = parse_vars(tok_srch); + printf("%s:%s", address, port); + snet_connect(address, atoi(port)); return NULL; } diff --git a/src/network.c b/src/network.c new file mode 100644 index 0000000..ea0f4da --- /dev/null +++ b/src/network.c @@ -0,0 +1,181 @@ +/* + SlideScript - minimalistic top-down scripting language. + (C) Copyright 2014-2021 Chris Dorman - some rights reserved (GPLv2) + + View README file supplied with this software for more details +*/ + +#include "deps.h" +#include "network.h" + +void snet_bind(int sockfd) +{ + char buff[MAX_STRING_BUFSIZE]; + int n, rr, wr; + // infinite loop for chat + for (;;) + { + bzero(buff, MAX_STRING_BUFSIZE); + + // read the message from client and copy it in buffer + rr = read(sockfd, buff, sizeof(buff)); + + if(rr == -1) break; + + // print buffer which contains the client contents + printf("From client: %s\t To client : ", buff); + bzero(buff, MAX_STRING_BUFSIZE); + n = 0; + // copy server message in the buffer + while ((buff[n++] = getchar()) != '\n') + ; + + // and send that buffer to client + wr = write(sockfd, buff, sizeof(buff)); + + if(wr == -1) break; + + // if msg contains "Exit" then server exit and chat ended. + if (strncmp("exit", buff, 4) == 0) + { + printf("Server Exit...\n"); + break; + } + } +} + +void snet_listen(int port) +{ + int sockfd, connfd; + struct sockaddr_in servaddr; + + // socket create and verification + sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd == -1) + { + printf("socket creation failed...\n"); + exit(0); + } + else + { + printf("Socket successfully created..\n"); + } + + bzero(&servaddr, sizeof(servaddr)); + + // assign IP, PORT + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr = htonl(INADDR_ANY); + servaddr.sin_port = htons(port); + + // Binding newly created socket to given IP and verification + if ((bind(sockfd, (SA*)&servaddr, sizeof(servaddr))) != 0) + { + printf("socket bind failed...\n"); + exit(0); + } + else + { + printf("Socket successfully binded..\n"); + } + + // Now server is ready to listen and verification + if ((listen(sockfd, 10)) != 0) + { + printf("Listen failed...\n"); + exit(0); + } + else + { + printf("Server listening..\n"); + } + + // Accept the data packet from client and verification + connfd = accept(sockfd, (SA*)NULL, NULL); + if (connfd < 0) + { + printf("server acccept failed...\n"); + exit(0); + } + else + { + printf("server acccept the client...\n"); + } + + // Function for chatting between client and server + snet_bind(connfd); + + // After chatting close the socket + close(sockfd); +} + +void snet_serv_bind(int sockfd) +{ + char buff[MAX_STRING_BUFSIZE]; + int n, rr, wr; + + for (;;) + { + bzero(buff, sizeof(buff)); + printf("Enter the string : "); + n = 0; + while ((buff[n++] = getchar()) != '\n') + ; + + wr = write(sockfd, buff, sizeof(buff)); + if(wr == -1) break; + + bzero(buff, sizeof(buff)); + + rr = read(sockfd, buff, sizeof(buff)); + if(rr == -1) break; + + printf("From Server : %s", buff); + if ((strncmp(buff, "exit", 4)) == 0) { + printf("Client Exit...\n"); + break; + } + } +} + +void snet_connect(char *address, int port) +{ + int sockfd; + struct sockaddr_in servaddr; + + // socket create and varification + sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd == -1) + { + printf("socket creation failed...\n"); + exit(0); + } + else + { + printf("Socket successfully created..\n"); + } + + bzero(&servaddr, sizeof(servaddr)); + + // assign IP, PORT + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr = inet_addr(address); + servaddr.sin_port = htons(port); + + // connect the client socket to server socket + if (connect(sockfd, (SA*)&servaddr, sizeof(servaddr)) != 0) + { + printf("connection with the server failed...\n"); + exit(0); + } + else + { + printf("connected to the server..\n"); + } + + // function for chat + snet_serv_bind(sockfd); + + // close the socket + close(sockfd); +} diff --git a/src/network.h b/src/network.h new file mode 100644 index 0000000..d264b4c --- /dev/null +++ b/src/network.h @@ -0,0 +1,14 @@ +/* + SlideScript - minimalistic top-down scripting language. + (C) Copyright 2014-2021 Chris Dorman - some rights reserved (GPLv2) + + View README file supplied with this software for more details +*/ + + +#define SA struct sockaddr + +void snet_bind(int sockfd); +void snet_listen(int port); +void snet_serv_bind(int sockfd); +void snet_connect(char *address, int port);