Server 0.0.1
HTTP/REST server implementation

src/webgameserver.c

Go to the documentation of this file.
00001 
00023 #include <unistd.h>
00024 #include <stdlib.h>
00025 #include <fcntl.h>
00026 
00027 #include <sys/time.h>
00028 #include <sys/resource.h>
00029 #include <sys/types.h>
00030 #include <sys/wait.h>
00031 #include <sys/time.h>
00032 #include <sys/signal.h>
00033 #include <sys/param.h>
00034 #include <sys/stat.h>
00035 #include <sys/mman.h>
00036 #include <errno.h>
00037 
00038 #include "server.h"
00039 #include "logger.h"
00040 #include "http/worker.h"
00041 #include "auth/ldap.h"
00042 
00043 #include "interface/class.h"
00044 #include "interface/logger.h"
00045 
00046 #include "utils/signalHandling.h"
00047 #include "utils/memory.h"
00048 
00049 #define DEFAULT_SECS    10
00050 //#define DEFAULT_USECS (1000000 / HZ * 2)
00051 //#define DEFAULT_SECS  1
00052 #define DEFAULT_USECS   0
00053 
00054 void nullhandler() {}
00055 
00056 void daemonize(void);
00057 
00058 int
00059 main()
00060 {
00061         pid_t            pid;
00062         long             psize  = sysconf(_SC_PAGESIZE);
00063         int              status;
00064         int              shm;
00065         struct randval * value;
00066 
00067         struct rlimit limit = {RLIM_INFINITY, RLIM_INFINITY};
00068         setrlimit(RLIMIT_CPU, &limit);
00069 
00070         getrlimit(RLIMIT_NOFILE, &limit);
00071         limit.rlim_cur = limit.rlim_max;
00072         setrlimit(RLIMIT_NOFILE, &limit);
00073 
00074         init_signals();
00075 
00076         shm   = shm_open("/fooshm", O_RDWR|O_CREAT, S_IRWXU);
00077         ftruncate(shm, psize);
00078 
00079         switch((pid = fork())) {
00080                 case -1:
00081                         break;
00082 
00083                 case 0:
00084                         {
00085                                 sigset_t block_these, pause_mask;
00086                                 struct sigaction s;
00087                                 struct itimerval interval;
00088 
00089                                 value = mmap (0, sizeof(struct randval), PROT_READ|PROT_WRITE,
00090                                                 MAP_SHARED, shm, 0);
00091                                 value->timestamp = 0;
00092                                 value->value     = 0;
00093 
00094                                 close(shm);
00095 
00096                                 // Block SIGALRM
00097                                 sigemptyset(&block_these);
00098                                 sigaddset(&block_these, SIGALRM);
00099                                 sigprocmask(SIG_BLOCK, &block_these, &pause_mask);
00100 
00101                                 // Set up handler for SIGALRM
00102                                 sigemptyset(&s.sa_mask);
00103                                 sigaddset(&s.sa_mask, SIGINT);
00104                                 s.sa_flags = 0;
00105                                 s.sa_handler = nullhandler;
00106                                 if (sigaction(SIGALRM, &s, NULL) < 0) {
00107                                         perror("sigaction SIGALRM");
00108                                         exit (1);
00109                                 }
00110 
00111                                 interval.it_value.tv_sec     = DEFAULT_SECS;
00112                                 interval.it_value.tv_usec    = DEFAULT_USECS;
00113                                 interval.it_interval.tv_sec  = DEFAULT_SECS;
00114                                 interval.it_interval.tv_usec = DEFAULT_USECS;
00115 
00116                                 setitimer(ITIMER_REAL, &interval, NULL);
00117 
00118                                 // child
00119                                 while(!doShutdown) {
00120                                         value->timestamp = time(NULL);
00121                                         value->value     = rand() % 100;
00122                                         sigsuspend(&pause_mask);
00123                                 }
00124 
00125                                 _exit(EXIT_SUCCESS);
00126                         }
00127 
00128                 default:
00129                         {
00130                                 Logger     logger;
00131                                 AuthLdap   auth;
00132                                 HttpWorker worker;
00133                                 Server     server;
00134 
00135                                 value = mmap (0, sizeof(int), PROT_READ|PROT_WRITE,
00136                                                 MAP_SHARED, shm, 0);
00137 
00138                                 shm_unlink("/fooshm");
00139                                 close(shm);
00140 
00141                                 logger = new(LoggerSyslog, LOGGER_DEBUG);
00142                                 auth   = new(AuthLdap,
00143                                                 "ldap://localhost/",
00144                                                 CSTRA("ou=user,dc=yabrog,dc=weird-web-workers,dc=org"));
00145                                 worker = new(HttpWorker, "testserver", value, auth);
00146                                 server = new(Server, logger, worker, 11212, SOMAXCONN);
00147 
00148                                 //daemonize();
00149                                 if (NULL != server) {
00150                                         serverRun(server);
00151                                 }
00152                                 else {
00153                                         doShutdown = 1;
00154                                         kill(pid, SIGINT);
00155                                 }
00156 
00157                                 do {
00158                                         pid_t w;
00159 
00160                                         w = waitpid(pid, &status, 0);
00161 
00162                                         while (w == -1) {
00163                                                 switch(errno) {
00164                                                         case EINTR: w = waitpid(pid, &status, 0);
00165                                                                                 break;
00166                                                         case ECHILD: perror("no child");
00167                                                                                  // DROP THROUGH
00168                                                         default: w = 0;
00169                                                 }
00170                                         }
00171 
00172                                         if (0 < w) {
00173                                                 if (WIFEXITED(status)) {
00174                                                         loggerLog(logger, LOGGER_INFO,
00175                                                                         "child exited, status=%d\n",
00176                                                                         WEXITSTATUS(status));
00177                                                 } else if (WIFSIGNALED(status)) {
00178                                                         loggerLog(logger, LOGGER_INFO,
00179                                                                         "killed by signal %d\n",
00180                                                                         WTERMSIG(status));
00181                                                 } else if (WIFSTOPPED(status)) {
00182                                                         loggerLog(logger, LOGGER_INFO,
00183                                                                         "stopped by signal %d\n",
00184                                                                         WSTOPSIG(status));
00185                                                 } else if (WIFCONTINUED(status)) {
00186                                                         loggerLog(logger, LOGGER_INFO, "continued\n");
00187                                                 }
00188                                         }
00189                                 } while (!WIFEXITED(status) && !WIFSIGNALED(status));
00190 
00191                                 if (NULL != server) delete(server);
00192                                 if (NULL != worker) delete(worker);
00193                                 if (NULL != auth)   delete(auth);
00194                                 if (NULL != logger) delete(logger);
00195                         }
00196 
00197                         break;
00198         }
00199 
00200         return 0;
00201 }
00202 
00203 // vim: set ts=4 sw=4:
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines