From e2f8a1cb821ff74b977716ab973b9c8016e38278 Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Wed, 25 Jun 2008 14:36:10 +0000 Subject: [PATCH] mingw port continues. git-svn-id: file:///svn/unbound/trunk@1139 be551aaa-1e26-0410-a405-d3ace91eadb9 --- doc/Changelog | 2 ++ doc/TODO | 5 +++++ libunbound/libunbound.c | 2 ++ services/listen_dnsport.c | 40 ++++++++++++++++++++++++++++++++++++- testcode/delayer.c | 23 +++++++++++++++++++-- testdata/05-asynclook.tpkg | Bin 2138 -> 2237 bytes testdata/hostsfileosx.tpkg | Bin 1882 -> 1947 bytes util/config_file.c | 2 +- util/netevent.c | 17 ++++++++++++++++ util/winsock_event.h | 4 ++++ 10 files changed, 91 insertions(+), 4 deletions(-) diff --git a/doc/Changelog b/doc/Changelog index cd14132c1..096ad37bf 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -2,6 +2,8 @@ - fixup fwd_ancil test typos. - Fix for newegg lameness : ok for qtype=A, but lame for others. - fixup unit test for infra cache, test lame merging. + - porting to mingw, bind, listen, getsockopt and setsockopt error + handling. 24 June 2008: Wouter - removed testcode/checklocks from production code compilation path. diff --git a/doc/TODO b/doc/TODO index 9e04a77a3..a2aa108e4 100644 --- a/doc/TODO +++ b/doc/TODO @@ -69,3 +69,8 @@ o command channel for couple of tasks. Like rndc. o add/del static preload data to change the domain redirections. o and maybe also start, stop, reload. + +o on windows version, libunbound uses a NamedPipe, examine security status + make sure the OS makes it safe like on unix. +o on windows version, implement that OS ancillary data capabilities for + interface-automatic. IPPKTINFO, IP6PKTINFO for WSARecvMsg, WSASendMsg. diff --git a/libunbound/libunbound.c b/libunbound/libunbound.c index 8cb146304..4b7a6d5e3 100644 --- a/libunbound/libunbound.c +++ b/libunbound/libunbound.c @@ -109,6 +109,7 @@ ub_ctx_create() errno = e; return NULL; } +#ifndef USE_WINSOCK if(!fd_set_nonblock(ctx->rrpipe[0]) || !fd_set_nonblock(ctx->rrpipe[1]) || !fd_set_nonblock(ctx->qqpipe[0]) || @@ -123,6 +124,7 @@ ub_ctx_create() errno = e; return NULL; } +#endif /* !USE_WINSOCK - it is a pipe(nonsocket) on windows) */ lock_basic_init(&ctx->qqpipe_lock); lock_basic_init(&ctx->rrpipe_lock); lock_basic_init(&ctx->cfglock); diff --git a/services/listen_dnsport.c b/services/listen_dnsport.c index c054c268c..2e8c46eaf 100644 --- a/services/listen_dnsport.c +++ b/services/listen_dnsport.c @@ -123,8 +123,14 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, int val=(v6only==2)?0:1; if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&val, (socklen_t)sizeof(val)) < 0) { +#ifndef USE_WINSOCK log_err("setsockopt(..., IPV6_V6ONLY" ", ...) failed: %s", strerror(errno)); +#else + log_err("setsockopt(..., IPV6_V6ONLY" + ", ...) failed: %s", + wsa_strerror(WSAGetLastError())); +#endif close(s); *noproto = 0; *inuse = 0; @@ -143,8 +149,14 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, */ if (setsockopt(s, IPPROTO_IPV6, IPV6_USE_MIN_MTU, (void*)&on, (socklen_t)sizeof(on)) < 0) { +#ifndef USE_WINSOCK log_err("setsockopt(..., IPV6_USE_MIN_MTU, " "...) failed: %s", strerror(errno)); +#else + log_err("setsockopt(..., IPV6_USE_MIN_MTU, " + "...) failed: %s", + wsa_strerror(WSAGetLastError())); +#endif close(s); *noproto = 0; *inuse = 0; @@ -154,11 +166,18 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, } if(bind(s, (struct sockaddr*)addr, addrlen) != 0) { *noproto = 0; +#ifndef USE_WINSOCK #ifdef EADDRINUSE *inuse = (errno == EADDRINUSE); if(errno != EADDRINUSE) -#endif log_err("can't bind socket: %s", strerror(errno)); +#endif +#else /* USE_WINSOCK */ + if(WSAGetLastError() != WSAEADDRINUSE && + WSAGetLastError() != WSAEADDRNOTAVAIL) +#endif + log_err("can't bind socket: %s", + wsa_strerror(WSAGetLastError())); close(s); return -1; } @@ -208,8 +227,13 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto) #ifdef SO_REUSEADDR if(setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void*)&on, (socklen_t)sizeof(on)) < 0) { +#ifndef USE_WINSOCK log_err("setsockopt(.. SO_REUSEADDR ..) failed: %s", strerror(errno)); +#else + log_err("setsockopt(.. SO_REUSEADDR ..) failed: %s", + wsa_strerror(WSAGetLastError())); +#endif return -1; } #endif /* SO_REUSEADDR */ @@ -217,8 +241,13 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto) if(addr->ai_family == AF_INET6 && v6only) { if(setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&on, (socklen_t)sizeof(on)) < 0) { +#ifndef USE_WINSOCK log_err("setsockopt(..., IPV6_V6ONLY, ...) failed: %s", strerror(errno)); +#else + log_err("setsockopt(..., IPV6_V6ONLY, ...) failed: %s", + wsa_strerror(WSAGetLastError())); +#endif return -1; } } @@ -226,14 +255,23 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto) (void)v6only; #endif /* IPV6_V6ONLY */ if(bind(s, addr->ai_addr, addr->ai_addrlen) != 0) { +#ifndef USE_WINSOCK log_err("can't bind socket: %s", strerror(errno)); +#else + log_err("can't bind socket: %s", + wsa_strerror(WSAGetLastError())); +#endif return -1; } if(!fd_set_nonblock(s)) { return -1; } if(listen(s, TCP_BACKLOG) == -1) { +#ifndef USE_WINSOCK log_err("can't listen: %s", strerror(errno)); +#else + log_err("can't listen: %s", wsa_strerror(WSAGetLastError())); +#endif return -1; } return s; diff --git a/testcode/delayer.c b/testcode/delayer.c index f6e089571..4bf8d98e7 100644 --- a/testcode/delayer.c +++ b/testcode/delayer.c @@ -1025,7 +1025,11 @@ service(char* bind_str, int bindport, char* serv_str, size_t memsize, exit(1); } if(bind(s, (struct sockaddr*)&bind_addr, bind_len) == -1) { +#ifndef USE_WINSOCK log_err("bind: %s", strerror(errno)); +#else + log_err("bind: %s", wsa_strerror(WSAGetLastError())); +#endif if(i--==0) fatal_exit("cannot bind any port"); bindport = 1024 + random()%64000; @@ -1046,14 +1050,29 @@ service(char* bind_str, int bindport, char* serv_str, size_t memsize, int on = 1; if(setsockopt(listen_s, SOL_SOCKET, SO_REUSEADDR, (void*)&on, (socklen_t)sizeof(on)) < 0) +#ifndef USE_WINSOCK fatal_exit("setsockopt(.. SO_REUSEADDR ..) failed: %s", strerror(errno)); +#else + fatal_exit("setsockopt(.. SO_REUSEADDR ..) failed: %s", + wsa_strerror(WSAGetLastError())); +#endif } #endif - if(bind(listen_s, (struct sockaddr*)&bind_addr, bind_len) == -1) + if(bind(listen_s, (struct sockaddr*)&bind_addr, bind_len) == -1) { +#ifndef USE_WINSOCK fatal_exit("tcp bind: %s", strerror(errno)); - if(listen(listen_s, 5) == -1) +#else + fatal_exit("tcp bind: %s", wsa_strerror(WSAGetLastError())); +#endif + } + if(listen(listen_s, 5) == -1) { +#ifndef USE_WINSOCK fatal_exit("tcp listen: %s", strerror(errno)); +#else + fatal_exit("tcp listen: %s", wsa_strerror(WSAGetLastError())); +#endif + } fd_set_nonblock(listen_s); printf("listening on port: %d\n", bindport); diff --git a/testdata/05-asynclook.tpkg b/testdata/05-asynclook.tpkg index 128328d657f4a945bcdce7aa26b11e4f75a39561..941a46aae5afe971bbcc22a409958748f0b4af4a 100644 GIT binary patch literal 2237 zc-jHI2txNCiwFSoQ({N}1MM39ciPC&zp{VDMCQeIQ)EeiX>s7f*|_#4#y(8W&Fky) z326bMkJ`U-bhIN&waQUhk;_N5 z9Z6xIJ0NX<_gZ-6_Wx1!Xh$8>I;0Ixexa^s*j626Q6i_*(_F*x`9P0)K5#@}n1KU< zXIMipjecPD?ZDE>iAz<6e5(3L_slimC)EO_3esQeRjFRC!b!UaiX{DoT&jlU+#Mcp1F)jjA_ z)1JV@@JF0OIBa230($^cJ8+TGSk*?DCPWmlUYB7RaQ=*a@+8Jwh^*8^3IAo+u3ohZ z7h`p3SgJb(i~1AWy%&iraY{;t(s;^bP8LT4GxYKT`oJ|XZ_OMD(31IiF0Asd z;}H|!$aCc9rg$#XZJt4pFxu3fSilM4#JypfFqr5l0e>u>-JafEUz|eoP^aGxtpLZA z=3ANPo_kD%Soqgq68d2HAbnTe!J7DY=_Yurj(=?Sl{o&7Bqi+s^ZNfHuq^&v`jXKf zc-g?^-2`hlqGVvGeProi6OIRs-)z70bg0_V@%SnwX%GH+pBP!rx` z?689(B283Z8#T!wurzi~=AO^}1ggvLcbfZR?_U*E{dF zZyII%%DAFEeRtZB;Fx{F`vw$~RpH>fcW7gL)NN8I%(RcXFUrhg21A!RAQTmW4J7G& zW{E-}RFRISPCz*smm>ZV*i;`+x%bETgvLl{vuP;NuW3=TVKFc|BpI=>u$RtFxH~L@*u~@RLYxwFg%w1!o=LfY&?Vy$yLEzb)8HmB7IQDj!8w# zn(!Z_gk>S{nLY&ayO*-AAS^_wW4|z)o#pjV!j#Mcp{7R(uNF}vp2uQUg`q`Ngf$KB zIA)59(AYgKh2+-vvh}guV5c1>QrMgf`QayX(g|e(j?NK|(I;XZ?rS;}QRi58iwq@U za3GKslj-j0fg>Hplk-~8REuq{9~h>d5C|7Lu03?s@!Yl-n3}eBU&11045kNM6CI>^q|yHYITf5y_XL10|KYWzgp9SxsCDJaI;;==tBF})ZxPtMp5@)s#!sB`EDO&ygv=UWjaDSWfmL$xlYVx`I z!SBk}6!rw-FRH;bFXb_2$~Mh4Fkm-MK95_^-?9NWOaGPG@M%>9I|7ZGCjZ&_Q9El} zw)1A`uds8pTdHs0%A01j%*Ia-(`{RD<1Ai}5uX^Syzgb5-q_aZqo(d}+0L7#|GF~r z)1!6UR@^v?*Ja2jMl5~sDIN%Q{tb`DvtxeN8V|_}6vBe3Qj;Wg)@>vw-6tP$cKMkc zqQkImQ;*+tuvas}pO7auy9Cg}msD)To4AG_USfIdr4s%oN<@b1WSK`V*`U8>kN!rt z8A}(-qwym#|3$?UNXqW;j31uY-~U?AzU*B4{#Pya{)f!p|6s3#<@diY0LQ?7otyoB z$FE*lZYW-LFaCDXfmB)&NwL@a1mz=1BIKCg&^oR$X0`llK;0>6cY56~cR#jq9l31v zPR_x0G_3OQ)t@@}m%j|vZC`)-0zY@5)q>7dyW73$lGf=@pKp4g+0OLN(8*2vq<3-E zfuBFOZ`cF*P`Kz6Iydn|t8;VP?#_k_arTcSXm?J@_JqM~&G@#m(#*ySsY>xu0x6G4 zq+~@>(jxuQzL!G|IpmN-4msqILk>CQkV6hRCQkV6hRYzF=Z LLckGV08jt`_6&Ub literal 2138 zc-jG42&MNQiwFRtAh1UO1MOOIciK1-&%fwXOdVd6To1=Kf!vakEt}9yc3YAq^m_a5 z-OCDFfH%f+WxIrTx8MCnvH?R9l5QZo-T2qnV5HHEG@}`5#u$|n4adIiaek#cuGrmJ zJq*PDekJ*=?#+Fs*f5R#%AR2vRvFvPa>cSXpt6R!+&~;gQ~+#@cpNctH{E^xUnz`5 z`_DB5f~`UZqPk%BjQuUMY)Sj?Rm+xHH7vA$b+2k{fUyGE_u`q`e-k!KC0I0iskBKp zA>^^J8AJmHLmJ}h;WMhL=XwlA1LlJpZH2N|F!FCG^+4Bm^(eUN>qw@jBmM&~Urrd^ z(vMQ&5PPQ05ep;eaRIIm>KPkd+C`B84MW%Or=sQu%t@K+BBb3qzC1r`ck0FMZ78-I zt>d%z@CqvB${y_OkhdRa-Ngwl_M6zp>;VUDMlpHP;PCK<9Ml)?BsKXF6%MWq$(!xE z=lEeslK3HUd�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 hAnRiiS?eNM%OZVg-`kDd*o`kcegjQ_Z zaBxshp8K_>X9`bD(=e;nfnk}5XVwg>`UL8qK$jJW!-xuiCsQ6rOnew`-S{Jganb%u z9Ra@FUxqaBe!=c}``4}7!v03BiuOOK;V>BY7rh=nbNg?>R;2S|+Yy96tr(gI#{z(7duNoWwe+bxu z6Y1{9G@=6;@DIbd@?qOPwzlsb-JVaP(Dz5~>Asca9q0FT?$OF{`^ z(nxytmV&xP|8c;Vl?El!{s?Hj+;2f>@f!|!qZz0+%YjvrPeiXRep zm`v)aoP+juI(F@`swX?Wx7wjxOP`byGIYcV+e>!c-oW+u@_dFaNvNO_z(TFnsO5*y z!WtLzypbwV;TcJb*Jk-?etNPaZQMFJn?|=xcuL*GSRoVd(by4(5r;VVQW*s&Ug_$sBMJtHw|8gM9|@S+Ljj4J7T{v2(LO^1_GX}bMU0 zJW3Yssp2dbyKE|ad7)r_K*)$eIa`%XNa!(~m6;Mr-N~Oz)>`aPX$u>-8A?{$SJ`L# zm5ZL~%O*}a;3C?Vs-i7*vTP`rZ!K+wL?e&+Q2dPG?(;v1A@`NBF8@C`DBS;IE@3M$E0gx}dGGZ5(=MU)qTSt^zULO zW~9@_SaeubZU&~8KbywmHQ_elHrhu2sE z*gTkBxemGP9Q9AnyYSO%tP8L~zAc@0OWn)GK)ZYSrqi2umliiWsRo_yG5K`LOs7*R zw_Vg`-e1aHygZab)`v8*iYi%om8AXG`~Us-*t-0`UaJ+p{~gr!s~i7+2)HHxPjaOH zqYB`n*J)}}w64iKNa15Dr9S?E8_Mh_Nz7W9jg8>j?5cPvyGDP~bMX-VKu(wz#*thP zjr?O$SrsISXfAYU^U--;muQ&NStHB~8By6{nusl9$*fYMrCFpb8pLEF6c@slH!}=q zIP-0Jql0nj$4*mz?UE`b#mPv0{3?9uN^}B+t`P7za2IR1V>?jBHOI8OEKxE6yBfJ; zFkc?91(+`6gKMpZRvT)tah8H`GYZ8{sj2 U58l8AHt_ktUz^Ci8UQE&0JAZ`E&u=k diff --git a/util/config_file.c b/util/config_file.c index 5f806c3c5..a4cb91276 100644 --- a/util/config_file.c +++ b/util/config_file.c @@ -85,7 +85,7 @@ config_create() #ifndef USE_WINSOCK cfg->outgoing_num_ports = 256; #else - cfg->outgoing_num_ports = 32; /* windows is limited in num fds */ + cfg->outgoing_num_ports = 16; /* windows is limited in num fds */ #endif cfg->outgoing_num_tcp = 10; cfg->incoming_num_tcp = 10; diff --git a/util/netevent.c b/util/netevent.c index 3e5e1c991..47bec1863 100644 --- a/util/netevent.c +++ b/util/netevent.c @@ -762,8 +762,13 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) socklen_t len = (socklen_t)sizeof(error); if(getsockopt(fd, SOL_SOCKET, SO_ERROR, (void*)&error, &len) < 0){ +#ifndef USE_WINSOCK error = errno; /* on solaris errno is error */ +#else /* USE_WINSOCK */ + error = WSAGetLastError(); +#endif } +#ifndef USE_WINSOCK #if defined(EINPROGRESS) && defined(EWOULDBLOCK) if(error == EINPROGRESS || error == EWOULDBLOCK) return 1; /* try again later */ @@ -778,6 +783,18 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c) #endif else if(error != 0) { log_err("tcp connect: %s", strerror(error)); +#else /* USE_WINSOCK */ + /* examine error */ + if(error == WSAEINPROGRESS) + return 1; + else if(error == WSAEWOULDBLOCK) { + winsock_tcp_wouldblock(&c->ev->ev, EV_WRITE); + return 1; + } else if(error == WSAECONNREFUSED || error == WSAEHOSTUNREACH) + return 0; + else if(error != 0) { + log_err("tcp connect: %s", wsa_strerror(error)); +#endif /* USE_WINSOCK */ log_addr(0, "remote address is", &c->repinfo.addr, c->repinfo.addrlen); return 0; diff --git a/util/winsock_event.h b/util/winsock_event.h index 2851b0eeb..86ea9c8d0 100644 --- a/util/winsock_event.h +++ b/util/winsock_event.h @@ -75,6 +75,10 @@ * not read() and write(), those work only on files. * * Also fseek and fseeko do not work if a FILE is not fopen-ed in binary mode. + * + * When under a high load windows gives out lots of errors, from recvfrom + * on udp sockets for example (WSAECONNRESET). Even though the udp socket + * has no connection per se. */ #ifndef UTIL_WINSOCK_EVENT_H -- 2.47.2