From a0b58301caa7988bec212f8d62e56be9d6c1e2d1 Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Thu, 14 Oct 2010 14:55:38 +0000 Subject: [PATCH] unbound-anchor works on vista. git-svn-id: file:///svn/unbound/trunk@2292 be551aaa-1e26-0410-a405-d3ace91eadb9 --- smallapp/unbound-anchor.c | 45 +++++++++++++++++++++++++++++--- testcode/petal.c | 30 +++++++++++++++++++-- testdata/10-unbound-anchor.tpkg | Bin 15248 -> 13677 bytes 3 files changed, 70 insertions(+), 5 deletions(-) diff --git a/smallapp/unbound-anchor.c b/smallapp/unbound-anchor.c index 5a6e92fe7..7038f7546 100644 --- a/smallapp/unbound-anchor.c +++ b/smallapp/unbound-anchor.c @@ -139,12 +139,17 @@ /** name of server in URL to fetch HTTPS from */ #define URLNAME "data.iana.org" /** path on HTTPS server to xml file */ -#define XMLNAME "/root-anchors/root-anchors.xml" +#define XMLNAME "root-anchors/root-anchors.xml" /** path on HTTPS server to p7s file */ -#define P7SNAME "/root-anchors/root-anchors.p7s" +#define P7SNAME "root-anchors/root-anchors.p7s" /** port number for https access */ #define HTTPS_PORT 443 +#ifdef USE_WINSOCK +/* sneakily reuse the the wsa_strerror function, on windows */ +char* wsa_strerror(int err); +#endif + /** verbosity for this application */ static int verb = 0; @@ -533,6 +538,7 @@ resolve_host_ip(struct ub_ctx* ctx, char* host, int port, int tp, int cl, } if(!res) { if(verb) printf("out of memory\n"); + ub_ctx_delete(ctx); exit(0); } for(i = 0; res->data[i]; i++) { @@ -695,11 +701,21 @@ connect_to_ip(struct ip_list* ip) fd = socket(ip->len==(socklen_t)sizeof(struct sockaddr_in)? AF_INET:AF_INET6, SOCK_STREAM, 0); if(fd == -1) { +#ifndef USE_WINSOCK if(verb) printf("socket: %s\n", strerror(errno)); +#else + if(verb) printf("socket: %s\n", + wsa_strerror(WSAGetLastError())); +#endif return -1; } if(connect(fd, (struct sockaddr*)&ip->addr, ip->len) < 0) { +#ifndef USE_WINSOCK if(verb) printf("connect: %s\n", strerror(errno)); +#else + if(verb) printf("connect: %s\n", + wsa_strerror(WSAGetLastError())); +#endif fd_close(fd); return -1; } @@ -935,6 +951,7 @@ do_chunked_read(SSL* ssl) size_t len; char* body; BIO* mem = BIO_new(BIO_s_mem()); + if(verb>=3) printf("do_chunked_read\n"); if(!mem) { if(verb) printf("out of memory\n"); return NULL; @@ -944,6 +961,7 @@ do_chunked_read(SSL* ssl) if(verb>=2) printf("chunk header: %s\n", buf); if(!parse_chunk_header(buf, &len)) { BIO_free(mem); + if(verb>=3) printf("could not parse chunk header\n"); return NULL; } if(verb>=2) printf("chunk len: %d\n", (int)len); @@ -992,7 +1010,7 @@ do_chunked_read(SSL* ssl) static int write_http_get(SSL* ssl, char* pathname, char* urlname) { - if(write_ssl_line(ssl, "GET %s HTTP/1.1", pathname) && + if(write_ssl_line(ssl, "GET /%s HTTP/1.1", pathname) && write_ssl_line(ssl, "Host: %s", urlname) && write_ssl_line(ssl, "User-Agent: unbound-anchor/%s", PACKAGE_VERSION) && @@ -1020,6 +1038,10 @@ read_http_result(SSL* ssl) BIO* tmp = do_chunked_read(ssl); char* d = NULL; size_t l; + if(!tmp) { + if(verb) printf("could not read from https\n"); + return NULL; + } l = (size_t)BIO_get_mem_data(tmp, &d); if(verb>=2) printf("chunked data is %d\n", (int)l); if(l == 0 || d == NULL) { @@ -1706,6 +1728,10 @@ verify_and_update_anchor(char* root_anchor_file, BIO* xml, BIO* p7s, BIO_free(ds); } +#ifdef USE_WINSOCK +static void do_wsa_cleanup(void) { WSACleanup(); } +#endif + /** perform actual certupdate work */ static int do_certupdate(char* root_anchor_file, char* root_cert_file, @@ -1724,6 +1750,19 @@ do_certupdate(char* root_anchor_file, char* root_cert_file, ip_list = resolve_name(urlname, port, res_conf, root_hints, debugconf, ip4only, ip6only); +#ifdef USE_WINSOCK + if(1) { /* libunbound finished, startup WSA for the https connection */ + WSADATA wsa_data; + int r; + if((r = WSAStartup(MAKEWORD(2,2), &wsa_data)) != 0) { + if(verb) printf("WSAStartup failed: %s\n", + wsa_strerror(r)); + exit(0); + } + atexit(&do_wsa_cleanup); + } +#endif + /* fetch the necessary files over HTTPS */ xml = https(ip_list, xmlname, urlname); p7s = https(ip_list, p7sname, urlname); diff --git a/testcode/petal.c b/testcode/petal.c index 5d6e11e1d..46df6c169 100644 --- a/testcode/petal.c +++ b/testcode/petal.c @@ -334,7 +334,13 @@ provide_file_10(SSL* ssl, char* fname) { char* buf, *at; size_t len, avail, header_reserve=1024; - FILE* in = fopen(fname, "r"); + FILE* in = fopen(fname, +#ifndef USE_WINSOCK + "r" +#else + "rb" +#endif + ); int r; const char* rcode = "200 OK"; if(!in) { @@ -396,7 +402,13 @@ provide_file_chunked(SSL* ssl, char* fname) char* at = buf; size_t avail = sizeof(buf); int r; - FILE* in = fopen(fname, "r"); + FILE* in = fopen(fname, +#ifndef USE_WINSOCK + "r" +#else + "rb" +#endif + ); const char* rcode = "200 OK"; if(!in) { rcode = "404 File not found"; @@ -429,6 +441,8 @@ provide_file_chunked(SSL* ssl, char* fname) size_t red = in?fread(tmpbuf, 1, avail-16, in):0; /* prepare chunk */ r = snprintf(at, avail, "%x\r\n", (unsigned)red); + if(verb >= 3) + {printf("chunk len %x\n", (unsigned)red); fflush(stdout);} at += r; avail -= r; if(red != 0) { @@ -491,6 +505,7 @@ service_ssl(SSL* ssl, struct sockaddr_storage* from, socklen_t falen) (void)inet_ntop((int)((struct sockaddr_in*)from)->sin_family, a, out, (socklen_t)sizeof(out)); printf("%s requests %s\n", out, combined); + fflush(stdout); } if(vs == 10) provide_file_10(ssl, combined); @@ -510,15 +525,19 @@ do_service(char* addr, int port, char* key, char* cert) struct sockaddr_storage from; socklen_t flen = (socklen_t)sizeof(from); int s = accept(fd, (struct sockaddr*)&from, &flen); + if(verb) fflush(stdout); if(s != -1) { SSL* ssl = setup_ssl(s, sslctx); + if(verb) fflush(stdout); if(ssl) { service_ssl(ssl, &from, flen); + if(verb) fflush(stdout); SSL_shutdown(ssl); SSL_free(ssl); } fd_close(s); } else if (verb >=2) log_errno("accept"); + if(verb) fflush(stdout); } /* if we get a kill signal, the process dies and the OS reaps us */ if(verb) printf("petal end\n"); @@ -537,6 +556,13 @@ int main(int argc, char* argv[]) int c; int port = 443; char* addr = "127.0.0.1", *key = "petal.key", *cert = "petal.pem"; +#ifdef USE_WINSOCK + WSADATA wsa_data; + if((c=WSAStartup(MAKEWORD(2,2), &wsa_data)) != 0) + { printf("WSAStartup failed\n"); exit(1); } + atexit((void (*)(void))WSACleanup); +#endif + /* parse the options */ while( (c=getopt(argc, argv, "a:c:k:hp:v")) != -1) { switch(c) { diff --git a/testdata/10-unbound-anchor.tpkg b/testdata/10-unbound-anchor.tpkg index 108f0da20421061f026ea2e821bcbbf4b83c89fb..a1527caee14003f8e9a5c2e3487af22edbb4bf36 100644 GIT binary patch literal 13677 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 literal 15248 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 PUx;jmV?-c0pdkMPF5yYm -- 2.47.2