|
Server 0.0.1
HTTP/REST server implementation
|
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: