/****************************************************************************** # ______ __ __ # # /\ _ \/\ \__/\ \ # # __\ \ \L\ \ \ ,_\ \ \___ __ ___ __ # # /'__`\ \ __ \ \ \/\ \ _ `\ /'__`\/' _ `\ /'__`\ # # /\ __/\ \ \/\ \ \ \_\ \ \ \ \/\ __//\ \/\ \/\ \L\.\_ # # \ \____\\ \_\ \_\ \__\\ \_\ \_\ \____\ \_\ \_\ \__/.\_\ # # \/____/ \/_/\/_/\/__/ \/_/\/_/\/____/\/_/\/_/\/__/\/_/ # # eAthena Web Server (Second Edition) # # by MC Cameri # # ------------------------------------------------------- # # -Website/Forum- # # http://eathena.deltaanime.net/ # # -Download URL- # # http://eathena.systeminplace.net/ # # -IRC Channel- # # irc://irc.deltaanime.net/#athena # ******************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include "../common/showmsg.h" #include "webserver.h" char ws_password[17]; char ws_header[128]; #define WEB_CONF "conf/webserver-athena.conf" #define MAX_CONNECTIONS 10 #define HOME "home/" struct config config; int main(int argc, char *argv[]) { int server_fd, client_fd; int sin_size; struct sockaddr_in server_addr; struct sockaddr_in client_addr; struct sigaction sa; char recvin[1024]; char path[1024]; char line[1024]; int optval = 1; if (ws_config_read(WEB_CONF)) exit(0); if (config.show_title) ws_display_title(); else printf("eAthena Web Server (Second Edition)\n"); if (strcmpEx(ws_password,"webpass")==0) ShowWarning("You are using the default password (webpass), we highly " "recommend\n that you change it.\n"); else if (strstr(ws_password,"webpass")) ShowWarning("Your password should not contain \"webpass\" in it, it is" " highly\n recommended that you change it.\n"); printf("Web Server Password: %s\n",ws_password); printf("Web Server Port: %d\n",config.port); if ((server_fd = socket(AF_INET, SOCK_STREAM,0)) == -1) { ShowError("In main() -> Could not open socket.\n"); return 1; } if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int)) == -1) { ShowError("In main() -> Could not set socket options.\n"); return 1; } server_addr.sin_family = AF_INET; server_addr.sin_port = htons(config.port); server_addr.sin_addr.s_addr = INADDR_ANY; memset(&(server_addr.sin_zero), '\0', 8); if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0) { snprintf(tmp_output,sizeof(tmp_output),"In main() -> Could not bind to port number: %d\n",config.port); ShowError(tmp_output); return 1; } if (listen(server_fd, MAX_CONNECTIONS) < 0) { snprintf(tmp_output,sizeof(tmp_output),"In main() -> Could not listen on port number: %d\n",config.port); ShowError(tmp_output); return 1; } sa.sa_handler = ws_sigchld_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; if (sigaction(SIGCHLD, &sa, NULL) < 0) { ShowError("In main() -> Invalid sigaction.\n"); return 1; } ShowInfo("eAthena Web Server is now listening for incoming connections.\n"); while(1) { sin_size = sizeof(struct sockaddr_in); client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &sin_size); if (!fork()) { close(server_fd); memset(recvin, 0x0, 500); recv(client_fd, recvin, 500, 0); char *html_output; int count = 0; if (sscanf(recvin,"GET %[a-zA-Z_-.+\%#@~] %*[^\n]",path)==1) { FILE *fp; strcpy(tmp_output,HOME); strcat(tmp_output,path); fp = fopen(tmp_output,"r+"); if (fp==NULL) { send(client_fd,"File not found",strlen("File not found"), 0); close(client_fd); } memset(tmp_output,0x0,strlen(tmp_output)); html_output = (char*)malloc(sizeof(char)*2); while (fgets(line,1023,fp)) { html_output = (char*)realloc(sizeof(html_output)+(sizeof(char)*count)); strcat(html_output,line); printf(line); } send(client_fd,tmp_output,sizeof(tmp_output),0); fclose(fp); } // send(client_fd, ws_header, strlen(ws_header), 0); // generate_page(password, client_fd, get_query(recvin), inet_ntoa(client_addr.sin_addr)); // log_visit(get_query(recvin), inet_ntoa(client_addr.sin_addr)); close(client_fd); exit(0); } close(client_fd); } return 0; }