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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ʔm%ZwG59W6R_1 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 literal 15248 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