Commit 353fee04940716bed5342f0a62b3bfb8b78fffa1

Authored by perry.werneck@gmail.com
1 parent a67b1c99

Iniciando remoção das chamadas a gethostbyname

connect.c
... ... @@ -126,6 +126,9 @@
126 126 }
127 127 }
128 128  
  129 + #error Implementar
  130 +
  131 + /*
129 132 if(sock > 0)
130 133 {
131 134 // Connection in progress, wait until socket is available for write
... ... @@ -203,6 +206,7 @@
203 206 }
204 207 }
205 208 }
  209 + */
206 210  
207 211 #else
208 212 fcntl(sock, F_SETFL,fcntl(sock,F_GETFL,0)|O_NONBLOCK);
... ... @@ -223,6 +227,9 @@
223 227 }
224 228 }
225 229  
  230 + #error Implementar
  231 +
  232 +/*
226 233 if(sock > 0)
227 234 {
228 235 // Connection in progress, wait until socket is available for write
... ... @@ -301,6 +308,7 @@
301 308 }
302 309 }
303 310 }
  311 + */
304 312 #endif // WIN32
305 313 }
306 314  
... ... @@ -308,7 +316,7 @@
308 316  
309 317 status_changed(hSession,saved_status);
310 318  
311   - return sock;
  319 + return 0;
312 320  
313 321 }
314 322  
... ...
iocalls.c
... ... @@ -48,20 +48,19 @@
48 48 /*---[ Standard calls ]-------------------------------------------------------------------------------------*/
49 49  
50 50 static void internal_remove_timeout(void *timer);
  51 +static void internal_remove_source(void *id);
51 52 static void * internal_add_timeout(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session));
52 53  
53 54 #ifdef WIN32
54 55 static void * internal_add_input(HANDLE source, H3270 *session, void (*fn)(H3270 *session));
  56 + static void * internal_add_output(HANDLE source, H3270 *session, void (*fn)(H3270 *session));
55 57 static void * internal_add_except(HANDLE source, H3270 *session, void (*fn)(H3270 *session));
56 58 #else
57 59 static void * internal_add_input(int source, H3270 *session, void (*fn)(H3270 *session));
  60 + static void * internal_add_output(int source, H3270 *session, void (*fn)(H3270 *session));
58 61 static void * internal_add_except(int source, H3270 *session, void (*fn)(H3270 *session));
59 62 #endif // WIN32
60 63  
61   -static void internal_remove_input(void *id);
62   -
63   -// static int internal_process_events(int block);
64   -
65 64 static int internal_callthread(int(*callback)(H3270 *, void *), H3270 *session, void *parm);
66 65 static int internal_wait(H3270 *hSession, int seconds);
67 66  
... ... @@ -76,19 +75,25 @@ static void internal_ring_bell(H3270 *);
76 75 static void (*remove_timeout)(void *timer)
77 76 = internal_remove_timeout;
78 77  
79   - static void (*remove_input)(void *id)
80   - = internal_remove_input;
  78 + static void (*remove_source)(void *id)
  79 + = internal_remove_source;
81 80  
82 81 #ifdef WIN32
83 82 static void * (*add_input)(HANDLE source, H3270 *session, void (*fn)(H3270 *session))
84 83 = internal_add_input;
85 84  
  85 + static void * (*add_output)(HANDLE source, H3270 *session, void (*fn)(H3270 *session))
  86 + = internal_add_output;
  87 +
86 88 static void * (*add_except)(HANDLE source, H3270 *session, void (*fn)(H3270 *session))
87 89 = internal_add_except;
88 90 #else
89 91 static void * (*add_input)(int source, H3270 *session, void (*fn)(H3270 *session))
90 92 = internal_add_input;
91 93  
  94 + static void * (*add_output)(int source, H3270 *session, void (*fn)(H3270 *session))
  95 + = internal_add_output;
  96 +
92 97 static void * (*add_except)(int source, H3270 *session, void (*fn)(H3270 *session))
93 98 = internal_add_except;
94 99 #endif // WIN32
... ... @@ -266,19 +271,39 @@ static void * internal_add_input(int source, H3270 *session, void (*fn)(H3270 *s
266 271  
267 272 trace("%s session=%p proc=%p",__FUNCTION__,session,fn);
268 273  
269   - ip->source = source;
270   - ip->condition = InputReadMask;
271   - ip->proc = fn;
272   - ip->session = session;
273   - ip->next = inputs;
274   - inputs = ip;
275   - inputs_changed = True;
  274 + ip->source = source;
  275 + ip->condition = InputReadMask;
  276 + ip->proc = fn;
  277 + ip->session = session;
  278 + ip->next = inputs;
  279 + inputs = ip;
  280 + inputs_changed = True;
276 281  
277   -// trace("%s: fd=%d callback=%p handle=%p",__FUNCTION__,source,fn,ip);
  282 + return ip;
  283 +}
  284 +
  285 +#ifdef WIN32
  286 +static void * internal_add_output(HANDLE source, H3270 *session, void (*fn)(H3270 *session))
  287 +#else
  288 +static void * internal_add_output(int source, H3270 *session, void (*fn)(H3270 *session))
  289 +#endif // WIN32
  290 +{
  291 + input_t *ip = (input_t *) lib3270_malloc(sizeof(input_t));
  292 +
  293 + trace("%s session=%p proc=%p",__FUNCTION__,session,fn);
  294 +
  295 + ip->source = source;
  296 + ip->condition = InputWriteMask;
  297 + ip->proc = fn;
  298 + ip->session = session;
  299 + ip->next = inputs;
  300 + inputs = ip;
  301 + inputs_changed = True;
278 302  
279 303 return ip;
280 304 }
281 305  
  306 +
282 307 #if defined(_WIN32)
283 308 static void * internal_add_except(HANDLE source, H3270 *session, void (*fn)(H3270 *session))
284 309 {
... ... @@ -305,7 +330,7 @@ static void * internal_add_except(int source, H3270 *session, void (*fn)(H3270 *
305 330 }
306 331 #endif // WIN32
307 332  
308   -static void internal_remove_input(void *id)
  333 +static void internal_remove_source(void *id)
309 334 {
310 335 input_t *ip;
311 336 input_t *prev = (input_t *)NULL;
... ... @@ -337,7 +362,7 @@ static int internal_event_dispatcher(H3270 *hSession, int block)
337 362 {
338 363 #if defined(_WIN32)
339 364 HANDLE ha[MAX_HA];
340   - DWORD nha;
  365 + DWORD events;
341 366 DWORD tmo;
342 367 DWORD ret;
343 368 unsigned long long now;
... ... @@ -346,19 +371,21 @@ static int internal_event_dispatcher(H3270 *hSession, int block)
346 371 fd_set rfds, wfds, xfds;
347 372 int ns;
348 373 struct timeval now, twait, *tp;
  374 + int events;
349 375 #endif
350 376 input_t *ip, *ip_next;
351 377 struct timeout *t;
352   - Boolean any_events;
353 378 int processed_any = 0;
354 379  
355   - retry:
  380 +retry:
356 381  
357 382 // If we've processed any input, then don't block again.
358   -
359 383 if(processed_any)
360 384 block = 0;
361   - any_events = False;
  385 +
  386 + events = 0;
  387 +
  388 +/*
362 389 #if defined(_WIN32)
363 390 nha = 0;
364 391 #else
... ... @@ -378,12 +405,16 @@ static int internal_event_dispatcher(H3270 *hSession, int block)
378 405 #endif
379 406 any_events = True;
380 407 }
381   -#if !defined(_WIN32)
382 408 if ((unsigned long)ip->condition & InputWriteMask)
383 409 {
  410 +#if defined(_WIN32)
  411 + ha[nha++] = ip->source;
  412 +#else
384 413 FD_SET(ip->source, &wfds);
  414 +#endif
385 415 any_events = True;
386 416 }
  417 +#if !defined(_WIN32)
387 418 if ((unsigned long)ip->condition & InputExceptMask)
388 419 {
389 420 FD_SET(ip->source, &xfds);
... ... @@ -394,7 +425,8 @@ static int internal_event_dispatcher(H3270 *hSession, int block)
394 425  
395 426 if (block)
396 427 {
397   - if (timeouts != TN) {
  428 + if (timeouts != TN)
  429 + {
398 430 #if defined(_WIN32)
399 431 ms_ts(&now);
400 432 if (now > timeouts->ts)
... ... @@ -414,7 +446,9 @@ static int internal_event_dispatcher(H3270 *hSession, int block)
414 446 tp = &twait;
415 447 #endif
416 448 any_events = True;
417   - } else {
  449 + }
  450 + else
  451 + {
418 452 // Block for 1 second (at maximal)
419 453 #if defined(_WIN32)
420 454 tmo = 1;
... ... @@ -437,63 +471,170 @@ static int internal_event_dispatcher(H3270 *hSession, int block)
437 471  
438 472 if (!any_events)
439 473 return processed_any;
  474 +*/
440 475  
441 476 #if defined(_WIN32)
442   - ret = WaitForMultipleObjects(nha, ha, FALSE, tmo);
443   - if (ret == WAIT_FAILED)
  477 +
  478 + for (ip = inputs; ip != (input_t *)NULL; ip = ip->next)
444 479 {
445   -#else
446   - ns = select(FD_SETSIZE, &rfds, &wfds, &xfds, tp);
447   - if (ns < 0)
  480 + if ((unsigned long)ip->condition & InputReadMask)
  481 + ha[events++] = ip->source;
  482 + if ((unsigned long)ip->condition & InputWriteMask)
  483 + ha[events++] = ip->source;
  484 + }
  485 +
  486 + if (block)
448 487 {
449   - if (errno != EINTR)
450   - lib3270_popup_an_errno(hSession,errno,"%s",_( "select() failed when dispatching events"));
451   -#endif
  488 + if (timeouts != TN)
  489 + {
  490 + ms_ts(&now);
  491 + if (now > timeouts->ts)
  492 + tmo = 0;
  493 + else
  494 + tmo = timeouts->ts - now;
  495 + }
  496 + else
  497 + {
  498 + // Block for 1 second (at maximal)
  499 + tmo = 1;
  500 + }
  501 + }
  502 + else if (!events)
  503 + {
  504 + // No block & no events, return
452 505 return processed_any;
453 506 }
  507 + else
  508 + {
  509 + tmo = 1;
  510 + }
  511 +
  512 + ret = WaitForMultipleObjects(nha, ha, FALSE, tmo);
  513 + if (ret == WAIT_FAILED)
  514 + {
  515 + lib3270_popup_dialog( hSession,
  516 + LIB3270_NOTIFY_ERROR,
  517 + _( "Network error" ),
  518 + _( "WaitForMultipleObjects() failed when processing for events." ),
  519 + "Windows error %d",
  520 + GetLastError());
  521 + }
454 522  
455 523 inputs_changed = False;
456 524  
457   -#if defined(_WIN32)
458 525 for (i = 0, ip = inputs; ip != (input_t *)NULL; ip = ip_next, i++)
459 526 {
460   -#else
461   - for (ip = inputs; ip != (input_t *) NULL; ip = ip_next)
462   - {
463   -#endif
464   - ip_next = ip->next;
465   - if (((unsigned long)ip->condition & InputReadMask) &&
466   -#if defined(_WIN32)
467   - ret == WAIT_OBJECT_0 + i)
468   - {
469   -#else
470   - FD_ISSET(ip->source, &rfds))
  527 + if(ret == WAIT_OBJECT_0 + i)
471 528 {
472   -#endif
473 529 (*ip->proc)(ip->session);
474 530 processed_any = True;
475 531 if (inputs_changed)
476 532 goto retry;
477 533 }
478 534  
479   -#if !defined(_WIN32)
480   - if (((unsigned long)ip->condition & InputWriteMask) && FD_ISSET(ip->source, &wfds))
  535 + }
  536 +#else
  537 +
  538 + FD_ZERO(&rfds);
  539 + FD_ZERO(&wfds);
  540 + FD_ZERO(&xfds);
  541 +
  542 + for (ip = inputs; ip != (input_t *)NULL; ip = ip->next)
  543 + {
  544 + if ((unsigned long)ip->condition & InputReadMask)
481 545 {
482   - (*ip->proc)(ip->session);
483   - processed_any = True;
484   - if (inputs_changed)
485   - goto retry;
  546 + FD_SET(ip->source, &rfds);
  547 + events++;
486 548 }
487   - if (((unsigned long)ip->condition & InputExceptMask) && FD_ISSET(ip->source, &xfds))
  549 +
  550 + if ((unsigned long)ip->condition & InputWriteMask)
488 551 {
489   - (*ip->proc)(ip->session);
490   - processed_any = True;
491   - if (inputs_changed)
492   - goto retry;
  552 + FD_SET(ip->source, &wfds);
  553 + events++;
  554 + }
  555 +
  556 + if ((unsigned long)ip->condition & InputExceptMask)
  557 + {
  558 + FD_SET(ip->source, &xfds);
  559 + events++;
493 560 }
494   -#endif
495 561 }
496 562  
  563 + if (block)
  564 + {
  565 + if (timeouts != TN)
  566 + {
  567 + (void) gettimeofday(&now, (void *)NULL);
  568 + twait.tv_sec = timeouts->tv.tv_sec - now.tv_sec;
  569 + twait.tv_usec = timeouts->tv.tv_usec - now.tv_usec;
  570 + if (twait.tv_usec < 0L) {
  571 + twait.tv_sec--;
  572 + twait.tv_usec += MILLION;
  573 + }
  574 + if (twait.tv_sec < 0L)
  575 + twait.tv_sec = twait.tv_usec = 0L;
  576 + tp = &twait;
  577 + }
  578 + else
  579 + {
  580 + twait.tv_sec = 1;
  581 + twait.tv_usec = 0L;
  582 + tp = &twait;
  583 + }
  584 + }
  585 + else
  586 + {
  587 + twait.tv_sec = twait.tv_usec = 0L;
  588 + tp = &twait;
  589 +
  590 + if(!events)
  591 + return processed_any;
  592 + }
  593 +
  594 + ns = select(FD_SETSIZE, &rfds, &wfds, &xfds, tp);
  595 + if (ns < 0 && errno != EINTR)
  596 + {
  597 + lib3270_popup_dialog( hSession,
  598 + LIB3270_NOTIFY_ERROR,
  599 + _( "Network error" ),
  600 + _( "Select() failed when processing for events." ),
  601 + "%s",
  602 + strerror(errno));
  603 + }
  604 + else
  605 + {
  606 + for (ip = inputs; ip != (input_t *) NULL; ip = ip_next)
  607 + {
  608 + ip_next = ip->next;
  609 +
  610 + if (((unsigned long)ip->condition & InputReadMask) && FD_ISSET(ip->source, &rfds))
  611 + {
  612 + (*ip->proc)(ip->session);
  613 + processed_any = True;
  614 + if (inputs_changed)
  615 + goto retry;
  616 + }
  617 +
  618 + if (((unsigned long)ip->condition & InputWriteMask) && FD_ISSET(ip->source, &wfds))
  619 + {
  620 + (*ip->proc)(ip->session);
  621 + processed_any = True;
  622 + if (inputs_changed)
  623 + goto retry;
  624 + }
  625 +
  626 + if (((unsigned long)ip->condition & InputExceptMask) && FD_ISSET(ip->source, &xfds))
  627 + {
  628 + (*ip->proc)(ip->session);
  629 + processed_any = True;
  630 + if (inputs_changed)
  631 + goto retry;
  632 + }
  633 + }
  634 + }
  635 +
  636 +#endif
  637 +
497 638 // See what's expired.
498 639 if (timeouts != TN) {
499 640 #if defined(_WIN32)
... ... @@ -580,6 +721,16 @@ void * AddInput(int source, H3270 *session, void (*fn)(H3270 *session))
580 721 }
581 722  
582 723 #ifdef WIN32
  724 +void * AddOutput(HANDLE source, H3270 *session, void (*fn)(H3270 *session))
  725 +#else
  726 +void * AddOutput(int source, H3270 *session, void (*fn)(H3270 *session))
  727 +#endif // WIN32
  728 +{
  729 + CHECK_SESSION_HANDLE(session);
  730 + return add_output(source,session,fn);
  731 +}
  732 +
  733 +#ifdef WIN32
583 734 void * AddExcept(HANDLE source, H3270 *session, void (*fn)(H3270 *session))
584 735 #else
585 736 void * AddExcept(int source, H3270 *session, void (*fn)(H3270 *session))
... ... @@ -589,9 +740,9 @@ void * AddExcept(int source, H3270 *session, void (*fn)(H3270 *session))
589 740 return add_except(source,session,fn);
590 741 }
591 742  
592   -void RemoveInput(void * id)
  743 +void RemoveSource(void * id)
593 744 {
594   - remove_input(id);
  745 + remove_source(id);
595 746 }
596 747  
597 748 void x_except_on(H3270 *h)
... ... @@ -600,7 +751,7 @@ void x_except_on(H3270 *h)
600 751 return;
601 752  
602 753 if(h->reading)
603   - RemoveInput(h->ns_read_id);
  754 + RemoveSource(h->ns_read_id);
604 755  
605 756 #ifdef WIN32
606 757 h->ns_exception_id = AddExcept(h->sockEvent, h, net_exception);
... ... @@ -621,13 +772,13 @@ void remove_input_calls(H3270 *session)
621 772 {
622 773 if(session->ns_read_id)
623 774 {
624   - RemoveInput(session->ns_read_id);
  775 + RemoveSource(session->ns_read_id);
625 776 session->ns_read_id = NULL;
626 777 session->reading = 0;
627 778 }
628 779 if(session->ns_exception_id)
629 780 {
630   - RemoveInput(session->ns_exception_id);
  781 + RemoveSource(session->ns_exception_id);
631 782 session->ns_exception_id = NULL;
632 783 session->excepting = 0;
633 784 }
... ... @@ -656,8 +807,11 @@ LIB3270_EXPORT int lib3270_register_handlers(const struct lib3270_callbacks *cbk
656 807 if(cbk->AddInput)
657 808 add_input = cbk->AddInput;
658 809  
659   - if(cbk->RemoveInput)
660   - remove_input = cbk->RemoveInput;
  810 + if(cbk->AddOutput)
  811 + add_output = cbk->AddOutput;
  812 +
  813 + if(cbk->RemoveSource)
  814 + remove_source = cbk->RemoveSource;
661 815  
662 816 if(cbk->AddExcept)
663 817 add_except = cbk->AddExcept;
... ...
sources.mak
... ... @@ -34,6 +34,7 @@ TERMINAL_SOURCES = bounds.c ctlr.c util.c toggles.c screen.c selection.c kybd.c
34 34  
35 35 # Network I/O Sources
36 36 NETWORK_SOURCES = iocalls.c proxy.c
  37 +# connect.c
37 38  
38 39 # Full library sources
39 40 SOURCES = $(TERMINAL_SOURCES) $(NETWORK_SOURCES) ft.c ft_cut.c ft_dft.c glue.c resources.c \
... ...
telnet.c
... ... @@ -2052,7 +2052,7 @@ void net_exception(H3270 *session)
2052 2052  
2053 2053 if(session->excepting)
2054 2054 {
2055   - RemoveInput(session->ns_exception_id);
  2055 + RemoveSource(session->ns_exception_id);
2056 2056 session->ns_exception_id = NULL;
2057 2057 session->excepting = 0;
2058 2058 }
... ...
utilc.h
... ... @@ -38,14 +38,16 @@ LIB3270_INTERNAL void xs_warning(const char *fmt, ...) printflike(1, 2);
38 38  
39 39 #ifdef WIN32
40 40 LIB3270_INTERNAL void * AddInput(HANDLE, H3270 *session, void (*fn)(H3270 *session));
  41 + LIB3270_INTERNAL void * AddOutput(HANDLE, H3270 *session, void (*fn)(H3270 *session));
41 42 LIB3270_INTERNAL void * AddExcept(HANDLE, H3270 *session, void (*fn)(H3270 *session));
42 43 #else
43 44 LIB3270_INTERNAL void * AddInput(int, H3270 *session, void (*fn)(H3270 *session));
  45 + LIB3270_INTERNAL void * AddOutput(int, H3270 *session, void (*fn)(H3270 *session));
44 46 LIB3270_INTERNAL void * AddExcept(int, H3270 *session, void (*fn)(H3270 *session));
45 47 #endif // WIN32
46   -LIB3270_INTERNAL void RemoveInput(void *);
47   -LIB3270_INTERNAL void * AddTimeOut(unsigned long msec, H3270 *session, void (*fn)(H3270 *session));
48   -LIB3270_INTERNAL void RemoveTimeOut(void *cookie);
  48 +LIB3270_INTERNAL void RemoveSource(void *);
  49 +LIB3270_INTERNAL void * AddTimeOut(unsigned long msec, H3270 *session, void (*fn)(H3270 *session));
  50 +LIB3270_INTERNAL void RemoveTimeOut(void *cookie);
49 51  
50 52 LIB3270_INTERNAL const char * KeysymToString(KeySym k);
51 53  
... ...