Explorar o código

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@463 54d463be-8e91-2dee-dedb-b68131a5f0ec

mc_cameri %!s(int64=20) %!d(string=hai) anos
pai
achega
f81cef7396

+ 3 - 0
src/webserver/Changelog.txt

@@ -0,0 +1,3 @@
+Date	Added
+12/3	
+	* Creation of eAthena Web Server v2 [MC Cameri]

+ 32 - 0
src/webserver/Makefile

@@ -0,0 +1,32 @@
+CC = gcc -pipe
+MAKE = make
+OPT = -g -O2 -ffast-math
+
+ifeq ($(findstring CYGWIN,$(PLATFORM)), CYGWIN)
+CFLAGS = $(OPT) -Wall -I../common
+else
+CFLAGS = $(OPT) -Wall -I../common
+endif
+
+OBJ  = main.o webserver.o ../common/showmsg.o
+LINKOBJ  = main.o webserver.o ../common/showmsg.o
+
+all: clean webserver run
+
+clean:
+	rm -f *.o webserver.exe ../common/showmsg.o
+
+webserver: main.o webserver.o ../common/showmsg.o
+	$(CC) $(OPT) -o "Webserver.exe" $(OBJ)
+
+main.o: main.c
+	$(CC) $(OPT) -c main.c -o main.o $(CFLAGS)
+
+webserver.o: webserver.c
+	$(CC) $(OPT) -c webserver.c -o webserver.o $(CFLAGS)
+
+../common/showmsg.o: ../common/showmsg.c
+	$(CC) $(OPT) -c ../common/showmsg.c -o ../common/showmsg.o $(CFLAGS)
+
+run:
+	./webserver

+ 35 - 0
src/webserver/Makefile.win

@@ -0,0 +1,35 @@
+# Project: Webserver
+# Makefile created by Dev-C++ 4.9.8.0
+
+CPP  = g++.exe -D__DEBUG__
+CC   = gcc.exe -D__DEBUG__
+WINDRES = windres.exe
+RES  = 
+OBJ  = main.o webserver.o ../common/showmsg.o $(RES)
+LINKOBJ  = main.o webserver.o ../common/showmsg.o $(RES)
+LIBS =  -L"C:/Program Files/Dev-Cpp/lib" -L"C:/cygwin/lib" 
+INCS =  -I"C:/Program Files/Dev-Cpp/include"  -I"C:/cygwin/usr/include"  -I"C:/cygwin/usr/include/mingw" 
+CXXINCS =  -I"C:/Program Files/Dev-Cpp/include/c++"  -I"C:/Program Files/Dev-Cpp/include/c++/mingw32"  -I"C:/Program Files/Dev-Cpp/include/c++/backward"  -I"C:/Program Files/Dev-Cpp/include"  -I"C:/cygwin/usr/include/c++/3.3.1" 
+BIN  = webserver.exe
+CXXFLAGS = $(CXXINCS)  -pg -g3
+CFLAGS = $(INCS)  -pg -g3
+
+.PHONY: all all-before all-after clean clean-custom
+
+all: all-before webserver.exe all-after
+
+
+clean: clean-custom
+	rm -f $(OBJ) $(BIN)
+
+$(BIN): $(LINKOBJ)
+	$(CC) $(LINKOBJ) -o "webserver.exe" $(LIBS)
+
+main.o: main.c
+	$(CC) -c main.c -o main.o $(CFLAGS)
+
+webserver.o: webserver.c
+	$(CC) -c webserver.c -o webserver.o $(CFLAGS)
+
+../common/showmsg.o: ../common/showmsg.c
+	$(CC) -c ../common/showmsg.c -o ../common/showmsg.o $(CFLAGS)

+ 24 - 0
src/webserver/WEBSER~1.layout

@@ -0,0 +1,24 @@
+[Editors]
+Focused=-1
+Order=-1,0
+[Editor_0]
+Open=1
+Top=0
+CursorCol=5
+CursorRow=30
+TopLine=1
+LeftChar=1
+[Editor_1]
+Open=1
+Top=0
+CursorCol=1
+CursorRow=35
+TopLine=16
+LeftChar=1
+[Editor_2]
+Open=1
+Top=1
+CursorCol=14
+CursorRow=4
+TopLine=1
+LeftChar=1

+ 97 - 0
src/webserver/Webserver.dev

@@ -0,0 +1,97 @@
+[Project]
+FileName=Webserver.dev
+Name=Webserver
+UnitCount=5
+Type=1
+Ver=1
+ObjFiles=
+Includes=
+Libs=
+PrivateResource=
+ResourceIncludes=
+MakeIncludes=
+Compiler=
+CppCompiler=
+Linker=
+IsCpp=0
+Icon=
+ExeOutput=
+ObjectOutput=
+OverrideOutput=1
+OverrideOutputName=webserver.exe
+HostApplication=
+Folders=common
+CommandLine=
+IncludeVersionInfo=0
+SupportXPThemes=0
+CompilerSet=1
+CompilerSettings=000000000000000000
+
+[Unit1]
+FileName=main.c
+CompileCpp=0
+Folder=
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=$(CC) -c main.c -o main.o webserver.o $(CFLAGS)
+
+[VersionInfo]
+Major=0
+Minor=1
+Release=1
+Build=1
+LanguageID=1033
+CharsetID=1252
+CompanyName=
+FileVersion=
+FileDescription=Developed using the Dev-C++ IDE
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=
+AutoIncBuildNr=0
+
+[Unit2]
+FileName=webserver.c
+CompileCpp=0
+Folder=
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=1
+BuildCmd=$(CC) -c webserver.c -o webserver.o $(CFLAGS)
+
+[Unit3]
+FileName=webserver.h
+CompileCpp=0
+Folder=
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit4]
+FileName=..\common\showmsg.c
+CompileCpp=0
+Folder=common
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+
+[Unit5]
+FileName=..\common\showmsg.h
+CompileCpp=0
+Folder=common
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=
+

BIN=BIN
src/webserver/Webserver.exe


+ 38 - 0
src/webserver/Webserver.layout

@@ -0,0 +1,38 @@
+[Editors]
+Focused=0
+Order=0,2,1,-1
+[Editor_0]
+Open=1
+Top=1
+CursorCol=55
+CursorRow=128
+TopLine=95
+LeftChar=1
+[Editor_1]
+Open=1
+Top=0
+CursorCol=25
+CursorRow=113
+TopLine=92
+LeftChar=1
+[Editor_2]
+Open=1
+Top=0
+CursorCol=1
+CursorRow=21
+TopLine=1
+LeftChar=1
+[Editor_3]
+Open=0
+Top=0
+CursorCol=20
+CursorRow=2
+TopLine=1
+LeftChar=1
+[Editor_4]
+Open=0
+Top=0
+CursorCol=20
+CursorRow=1
+TopLine=1
+LeftChar=1

+ 36 - 0
src/webserver/conf/webserver-athena.conf

@@ -0,0 +1,36 @@
+#############################################################
+#        ______  __    __                                   #
+#       /\  _  \/\ \__/\ \                                  #
+#     __\ \ \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            #
+#############################################################
+
+// Display the eAthena Logo at startup?
+show_title: 1
+
+//Web Server Port
+port: 81
+
+//Web Server Password
+password: juan16
+
+//Page Header
+header: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+//Document index
+document_index: index.xhtml
+
+//Send favorite icon if provided?
+favicon: yes

+ 9 - 0
src/webserver/home/index.xhtml

@@ -0,0 +1,9 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>Hello!</title>
+</head>
+<body>
+!{CLIENT_FD}
+</body>
+</html>

+ 144 - 0
src/webserver/main.c

@@ -0,0 +1,144 @@
+/******************************************************************************
+ #	            ______  __    __                                 			  #
+ #	           /\  _  \/\ \__/\ \                                			  #
+ #	         __\ \ \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 <stdio.h>
+#include <stdlib.h>
+#include <strings.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <unistd.h>
+#include <errno.h>
+
+#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;
+}

+ 136 - 0
src/webserver/webserver.c

@@ -0,0 +1,136 @@
+/******************************************************************************
+ #	            ______  __    __                                 			  #
+ #	           /\  _  \/\ \__/\ \                                			  #
+ #	         __\ \ \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 <stdio.h>
+#include <strings.h>
+#include "../common/showmsg.h"
+#include "webserver.h"
+
+char ws_password[17] = "pass";
+char ws_header[128] = {'\0'};
+
+/* Displays the eAthena Logo */
+void ws_display_title(void)
+{
+	printf("\033[2J");
+	printf("\033[37;44m          (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n");
+	printf("\033[0;44m          (\033[1;33m        (c)2004 eAthena Development Team presents        \033[0;44m)\033[K\033[0m\n");
+	printf("\033[0;44m          (\033[1m       ______  __    __                                  \033[0;44m)\033[K\033[0m\n");
+	printf("\033[0;44m          (\033[1m      /\\  _  \\/\\ \\__/\\ \\                                 \033[0;44m)\033[K\033[0m\n");
+	printf("\033[0;44m          (\033[1m    __\\ \\ \\_\\ \\ \\ ,_\\ \\ \\___      __    ___      __      \033[0;44m)\033[K\033[0m\n");
+	printf("\033[0;44m          (\033[1m  /'__`\\ \\  __ \\ \\ \\/\\ \\  _ `\\  /'__`\\/' _ `\\  /'__`\\    \033[0;44m)\033[K\033[0m\n");
+	printf("\033[0;44m          (\033[1m /\\  __/\\ \\ \\/\\ \\ \\ \\_\\ \\ \\ \\ \\/\\  __//\\ \\/\\ \\/\\ \\_\\.\\_  \033[0;44m)\033[K\033[0m\n");
+	printf("\033[0;44m          (\033[1m \\ \\____\\\\ \\_\\ \\_\\ \\__\\\\ \\_\\ \\_\\ \\____\\ \\_\\ \\_\\ \\__/.\\_\\ \033[0;44m)\033[K\033[0m\n");
+	printf("\033[0;44m          (\033[1m  \\/____/ \\/_/\\/_/\\/__/ \\/_/\\/_/\\/____/\\/_/\\/_/\\/__/\\/_/ \033[0;44m)\033[K\033[0m\n");
+	printf("\033[0;44m          (\033[1m   _   _   _   _   _   _   _     _   _   _   _   _   _   \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
+	printf("\033[0;44m          (\033[1m  / \\ / \\ / \\ / \\ / \\ / \\ / \\   / \\ / \\ / \\ / \\ / \\ / \\  \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
+	printf("\033[0;44m          (\033[1m ( e | n | g | l | i | s | h ) ( A | t | h | e | n | a ) \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
+	printf("\033[0;44m          (\033[1m  \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/   \\_/ \\_/ \\_/ \\_/ \\_/ \\_/  \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char
+	printf("\033[0;44m          (\033[1m                                                         \033[0;44m)\033[K\033[0m\n"); // yellow writing (33)
+	printf("\033[0;44m          (\033[1;33m  Advanced Fusion Maps (c) 2003-2004 The Fusion Project  \033[0;44m)\033[K\033[0m\n"); // yellow writing (33)
+	printf("\033[37;44m          (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n\n"); // reset color
+}
+/* Returns a boolean value given character string */
+int ws_config_switch(const char *str) {
+	if (strcmpEx(str, "on") == 0 || strcmpEx(str, "yes") == 0 ||
+		strcmpEx(str, "oui") == 0 || strcmpEx(str, "ja") == 0 ||
+		strcmpEx(str, "si") == 0 || strcmpEx(str,"true") == 0)
+		return 1;
+	if (strcmpEx(str, "off") == 0 || strcmpEx(str, "no") == 0 ||
+		strcmpEx(str, "non") == 0 || strcmpEx(str, "nein") == 0 ||
+		strcmpEx(str, "false") == 0)
+		return 0;
+	return atoi(str);
+}
+
+/*  Reads the eAthena Web Server's configuration file */
+int ws_config_read(const char *cfgName)
+{
+	int i;
+	char line[1024],w1[1024],w2[1024],temp[1024];
+	FILE *fp;
+
+	/* Default values */
+	config.show_title=0;
+	config.port=80;
+
+
+	fp=fopen(cfgName,"r");
+	if(fp==NULL){
+		snprintf(temp,sizeof(temp),"Could not open \033[1;29m%s\033[0;0m, file not found.\n",cfgName);
+		ShowMessage(temp,MSG_ERROR);
+		return 1;
+	}
+	while(fgets(line,1020,fp)){
+		const struct {
+			char str[128];
+			int *val;
+		} data[] ={
+			//List of variables
+			{ "show_title",		&config.show_title	},
+			{ "port",			&config.port		},
+		};
+
+		if((line[0] == '/' && line[1] == '/') || (line[0]=='#') ||
+			(sscanf(line,"%1023[^:]:%1023[^\n]",w1,w2) !=2))
+			continue;
+		for(i=0;i<sizeof(data)/(sizeof(data[0]));i++) {
+			if(strcmpEx(w1,data[i].str)==0){
+				*data[i].val=ws_config_switch(w2);
+				break;
+			}
+		}
+		if(strcmpEx(w1,"import")==0) {
+			ws_config_read(w2);
+			continue;
+		}
+		if(strcmpEx(w1,"password")==0) {
+			if (strlen(w2)>16) {
+				ShowError("The Web Server password is too long, maximum passwor"
+					"d length is 16 characters.\n");
+				return 1;
+			}
+			strcpy(ws_password,w2);
+			continue;
+		}
+		if(strcmpEx(w1,"header")==0) {
+			if (strlen(w2)>127) {
+				ShowError("The Web Server header is too long, maximum header"
+					"d length is 127 characters.\n");
+				return 1;
+			}
+			strcpy(ws_header,w2);
+			continue;
+		}
+	}
+	fclose(fp);
+
+	//Correct values
+	if(config.show_title < 0)
+		config.show_title = 0;
+	if(config.port < 1 || config.port > 65534)
+		config.port=80;
+
+	return 0;
+}
+
+void ws_sigchld_handler(int s)
+{
+	while(wait(NULL) > 0);
+}

+ 21 - 0
src/webserver/webserver.h

@@ -0,0 +1,21 @@
+#ifndef WEBSERV_H_
+#define WEBSERV_H_
+
+#define strcmpEx(x,y) (strcasecmp(x,y))
+
+extern void ws_display_title(void);
+
+extern int ws_config_read(const char *cfgName);
+
+extern struct config {
+	int show_title;
+	int port;
+} config;
+
+extern char ws_password[17]; //16 chars + \0
+
+extern char ws_header[128]; //!?
+
+extern void ws_sigchld_handler(int s);
+
+#endif