Browse Source

some fixes i have done in server

release0.1.5
Georg Hopp 14 years ago
parent
commit
f6de9deec5
  1. 2
      src/Makefile.am
  2. 2
      src/cbuf/skip_non_alpha.c
  3. 4
      src/http/parser/body.c
  4. 31
      src/http/parser/parse.c
  5. 196
      src/webgameserver.c

2
src/Makefile.am

@ -58,7 +58,7 @@ AM_CFLAGS = -Wall -I ../include/
bin_PROGRAMS = taskrambler
taskrambler_SOURCES = webgameserver.c \
taskrambler_SOURCES = taskrambler.c \
$(IFACE) $(SOCKET) $(SERVER) $(LOGGER) $(MSG) $(REQ) \
$(WRITER) $(RESP) $(HEADER) $(PARSER) $(WORKER) $(CB) \
$(UTILS) $(MSGQ) $(SESSION) $(STREAM)

2
src/cbuf/skip_non_alpha.c

@ -27,7 +27,7 @@
void
cbufSkipNonAlpha(Cbuf this)
{
while(0 > this->bused && isalpha(*cbufGetRead(this)))
while(0 < this->bused && !isalpha(*cbufGetRead(this)))
cbufIncRead(this, 1);
}

4
src/http/parser/body.c

@ -28,7 +28,7 @@
#include "http/parser.h"
#include "cbuf.h"
#define MAX(a,b) (((a) > (b))? (a) : (b))
#define MIN(a,b) (((a) < (b))? (a) : (b))
size_t
httpParserBody(HttpParser this, const char * buf, size_t nbuf)
@ -37,7 +37,7 @@ httpParserBody(HttpParser this, const char * buf, size_t nbuf)
HttpMessage current = this->current;
if (current->dbody < current->nbody) {
len = MAX(current->nbody - current->dbody, nbuf);
len = MIN(current->nbody - current->dbody, nbuf);
memcpy(current->body, buf, len);

31
src/http/parser/parse.c

@ -120,23 +120,24 @@ httpParserParse(void * _this, Stream st)
break;
case HTTP_MESSAGE_HEADERS_DONE:
{
cbufIncRead(
this->buffer,
httpParserBody(
this,
cbufGetRead(this->buffer),
this->buffer->bused));
if (cbufIsEmpty(this->buffer)) {
cbufRelease(this->buffer);
this->ourLock = FALSE;
}
if (this->current->dbody == this->current->nbody) {
this->state = HTTP_MESSAGE_DONE;
break;
}
if (this->current->dbody == this->current->nbody) {
this->state = HTTP_MESSAGE_DONE;
}
if (cbufIsEmpty(this->buffer)) {
cbufRelease(this->buffer);
this->ourLock = FALSE;
cont = 0;
break;
}
cbufIncRead(
this->buffer,
httpParserBody(
this,
cbufGetRead(this->buffer),
this->buffer->bused));
break;
case HTTP_MESSAGE_DONE:

196
src/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:
Loading…
Cancel
Save