aboutsummaryrefslogtreecommitdiff
path: root/src/tools/tor-fw-helper
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2010-09-30 11:49:41 -0400
committerNick Mathewson <nickm@torproject.org>2010-09-30 12:18:21 -0400
commit1779fee27ab8126682f5f7d2f9aeb5e1978bd875 (patch)
treea8515c915822137b5484fd9fe7e30ec39af6dc5f /src/tools/tor-fw-helper
parenta6dc00fa75fcb089837c50ba1af7a25e5e6e6b20 (diff)
downloadtor-1779fee27ab8126682f5f7d2f9aeb5e1978bd875.tar
tor-1779fee27ab8126682f5f7d2f9aeb5e1978bd875.tar.gz
Turn select() usage in tor-fw-helper into a function.
Diffstat (limited to 'src/tools/tor-fw-helper')
-rw-r--r--src/tools/tor-fw-helper/tor-fw-helper-natpmp.c53
1 files changed, 28 insertions, 25 deletions
diff --git a/src/tools/tor-fw-helper/tor-fw-helper-natpmp.c b/src/tools/tor-fw-helper/tor-fw-helper-natpmp.c
index 6e4e40404..1b896fa3b 100644
--- a/src/tools/tor-fw-helper/tor-fw-helper-natpmp.c
+++ b/src/tools/tor-fw-helper/tor-fw-helper-natpmp.c
@@ -80,6 +80,29 @@ tor_natpmp_cleanup(tor_fw_options_t *tor_fw_options, void *backend_state)
return r;
}
+/** Use select() to wait until we can read on fd. */
+static int
+wait_until_fd_readable(int fd, struct timeval *timeout)
+{
+ int r;
+ fd_set fds;
+ if (fd >= FD_SETSIZE) {
+ fprintf(stderr, "E: NAT-PMP FD_SETSIZE error %d\n", fd);
+ return -1;
+ }
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+ r = select(fd+1, &fds, NULL, NULL, timeout);
+ if (r == -1) {
+ fprintf(stdout, "V: select failed in wait_until_fd_readable: %s\n",
+ strerror(errno));
+ return -1;
+ }
+ /* XXXX we should really check to see whether fd was readable, or we timed
+ out. */
+ return 0;
+}
+
/** Add a TCP port mapping for a single port stored in <b>tor_fw_options</b>
* using the <b>natpmp_t</b> stored in <b>backend_state</b>. */
int
@@ -91,7 +114,6 @@ tor_natpmp_add_tcp_mapping(tor_fw_options_t *tor_fw_options,
int x = 0;
int sav_errno;
- fd_set fds;
struct timeval timeout;
if (tor_fw_options->verbose)
@@ -105,16 +127,10 @@ tor_natpmp_add_tcp_mapping(tor_fw_options_t *tor_fw_options,
"returned %d (%s)\n", r, r==12?"SUCCESS":"FAILED");
do {
- FD_ZERO(&fds);
- FD_SET(state->natpmp.s, &fds);
getnatpmprequesttimeout(&(state->natpmp), &timeout);
- x = select(FD_SETSIZE, &fds, NULL, NULL, &timeout);
+ x = wait_until_fd_readable(state->natpmp.s, &timeout);
if (x == -1)
- {
- fprintf(stdout, "V: select failed in "
- "tor_natpmp_fetch_public_ip.\n");
- return -1;
- }
+ return -1;
if (tor_fw_options->verbose)
fprintf(stdout, "V: attempting to readnatpmpreponseorretry...\n");
@@ -166,30 +182,17 @@ tor_natpmp_fetch_public_ip(tor_fw_options_t *tor_fw_options,
natpmp_state_t *state = (natpmp_state_t *) backend_state;
struct timeval timeout;
- fd_set fds;
r = sendpublicaddressrequest(&(state->natpmp));
fprintf(stdout, "tor-fw-helper: NAT-PMP sendpublicaddressrequest returned"
" %d (%s)\n", r, r==2?"SUCCESS":"FAILED");
do {
-
- if (state->natpmp.s >= FD_SETSIZE)
- {
- fprintf(stderr, "E: NAT-PMP FD_SETSIZE error %d\n",
- state->natpmp.s);
- return -1;
- }
- FD_ZERO(&fds);
- FD_SET(state->natpmp.s, &fds);
getnatpmprequesttimeout(&(state->natpmp), &timeout);
- x = select(FD_SETSIZE, &fds, NULL, NULL, &timeout);
+
+ x = wait_until_fd_readable(state->natpmp.s, &timeout);
if (x == -1)
- {
- fprintf(stdout, "V: select failed in "
- "tor_natpmp_fetch_public_ip.\n");
- return -1;
- }
+ return -1;
if (tor_fw_options->verbose)
fprintf(stdout, "V: NAT-PMP attempting to read reponse...\n");