5 changed files with 20 additions and 215 deletions
-
2src/Makefile.am
-
2src/cbuf/skip_non_alpha.c
-
4src/http/parser/body.c
-
23src/http/parser/parse.c
-
196src/webgameserver.c
@ -1,196 +0,0 @@ |
|||
/** |
|||
* \file |
|||
* |
|||
* \author Georg Hopp |
|||
* |
|||
* \copyright |
|||
* Copyright (C) 2012 Georg Hopp |
|||
* |
|||
* 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 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
*/ |
|||
|
|||
#include <unistd.h> |
|||
#include <stdlib.h> |
|||
#include <fcntl.h> |
|||
|
|||
#include <sys/time.h> |
|||
#include <sys/resource.h> |
|||
#include <sys/types.h> |
|||
#include <sys/wait.h> |
|||
#include <sys/time.h> |
|||
#include <sys/signal.h> |
|||
#include <sys/param.h> |
|||
#include <sys/stat.h> |
|||
#include <sys/mman.h> |
|||
#include <errno.h> |
|||
|
|||
#include "server.h" |
|||
#include "logger.h" |
|||
#include "http/worker.h" |
|||
|
|||
#include "interface/class.h" |
|||
#include "interface/logger.h" |
|||
|
|||
#include "utils/signalHandling.h" |
|||
|
|||
#define DEFAULT_SECS 10 |
|||
//#define DEFAULT_USECS (1000000 / HZ * 2) |
|||
//#define DEFAULT_SECS 1 |
|||
#define DEFAULT_USECS 0 |
|||
|
|||
void nullhandler() {} |
|||
|
|||
void daemonize(void); |
|||
|
|||
int |
|||
main() |
|||
{ |
|||
pid_t pid; |
|||
long psize = sysconf(_SC_PAGESIZE); |
|||
int status; |
|||
int shm; |
|||
struct randval * value; |
|||
|
|||
struct rlimit limit = {RLIM_INFINITY, RLIM_INFINITY}; |
|||
setrlimit(RLIMIT_CPU, &limit); |
|||
|
|||
getrlimit(RLIMIT_NOFILE, &limit); |
|||
limit.rlim_cur = limit.rlim_max; |
|||
setrlimit(RLIMIT_NOFILE, &limit); |
|||
|
|||
init_signals(); |
|||
|
|||
shm = shm_open("/fooshm", O_RDWR|O_CREAT, S_IRWXU); |
|||
ftruncate(shm, psize); |
|||
|
|||
switch((pid = fork())) { |
|||
case -1: |
|||
break; |
|||
|
|||
case 0: |
|||
{ |
|||
sigset_t block_these, pause_mask; |
|||
struct sigaction s; |
|||
struct itimerval interval; |
|||
|
|||
value = mmap (0, sizeof(struct randval), PROT_READ|PROT_WRITE, |
|||
MAP_SHARED, shm, 0); |
|||
value->timestamp = 0; |
|||
value->value = 0; |
|||
|
|||
close(shm); |
|||
|
|||
// Block SIGALRM |
|||
sigemptyset(&block_these); |
|||
sigaddset(&block_these, SIGALRM); |
|||
sigprocmask(SIG_BLOCK, &block_these, &pause_mask); |
|||
|
|||
// Set up handler for SIGALRM |
|||
sigemptyset(&s.sa_mask); |
|||
sigaddset(&s.sa_mask, SIGINT); |
|||
s.sa_flags = 0; |
|||
s.sa_handler = nullhandler; |
|||
if (sigaction(SIGALRM, &s, NULL) < 0) { |
|||
perror("sigaction SIGALRM"); |
|||
exit (1); |
|||
} |
|||
|
|||
interval.it_value.tv_sec = DEFAULT_SECS; |
|||
interval.it_value.tv_usec = DEFAULT_USECS; |
|||
interval.it_interval.tv_sec = DEFAULT_SECS; |
|||
interval.it_interval.tv_usec = DEFAULT_USECS; |
|||
|
|||
setitimer(ITIMER_REAL, &interval, NULL); |
|||
|
|||
// child |
|||
while(!doShutdown) { |
|||
value->timestamp = time(NULL); |
|||
value->value = rand() % 100; |
|||
sigsuspend(&pause_mask); |
|||
} |
|||
|
|||
_exit(EXIT_SUCCESS); |
|||
} |
|||
|
|||
default: |
|||
{ |
|||
Logger logger; |
|||
HttpWorker worker; |
|||
Server server; |
|||
|
|||
value = mmap (0, sizeof(int), PROT_READ|PROT_WRITE, |
|||
MAP_SHARED, shm, 0); |
|||
|
|||
shm_unlink("/fooshm"); |
|||
close(shm); |
|||
|
|||
logger = new(LoggerStderr, LOGGER_DEBUG); |
|||
worker = new(HttpWorker, "testserver", value); |
|||
server = new(Server, logger, worker, 11212, SOMAXCONN); |
|||
|
|||
//daemonize(); |
|||
if (NULL != server) { |
|||
serverRun(server); |
|||
} |
|||
else { |
|||
doShutdown = 1; |
|||
kill(pid, SIGINT); |
|||
} |
|||
|
|||
do { |
|||
pid_t w; |
|||
|
|||
w = waitpid(pid, &status, 0); |
|||
|
|||
while (w == -1) { |
|||
switch(errno) { |
|||
case EINTR: w = waitpid(pid, &status, 0); |
|||
break; |
|||
case ECHILD: perror("no child"); |
|||
// DROP THROUGH |
|||
default: w = 0; |
|||
} |
|||
} |
|||
|
|||
if (0 < w) { |
|||
if (WIFEXITED(status)) { |
|||
loggerLog(logger, LOGGER_INFO, |
|||
"child exited, status=%d\n", |
|||
WEXITSTATUS(status)); |
|||
} else if (WIFSIGNALED(status)) { |
|||
loggerLog(logger, LOGGER_INFO, |
|||
"killed by signal %d\n", |
|||
WTERMSIG(status)); |
|||
} else if (WIFSTOPPED(status)) { |
|||
loggerLog(logger, LOGGER_INFO, |
|||
"stopped by signal %d\n", |
|||
WSTOPSIG(status)); |
|||
} else if (WIFCONTINUED(status)) { |
|||
loggerLog(logger, LOGGER_INFO, "continued\n"); |
|||
} |
|||
} |
|||
} while (!WIFEXITED(status) && !WIFSIGNALED(status)); |
|||
|
|||
if (NULL != server) delete(server); |
|||
if (NULL != worker) delete(worker); |
|||
if (NULL != logger) delete(logger); |
|||
} |
|||
|
|||
break; |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue