"Fossies" - the Fresh Open Source Software Archive 
Member "dbg-2.15.5/dbg_net.c" (21 Apr 2007, 12804 Bytes) of package /linux/www/old/dbg-2.15.5.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "dbg_net.c" see the
Fossies "Dox" file reference documentation.
1 /***************************************************************************
2 dbg_net.c - description
3 -------------------
4 begin : Sun Sep 24 2000
5 copyright : (C) 2001 by Dmitri Dmitrienko
6 : (C) 2002, 2007 NuSphere Corp.
7 www : http://dd.cron.ru
8 : http://www.nusphere.com/
9 author : written by Dmitri Dmitrienko
10 license : This source file is subject to version 3.0 of
11 the License, that is bundled with this package
12 in the file LICENSE, and is available at through
13 the world-wide-web at http://www.nusphere.com/dbg
14 ***************************************************************************/
15
16 #ifdef HAVE_CONFIG_H
17 #include "config.h"
18 #endif
19
20 #ifdef DBG_USE_STDALLOCA
21 #define _MALLOC malloc
22 #define _FREE free
23 #else
24 #include "php.h"
25 #include "php_network.h"
26 #include "zend.h"
27 #include "zend_alloc.h"
28 #define _MALLOC emalloc
29 #define _FREE efree
30 #endif
31
32
33
34 #if PHP_WIN32 || defined WIN32
35 #if defined(ZEND_ENGINE_2) || defined(DBG_LISTENER)
36 #include <windows.h>
37 #include <winsock2.h>
38 #else
39 #include <winsock.h>
40 #endif
41 #else
42 #include <unistd.h>
43 #include <sys/socket.h>
44 #include <netinet/in.h>
45 #include <arpa/inet.h>
46 #include <netdb.h>
47 #include <sys/time.h>
48 #endif
49
50
51 #include "dbg_net.h"
52 #include <string.h>
53 #include <signal.h>
54 #include <errno.h>
55 #include <stdlib.h>
56 #include <stdarg.h>
57 #include <stdio.h>
58
59 #ifdef __cplusplus
60 extern "C"{
61 #endif
62
63 DBGAPI int dbg_packet_new(dbg_packet *pack) {
64 memset(pack,0,sizeof(dbg_packet));
65 return 1;
66 }
67
68 DBGAPI void dbg_packet_free(dbg_packet *pack) {
69 if (pack->buf) _FREE(pack->buf);
70 memset(pack,0,sizeof(dbg_packet));
71 }
72
73 DBGAPI void dbg_packet_clear(dbg_packet *pack) {
74 pack->size = 0;
75 pack->lastrawid = 0;
76 }
77
78 int dbg_packet_update_limit(dbg_packet *pack, int space) {
79 int alimit;
80 void *p;
81
82 if (!pack->limit) {
83 alimit = PACKET_LIMIT_ROUND(space);
84 pack->size = 0;
85 pack->buf = _MALLOC(alimit);
86 if (!pack->buf) return 0;
87 pack->limit = alimit;
88 } else if (pack->limit < (pack->size + space)) {
89 alimit = PACKET_LIMIT_ROUND(pack->size + space);
90 p = _MALLOC(alimit);
91 if (!p) return 0;
92 memcpy(p, pack->buf, pack->size);
93 _FREE(pack->buf);
94 pack->buf = p;
95 pack->limit = alimit;
96 }
97 return 1;
98 }
99
100 DBGAPI int dbg_packet_add_frame(dbg_packet *pack, framename frname, void *data, int datasize) {
101 dbg_frame *p;
102 int asize;
103
104 datasize = ALIGN8(datasize);
105 asize = datasize + sizeof(dbg_frame);
106 if (!dbg_packet_update_limit(pack, asize)) {
107 return 0;
108 }
109 p = (dbg_frame *) ((char *) (pack->buf) + pack->size);
110 p->size = datasize;
111 p->name = frname;
112
113 if (data) memcpy(FRAME_DATA_PTR(char,p), data, datasize);
114 pack->size += asize;
115 return FRAME_DATA_PTR(char,p) - (char*)pack->buf;
116 }
117
118 int dbg_sock_read(char *buf, int bufsize, int socket, int timeoutms) {
119 fd_set rset, eset;
120 struct timeval timeout;
121 int ret_val;
122
123 if (socket <= 0) {
124 return 0;
125 }
126
127 FD_ZERO(&rset);
128 FD_SET((unsigned int)socket, &rset);
129 FD_ZERO(&eset);
130 FD_SET((unsigned int)socket, &eset);
131 if (timeoutms >= 0) {
132 timeout.tv_sec = timeoutms / 1000;
133 timeout.tv_usec = (timeoutms>1000) ? 0 : timeoutms * 1000;
134 } else {
135 timeout.tv_sec = 0;
136 timeout.tv_usec = 0;
137 }
138
139 do {
140 ret_val = select(socket + 1, &rset, NULL, &eset, &timeout);
141 } while (ret_val == -1 && errno == EINTR);
142
143 if (ret_val != 1 || !FD_ISSET((unsigned int)socket, &rset)) {
144 return ((ret_val < 0) ? (-1) : (0));
145 }
146
147 if (ret_val >= 0) {
148 ret_val = SREAD(socket, buf, bufsize);
149 if (ret_val == 0) return (-1); /* most probably peer has been terminated */
150 }
151 return (ret_val);
152 }
153
154 DBGAPI dbg_frame *dbg_packet_firstframe(dbg_packet *pack) {
155 return (pack->size ? (pack->buf):(NULL));
156 }
157
158 DBGAPI dbg_frame *dbg_packet_nextframe(dbg_packet *pack, dbg_frame *frame) {
159 dbg_frame *p;
160 int s;
161
162 #ifdef _DEBUG
163 int frsize;
164 char is_eq;
165
166 p = pack->buf;
167 s = pack->size;
168 while (s >= sizeof(dbg_frame)) {
169 frsize = p->size + sizeof(dbg_frame);
170 is_eq = (p == frame);
171 p = (dbg_frame *)((char *)p + frsize);
172 s -= frsize;
173 if (is_eq) {
174 if (s < sizeof(dbg_frame)) return NULL;
175 return p;
176 }
177 }
178 return NULL;
179 #else
180 p = frame;
181 s = pack->size - ((char*)frame + frame->size + sizeof(dbg_frame) - (char*)pack->buf);
182 if (s >= sizeof(dbg_frame)) {
183 p = (dbg_frame *)((char *) p + p->size + sizeof(dbg_frame));
184 return p;
185 }
186 return NULL;
187 #endif
188 }
189
190 DBGAPI dbg_frame* dbg_packet_findfirstframe(dbg_packet *pack, framename frname) {
191 dbg_frame *p;
192 int s,frsize;
193
194 s = pack->size;
195 p = pack->buf;
196 while (s >= sizeof(dbg_frame)) {
197 if (p->name == frname) {
198 return p;
199 }
200 frsize = p->size + sizeof(dbg_frame);
201 p =(dbg_frame *)((char *)p + frsize);
202 s -= frsize;
203 }
204 return NULL;
205 }
206
207 DBGAPI dbg_frame* dbg_packet_findnextframe(dbg_packet *pack, framename frname, dbg_frame *frame) {
208 dbg_frame *p;
209 int s,frsize;
210
211 p = dbg_packet_nextframe(pack, frame);
212
213 s = (p) ? pack->size - ((char*)p - (char*)pack->buf) : 0;
214 while (s >= sizeof(dbg_frame)) {
215 if (p->name == frname) {
216 return p;
217 }
218 frsize = p->size + sizeof(dbg_frame);
219 p = (dbg_frame *) ((char *)p + frsize);
220 s -= frsize;
221 }
222 return NULL;
223 }
224
225 DBGAPI int dbg_packet_send(int cmd , dbg_packet *pack, int socket, int flags) {
226 dbg_header_struct *packetbuf;
227 dbg_frame *p;
228 int packsize, frsize, *v, i;
229 int ret_val, sz, tosend, chunksz, sentsz, icnt;
230 char *pchunk;
231
232 if (socket <= 0) {
233 return -1;
234 }
235 packsize = sizeof(dbg_header_struct) + ((pack!=NULL)? pack->size:0);
236 if (!(packetbuf = _MALLOC(packsize))) {
237 return 0;
238 }
239 packetbuf->sync = htonl(DBG_SYNC);
240 packetbuf->cmd = htonl(cmd);
241 packetbuf->flags = htonl(flags);
242 packetbuf->bodysize = htonl(pack!=NULL?pack->size:0);
243 if (pack && pack->size) {
244 p = (dbg_frame*)((char *)packetbuf + sizeof(dbg_header_struct));
245 sz = pack->size;
246 memcpy(p, pack->buf, pack->size); /* copy data */
247 while (sz > 0) {
248 if (p->name != FRAME_RAWDATA) {
249 v = (int *)((char *)p + sizeof(*p));
250 icnt = p->size / (int)sizeof(*v);
251 for (i=0; i < icnt; i++) {
252 *v = htonl(*v);
253 v++;
254 }
255 } else {
256 dbg_rawdata_body *body = FRAME_DATA_PTR(dbg_rawdata_body, p);
257 body->datasize = htonl(body->datasize);
258 body->rawid = htonl(body->rawid);
259 }
260 frsize = p->size + sizeof(dbg_frame);
261 p->size = htonl(p->size);
262 p->name = htonl(p->name);
263 p = (dbg_frame *)((char *)p + frsize);
264 sz-=frsize;
265 }
266 }
267 tosend = packsize;
268 pchunk = (char *)packetbuf;
269 sentsz = 0;
270 ret_val = 0;
271 while (tosend > 0) {
272 chunksz = (tosend > CHUNKSIZE) ? CHUNKSIZE:tosend;
273 ret_val = SSEND(socket, pchunk, chunksz);
274 if (ret_val <= 0) break;
275 sentsz+=ret_val;
276 pchunk+=ret_val;
277 tosend-=ret_val;
278 }
279 _FREE(packetbuf);
280 if (ret_val < 0) return -1;
281 if (sentsz == packsize) return sentsz;
282 return 0;
283 }
284
285 int dbg_packet_recv_body(dbg_packet *pack, int bodysize, int socket, int timeoutms) {
286 dbg_frame *p;
287 int *v, i;
288 int ret_val = 0;
289 int restsize, chunksz, recvsz, is_first, icnt;
290 int frsize;
291 char *pchunk;
292
293 if (!dbg_packet_update_limit(pack, bodysize)) {
294 return 0;
295 }
296 pchunk = (char *) (pack->buf) + pack->size;
297 restsize = bodysize;
298 recvsz = 0;
299 is_first = 1;
300 while (restsize > 0) {
301 if (is_first) {
302 chunksz = (restsize>(CHUNKSIZE-sizeof(dbg_header_struct))) ? CHUNKSIZE-sizeof(dbg_header_struct):restsize;
303 is_first = 0;
304 }
305 else {
306 chunksz = (restsize>CHUNKSIZE) ? CHUNKSIZE:restsize;
307 }
308 ret_val = dbg_sock_read(pchunk, chunksz, socket, timeoutms);
309 if (ret_val < 0 || (recvsz == 0 && ret_val == 0))
310 break;
311 restsize -= ret_val;
312 recvsz += ret_val;
313 pchunk += ret_val;
314 }
315 if (recvsz!=bodysize) {
316 dbg_packet_clear(pack);
317 if (ret_val < 0) return -1;
318 return 0;
319 }
320 p = (dbg_frame *)((char *) (pack->buf) + pack->size);
321 restsize = bodysize;
322 while (restsize > 0) {
323 p->size = ntohl(p->size);
324 p->name = ntohl(p->name);
325 if (p->name != FRAME_RAWDATA) { /* make all ints back system-depended Big- or Little- Endian*/
326 v = (int *)((char *)p + sizeof(*p));
327 icnt = p->size/(int)sizeof(*v);
328 for (i=0; i < icnt; i++) {
329 *v = ntohl(*v);
330 v++;
331 }
332 } else {
333 dbg_rawdata_body *body = FRAME_DATA_PTR(dbg_rawdata_body,p);
334 body->datasize = ntohl(body->datasize);
335 body->rawid = ntohl(body->rawid);
336 }
337 frsize = p->size + (int)sizeof(dbg_frame);
338 if ((p->size > MAX_PACKET_SIZE) || (frsize > restsize)) {
339 dbg_packet_clear(pack);
340 return 0;
341 }
342 p = (dbg_frame *)((char *)p + frsize);
343 restsize -= frsize;
344 if (restsize < 0) {
345 dbg_packet_clear(pack);
346 return 0;
347 }
348 }
349 pack->size += bodysize;
350 return bodysize;
351 }
352
353 DBGAPI int dbg_packet_recv(dbg_header_struct *hdr, dbg_packet *pack, int socket, int timeoutms) {
354 int ret_val;
355
356 if (!pack || !hdr) return 0;
357 dbg_packet_clear(pack);
358 ret_val = dbg_sock_read((char *) hdr, sizeof(dbg_header_struct), socket, timeoutms);
359 if ((ret_val != sizeof(dbg_header_struct)) ||
360 (hdr->sync != (int)ntohl(DBG_SYNC))) {
361 memset(hdr,0,sizeof(dbg_header_struct));
362 if (ret_val < 0) return -1;
363 return 0;
364 }
365
366 hdr->bodysize = ntohl(hdr->bodysize);
367 hdr->cmd = ntohl(hdr->cmd);
368 hdr->flags = ntohl(hdr->flags);
369
370 if ((hdr->bodysize<0) || (hdr->bodysize > MAX_PACKET_SIZE)) {
371 memset(hdr,0,sizeof(dbg_header_struct));
372 return 0;
373 }
374 if (hdr->bodysize) {
375 if (!dbg_packet_recv_body(pack, hdr->bodysize, socket, timeoutms)) {
376 memset(hdr,0,sizeof(dbg_header_struct));
377 return 0;
378 }
379 }
380 return hdr->bodysize + sizeof(dbg_header_struct);
381 }
382
383
384 int add_rawdata(dbg_packet *pack, const char *data, int datasize, char **presult) {
385 dbg_rawdata_body *body;
386 char *p;
387 int id, bodyofs;
388
389 if (presult) *presult = NULL;
390 if (!data && datasize) return 0;
391 bodyofs = dbg_packet_add_frame(pack, FRAME_RAWDATA, NULL, datasize + sizeof(dbg_rawdata_body));
392 if (!bodyofs) {
393 return 0;
394 }
395 id = ++pack->lastrawid;
396 body = (dbg_rawdata_body *)((char *)pack->buf + bodyofs);
397 body->rawid = id;
398 body->datasize = datasize;
399 p = (char*)body + sizeof(dbg_rawdata_body);
400 if (presult) *presult = p;
401 if (data) memcpy(p, data, datasize);
402
403 return id;
404 }
405
406
407 DBGAPI int dbg_packet_add_rawdata(dbg_packet *pack, const char *data, int datasize) {
408 return add_rawdata(pack, data, datasize, NULL);
409 }
410
411 DBGAPI int dbg_packet_add_stringlen(dbg_packet *pack, const char *str, int len) {
412 char *rslt;
413 int ret_val;
414
415 if (len == 0) return 0;
416 ret_val = add_rawdata(pack, str, len+1, &rslt);
417 if (rslt && ret_val) {
418 rslt[len]='\0';
419 }
420 return ret_val;
421 }
422
423
424 DBGAPI int dbg_packet_findrawdata(dbg_packet *pack, int rawid, char **data, int *datasize) {
425 dbg_frame *fr;
426 dbg_rawdata_body *body;
427
428 *datasize = 0;
429 *data = NULL;
430 if (rawid <= 0) return 0;
431 fr = dbg_packet_findfirstframe(pack, FRAME_RAWDATA);
432 while (fr) {
433 body = FRAME_DATA_PTR(dbg_rawdata_body,fr);
434 if ((int)body->rawid == rawid) {
435 *data = (char*)body + sizeof(dbg_rawdata_body);
436 *datasize = body->datasize;
437 return sizeof(dbg_rawdata_body) + (*datasize);
438 }
439 fr = dbg_packet_findnextframe(pack, FRAME_RAWDATA, fr);
440 }
441 return 0;
442 }
443
444
445
446
447
448
449 /********************************\
450
451 DEBUGGING/TRACING\FACILITY
452
453 \********************************/
454
455 #if defined(DBG_TRACEFILE)
456 #ifdef WIN32
457 #define OPENLOG(f) f = fopen(DBG_TRACEFILE,"a+")
458 #else
459 #define OPENLOG(f) f = fopen(DBG_TRACEFILE,"a")
460 #endif
461
462 #define LOG(msg) { \
463 FILE *log; \
464 OPENLOG(log); \
465 if (log) { \
466 fprintf(log, "%s", msg); \
467 fclose(log); \
468 } \
469 }
470 #else
471 #define LOG(msg)
472 #endif
473
474
475 void SysError(const char *msg,...) {
476 va_list args;
477 char buf[512];
478
479 va_start(args, msg);
480 vsnprintf(buf, sizeof(buf)-1, msg, args);
481 va_end(args);
482
483 fprintf(stderr, buf);
484
485 #ifdef WIN32
486 {
487 int err;
488 err = WSAGetLastError();
489 if (err) {
490 int i;
491 FormatMessage(
492 FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
493 NULL,
494 err,
495 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
496 buf,
497 sizeof(buf),
498 NULL
499 );
500 i=strlen(buf);
501 while (--i>0 && buf[i]<32);
502 buf[i+1] = 0;
503 fprintf(stderr, "\nOSERR:%d:\"%s\"\n", err, buf);
504 DBG_TRACE(("OSERR: %d \"%s\"\n", err, buf));
505 }
506 }
507 #else
508 if (errno) {
509 fprintf(stderr, "\nOSERR:%d:\"%s\"\n", errno, strerror(errno));
510 DBG_TRACE(("OSERR: %d \"%s\"\n", errno, buf));
511 }
512 #endif
513 }
514
515 /************************
516
517 TRACE
518
519 *************************/
520
521
522 #ifdef DBG_DEBUG
523 void _dbg_trace(const char *str,...) {
524 va_list args;
525 char buf[1024];
526
527 if (!str) return;
528 va_start(args, str);
529 vsnprintf(buf, sizeof(buf)-1, str, args);
530 #ifdef PHP_WIN32
531 OutputDebugString("[DBG] ");
532 OutputDebugString(buf);
533 #endif
534 LOG(buf);
535 fprintf(stderr, "[DBG] ");
536 fprintf(stderr, buf);
537 va_end(args);
538 }
539 #endif
540
541 #ifdef __cplusplus
542 }
543 #endif