A task management system. At least this was the initial idea. Basically this it the base code for the taskrambler framework.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

293 lines
24 KiB

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Server: src/webgameserver.c Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body onload='searchBox.OnSelectItem(0);'>
<!-- Generated by Doxygen 1.7.3 -->
<script type="text/javascript"><!--
var searchBox = new SearchBox("searchBox", "search",false,'Search');
--></script>
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">Server&#160;<span id="projectnumber">0.0.1</span></div>
<div id="projectbrief">HTTP/REST server implementation</div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
<li id="searchli">
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
initNavTree('webgameserver_8c.html','');
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<h1>src/webgameserver.c</h1> </div>
</div>
<div class="contents">
<a href="webgameserver_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001
<a name="l00023"></a>00023 <span class="preprocessor">#include &lt;unistd.h&gt;</span>
<a name="l00024"></a>00024 <span class="preprocessor">#include &lt;stdlib.h&gt;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &lt;fcntl.h&gt;</span>
<a name="l00026"></a>00026
<a name="l00027"></a>00027 <span class="preprocessor">#include &lt;sys/time.h&gt;</span>
<a name="l00028"></a>00028 <span class="preprocessor">#include &lt;sys/resource.h&gt;</span>
<a name="l00029"></a>00029 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include &lt;sys/wait.h&gt;</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include &lt;sys/time.h&gt;</span>
<a name="l00032"></a>00032 <span class="preprocessor">#include &lt;sys/signal.h&gt;</span>
<a name="l00033"></a>00033 <span class="preprocessor">#include &lt;sys/param.h&gt;</span>
<a name="l00034"></a>00034 <span class="preprocessor">#include &lt;sys/stat.h&gt;</span>
<a name="l00035"></a>00035 <span class="preprocessor">#include &lt;sys/mman.h&gt;</span>
<a name="l00036"></a>00036 <span class="preprocessor">#include &lt;errno.h&gt;</span>
<a name="l00037"></a>00037
<a name="l00038"></a>00038 <span class="preprocessor">#include &quot;server.h&quot;</span>
<a name="l00039"></a>00039 <span class="preprocessor">#include &quot;logger.h&quot;</span>
<a name="l00040"></a>00040 <span class="preprocessor">#include &quot;http/worker.h&quot;</span>
<a name="l00041"></a>00041 <span class="preprocessor">#include &quot;auth/ldap.h&quot;</span>
<a name="l00042"></a>00042
<a name="l00043"></a>00043 <span class="preprocessor">#include &quot;interface/class.h&quot;</span>
<a name="l00044"></a>00044 <span class="preprocessor">#include &quot;interface/logger.h&quot;</span>
<a name="l00045"></a>00045
<a name="l00046"></a>00046 <span class="preprocessor">#include &quot;utils/signalHandling.h&quot;</span>
<a name="l00047"></a>00047 <span class="preprocessor">#include &quot;utils/memory.h&quot;</span>
<a name="l00048"></a>00048
<a name="l00049"></a><a class="code" href="webgameserver_8c.html#adc65839bf93b60b69f4c3cc69579cd5d">00049</a> <span class="preprocessor">#define DEFAULT_SECS 10</span>
<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="comment">//#define DEFAULT_USECS (1000000 / HZ * 2)</span>
<a name="l00051"></a>00051 <span class="comment">//#define DEFAULT_SECS 1</span>
<a name="l00052"></a><a class="code" href="webgameserver_8c.html#a8e46f816094620164ba5207c0cc1c255">00052</a> <span class="preprocessor">#define DEFAULT_USECS 0</span>
<a name="l00053"></a>00053 <span class="preprocessor"></span>
<a name="l00054"></a><a class="code" href="webgameserver_8c.html#a037a87641df20cd07cf7ad9799c502a2">00054</a> <span class="keywordtype">void</span> <a class="code" href="webgameserver_8c.html#a037a87641df20cd07cf7ad9799c502a2">nullhandler</a>() {}
<a name="l00055"></a>00055
<a name="l00056"></a>00056 <span class="keywordtype">void</span> <a class="code" href="daemonize_8c.html#a29b0af1da2432bcc90721c0b62f4e660">daemonize</a>(<span class="keywordtype">void</span>);
<a name="l00057"></a>00057
<a name="l00058"></a>00058 <span class="keywordtype">int</span>
<a name="l00059"></a><a class="code" href="webgameserver_8c.html#ae66f6b31b5ad750f1fe042a706a4e3d4">00059</a> <a class="code" href="webgameserver_8c.html#ae66f6b31b5ad750f1fe042a706a4e3d4">main</a>()
<a name="l00060"></a>00060 {
<a name="l00061"></a>00061 pid_t pid;
<a name="l00062"></a>00062 <span class="keywordtype">long</span> psize = sysconf(_SC_PAGESIZE);
<a name="l00063"></a>00063 <span class="keywordtype">int</span> status;
<a name="l00064"></a>00064 <span class="keywordtype">int</span> shm;
<a name="l00065"></a>00065 <span class="keyword">struct </span><a class="code" href="structrandval.html">randval</a> * <a class="code" href="structrandval.html#ada52f1346b93f8e296aa2488836311ec">value</a>;
<a name="l00066"></a>00066
<a name="l00067"></a>00067 <span class="keyword">struct </span>rlimit limit = {RLIM_INFINITY, RLIM_INFINITY};
<a name="l00068"></a>00068 setrlimit(RLIMIT_CPU, &amp;limit);
<a name="l00069"></a>00069
<a name="l00070"></a>00070 getrlimit(RLIMIT_NOFILE, &amp;limit);
<a name="l00071"></a>00071 limit.rlim_cur = limit.rlim_max;
<a name="l00072"></a>00072 setrlimit(RLIMIT_NOFILE, &amp;limit);
<a name="l00073"></a>00073
<a name="l00074"></a>00074 <a class="code" href="signalHandling_8h.html#a1de31bdef82f181f8045b94ae0933916">init_signals</a>();
<a name="l00075"></a>00075
<a name="l00076"></a>00076 shm = shm_open(<span class="stringliteral">&quot;/fooshm&quot;</span>, O_RDWR|O_CREAT, S_IRWXU);
<a name="l00077"></a>00077 ftruncate(shm, psize);
<a name="l00078"></a>00078
<a name="l00079"></a>00079 <span class="keywordflow">switch</span>((pid = fork())) {
<a name="l00080"></a>00080 <span class="keywordflow">case</span> -1:
<a name="l00081"></a>00081 <span class="keywordflow">break</span>;
<a name="l00082"></a>00082
<a name="l00083"></a>00083 <span class="keywordflow">case</span> 0:
<a name="l00084"></a>00084 {
<a name="l00085"></a>00085 sigset_t block_these, pause_mask;
<a name="l00086"></a>00086 <span class="keyword">struct </span>sigaction s;
<a name="l00087"></a>00087 <span class="keyword">struct </span>itimerval interval;
<a name="l00088"></a>00088
<a name="l00089"></a>00089 value = mmap (0, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structrandval.html">randval</a>), PROT_READ|PROT_WRITE,
<a name="l00090"></a>00090 MAP_SHARED, shm, 0);
<a name="l00091"></a>00091 value-&gt;timestamp = 0;
<a name="l00092"></a>00092 value-&gt;value = 0;
<a name="l00093"></a>00093
<a name="l00094"></a>00094 close(shm);
<a name="l00095"></a>00095
<a name="l00096"></a>00096 <span class="comment">// Block SIGALRM</span>
<a name="l00097"></a>00097 sigemptyset(&amp;block_these);
<a name="l00098"></a>00098 sigaddset(&amp;block_these, SIGALRM);
<a name="l00099"></a>00099 sigprocmask(SIG_BLOCK, &amp;block_these, &amp;pause_mask);
<a name="l00100"></a>00100
<a name="l00101"></a>00101 <span class="comment">// Set up handler for SIGALRM</span>
<a name="l00102"></a>00102 sigemptyset(&amp;s.sa_mask);
<a name="l00103"></a>00103 sigaddset(&amp;s.sa_mask, SIGINT);
<a name="l00104"></a>00104 s.sa_flags = 0;
<a name="l00105"></a>00105 s.sa_handler = <a class="code" href="webgameserver_8c.html#a037a87641df20cd07cf7ad9799c502a2">nullhandler</a>;
<a name="l00106"></a>00106 <span class="keywordflow">if</span> (sigaction(SIGALRM, &amp;s, NULL) &lt; 0) {
<a name="l00107"></a>00107 perror(<span class="stringliteral">&quot;sigaction SIGALRM&quot;</span>);
<a name="l00108"></a>00108 exit (1);
<a name="l00109"></a>00109 }
<a name="l00110"></a>00110
<a name="l00111"></a>00111 interval.it_value.tv_sec = <a class="code" href="webgameserver_8c.html#adc65839bf93b60b69f4c3cc69579cd5d">DEFAULT_SECS</a>;
<a name="l00112"></a>00112 interval.it_value.tv_usec = <a class="code" href="webgameserver_8c.html#a8e46f816094620164ba5207c0cc1c255">DEFAULT_USECS</a>;
<a name="l00113"></a>00113 interval.it_interval.tv_sec = <a class="code" href="webgameserver_8c.html#adc65839bf93b60b69f4c3cc69579cd5d">DEFAULT_SECS</a>;
<a name="l00114"></a>00114 interval.it_interval.tv_usec = <a class="code" href="webgameserver_8c.html#a8e46f816094620164ba5207c0cc1c255">DEFAULT_USECS</a>;
<a name="l00115"></a>00115
<a name="l00116"></a>00116 setitimer(ITIMER_REAL, &amp;interval, NULL);
<a name="l00117"></a>00117
<a name="l00118"></a>00118 <span class="comment">// child</span>
<a name="l00119"></a>00119 <span class="keywordflow">while</span>(!<a class="code" href="signalHandling_8h.html#a960e985a396acaabb1bbed4f15668ade">doShutdown</a>) {
<a name="l00120"></a>00120 value-&gt;timestamp = time(NULL);
<a name="l00121"></a>00121 value-&gt;value = rand() % 100;
<a name="l00122"></a>00122 sigsuspend(&amp;pause_mask);
<a name="l00123"></a>00123 }
<a name="l00124"></a>00124
<a name="l00125"></a>00125 _exit(EXIT_SUCCESS);
<a name="l00126"></a>00126 }
<a name="l00127"></a>00127
<a name="l00128"></a>00128 <span class="keywordflow">default</span>:
<a name="l00129"></a>00129 {
<a name="l00130"></a>00130 <a class="code" href="structLogger.html">Logger</a> logger;
<a name="l00131"></a>00131 <a class="code" href="structAuthLdap.html">AuthLdap</a> auth;
<a name="l00132"></a>00132 <a class="code" href="structHttpWorker.html">HttpWorker</a> worker;
<a name="l00133"></a>00133 <a class="code" href="structServer.html">Server</a> server;
<a name="l00134"></a>00134
<a name="l00135"></a>00135 value = mmap (0, <span class="keyword">sizeof</span>(<span class="keywordtype">int</span>), PROT_READ|PROT_WRITE,
<a name="l00136"></a>00136 MAP_SHARED, shm, 0);
<a name="l00137"></a>00137
<a name="l00138"></a>00138 shm_unlink(<span class="stringliteral">&quot;/fooshm&quot;</span>);
<a name="l00139"></a>00139 close(shm);
<a name="l00140"></a>00140
<a name="l00141"></a>00141 logger = <span class="keyword">new</span>(<a class="code" href="structLoggerSyslog.html">LoggerSyslog</a>, <a class="code" href="logger_2logger_8h.html#a63296c69f4b9bf51d6756a5d2c482d1ea30eb5eac34e7c2406c74fb78d9004f6c">LOGGER_DEBUG</a>);
<a name="l00142"></a>00142 auth = <span class="keyword">new</span>(<a class="code" href="structAuthLdap.html">AuthLdap</a>,
<a name="l00143"></a>00143 <span class="stringliteral">&quot;ldap://localhost/&quot;</span>,
<a name="l00144"></a>00144 <a class="code" href="memory_8h.html#a2a9234835facec8c1ebca59c214391e3" title="Const STRing Argument.">CSTRA</a>(<span class="stringliteral">&quot;ou=user,dc=yabrog,dc=weird-web-workers,dc=org&quot;</span>));
<a name="l00145"></a>00145 worker = <span class="keyword">new</span>(<a class="code" href="structHttpWorker.html">HttpWorker</a>, <span class="stringliteral">&quot;testserver&quot;</span>, value, auth);
<a name="l00146"></a>00146 server = <span class="keyword">new</span>(<a class="code" href="structServer.html">Server</a>, logger, worker, 11212, SOMAXCONN);
<a name="l00147"></a>00147
<a name="l00148"></a>00148 <span class="comment">//daemonize();</span>
<a name="l00149"></a>00149 <span class="keywordflow">if</span> (NULL != server) {
<a name="l00150"></a>00150 <a class="code" href="server_8h.html#a67a4d9073b80d8ae1459fb11ddd23675">serverRun</a>(server);
<a name="l00151"></a>00151 }
<a name="l00152"></a>00152 <span class="keywordflow">else</span> {
<a name="l00153"></a>00153 <a class="code" href="signalHandling_8h.html#a960e985a396acaabb1bbed4f15668ade">doShutdown</a> = 1;
<a name="l00154"></a>00154 kill(pid, SIGINT);
<a name="l00155"></a>00155 }
<a name="l00156"></a>00156
<a name="l00157"></a>00157 <span class="keywordflow">do</span> {
<a name="l00158"></a>00158 pid_t w;
<a name="l00159"></a>00159
<a name="l00160"></a>00160 w = waitpid(pid, &amp;status, 0);
<a name="l00161"></a>00161
<a name="l00162"></a>00162 <span class="keywordflow">while</span> (w == -1) {
<a name="l00163"></a>00163 <span class="keywordflow">switch</span>(errno) {
<a name="l00164"></a>00164 <span class="keywordflow">case</span> EINTR: w = waitpid(pid, &amp;status, 0);
<a name="l00165"></a>00165 <span class="keywordflow">break</span>;
<a name="l00166"></a>00166 <span class="keywordflow">case</span> ECHILD: perror(<span class="stringliteral">&quot;no child&quot;</span>);
<a name="l00167"></a>00167 <span class="comment">// DROP THROUGH</span>
<a name="l00168"></a>00168 <span class="keywordflow">default</span>: w = 0;
<a name="l00169"></a>00169 }
<a name="l00170"></a>00170 }
<a name="l00171"></a>00171
<a name="l00172"></a>00172 <span class="keywordflow">if</span> (0 &lt; w) {
<a name="l00173"></a>00173 <span class="keywordflow">if</span> (WIFEXITED(status)) {
<a name="l00174"></a>00174 <a class="code" href="logger_2interface_2logger_8h.html#ae9f8662ec8b300dcfb5064906937553e">loggerLog</a>(logger, <a class="code" href="logger_2logger_8h.html#a63296c69f4b9bf51d6756a5d2c482d1ea3a56c2c000665930df74a9ebf9047316">LOGGER_INFO</a>,
<a name="l00175"></a>00175 <span class="stringliteral">&quot;child exited, status=%d\n&quot;</span>,
<a name="l00176"></a>00176 WEXITSTATUS(status));
<a name="l00177"></a>00177 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (WIFSIGNALED(status)) {
<a name="l00178"></a>00178 <a class="code" href="logger_2interface_2logger_8h.html#ae9f8662ec8b300dcfb5064906937553e">loggerLog</a>(logger, <a class="code" href="logger_2logger_8h.html#a63296c69f4b9bf51d6756a5d2c482d1ea3a56c2c000665930df74a9ebf9047316">LOGGER_INFO</a>,
<a name="l00179"></a>00179 <span class="stringliteral">&quot;killed by signal %d\n&quot;</span>,
<a name="l00180"></a>00180 WTERMSIG(status));
<a name="l00181"></a>00181 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (WIFSTOPPED(status)) {
<a name="l00182"></a>00182 <a class="code" href="logger_2interface_2logger_8h.html#ae9f8662ec8b300dcfb5064906937553e">loggerLog</a>(logger, <a class="code" href="logger_2logger_8h.html#a63296c69f4b9bf51d6756a5d2c482d1ea3a56c2c000665930df74a9ebf9047316">LOGGER_INFO</a>,
<a name="l00183"></a>00183 <span class="stringliteral">&quot;stopped by signal %d\n&quot;</span>,
<a name="l00184"></a>00184 WSTOPSIG(status));
<a name="l00185"></a>00185 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (WIFCONTINUED(status)) {
<a name="l00186"></a>00186 <a class="code" href="logger_2interface_2logger_8h.html#ae9f8662ec8b300dcfb5064906937553e">loggerLog</a>(logger, <a class="code" href="logger_2logger_8h.html#a63296c69f4b9bf51d6756a5d2c482d1ea3a56c2c000665930df74a9ebf9047316">LOGGER_INFO</a>, <span class="stringliteral">&quot;continued\n&quot;</span>);
<a name="l00187"></a>00187 }
<a name="l00188"></a>00188 }
<a name="l00189"></a>00189 } <span class="keywordflow">while</span> (!WIFEXITED(status) &amp;&amp; !WIFSIGNALED(status));
<a name="l00190"></a>00190
<a name="l00191"></a>00191 <span class="keywordflow">if</span> (NULL != server) <span class="keyword">delete</span>(server);
<a name="l00192"></a>00192 <span class="keywordflow">if</span> (NULL != worker) <span class="keyword">delete</span>(worker);
<a name="l00193"></a>00193 <span class="keywordflow">if</span> (NULL != auth) <span class="keyword">delete</span>(auth);
<a name="l00194"></a>00194 <span class="keywordflow">if</span> (NULL != logger) <span class="keyword">delete</span>(logger);
<a name="l00195"></a>00195 }
<a name="l00196"></a>00196
<a name="l00197"></a>00197 <span class="keywordflow">break</span>;
<a name="l00198"></a>00198 }
<a name="l00199"></a>00199
<a name="l00200"></a>00200 <span class="keywordflow">return</span> 0;
<a name="l00201"></a>00201 }
<a name="l00202"></a>00202
<a name="l00203"></a>00203 <span class="comment">// vim: set ts=4 sw=4:</span>
</pre></div></div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="webgameserver_8c.html">webgameserver.c</a> </li>
<li class="footer">Generated on Wed Mar 28 2012 10:39:44 for Server by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.3 </li>
</ul>
</div>
<!--- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Defines</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
</body>
</html>