serverRun_8c-source.html
29.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>xmlrpc: server/serverRun.c Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css">
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.8 -->
<div class="navigation" id="top">
<div class="tabs">
<ul>
<li><a href="main.html"><span>Main Page</span></a></li>
<li><a href="annotated.html"><span>Data Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div class="tabs">
<ul>
<li><a href="files.html"><span>File List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
<h1>server/serverRun.c</h1><a href="serverRun_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#include <sys/select.h></span> <span class="comment">/* for select system call and related */</span>
<a name="l00002"></a>00002 <span class="preprocessor">#include <string.h></span> <span class="comment">/* for memset and stuff */</span>
<a name="l00003"></a>00003 <span class="preprocessor">#include <stdlib.h></span> <span class="comment">/* for exit */</span>
<a name="l00004"></a>00004 <span class="preprocessor">#include <errno.h></span> <span class="comment">/* for errno */</span>
<a name="l00005"></a>00005 <span class="preprocessor">#include <unistd.h></span> <span class="comment">/* for write */</span>
<a name="l00006"></a>00006
<a name="l00007"></a>00007 <span class="preprocessor">#include <expat.h></span>
<a name="l00008"></a>00008
<a name="l00009"></a>00009 <span class="preprocessor">#include "../include/appConfig.h"</span>
<a name="l00010"></a>00010 <span class="preprocessor">#include "../include/server.h"</span>
<a name="l00011"></a>00011 <span class="preprocessor">#include "../include/client.h"</span>
<a name="l00012"></a>00012 <span class="preprocessor">#include "../include/socket.h"</span>
<a name="l00013"></a>00013 <span class="preprocessor">#include "../include/monitor.h"</span>
<a name="l00014"></a>00014 <span class="preprocessor">#include "../include/logRotate.h"</span>
<a name="l00015"></a>00015 <span class="preprocessor">#include "../include/signalHandling.h"</span>
<a name="l00016"></a>00016 <span class="preprocessor">#include "../include/httpRequest.h"</span>
<a name="l00017"></a>00017
<a name="l00018"></a><a class="code" href="serverRun_8c.html#98a2366f9ef44f0d3eee7d33981bbe8a">00018</a> <span class="preprocessor">#define RESPONSE " 200 OK\r\nServer: xmlrpc\r\nStatus: 200\r\nContent-Length: 10\r\nContent-Type: text/plain\r\n\r\n0123456789"</span>
<a name="l00019"></a>00019 <span class="preprocessor"></span>
<a name="l00020"></a><a class="code" href="serverRun_8c.html#c66dbe0e082fd3cc29bc1572a4dccc09">00020</a> <span class="keywordtype">int</span> <a class="code" href="serverRun_8c.html#c66dbe0e082fd3cc29bc1572a4dccc09">Depth</a>;
<a name="l00021"></a>00021
<a name="l00022"></a>00022 <span class="keywordtype">void</span> XMLCALL
<a name="l00023"></a><a class="code" href="serverRun_8c.html#73425567b97c64e9af77c626e0069f67">00023</a> <a class="code" href="serverRun_8c.html#73425567b97c64e9af77c626e0069f67">start</a>(<span class="keywordtype">void</span> *data, <span class="keyword">const</span> <span class="keywordtype">char</span> *el, <span class="keyword">const</span> <span class="keywordtype">char</span> **attr) {
<a name="l00024"></a>00024 <span class="keywordtype">int</span> i;
<a name="l00025"></a>00025
<a name="l00026"></a>00026 <span class="keywordflow">for</span> (i = 0; i < <a class="code" href="serverRun_8c.html#c66dbe0e082fd3cc29bc1572a4dccc09">Depth</a>; i++)
<a name="l00027"></a>00027 printf(<span class="stringliteral">" "</span>);
<a name="l00028"></a>00028
<a name="l00029"></a>00029 printf(<span class="stringliteral">"%s"</span>, el);
<a name="l00030"></a>00030
<a name="l00031"></a>00031 <span class="keywordflow">for</span> (i = 0; attr[i]; i += 2) {
<a name="l00032"></a>00032 printf(<span class="stringliteral">" %s='%s'"</span>, attr[i], attr[i + 1]);
<a name="l00033"></a>00033 }
<a name="l00034"></a>00034
<a name="l00035"></a>00035 printf(<span class="stringliteral">"\n"</span>);
<a name="l00036"></a>00036 Depth++;
<a name="l00037"></a>00037 } <span class="comment">/* End of start handler */</span>
<a name="l00038"></a>00038
<a name="l00039"></a>00039 <span class="keywordtype">void</span> XMLCALL
<a name="l00040"></a><a class="code" href="serverRun_8c.html#1e60190f250d3f699f3671c759e6fe36">00040</a> <a class="code" href="serverRun_8c.html#1e60190f250d3f699f3671c759e6fe36">end</a>(<span class="keywordtype">void</span> *data, <span class="keyword">const</span> <span class="keywordtype">char</span> *el) {
<a name="l00041"></a>00041 <span class="keywordtype">int</span> i;
<a name="l00042"></a>00042
<a name="l00043"></a>00043 <a class="code" href="serverRun_8c.html#c66dbe0e082fd3cc29bc1572a4dccc09">Depth</a>--;
<a name="l00044"></a>00044 <span class="keywordflow">for</span> (i = 0; i < <a class="code" href="serverRun_8c.html#c66dbe0e082fd3cc29bc1572a4dccc09">Depth</a>; i++)
<a name="l00045"></a>00045 printf(<span class="stringliteral">" "</span>);
<a name="l00046"></a>00046 printf(<span class="stringliteral">"--\n"</span>);
<a name="l00047"></a>00047 } <span class="comment">/* End of end handler */</span>
<a name="l00048"></a>00048
<a name="l00049"></a>00049 <span class="keywordtype">void</span>
<a name="l00050"></a><a class="code" href="serverRun_8c.html#208ea34b5a69f6ff0d48ed85c9a6f9eb">00050</a> <a class="code" href="server_8h.html#208ea34b5a69f6ff0d48ed85c9a6f9eb">serverRun</a>(<a class="code" href="structtServer.html">tServer</a> * server)
<a name="l00051"></a>00051 {
<a name="l00052"></a>00052 <a class="code" href="monitor_8h.html#5d332cf84a9d6dd9c77382a74960cccf">syslogMonitor</a>(LOG_INFO, <a class="code" href="monitor_8h.html#d702c7f3311c0b76ee05d7efd27c87b2">MON_INFO</a>, <span class="stringliteral">"startup"</span>, <span class="stringliteral">"service started"</span>);
<a name="l00053"></a>00053
<a name="l00054"></a>00054 <span class="keywordflow">while</span> (!<a class="code" href="signalHandling_8h.html#960e985a396acaabb1bbed4f15668ade">doShutdown</a>) <span class="comment">/* until error or signal */</span>
<a name="l00055"></a>00055 {
<a name="l00056"></a>00056 fd_set rfds;
<a name="l00057"></a>00057 fd_set wfds;
<a name="l00058"></a>00058 <span class="keywordtype">int</span> i;
<a name="l00059"></a>00059
<a name="l00060"></a>00060 memcpy(&rfds, &(server-><a class="code" href="structtServer.html#f1e1c8e11bd347994ebc641bcac4c0fb">socks</a>), <span class="keyword">sizeof</span>(fd_set));
<a name="l00061"></a>00061
<a name="l00062"></a>00062 FD_ZERO(&wfds);
<a name="l00063"></a>00063 <span class="keywordflow">for</span> (i=3; i<=server-><a class="code" href="structtServer.html#145a672dfaec08ce54c02dbc9f3b11ae">maxFd</a>; i++) {
<a name="l00064"></a>00064 <a class="code" href="structtClient.html">tClient</a> * actClient = &(server-><a class="code" href="structtServer.html#1c13c660dcf97444bdeee1f52bace303">clients</a>)[i];
<a name="l00065"></a>00065
<a name="l00066"></a>00066 <span class="keywordflow">if</span> (FD_ISSET(i, &(server-><a class="code" href="structtServer.html#f1e1c8e11bd347994ebc641bcac4c0fb">socks</a>))
<a name="l00067"></a>00067 && NULL != actClient-><a class="code" href="structtClient.html#99d73b0cba75199cb16952751fdcc52d">writeBuffer</a>
<a name="l00068"></a>00068 && 0 != strlen(actClient-><a class="code" href="structtClient.html#99d73b0cba75199cb16952751fdcc52d">writeBuffer</a>)) {
<a name="l00069"></a>00069 FD_SET(i, &wfds);
<a name="l00070"></a>00070 }
<a name="l00071"></a>00071 }
<a name="l00072"></a>00072
<a name="l00073"></a>00073 <span class="comment">/*</span>
<a name="l00074"></a>00074 <span class="comment"> * wait for handles to become ready</span>
<a name="l00075"></a>00075 <span class="comment"> */</span>
<a name="l00076"></a>00076 <span class="keywordflow">if</span> (-1 == select((server-><a class="code" href="structtServer.html#145a672dfaec08ce54c02dbc9f3b11ae">maxFd</a>)+1, &rfds, &wfds, NULL, NULL))
<a name="l00077"></a>00077 {
<a name="l00078"></a>00078 <span class="keywordflow">switch</span> (errno) {
<a name="l00079"></a>00079 <span class="keywordflow">default</span>:
<a name="l00080"></a>00080 <span class="keywordflow">case</span> EBADF:
<a name="l00081"></a>00081 <span class="keywordflow">case</span> EINVAL:
<a name="l00082"></a>00082 <span class="keywordflow">case</span> ENOMEM:
<a name="l00083"></a>00083 <a class="code" href="signalHandling_8h.html#960e985a396acaabb1bbed4f15668ade">doShutdown</a> = 1;
<a name="l00084"></a>00084 <span class="comment">/* Fallthrough */</span>
<a name="l00085"></a>00085
<a name="l00086"></a>00086 <span class="keywordflow">case</span> EINTR:
<a name="l00087"></a>00087 <a class="code" href="monitor_8h.html#5d332cf84a9d6dd9c77382a74960cccf">syslogMonitor</a>(LOG_ERR, <a class="code" href="monitor_8h.html#d702c7f3311c0b76ee05d7efd27c87b2">MON_INFO</a>, <span class="stringliteral">"select"</span>,
<a name="l00088"></a>00088 <span class="stringliteral">"select systemcall failed: [%s] - service terminated"</span>,
<a name="l00089"></a>00089 strerror(errno));
<a name="l00090"></a>00090 <span class="keywordflow">continue</span>; <span class="comment">/* in while loop above */</span>
<a name="l00091"></a>00091 }
<a name="l00092"></a>00092 }
<a name="l00093"></a>00093
<a name="l00094"></a>00094 <span class="comment">/*</span>
<a name="l00095"></a>00095 <span class="comment"> * handle accept</span>
<a name="l00096"></a>00096 <span class="comment"> */</span>
<a name="l00097"></a>00097 <span class="keywordflow">if</span> (FD_ISSET(server-><a class="code" href="structtServer.html#0f35110b14ced93ae0c47173e37d707d">servSock</a>, &rfds)) {
<a name="l00098"></a>00098 <span class="keywordtype">int</span> fd;
<a name="l00099"></a>00099 <span class="keywordtype">char</span> remoteAddr[16] = <span class="stringliteral">""</span>;
<a name="l00100"></a>00100
<a name="l00101"></a>00101 <span class="keywordflow">if</span> (-1 != (fd = <a class="code" href="socket_8h.html#f09ba488c48f40f8d1f133a4441deb25">acceptConnection</a>(server-><a class="code" href="structtServer.html#0f35110b14ced93ae0c47173e37d707d">servSock</a>, remoteAddr))) {
<a name="l00102"></a>00102 (server-><a class="code" href="structtServer.html#1c13c660dcf97444bdeee1f52bace303">clients</a>)[fd].socket = fd; <span class="comment">// save the socket handle within the client struct</span>
<a name="l00103"></a>00103 strncpy(
<a name="l00104"></a>00104 (server-><a class="code" href="structtServer.html#1c13c660dcf97444bdeee1f52bace303">clients</a>)[fd].remoteAddr,
<a name="l00105"></a>00105 remoteAddr,
<a name="l00106"></a>00106 <span class="keyword">sizeof</span>((server-><a class="code" href="structtServer.html#1c13c660dcf97444bdeee1f52bace303">clients</a>)[fd].remoteAddr)-1);
<a name="l00107"></a>00107 FD_SET(fd, &(server-><a class="code" href="structtServer.html#f1e1c8e11bd347994ebc641bcac4c0fb">socks</a>));
<a name="l00108"></a>00108 server-><a class="code" href="structtServer.html#145a672dfaec08ce54c02dbc9f3b11ae">maxFd</a> = <a class="code" href="appConfig_8h.html#acc3ee1a7f283f8ef65cea31f4436a95">MAX</a>(fd, server-><a class="code" href="structtServer.html#145a672dfaec08ce54c02dbc9f3b11ae">maxFd</a>);
<a name="l00109"></a>00109
<a name="l00110"></a>00110 (server-><a class="code" href="structtServer.html#1c13c660dcf97444bdeee1f52bace303">clients</a>)[fd].parser = XML_ParserCreate(<span class="stringliteral">"UTF-8"</span>);
<a name="l00111"></a>00111 XML_SetElementHandler((server-><a class="code" href="structtServer.html#1c13c660dcf97444bdeee1f52bace303">clients</a>)[fd].parser, &<a class="code" href="serverRun_8c.html#73425567b97c64e9af77c626e0069f67">start</a>, &<a class="code" href="serverRun_8c.html#1e60190f250d3f699f3671c759e6fe36">end</a>);
<a name="l00112"></a>00112
<a name="l00113"></a>00113 }
<a name="l00114"></a>00114
<a name="l00115"></a>00115 FD_CLR(server-><a class="code" href="structtServer.html#0f35110b14ced93ae0c47173e37d707d">servSock</a>, &rfds);
<a name="l00116"></a>00116 }
<a name="l00117"></a>00117
<a name="l00118"></a>00118 <span class="comment">/* handle reads (max 10 before next select, else we block accept for to long) */</span>
<a name="l00119"></a>00119 <span class="keywordflow">for</span> (i=3; i<=server-><a class="code" href="structtServer.html#145a672dfaec08ce54c02dbc9f3b11ae">maxFd</a>; i++) {
<a name="l00120"></a>00120 <span class="comment">// for (i=3, count=0; i<=server->maxFd && count<10; i++, count++) {</span>
<a name="l00121"></a>00121 <a class="code" href="structtClient.html">tClient</a> * actClient = &(server-><a class="code" href="structtServer.html#1c13c660dcf97444bdeee1f52bace303">clients</a>)[i];
<a name="l00122"></a>00122
<a name="l00123"></a>00123 <span class="keywordflow">if</span> (FD_ISSET(i, &rfds)) {
<a name="l00124"></a>00124 <span class="keywordflow">switch</span> (<a class="code" href="client_8h.html#6504ff36553f8008b9ee1d52aa977740">clientRead</a>(actClient)) {
<a name="l00125"></a>00125 <span class="keywordflow">case</span> -1:
<a name="l00126"></a>00126 <a class="code" href="monitor_8h.html#5d332cf84a9d6dd9c77382a74960cccf">syslogMonitor</a>(LOG_WARNING, <a class="code" href="monitor_8h.html#d702c7f3311c0b76ee05d7efd27c87b2">MON_INFO</a>, <span class="stringliteral">"socket.read"</span>,
<a name="l00127"></a>00127 <span class="stringliteral">"read on socket for %s returns -1: %s"</span>,
<a name="l00128"></a>00128 actClient-><a class="code" href="structtClient.html#e23a04145b9c0cc1262721432a43c947">remoteAddr</a>, strerror(errno));
<a name="l00129"></a>00129 <span class="comment">/* FALLTHROUGH */</span>
<a name="l00130"></a>00130
<a name="l00131"></a>00131 <span class="keywordflow">case</span> 0:
<a name="l00132"></a>00132 <a class="code" href="client_8h.html#a9dad65338aa78062b23a924ae1d2b59">clientClose</a>(actClient);
<a name="l00133"></a>00133 FD_CLR(i, &(server-><a class="code" href="structtServer.html#f1e1c8e11bd347994ebc641bcac4c0fb">socks</a>));
<a name="l00134"></a>00134 <span class="keywordflow">break</span>;
<a name="l00135"></a>00135
<a name="l00136"></a>00136 <span class="keywordflow">default</span>:
<a name="l00137"></a>00137 <span class="keywordflow">if</span> (! <a class="code" href="httpRequest_8h.html#91e1c62216e1370b68a87ffc8b120f0d">httpHeaderIsComplete</a>(&(actClient-><a class="code" href="structtClient.html#33623f89815acd8a2822a1f04cafe844">httpHeader</a>))) {
<a name="l00138"></a>00138 <span class="keywordtype">char</span> delim[] = <span class="stringliteral">"\r\n"</span>;
<a name="l00139"></a>00139 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = strlen(delim);
<a name="l00140"></a>00140 <span class="keywordtype">char</span> * line = <a class="code" href="client_8h.html#9741eb2a0853766868828c722e67c068">clientGetLine</a>(actClient, delim, &len);
<a name="l00141"></a>00141
<a name="l00142"></a>00142 <span class="comment">/* </span>
<a name="l00143"></a>00143 <span class="comment"> * len might be 0, thus indicatin an empty line</span>
<a name="l00144"></a>00144 <span class="comment"> * this might happen in two cases</span>
<a name="l00145"></a>00145 <span class="comment"> * 1. when a header is not already started</span>
<a name="l00146"></a>00146 <span class="comment"> * (could be identifies by a null req.method</span>
<a name="l00147"></a>00147 <span class="comment"> * 2. if a header is started, then it indicates</span>
<a name="l00148"></a>00148 <span class="comment"> * the end of the header.</span>
<a name="l00149"></a>00149 <span class="comment"> */</span>
<a name="l00150"></a>00150
<a name="l00151"></a>00151 <span class="keywordflow">while</span> (! <a class="code" href="httpRequest_8h.html#99eb3b2c1e06ee773fd3bb7da7e98ece">httpHeaderIsStarted</a>(&(actClient-><a class="code" href="structtClient.html#33623f89815acd8a2822a1f04cafe844">httpHeader</a>))) {
<a name="l00152"></a>00152
<a name="l00153"></a>00153 <span class="keywordflow">if</span> (0 != len) {
<a name="l00154"></a>00154 <a class="code" href="httpRequest_8h.html#b7ea84417c64cc894ef20f3fad58832f">httpHeaderParseRequestLine</a>(&(actClient-><a class="code" href="structtClient.html#33623f89815acd8a2822a1f04cafe844">httpHeader</a>), line, len);
<a name="l00155"></a>00155 <span class="comment">// TODO: do some error handling here</span>
<a name="l00156"></a>00156 }
<a name="l00157"></a>00157
<a name="l00158"></a>00158 len = strlen(delim);
<a name="l00159"></a>00159 <a class="code" href="client_8h.html#a920588f9122184bad211ae912d1dbc4">clientRemoveLine</a>(actClient, delim, &len); <span class="comment">// TODO: do some error handling here</span>
<a name="l00160"></a>00160 len = strlen(delim);
<a name="l00161"></a>00161 line = <a class="code" href="client_8h.html#9741eb2a0853766868828c722e67c068">clientGetLine</a>(actClient, delim, &len);
<a name="l00162"></a>00162
<a name="l00163"></a>00163 }
<a name="l00164"></a>00164
<a name="l00165"></a>00165 <span class="keywordflow">while</span> (NULL != line) {
<a name="l00166"></a>00166 <span class="keywordflow">if</span> (NULL == actClient-><a class="code" href="structtClient.html#33623f89815acd8a2822a1f04cafe844">httpHeader</a>.<a class="code" href="structtHttpHeader.html#d624a9ea5e703b2e8cd812415e28dfc7">req</a>.<a class="code" href="structtRequestLine.html#418658e78fa3e0e0e5fbd8f693104558">method</a>) {
<a name="l00167"></a>00167 }
<a name="l00168"></a>00168 }
<a name="l00169"></a>00169 }
<a name="l00170"></a>00170
<a name="l00171"></a>00171 <span class="keywordflow">if</span> (!<a class="code" href="httpRequest_8h.html#91e1c62216e1370b68a87ffc8b120f0d">httpHeaderIsComplete</a>(&(actClient-><a class="code" href="structtClient.html#33623f89815acd8a2822a1f04cafe844">httpHeader</a>))) {
<a name="l00172"></a>00172 actClient-><a class="code" href="structtClient.html#00e4a47041701700d5d9e418773b01a1">bodyLenRemaining</a> = <a class="code" href="httpRequest_8h.html#07afde622816238d4424591269f5616a">httpHeaderGet</a>(
<a name="l00173"></a>00173 &(actClient-><a class="code" href="structtClient.html#70a954f8e1e6df925d78b34b9f2f162a">readBuffer</a>),
<a name="l00174"></a>00174 &(actClient-><a class="code" href="structtClient.html#0948ef13430298f28cb48199119136c1">readPos</a>),
<a name="l00175"></a>00175 &(actClient-><a class="code" href="structtClient.html#33623f89815acd8a2822a1f04cafe844">httpHeader</a>));
<a name="l00176"></a>00176 }
<a name="l00177"></a>00177
<a name="l00178"></a>00178 <span class="keywordflow">if</span> (<a class="code" href="httpRequest_8h.html#91e1c62216e1370b68a87ffc8b120f0d">httpHeaderIsComplete</a>(&(actClient-><a class="code" href="structtClient.html#33623f89815acd8a2822a1f04cafe844">httpHeader</a>))) {
<a name="l00179"></a>00179 <span class="keywordtype">size_t</span> size = <a class="code" href="appConfig_8h.html#74e75242132eaabbc1c512488a135926">MIN</a>(actClient-><a class="code" href="structtClient.html#00e4a47041701700d5d9e418773b01a1">bodyLenRemaining</a>, actClient-><a class="code" href="structtClient.html#0948ef13430298f28cb48199119136c1">readPos</a>);
<a name="l00180"></a>00180 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> isLast = !(size - actClient-><a class="code" href="structtClient.html#00e4a47041701700d5d9e418773b01a1">bodyLenRemaining</a>);
<a name="l00181"></a>00181
<a name="l00182"></a>00182 <span class="keyword">enum</span> XML_Status expatStat;
<a name="l00183"></a>00183
<a name="l00184"></a>00184 expatStat = XML_Parse(actClient-><a class="code" href="structtClient.html#b8f8ab3f31d6cf8fd4b3b527ef9c0107">parser</a>, actClient-><a class="code" href="structtClient.html#70a954f8e1e6df925d78b34b9f2f162a">readBuffer</a>, size, isLast);
<a name="l00185"></a>00185
<a name="l00186"></a>00186 actClient-><a class="code" href="structtClient.html#0948ef13430298f28cb48199119136c1">readPos</a> -= size;
<a name="l00187"></a>00187 actClient-><a class="code" href="structtClient.html#00e4a47041701700d5d9e418773b01a1">bodyLenRemaining</a> -= size;
<a name="l00188"></a>00188 memmove(actClient-><a class="code" href="structtClient.html#70a954f8e1e6df925d78b34b9f2f162a">readBuffer</a>, actClient-><a class="code" href="structtClient.html#70a954f8e1e6df925d78b34b9f2f162a">readBuffer</a> + size, actClient-><a class="code" href="structtClient.html#0948ef13430298f28cb48199119136c1">readPos</a>);
<a name="l00189"></a>00189 memset(actClient-><a class="code" href="structtClient.html#70a954f8e1e6df925d78b34b9f2f162a">readBuffer</a> + actClient-><a class="code" href="structtClient.html#0948ef13430298f28cb48199119136c1">readPos</a>, 0, size);
<a name="l00190"></a>00190
<a name="l00191"></a>00191 <span class="keywordflow">if</span> (isLast && NULL == actClient-><a class="code" href="structtClient.html#99d73b0cba75199cb16952751fdcc52d">writeBuffer</a>) {
<a name="l00192"></a>00192
<a name="l00193"></a>00193 actClient-><a class="code" href="structtClient.html#99d73b0cba75199cb16952751fdcc52d">writeBuffer</a> = calloc(
<a name="l00194"></a>00194 strlen(actClient-><a class="code" href="structtClient.html#33623f89815acd8a2822a1f04cafe844">httpHeader</a>.<a class="code" href="structtHttpHeader.html#d624a9ea5e703b2e8cd812415e28dfc7">req</a>.<a class="code" href="structtRequestLine.html#9e9dad5c7e7851b4a5e5b8ab8837a72b">httpVersion</a>) +
<a name="l00195"></a>00195 strlen(<a class="code" href="serverRun_8c.html#98a2366f9ef44f0d3eee7d33981bbe8a">RESPONSE</a>) + 3,
<a name="l00196"></a>00196 <span class="keyword">sizeof</span>(<span class="keywordtype">char</span>));
<a name="l00197"></a>00197 sprintf(actClient-><a class="code" href="structtClient.html#99d73b0cba75199cb16952751fdcc52d">writeBuffer</a>, <span class="stringliteral">"%s%s"</span>,
<a name="l00198"></a>00198 actClient-><a class="code" href="structtClient.html#33623f89815acd8a2822a1f04cafe844">httpHeader</a>.<a class="code" href="structtHttpHeader.html#d624a9ea5e703b2e8cd812415e28dfc7">req</a>.<a class="code" href="structtRequestLine.html#9e9dad5c7e7851b4a5e5b8ab8837a72b">httpVersion</a>,
<a name="l00199"></a>00199 <a class="code" href="serverRun_8c.html#98a2366f9ef44f0d3eee7d33981bbe8a">RESPONSE</a>);
<a name="l00200"></a>00200
<a name="l00201"></a>00201 <a class="code" href="httpRequest_8h.html#b55d3458cc9e50ef2a22731d910c6385">freeHttpHeader</a>(&(actClient-><a class="code" href="structtClient.html#33623f89815acd8a2822a1f04cafe844">httpHeader</a>));
<a name="l00202"></a>00202 XML_ParserFree(actClient-><a class="code" href="structtClient.html#b8f8ab3f31d6cf8fd4b3b527ef9c0107">parser</a>);
<a name="l00203"></a>00203 actClient-><a class="code" href="structtClient.html#b8f8ab3f31d6cf8fd4b3b527ef9c0107">parser</a> = NULL;
<a name="l00204"></a>00204 }
<a name="l00205"></a>00205 }
<a name="l00206"></a>00206 <span class="keywordflow">break</span>;
<a name="l00207"></a>00207 }
<a name="l00208"></a>00208 }
<a name="l00209"></a>00209 }
<a name="l00210"></a>00210
<a name="l00211"></a>00211 <span class="comment">/* handle writes */</span>
<a name="l00212"></a>00212 <span class="keywordflow">for</span> (i=3; i<=server-><a class="code" href="structtServer.html#145a672dfaec08ce54c02dbc9f3b11ae">maxFd</a>; i++) {
<a name="l00213"></a>00213 <span class="comment">// for (i=3, count=0; i<=server->maxFd && count<10; i++, count++) {</span>
<a name="l00214"></a>00214 <a class="code" href="structtClient.html">tClient</a> * actClient = &(server-><a class="code" href="structtServer.html#1c13c660dcf97444bdeee1f52bace303">clients</a>)[i];
<a name="l00215"></a>00215
<a name="l00216"></a>00216 <span class="comment">// TODO: the && is only symptom fix...need to find real bug.</span>
<a name="l00217"></a>00217 <span class="keywordflow">if</span> (FD_ISSET(i, &wfds) && NULL != actClient-><a class="code" href="structtClient.html#99d73b0cba75199cb16952751fdcc52d">writeBuffer</a>) {
<a name="l00218"></a>00218 <span class="keywordtype">int</span> writeSize = 0;
<a name="l00219"></a>00219 <span class="keywordtype">int</span> toWrite = strlen(actClient-><a class="code" href="structtClient.html#99d73b0cba75199cb16952751fdcc52d">writeBuffer</a>);
<a name="l00220"></a>00220
<a name="l00221"></a>00221 writeSize = write(actClient-><a class="code" href="structtClient.html#fdcb6fae6d4162315adc430dc34e3df0">socket</a>, actClient-><a class="code" href="structtClient.html#99d73b0cba75199cb16952751fdcc52d">writeBuffer</a>, toWrite);
<a name="l00222"></a>00222
<a name="l00223"></a>00223 <span class="keywordflow">if</span> (0 < writeSize) {
<a name="l00224"></a>00224 <span class="keywordflow">if</span> (writeSize == toWrite) {
<a name="l00225"></a>00225 free(actClient-><a class="code" href="structtClient.html#99d73b0cba75199cb16952751fdcc52d">writeBuffer</a>);
<a name="l00226"></a>00226 actClient-><a class="code" href="structtClient.html#99d73b0cba75199cb16952751fdcc52d">writeBuffer</a> = NULL;
<a name="l00227"></a>00227
<a name="l00228"></a>00228 <a class="code" href="client_8h.html#a9dad65338aa78062b23a924ae1d2b59">clientClose</a>(actClient);
<a name="l00229"></a>00229 FD_CLR(i, &(server-><a class="code" href="structtServer.html#f1e1c8e11bd347994ebc641bcac4c0fb">socks</a>));
<a name="l00230"></a>00230 } <span class="keywordflow">else</span> {
<a name="l00231"></a>00231 memmove(actClient-><a class="code" href="structtClient.html#99d73b0cba75199cb16952751fdcc52d">writeBuffer</a>, actClient-><a class="code" href="structtClient.html#99d73b0cba75199cb16952751fdcc52d">writeBuffer</a> + writeSize, toWrite - writeSize);
<a name="l00232"></a>00232 memset(actClient-><a class="code" href="structtClient.html#99d73b0cba75199cb16952751fdcc52d">writeBuffer</a> + (toWrite - writeSize), 0, writeSize);
<a name="l00233"></a>00233 }
<a name="l00234"></a>00234 }
<a name="l00235"></a>00235 }
<a name="l00236"></a>00236 }
<a name="l00237"></a>00237 }
<a name="l00238"></a>00238 }
</pre></div></div>
<hr size="1"><address style="text-align: right;"><small>Generated on Sun Oct 10 01:24:35 2010 for xmlrpc by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.8 </small></address>
</body>
</html>