diff --git a/PmpMyApp.xcodeproj/tyler.mode1 b/PmpMyApp.xcodeproj/tyler.mode1 index c354c81..7f100ab 100644 --- a/PmpMyApp.xcodeproj/tyler.mode1 +++ b/PmpMyApp.xcodeproj/tyler.mode1 @@ -320,7 +320,7 @@ _historyCapacity 0 bookmark - 2F9021570B7BE0FB004FF42C + 2F18D5670B7C4F3B00149D44 history 2F5A489C0B7565AE0052B0C1 @@ -329,7 +329,7 @@ 2F901EF70B7AEED5004FF42C 2F9021510B7BE0FB004FF42C 2F9021520B7BE0FB004FF42C - 2F9021530B7BE0FB004FF42C + 2F9021760B7C1179004FF42C prevStack @@ -340,9 +340,6 @@ 2F901EC50B7AED84004FF42C 2F901ED80B7AEDBC004FF42C 2F901EE10B7AEE09004FF42C - 2F9021540B7BE0FB004FF42C - 2F9021550B7BE0FB004FF42C - 2F9021560B7BE0FB004FF42C SplitCount @@ -400,9 +397,9 @@ TableOfContents - 2F9021480B7BD19C004FF42C + 2F18D5540B7C4C1900149D44 1CE0B1FE06471DED0097A5F4 - 2F9021490B7BD19C004FF42C + 2F18D5550B7C4C1900149D44 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -536,8 +533,8 @@ 5 WindowOrderList - /Software/Subversion/trunk/PmpMyApp/PmpMyApp.xcodeproj 2F5A48970B7565A60052B0C1 + /Software/Subversion/trunk/PmpMyApp/PmpMyApp.xcodeproj 1C0AD2B3069F1EA900FABCE6 WindowString @@ -579,12 +576,10 @@ 0pt - BecomeActive - ContentConfiguration PBXBuildLogShowsTranscriptDefaultKey - {{0, 118}, {620, 352}} + {{0, 36}, {620, 434}} PBXProjectModuleGUID XCMainBuildResultsModuleGUID PBXProjectModuleLabel @@ -622,7 +617,7 @@ TableOfContents 2F5A48970B7565A60052B0C1 - 2F9021580B7BE0FB004FF42C + 2F18D55F0B7C4E5500149D44 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -633,7 +628,7 @@ WindowToolGUID 2F5A48970B7565A60052B0C1 WindowToolIsVisible - + FirstTimeWindowDisplayed @@ -992,9 +987,9 @@ TableOfContents 1C0AD2B3069F1EA900FABCE6 - 2F90214A0B7BD19C004FF42C + 2F18D5560B7C4C1900149D44 1CD0528B0623707200166675 - 2F90214B0B7BD19C004FF42C + 2F18D5570B7C4C1900149D44 ToolbarConfiguration xcode.toolbar.config.run diff --git a/PmpMyApp.xcodeproj/tyler.pbxuser b/PmpMyApp.xcodeproj/tyler.pbxuser index 50fe383..e70d627 100644 --- a/PmpMyApp.xcodeproj/tyler.pbxuser +++ b/PmpMyApp.xcodeproj/tyler.pbxuser @@ -67,10 +67,14 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 192663959; - PBXWorkspaceStateSaveDate = 192663959; + PBXPerProjectTemplateStateSaveDate = 192695317; + PBXWorkspaceStateSaveDate = 192695317; }; perUserProjectItems = { + 2F18D5530B7C4C1900149D44 /* PBXTextBookmark */ = 2F18D5530B7C4C1900149D44 /* PBXTextBookmark */; + 2F18D55E0B7C4E5500149D44 /* PBXTextBookmark */ = 2F18D55E0B7C4E5500149D44 /* PBXTextBookmark */; + 2F18D5640B7C4E9B00149D44 /* PBXTextBookmark */ = 2F18D5640B7C4E9B00149D44 /* PBXTextBookmark */; + 2F18D5670B7C4F3B00149D44 /* PBXTextBookmark */ = 2F18D5670B7C4F3B00149D44 /* PBXTextBookmark */; 2F5A489C0B7565AE0052B0C1 = 2F5A489C0B7565AE0052B0C1 /* PBXTextBookmark */; 2F5A489D0B7565AE0052B0C1 = 2F5A489D0B7565AE0052B0C1 /* PBXTextBookmark */; 2F5A48A00B7565AE0052B0C1 = 2F5A48A00B7565AE0052B0C1 /* PBXTextBookmark */; @@ -82,30 +86,58 @@ 2F901ED80B7AEDBC004FF42C = 2F901ED80B7AEDBC004FF42C /* PBXTextBookmark */; 2F901EE10B7AEE09004FF42C = 2F901EE10B7AEE09004FF42C /* PBXTextBookmark */; 2F901EF70B7AEED5004FF42C = 2F901EF70B7AEED5004FF42C /* PBXTextBookmark */; - 2F9020F40B7BC77F004FF42C = 2F9020F40B7BC77F004FF42C /* PBXTextBookmark */; - 2F9020F50B7BC77F004FF42C = 2F9020F50B7BC77F004FF42C /* PBXTextBookmark */; - 2F9020F60B7BC77F004FF42C = 2F9020F60B7BC77F004FF42C /* PBXTextBookmark */; - 2F9021260B7BCD94004FF42C = 2F9021260B7BCD94004FF42C /* PBXTextBookmark */; - 2F9021280B7BCD94004FF42C = 2F9021280B7BCD94004FF42C /* PBXTextBookmark */; - 2F9021290B7BCD94004FF42C = 2F9021290B7BCD94004FF42C /* PBXTextBookmark */; - 2F90213A0B7BCF9E004FF42C = 2F90213A0B7BCF9E004FF42C /* PBXTextBookmark */; - 2F90213B0B7BCF9E004FF42C = 2F90213B0B7BCF9E004FF42C /* PBXTextBookmark */; - 2F90213C0B7BCF9E004FF42C = 2F90213C0B7BCF9E004FF42C /* PBXTextBookmark */; - 2F90213D0B7BCF9E004FF42C = 2F90213D0B7BCF9E004FF42C /* PBXTextBookmark */; - 2F9021410B7BD05A004FF42C = 2F9021410B7BD05A004FF42C /* PBXTextBookmark */; - 2F9021470B7BD19C004FF42C /* PBXTextBookmark */ = 2F9021470B7BD19C004FF42C /* PBXTextBookmark */; - 2F9021510B7BE0FB004FF42C /* PBXTextBookmark */ = 2F9021510B7BE0FB004FF42C /* PBXTextBookmark */; - 2F9021520B7BE0FB004FF42C /* PBXTextBookmark */ = 2F9021520B7BE0FB004FF42C /* PBXTextBookmark */; - 2F9021530B7BE0FB004FF42C /* PBXTextBookmark */ = 2F9021530B7BE0FB004FF42C /* PBXTextBookmark */; - 2F9021540B7BE0FB004FF42C /* PBXTextBookmark */ = 2F9021540B7BE0FB004FF42C /* PBXTextBookmark */; - 2F9021550B7BE0FB004FF42C /* PBXTextBookmark */ = 2F9021550B7BE0FB004FF42C /* PBXTextBookmark */; - 2F9021560B7BE0FB004FF42C /* PBXTextBookmark */ = 2F9021560B7BE0FB004FF42C /* PBXTextBookmark */; - 2F9021570B7BE0FB004FF42C /* PBXTextBookmark */ = 2F9021570B7BE0FB004FF42C /* PBXTextBookmark */; + 2F9021510B7BE0FB004FF42C = 2F9021510B7BE0FB004FF42C /* PBXTextBookmark */; + 2F9021520B7BE0FB004FF42C = 2F9021520B7BE0FB004FF42C /* PBXTextBookmark */; + 2F9021530B7BE0FB004FF42C = 2F9021530B7BE0FB004FF42C /* PBXTextBookmark */; + 2F9021540B7BE0FB004FF42C = 2F9021540B7BE0FB004FF42C /* PBXTextBookmark */; + 2F9021550B7BE0FB004FF42C = 2F9021550B7BE0FB004FF42C /* PBXTextBookmark */; + 2F9021560B7BE0FB004FF42C = 2F9021560B7BE0FB004FF42C /* PBXTextBookmark */; + 2F9021760B7C1179004FF42C = 2F9021760B7C1179004FF42C /* PBXTextBookmark */; }; sourceControlManager = 2F5A48590B75586F0052B0C1 /* Source Control */; userBuildSettings = { }; }; + 2F18D5530B7C4C1900149D44 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; + name = "pmpmapper.c: pmp_get_public"; + rLen = 0; + rLoc = 1111; + rType = 0; + vrLen = 1697; + vrLoc = 0; + }; + 2F18D55E0B7C4E5500149D44 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; + name = "pmpmapper.c: 99"; + rLen = 0; + rLoc = 2552; + rType = 0; + vrLen = 1858; + vrLoc = 2111; + }; + 2F18D5640B7C4E9B00149D44 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; + name = "pmpmapper.c: 105"; + rLen = 0; + rLoc = 3086; + rType = 0; + vrLen = 1881; + vrLoc = 1769; + }; + 2F18D5670B7C4F3B00149D44 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; + name = "pmpmapper.c: sendfd"; + rLen = 0; + rLoc = 1118; + rType = 0; + vrLen = 1551; + vrLoc = 2316; + }; 2F5A484B0B7558670052B0C1 /* PmpMyApp */ = { isa = PBXExecutable; activeArgIndex = 2147483647; @@ -151,9 +183,9 @@ }; 2F5A48710B75598F0052B0C1 /* pmpmapper.c */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {817, 2212}}"; - sepNavSelRange = "{1491, 0}"; - sepNavVisRect = "{{0, 6}, {817, 846}}"; + sepNavIntBoundsRect = "{{0, 0}, {817, 2128}}"; + sepNavSelRange = "{1118, 0}"; + sepNavVisRect = "{{0, 1107}, {817, 846}}"; }; }; 2F5A48890B7565810052B0C1 /* PMPMapper */ = { @@ -251,7 +283,7 @@ fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; name = "PMPMapper.c: 29"; rLen = 0; - rLoc = 4016; + rLoc = 3670; rType = 0; vrLen = 951; vrLoc = 0; @@ -334,126 +366,6 @@ vrLen = 452; vrLoc = 0; }; - 2F9020F40B7BC77F004FF42C /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2F901ECF0B7AEDB5004FF42C /* route.c */; - name = "route.c: 12"; - rLen = 0; - rLoc = 157; - rType = 0; - vrLen = 1279; - vrLoc = 1019; - }; - 2F9020F50B7BC77F004FF42C /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; - name = "pmpmapper.c: 35"; - rLen = 0; - rLoc = 1382; - rType = 0; - vrLen = 1851; - vrLoc = 0; - }; - 2F9020F60B7BC77F004FF42C /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2F5A48700B75598F0052B0C1 /* pmpmapper.h */; - name = "pmpmapper.h: 30"; - rLen = 0; - rLoc = 529; - rType = 0; - vrLen = 867; - vrLoc = 0; - }; - 2F9021260B7BCD94004FF42C /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2F5A48700B75598F0052B0C1 /* pmpmapper.h */; - name = "pmpmapper.h: PMP_TIMEOUT"; - rLen = 0; - rLoc = 529; - rType = 0; - vrLen = 867; - vrLoc = 0; - }; - 2F9021280B7BCD94004FF42C /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; - name = "pmpmapper.c: 53"; - rLen = 0; - rLoc = 1491; - rType = 0; - vrLen = 2132; - vrLoc = 929; - }; - 2F9021290B7BCD94004FF42C /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2F5A48700B75598F0052B0C1 /* pmpmapper.h */; - name = "pmpmapper.h: PMP_TIMEOUT"; - rLen = 0; - rLoc = 529; - rType = 0; - vrLen = 867; - vrLoc = 0; - }; - 2F90213A0B7BCF9E004FF42C /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2F901ECF0B7AEDB5004FF42C /* route.c */; - name = "route.c: 12"; - rLen = 0; - rLoc = 157; - rType = 0; - vrLen = 1228; - vrLoc = 1272; - }; - 2F90213B0B7BCF9E004FF42C /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; - name = "pmpmapper.c: 50"; - rLen = 0; - rLoc = 1390; - rType = 0; - vrLen = 1337; - vrLoc = 3052; - }; - 2F90213C0B7BCF9E004FF42C /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; - name = "pmpmapper.c: 50"; - rLen = 0; - rLoc = 1390; - rType = 0; - vrLen = 1337; - vrLoc = 3052; - }; - 2F90213D0B7BCF9E004FF42C /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2F901ECF0B7AEDB5004FF42C /* route.c */; - name = "route.c: 12"; - rLen = 0; - rLoc = 157; - rType = 0; - vrLen = 1228; - vrLoc = 1272; - }; - 2F9021410B7BD05A004FF42C /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; - name = "pmpmapper.c: printf"; - rLen = 0; - rLoc = 4330; - rType = 0; - vrLen = 1766; - vrLoc = 0; - }; - 2F9021470B7BD19C004FF42C /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; - name = "pmpmapper.c: 18"; - rLen = 0; - rLoc = 425; - rType = 0; - vrLen = 1766; - vrLoc = 0; - }; 2F9021510B7BE0FB004FF42C /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 2F901ECF0B7AEDB5004FF42C /* route.c */; @@ -479,7 +391,7 @@ fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; name = r; rLen = 1; - rLoc = 2055; + rLoc = 1682; rType = 0; vrLen = 2025; vrLoc = 1394; @@ -489,7 +401,7 @@ fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; name = r; rLen = 1; - rLoc = 2055; + rLoc = 1682; rType = 0; vrLen = 2025; vrLoc = 1394; @@ -514,15 +426,15 @@ vrLen = 867; vrLoc = 0; }; - 2F9021570B7BE0FB004FF42C /* PBXTextBookmark */ = { + 2F9021760B7C1179004FF42C /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 2F5A48710B75598F0052B0C1 /* pmpmapper.c */; - name = "pmpmapper.c: 53"; + name = "pmpmapper.c: pmp_get_public"; rLen = 0; - rLoc = 1491; + rLoc = 1111; rType = 0; - vrLen = 1780; - vrLoc = 0; + vrLen = 1841; + vrLoc = 163; }; 8D1107260486CEB800E47090 /* PmpMyApp */ = { activeExec = 0; diff --git a/source/pmpmapper.c b/source/pmpmapper.c index a211b4d..871fa9c 100644 --- a/source/pmpmapper.c +++ b/source/pmpmapper.c @@ -35,25 +35,25 @@ static void double_timeout(struct timeval *to) */ struct sockaddr_in *pmp_get_public(struct sockaddr_in *gateway) { - int recvfd, sendfd; + if (gateway == NULL) + { + fprintf(stderr, "Cannot request public IP from a NULL gateway!\n"); + return NULL; + } + + int sendfd; int req_attempts = 1; struct timeval req_timeout; pmp_ip_request_t req; pmp_ip_response_t resp; - struct sockaddr_in *recvsockaddr = (struct sockaddr_in *)(malloc(sizeof(struct sockaddr))); struct sockaddr_in *publicsockaddr = NULL; req_timeout.tv_sec = 0; req_timeout.tv_usec = PMP_TIMEOUT; - - recvsockaddr->sin_family = AF_INET; - recvsockaddr->sin_port = htons(PMP_PORT); - recvsockaddr->sin_addr.s_addr = htonl(INADDR_ANY); gateway->sin_port = htons(PMP_PORT); // Default port for NAT-PMP is 5351 sendfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - recvfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // Clean out both req and resp structures bzero(&req, sizeof(pmp_ip_request_t)); @@ -61,13 +61,6 @@ struct sockaddr_in *pmp_get_public(struct sockaddr_in *gateway) req.version = 0; req.opcode = 0; - - if (bind(recvfd, (struct sockaddr *)(recvsockaddr), sizeof(struct sockaddr_in)) < 0) - { - fprintf(stderr, "Failed to bind properly to UDP:%d (%s)\n", PMP_PORT, strerror(errno)); - return NULL; - } - // Attempt to contact NAT-PMP device 9 times as per: draft-cheshire-nat-pmp-02.txt while (req_attempts < 10) { @@ -84,13 +77,13 @@ struct sockaddr_in *pmp_get_public(struct sockaddr_in *gateway) return NULL; } - if (setsockopt(recvfd, SOL_SOCKET, SO_RCVTIMEO, &req_timeout, sizeof(req_timeout)) < 0) + if (setsockopt(sendfd, SOL_SOCKET, SO_RCVTIMEO, &req_timeout, sizeof(req_timeout)) < 0) { fprintf(stderr, "There was an error setting the socket's options! (%s)\n", strerror(errno)); return NULL; } - if (recvfrom(recvfd, &resp, sizeof(pmp_ip_response_t), 0, (struct sockaddr *)(&addr), &len) < 0) + if (recvfrom(sendfd, &resp, sizeof(pmp_ip_response_t), 0, (struct sockaddr *)(&addr), &len) < 0) { if ( (errno != EAGAIN) || (req_attempts == 9) ) { @@ -109,6 +102,7 @@ struct sockaddr_in *pmp_get_public(struct sockaddr_in *gateway) } else { + publicsockaddr = &addr; break; }