Mercurial > pidgin.yaz
comparison src/proxy.c @ 13530:2e10680b7545
[gaim-migrate @ 15907]
Patch from Julien Bossart to change our DNS child liveness test to one
using waitpid instead of kill. This is still sort of a heuristic,
because we could conceivably have some *other* child with the same PID
(say, a sound fork), but that's reasonably unlikely and this check is
certainly more reliable than the previous check.
committer: Tailor Script <tailor@pidgin.im>
author | Ethan Blanton <elb@pidgin.im> |
---|---|
date | Mon, 20 Mar 2006 18:11:29 +0000 |
parents | 6ad9d666e824 |
children | 3eba1e7458c7 |
comparison
equal
deleted
inserted
replaced
13529:43268b823440 | 13530:2e10680b7545 |
---|---|
542 static int | 542 static int |
543 send_dns_request_to_child(pending_dns_request_t *req, dns_params_t *dns_params) | 543 send_dns_request_to_child(pending_dns_request_t *req, dns_params_t *dns_params) |
544 { | 544 { |
545 char ch; | 545 char ch; |
546 int rc; | 546 int rc; |
547 | 547 pid_t pid; |
548 /* Are you alive? */ | 548 |
549 if (kill(req->dns_pid, 0) != 0) { | 549 /* This waitpid might return the child's PID if it has recently |
550 * exited, or it might return an error if it exited "long | |
551 * enough" ago that it has already been reaped; in either | |
552 * instance, we can't use it. */ | |
553 if ((pid = waitpid (req->dns_pid, NULL, WNOHANG)) > 0) { | |
550 gaim_debug_warning("dns", | 554 gaim_debug_warning("dns", |
551 "DNS child %d no longer exists\n", req->dns_pid); | 555 "DNS child %d no longer exists\n", req->dns_pid); |
556 return -1; | |
557 } else if (pid < 0) { | |
558 gaim_debug_warning("dns", | |
559 "Wait for DNS child %d failed: %s\n", | |
560 req->dns_pid, strerror(errno)); | |
552 return -1; | 561 return -1; |
553 } | 562 } |
554 | 563 |
555 /* Let's contact this lost child! */ | 564 /* Let's contact this lost child! */ |
556 rc = write(req->fd_in, dns_params, sizeof(*dns_params)); | 565 rc = write(req->fd_in, dns_params, sizeof(*dns_params)); |