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.
 
 
 
 
 
 

214 lines
14 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/server/server.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('server_8c.html','');
</script>
<div id="doc-content">
<div class="header">
<div class="headertitle">
<h1>src/server/server.c</h1> </div>
</div>
<div class="contents">
<a href="server_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;fcntl.h&gt;</span>
<a name="l00024"></a>00024 <span class="preprocessor">#include &lt;unistd.h&gt;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &lt;stdlib.h&gt;</span>
<a name="l00026"></a>00026
<a name="l00027"></a>00027 <span class="preprocessor">#include &lt;openssl/ssl.h&gt;</span>
<a name="l00028"></a>00028 <span class="preprocessor">#include &lt;openssl/err.h&gt;</span>
<a name="l00029"></a>00029
<a name="l00030"></a>00030 <span class="preprocessor">#include &quot;class.h&quot;</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include &quot;server.h&quot;</span>
<a name="l00032"></a>00032 <span class="preprocessor">#include &quot;socket.h&quot;</span>
<a name="l00033"></a>00033 <span class="preprocessor">#include &quot;logger.h&quot;</span>
<a name="l00034"></a>00034
<a name="l00035"></a>00035 <span class="preprocessor">#include &quot;utils/memory.h&quot;</span>
<a name="l00036"></a>00036
<a name="l00037"></a>00037
<a name="l00038"></a>00038 <span class="keywordtype">void</span> <a class="code" href="close__conn_8c.html#ad721e61c8676f0b4c3b8fc401e26f266">serverCloseConn</a>(<a class="code" href="structServer.html">Server</a>, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>);
<a name="l00039"></a>00039
<a name="l00040"></a>00040
<a name="l00041"></a>00041 <span class="keyword">static</span>
<a name="l00042"></a>00042 <span class="keywordtype">int</span>
<a name="l00043"></a>00043 serverCtor(<span class="keywordtype">void</span> * _this, va_list * params)
<a name="l00044"></a>00044 {
<a name="l00045"></a>00045 <a class="code" href="structServer.html">Server</a> <span class="keyword">this</span> = _this;
<a name="l00046"></a>00046 in_port_t port;
<a name="l00047"></a>00047 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> backlog;
<a name="l00048"></a>00048 <span class="keywordtype">int</span> flags;
<a name="l00049"></a>00049
<a name="l00050"></a>00050 this-&gt;max_fds = sysconf(_SC_OPEN_MAX);
<a name="l00051"></a>00051 <span class="keywordflow">if</span> (this-&gt;max_fds &lt;= 10) { <span class="comment">// reserve 10 handles for internal use.</span>
<a name="l00055"></a>00055 <span class="comment"></span> <span class="keywordflow">return</span> -1;
<a name="l00056"></a>00056 }
<a name="l00057"></a>00057 this-&gt;max_fds -= 10;
<a name="l00058"></a>00058
<a name="l00059"></a>00059 this-&gt;logger = va_arg(* params, <a class="code" href="structLogger.html">Logger</a>);
<a name="l00060"></a>00060 this-&gt;worker = va_arg(* params, <span class="keywordtype">void</span> *);
<a name="l00061"></a>00061 port = va_arg(* params, <span class="keywordtype">int</span>);
<a name="l00062"></a>00062 backlog = va_arg(* params, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>);
<a name="l00063"></a>00063
<a name="l00064"></a>00064 this-&gt;fds = calloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> pollfd), this-&gt;max_fds);
<a name="l00065"></a>00065 this-&gt;<a class="code" href="structconns.html">conns</a> = calloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structconns.html">conns</a>), this-&gt;max_fds);
<a name="l00066"></a>00066
<a name="l00067"></a>00067 this-&gt;sock = <span class="keyword">new</span>(<a class="code" href="structSock.html">Sock</a>, this-&gt;logger, port);
<a name="l00068"></a>00068 flags = fcntl(this-&gt;sock-&gt;handle, F_GETFL, 0);
<a name="l00069"></a>00069 fcntl(this-&gt;sock-&gt;handle, F_SETFL, flags | O_NONBLOCK);
<a name="l00070"></a>00070
<a name="l00071"></a>00071 this-&gt;sockSSL = <span class="keyword">new</span>(<a class="code" href="structSock.html">Sock</a>, this-&gt;logger, port+1);
<a name="l00072"></a>00072 flags = fcntl(this-&gt;sockSSL-&gt;handle, F_GETFL, 0);
<a name="l00073"></a>00073 fcntl(this-&gt;sockSSL-&gt;handle, F_SETFL, flags | O_NONBLOCK);
<a name="l00074"></a>00074
<a name="l00075"></a>00075 SSL_library_init();
<a name="l00076"></a>00076 SSL_load_error_strings();
<a name="l00077"></a>00077 this-&gt;ctx = SSL_CTX_new(SSLv23_server_method());
<a name="l00078"></a>00078 SSL_CTX_use_certificate_file(
<a name="l00079"></a>00079 this-&gt;ctx,
<a name="l00080"></a>00080 <span class="stringliteral">&quot;./certs/server.crt&quot;</span>,
<a name="l00081"></a>00081 SSL_FILETYPE_PEM);
<a name="l00082"></a>00082
<a name="l00083"></a>00083 SSL_CTX_use_RSAPrivateKey_file(
<a name="l00084"></a>00084 this-&gt;ctx,
<a name="l00085"></a>00085 <span class="stringliteral">&quot;./certs/server.key&quot;</span>,
<a name="l00086"></a>00086 SSL_FILETYPE_PEM);
<a name="l00087"></a>00087
<a name="l00088"></a>00088 <a class="code" href="socket_8h.html#a757c220e9371523ef55b1137a1efed57">socketListen</a>(this-&gt;sock, backlog);
<a name="l00089"></a>00089 <a class="code" href="socket_8h.html#a757c220e9371523ef55b1137a1efed57">socketListen</a>(this-&gt;sockSSL, backlog);
<a name="l00090"></a>00090
<a name="l00091"></a>00091 (this-&gt;fds)[0].fd = this-&gt;sock-&gt;handle;
<a name="l00092"></a>00092 (this-&gt;fds)[0].events = POLLIN;
<a name="l00093"></a>00093 (this-&gt;fds)[1].fd = this-&gt;sockSSL-&gt;handle;
<a name="l00094"></a>00094 (this-&gt;fds)[1].events = POLLIN;
<a name="l00095"></a>00095 this-&gt;nfds = 2;
<a name="l00096"></a>00096
<a name="l00097"></a>00097 <span class="keywordflow">return</span> 0;
<a name="l00098"></a>00098 }
<a name="l00099"></a>00099
<a name="l00100"></a>00100 <span class="keyword">static</span>
<a name="l00101"></a>00101 <span class="keywordtype">void</span>
<a name="l00102"></a>00102 serverDtor(<span class="keywordtype">void</span> * _this)
<a name="l00103"></a>00103 {
<a name="l00104"></a>00104 <a class="code" href="structServer.html">Server</a> <span class="keyword">this</span> = _this;
<a name="l00105"></a>00105 <span class="keywordtype">int</span> i;
<a name="l00106"></a>00106
<a name="l00107"></a>00107 <span class="keywordflow">for</span> (i=0; i&lt;this-&gt;nfds; i++) {
<a name="l00108"></a>00108 <span class="keywordflow">if</span> (this-&gt;sock-&gt;handle != (this-&gt;fds)[i].fd &amp;&amp;
<a name="l00109"></a>00109 this-&gt;sockSSL-&gt;handle != (this-&gt;fds)[i].fd) {
<a name="l00110"></a>00110 <a class="code" href="close__conn_8c.html#ad721e61c8676f0b4c3b8fc401e26f266">serverCloseConn</a>(<span class="keyword">this</span>, i);
<a name="l00111"></a>00111 }
<a name="l00112"></a>00112 }
<a name="l00113"></a>00113
<a name="l00114"></a>00114 <a class="code" href="memory_8h.html#a717b411d846e077ecccf689e256b9865">FREE</a>(this-&gt;fds);
<a name="l00115"></a>00115 <a class="code" href="memory_8h.html#a717b411d846e077ecccf689e256b9865">FREE</a>(this-&gt;<a class="code" href="structconns.html">conns</a>);
<a name="l00116"></a>00116
<a name="l00117"></a>00117 <span class="keyword">delete</span>(this-&gt;sock);
<a name="l00118"></a>00118 <span class="keyword">delete</span>(this-&gt;sockSSL);
<a name="l00119"></a>00119
<a name="l00120"></a>00120 SSL_CTX_free(this-&gt;ctx);
<a name="l00121"></a>00121 ERR_free_strings();
<a name="l00122"></a>00122 }
<a name="l00123"></a>00123
<a name="l00124"></a>00124 <a class="code" href="interface_8h.html#a446cc7d7282f8a0b8e62a371671ea605">INIT_IFACE</a>(Class, serverCtor, serverDtor, NULL);
<a name="l00125"></a>00125 <a class="code" href="class_2class_8h.html#a509b4880afb25bb862c448d7a71e7afe">CREATE_CLASS</a>(<a class="code" href="structServer.html">Server</a>, NULL, <a class="code" href="interface_8h.html#a02255665665c91d905ec32d00d9a4a85">IFACE</a>(Class));
<a name="l00126"></a>00126
<a name="l00127"></a>00127 <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="server_8c.html">server.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>