/* 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 "inc/deps.h" #include "inc/network.h" #include "inc/util.h" // Structure of file types for nethttp // mimetype struct, searched through when checking mimetype struct { char *ext; char *filetype; } file_extensions [] = { {"gif", "image/gif" }, {"jpg", "image/jpeg" }, {"jpeg","image/jpeg" }, {"png", "image/png" }, {"zip", "application/zip" }, {"gz", "application/gzip" }, {"tar", "application/x-tar" }, {"htm", "text/html" }, {"html","text/html" }, {"cgi", "text/cgi" }, {"asp","text/asp" }, {"xml", "text/xml" }, {"js", "text/js" }, {"css", "text/css" }, {"c", "text/plain" }, {"h", "text/plain" }, {"md", "text/plain" }, {"txt", "text/plain" }, {"ss", "text/plain" }, {"sh", "text/plain" }, {"ogg", "audio/ogg" }, {"mp3", "audio/mpeg" }, {0,0} }; /* Serve process function, on connection catch buffer from socket */ void snet_process_connection(int sockfd, char *srch, char *resp) { char buff[MAX_STRING_BUFSIZE+1]; int rr, wr; //bzero(buff, MAX_STRING_BUFSIZE); // read the message from client and copy it in buffer rr = read(sockfd, buff, sizeof(buff)); if(rr == -1) syn_error("ss:net:client read error"); // print buffer which contains the client contents printf("ss:net: %s\n", buff); fflush(stdout); bzero(buff, MAX_STRING_BUFSIZE); // if msg contains "Exit" then server exit and chat ended. if (strncmp("exit", buff, 4) == 0) { syn_error("ss:net:call to exit"); } if (strncmp(srch, buff, strlen(srch)) == 0) { wr = write(sockfd, resp, sizeof(resp)); if(wr == -1) syn_error("ss:error:network write error!"); } else { wr = write(sockfd, resp, sizeof(resp)); if(wr == -1) syn_error("ss:error:network write error!"); } } /* Main netlisten function */ void snet_listen(int port, char *srch, char *resp) { int sockfd, connfd, length; struct sockaddr_in servaddr; struct sockaddr_in cliaddr; // socket create and verification sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { syn_error("ss:error:network socket creation failed"); } 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, (struct sockaddr*)&servaddr, sizeof(servaddr))) != 0) { syn_error("ss:error:network bind failed"); } // Now server is ready to listen and verification if ((listen(sockfd, 64)) != 0) { syn_error("ss:error:network listen failed"); } else { printf("ss:net:listening on '%d'\n", port); 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) { syn_error("ss:error:network accept failed"); } snet_process_connection(connfd, srch, resp); } // After chatting close the socket close(sockfd); } // Main nettoss function void snet_toss(char *address, int port, char *string) { int sockfd; struct sockaddr_in servaddr; // socket create and varification sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { syn_warn("ss:warn:network, failed to create socket"); return; } 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, (struct sockaddr*)&servaddr, sizeof(servaddr)) != 0) { syn_warn("ss:warn:network, failed to connect to socket"); close(sockfd); return; } else { printf("ss:net:connect: %s:%d\n", address, port); fflush(stdout); } // If write reports -1, exit on error. if(write(sockfd, string, strlen(string)) < 0) syn_warn("ss:warn:network, socket write error!"); // close the socket after pushing content close(sockfd); } // Process connection of nethttp void snet_http_process(int fd, int forkval) { int j, file_fd, buflen, len; long i, filesize; char *fstr = NULL; static char buffer[HTTP_BUFSIZE+1]; // Check to see if file is corrupted filesize = read(fd,buffer,HTTP_BUFSIZE); if(filesize == 0 || filesize == -1) { sprintf(buffer,"HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"); if(write(fd,buffer,strlen(buffer)) < 0) syn_error("ss:net:http socket write error"); sprintf(buffer,"
Could not locate file
ss:http only supports simple GET requests via HTTP/1.0
" \ "