X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fnat%2Fgnunet-helper-nat-server-windows.c;h=09bd025386e1e878450a3e91f0cb287109255b3e;hb=09e5676aa96c2f98ba2a3914b8b2848978930b4d;hp=8386a15b14aa3624d85137378a90fee7e8dbf111;hpb=5746309cb4be2073d550ad7a6885e918631dbc38;p=oweals%2Fgnunet.git diff --git a/src/nat/gnunet-helper-nat-server-windows.c b/src/nat/gnunet-helper-nat-server-windows.c index 8386a15b1..09bd02538 100644 --- a/src/nat/gnunet-helper-nat-server-windows.c +++ b/src/nat/gnunet-helper-nat-server-windows.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - (C) 2010 Christian Grothoff (and other contributing authors) + Copyright (C) 2010 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -14,8 +14,8 @@ You should have received a copy of the GNU General Public License along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ /** @@ -41,8 +41,10 @@ * - Christian Grothoff */ #define _GNU_SOURCE +/* Instead of including gnunet_common.h */ +#define GNUNET_memcpy(dst,src,n) do { if (0 != n) { (void) memcpy (dst,src,n); } } while (0) - +#define FD_SETSIZE 1024 #include #include #include @@ -70,6 +72,11 @@ */ #define NAT_TRAV_PORT 22225 +/** + * Must match packet ID used by gnunet-helper-nat-client.c + */ +#define PACKET_ID 256 + /** * TTL to use for our outgoing messages. */ @@ -182,6 +189,11 @@ struct udp_header uint16_t crc; }; +/** + * Will this binary be run in permissions testing mode? + */ +static boolean privilege_testing = FALSE; + /** * Socket we use to receive "fake" ICMP replies. */ @@ -265,7 +277,7 @@ send_icmp_echo (const struct in_addr *my_ip) ip_pkt.vers_ihl = 0x45; ip_pkt.tos = 0; ip_pkt.pkt_len = htons (sizeof (packet)); - ip_pkt.id = htons (256); + ip_pkt.id = htons (PACKET_ID); ip_pkt.flags_frag_offset = 0; ip_pkt.ttl = IPDEFTTL; ip_pkt.proto = IPPROTO_ICMP; @@ -274,7 +286,7 @@ send_icmp_echo (const struct in_addr *my_ip) ip_pkt.dst_ip = dummy.s_addr; ip_pkt.checksum = htons (calc_checksum ((uint16_t *) & ip_pkt, sizeof (struct ip_header))); - memcpy (&packet[off], &ip_pkt, sizeof (struct ip_header)); + GNUNET_memcpy (&packet[off], &ip_pkt, sizeof (struct ip_header)); off += sizeof (struct ip_header); icmp_echo.type = ICMP_ECHO; @@ -284,7 +296,7 @@ send_icmp_echo (const struct in_addr *my_ip) icmp_echo.checksum = htons (calc_checksum ((uint16_t *) & icmp_echo, sizeof (struct icmp_echo_header))); - memcpy (&packet[off], &icmp_echo, sizeof (struct icmp_echo_header)); + GNUNET_memcpy (&packet[off], &icmp_echo, sizeof (struct icmp_echo_header)); off += sizeof (struct icmp_echo_header); memset (&dst, 0, sizeof (dst)); @@ -367,10 +379,10 @@ process_icmp_response () return; } off = 0; - memcpy (&ip_pkt, &buf[off], sizeof (struct ip_header)); + GNUNET_memcpy (&ip_pkt, &buf[off], sizeof (struct ip_header)); off += sizeof (struct ip_header); - memcpy (&source_ip, &ip_pkt.src_ip, sizeof (source_ip)); - memcpy (&icmp_ttl, &buf[off], sizeof (struct icmp_ttl_exceeded_header)); + GNUNET_memcpy (&source_ip, &ip_pkt.src_ip, sizeof (source_ip)); + GNUNET_memcpy (&icmp_ttl, &buf[off], sizeof (struct icmp_ttl_exceeded_header)); off += sizeof (struct icmp_ttl_exceeded_header); if ((ICMP_TIME_EXCEEDED != icmp_ttl.type) || (0 != icmp_ttl.code)) { @@ -378,7 +390,7 @@ process_icmp_response () return; } /* skip 2nd IP header */ - memcpy (&ip_pkt, &buf[off], sizeof (struct ip_header)); + GNUNET_memcpy (&ip_pkt, &buf[off], sizeof (struct ip_header)); off += sizeof (struct ip_header); switch (ip_pkt.proto) @@ -393,7 +405,7 @@ process_icmp_response () return; } /* grab ICMP ECHO content */ - memcpy (&icmp_echo, &buf[off], sizeof (struct icmp_echo_header)); + GNUNET_memcpy (&icmp_echo, &buf[off], sizeof (struct icmp_echo_header)); port = (uint16_t) ntohl (icmp_echo.reserved); break; case IPPROTO_UDP: @@ -405,7 +417,7 @@ process_icmp_response () return; } /* grab UDP content */ - memcpy (&udp_pkt, &buf[off], sizeof (struct udp_header)); + GNUNET_memcpy (&udp_pkt, &buf[off], sizeof (struct udp_header)); port = ntohs (udp_pkt.length); break; default: @@ -521,9 +533,18 @@ main (int argc, char *const *argv) fd_set rs; struct timeval tv; WSADATA wsaData; - unsigned int alt; + unsigned int alt = 0; + + if ( (argc > 1) && (0 != strcmp (argv[1], "-d"))) + { + privilege_testing = TRUE; + fprintf (stderr, + "%s", + "DEBUG: Running binary in privilege testing mode."); + argv++; + argc--; + } - alt = 0; if (2 != argc) { fprintf (stderr, @@ -561,7 +582,8 @@ main (int argc, char *const *argv) closesocket (rawsock); return 3; } - while (1) + + while ( ! privilege_testing) { FD_ZERO (&rs); FD_SET (icmpsock, &rs); @@ -586,6 +608,8 @@ main (int argc, char *const *argv) closesocket (rawsock); closesocket (udpsock); WSACleanup (); + if (privilege_testing) + return 0; return 4; }