From 195dffc20af1fb32c7e4119988911b72955aeabc Mon Sep 17 00:00:00 2001
From: "(no author)" <(no author)@54d463be-8e91-2dee-dedb-b68131a5f0ec>
Date: Thu, 4 Nov 2004 23:25:09 +0000
Subject: git-svn-id:
https://rathena.svn.sourceforge.net/svnroot/rathena/athena@2
54d463be-8e91-2dee-dedb-b68131a5f0ec
---
webserver/Makefile | 26 +++++++++
webserver/doc/API.txt | 50 ++++++++++++++++
webserver/doc/README | 11 ++++
webserver/generate.c | 38 +++++++++++++
webserver/htmlstyle.c | 51 +++++++++++++++++
webserver/logs.c | 8 +++
webserver/main.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++
webserver/pages/about.c | 6 ++
webserver/pages/notdone.c | 5 ++
webserver/pages/sample.c | 24 ++++++++
webserver/parse.c | 135 +++++++++++++++++++++++++++++++++++++++++++
11 files changed, 496 insertions(+)
create mode 100644 webserver/Makefile
create mode 100644 webserver/doc/API.txt
create mode 100644 webserver/doc/README
create mode 100644 webserver/generate.c
create mode 100644 webserver/htmlstyle.c
create mode 100644 webserver/logs.c
create mode 100644 webserver/main.c
create mode 100644 webserver/pages/about.c
create mode 100644 webserver/pages/notdone.c
create mode 100644 webserver/pages/sample.c
create mode 100644 webserver/parse.c
(limited to 'webserver')
diff --git a/webserver/Makefile b/webserver/Makefile
new file mode 100644
index 000000000..f664a7d55
--- /dev/null
+++ b/webserver/Makefile
@@ -0,0 +1,26 @@
+cc = gcc
+
+all:
+ #Generate framework...
+ $(cc) -c parse.c
+ $(cc) -c generate.c
+ $(cc) -c htmlstyle.c
+ $(cc) -c logs.c
+
+ #Generate "pages"...
+ cd pages && $(cc) -c about.c && cd ..
+ cd pages && $(cc) -c sample.c && cd ..
+ cd pages && $(cc) -c notdone.c && cd ..
+
+ #Building the server...
+ $(cc) -o webserver main.c parse.o generate.o htmlstyle.o \
+ logs.o pages/about.o pages/sample.o pages/notdone.o
+
+
+
+
+clean:
+ rm -f *.o
+ rm -f pages/*.o
+ rm -f webserver
+
diff --git a/webserver/doc/API.txt b/webserver/doc/API.txt
new file mode 100644
index 000000000..92f88c5e3
--- /dev/null
+++ b/webserver/doc/API.txt
@@ -0,0 +1,50 @@
+Here's the webserver API, so you can work on the webserver.
+
+My personal goal is to make this interface simple, so that coding it
+will be like coding in some scripting language...
+
+
+
+char *get_param(char in_string[500], char swhat[500]);
+
+This function simply returns various data from the query string.
+ *Pass get_param NOTHING longer than 500 in length!
+
+ What do I pass where in_string is?
+ The query string.
+
+ What do I pass where swhat is?
+ One of two things...
+ Either 0 for the path of the 'page'
+ or you can pass it the param you wish to lookup.
+
+
+
+
+
+
+char *get_query(char *inquery);
+
+This function simply returns a query string from the raw server request.
+This is used once in main, I doubt you'll need it.
+
+
+
+
+
+void web_send(int sockin, char *in_data);
+
+Super easy way of sending data to a webpage!
+Simply put in the socket name and then the data.
+
+ Ex:
+ web_send(socket, "I like cheese!\n");
+
+
+
+
+char *html_header(char* title);
+Easy way to print the eAthena header for the server.
+
+ Ex:
+ web_send(sockethere, html_header("About"));
diff --git a/webserver/doc/README b/webserver/doc/README
new file mode 100644
index 000000000..edcabf1eb
--- /dev/null
+++ b/webserver/doc/README
@@ -0,0 +1,11 @@
+This readme is intended for the programmers of eAthena.
+
+This webserver's apis are in API.txt.
+
+To make this simple, generate.c should handle most of the work this sever does
+in terms of what people see.
+
+When a request is made the server shoots it off to generate.c.
+
+You are welcome to create more functions used by generate.c to generate pages
+though, so don't feel limited by that one file.
diff --git a/webserver/generate.c b/webserver/generate.c
new file mode 100644
index 000000000..26d2c7492
--- /dev/null
+++ b/webserver/generate.c
@@ -0,0 +1,38 @@
+
+void generate_page(char password[25], int sock_in, char *query, char *ip)
+{
+ char *page = get_param(query, 0);
+ char *ppass = get_param(query, "password");
+
+
+ if ( (ppass == 0) || (strcmp(password, ppass) != 0) )
+ {
+ web_send(sock_in, html_header("Enter your password"));
+ web_send(sock_in, "
NOT LOGGED IN!
";
+}
+
+
+
diff --git a/webserver/logs.c b/webserver/logs.c
new file mode 100644
index 000000000..faa1abf80
--- /dev/null
+++ b/webserver/logs.c
@@ -0,0 +1,8 @@
+#include
+
+void log_visit(char *query, char *ip)
+{
+ time_t timer;
+ timer=time(NULL);
+ printf("%s - \"%s\" - %s", ip, query, asctime(localtime(&timer)));
+}
diff --git a/webserver/main.c b/webserver/main.c
new file mode 100644
index 000000000..ac27c5e71
--- /dev/null
+++ b/webserver/main.c
@@ -0,0 +1,142 @@
+/***************************************************************************
+ description
+ -------------------
+ author : (C) 2004 by Michael J. Flickinger
+ email : mjflick@cpan.org
+
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#define BLOG 10
+
+char *header = "\n";
+char recvin[500], password[25];
+int s_port;
+
+void sigchld_handler(int s)
+{
+ while(wait(NULL) > 0);
+}
+
+int main(int argc, char **argv)
+{
+ if (argc < 3)
+ {
+ printf("eAthena Web Server\n");
+ printf("usage: %s [password] [port]\n", argv[0]);
+ exit(0);
+ }
+
+ s_port = atoi(argv[2]);
+
+ if ((s_port < 1) || (s_port > 65534))
+ {
+ printf("Error: The port you choose is not valid port.\n");
+ exit(0);
+ }
+
+ if (strlen(argv[1]) > 25)
+ {
+ printf("Error: Your password is too long.\n");
+ printf("It must be shorter than 25 characters.\n");
+ exit(0);
+ }
+
+ memset(password, 0x0, 25);
+ memcpy(password, argv[1], strlen(argv[1]));
+
+ int sockfd, new_fd;
+ struct sockaddr_in my_addr;
+ struct sockaddr_in their_addr;
+ int sin_size;
+
+ struct sigaction sa;
+
+ int yes=1;
+
+ if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) == -1)
+ {
+ perror("Darn, this is broken.");
+ exit(0);
+ }
+
+ if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
+ {
+ perror("Error... :-(");
+ }
+
+ //Now we know we have a working socket. :-)
+
+ my_addr.sin_family = AF_INET;
+ my_addr.sin_port = htons(s_port);
+ my_addr.sin_addr.s_addr = INADDR_ANY;
+ memset(&(my_addr.sin_zero), '\0', 8);
+
+ if ( bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
+ {
+ perror("can not bind to this port");
+ exit(0);
+ }
+
+ if ( listen(sockfd, BLOG) == -1)
+ {
+ perror("can not listen on port");
+ exit(0);
+ }
+
+ sa.sa_handler = sigchld_handler;
+
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = SA_RESTART;
+
+ if (sigaction(SIGCHLD, &sa, NULL) == -1)
+ {
+ perror("sigaction sucks");
+ exit(0);
+ }
+
+ printf("The eAthena webserver is up and listening on port %i.\n", s_port);
+
+ while(1)
+ {
+ sin_size = sizeof(struct sockaddr_in);
+ new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
+
+ if (!fork())
+ {
+ close(sockfd);
+ memset(recvin, 0x0, 500);
+ recv(new_fd, recvin, 500, 0);
+ send(new_fd, header, strlen(header), 0);
+ generate_page(password, new_fd, get_query(recvin), inet_ntoa(their_addr.sin_addr));
+ log_visit(get_query(recvin), inet_ntoa(their_addr.sin_addr));
+
+ close(new_fd);
+ exit(0);
+ }
+ close(new_fd);
+ }
+
+ return 0;
+}
diff --git a/webserver/pages/about.c b/webserver/pages/about.c
new file mode 100644
index 000000000..f1d94d1e0
--- /dev/null
+++ b/webserver/pages/about.c
@@ -0,0 +1,6 @@
+void generate_about(int sock_in, char *query, char *ip)
+{
+//printf("%s", html_header("About"));
+ web_send(sock_in, html_header("About"));
+ web_send(sock_in, "eAthena Web Server!\n");
+}
diff --git a/webserver/pages/notdone.c b/webserver/pages/notdone.c
new file mode 100644
index 000000000..07abd33da
--- /dev/null
+++ b/webserver/pages/notdone.c
@@ -0,0 +1,5 @@
+void generate_notdone(int sock_in, char *query, char *ip)
+{
+ web_send(sock_in, "Not here!\n");
+ web_send(sock_in, "This page/feature is not done yet.\n
");
+}
diff --git a/webserver/pages/sample.c b/webserver/pages/sample.c
new file mode 100644
index 000000000..7bec663f2
--- /dev/null
+++ b/webserver/pages/sample.c
@@ -0,0 +1,24 @@
+
+
+void generate_sample(int sock_in, char *query, char *ip)
+{
+
+ char *name = get_param(query, "name");
+
+ web_send(sock_in, "SAMPLE\n");
+
+
+ //If a name was not entered...
+ if ( name == '\0' )
+ {
+ web_send(sock_in, "