diff options
Diffstat (limited to 'libressl.patch')
-rw-r--r-- | libressl.patch | 678 |
1 files changed, 161 insertions, 517 deletions
diff --git a/libressl.patch b/libressl.patch index 564d620..00d5d4b 100644 --- a/libressl.patch +++ b/libressl.patch | |||
@@ -12,18 +12,10 @@ index bc1453e12..69f76cbb3 100644 | |||
12 | void tls_run_copy_loop(tls_state_t *tls, unsigned flags) FAST_FUNC; | 12 | void tls_run_copy_loop(tls_state_t *tls, unsigned flags) FAST_FUNC; |
13 | 13 | ||
14 | diff --git a/networking/ssl_client.c b/networking/ssl_client.c | 14 | diff --git a/networking/ssl_client.c b/networking/ssl_client.c |
15 | index 757745896..653b6f48e 100644 | 15 | index 757745896..38163440f 100644 |
16 | --- a/networking/ssl_client.c | 16 | --- a/networking/ssl_client.c |
17 | +++ b/networking/ssl_client.c | 17 | +++ b/networking/ssl_client.c |
18 | @@ -24,6 +24,7 @@ | 18 | @@ -69,7 +69,7 @@ int ssl_client_main(int argc UNUSED_PARAM, char **argv) |
19 | //usage:#define ssl_client_full_usage "" | ||
20 | |||
21 | #include "libbb.h" | ||
22 | +#include <tls.h> | ||
23 | |||
24 | int ssl_client_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | ||
25 | int ssl_client_main(int argc UNUSED_PARAM, char **argv) | ||
26 | @@ -69,7 +70,7 @@ int ssl_client_main(int argc UNUSED_PARAM, char **argv) | ||
27 | } | 19 | } |
28 | #endif | 20 | #endif |
29 | 21 | ||
@@ -32,34 +24,8 @@ index 757745896..653b6f48e 100644 | |||
32 | 24 | ||
33 | BUILD_BUG_ON(TLSLOOP_EXIT_ON_LOCAL_EOF != 1); | 25 | BUILD_BUG_ON(TLSLOOP_EXIT_ON_LOCAL_EOF != 1); |
34 | tls_run_copy_loop(tls, /*flags*/ opt & 1); | 26 | tls_run_copy_loop(tls, /*flags*/ opt & 1); |
35 | diff --git a/networking/ssl_helper-wolfssl/ssl_helper.c b/networking/ssl_helper-wolfssl/ssl_helper.c | ||
36 | index 38b7b56c6..834912a68 100644 | ||
37 | --- a/networking/ssl_helper-wolfssl/ssl_helper.c | ||
38 | +++ b/networking/ssl_helper-wolfssl/ssl_helper.c | ||
39 | @@ -160,10 +160,10 @@ WOLFSSL *prepare(int sockfd) | ||
40 | |||
41 | method = wolfTLSv1_1_client_method(); | ||
42 | if (method == NULL) | ||
43 | - err_sys("out of memory"); | ||
44 | + err_sys("out of memory 3"); | ||
45 | ctx = wolfSSL_CTX_new(method); | ||
46 | if (ctx == NULL) | ||
47 | - err_sys("out of memory"); | ||
48 | + err_sys("out of memory 2"); | ||
49 | // if (cipherList) | ||
50 | // if (wolfSSL_CTX_set_cipher_list(ctx, cipherList) != SSL_SUCCESS) | ||
51 | // err_sys("client can't set cipher list 1"); | ||
52 | @@ -279,7 +279,7 @@ WOLFSSL *prepare(int sockfd) | ||
53 | |||
54 | ssl = wolfSSL_new(ctx); | ||
55 | if (ssl == NULL) | ||
56 | - err_sys("out of memory"); | ||
57 | + err_sys("out of memory 1"); | ||
58 | |||
59 | //#ifdef HAVE_SESSION_TICKET | ||
60 | // wolfSSL_set_SessionTicket_cb(ssl, sessionTicketCB, (void*)"initial session"); | ||
61 | diff --git a/networking/tls.c b/networking/tls.c | 27 | diff --git a/networking/tls.c b/networking/tls.c |
62 | index 9f1dd67ec..7e8da6df2 100644 | 28 | index 9f1dd67ec..60e1afe99 100644 |
63 | --- a/networking/tls.c | 29 | --- a/networking/tls.c |
64 | +++ b/networking/tls.c | 30 | +++ b/networking/tls.c |
65 | @@ -2221,6 +2221,7 @@ static void send_client_finished(tls_state_t *tls) | 31 | @@ -2221,6 +2221,7 @@ static void send_client_finished(tls_state_t *tls) |
@@ -76,8 +42,8 @@ index 9f1dd67ec..7e8da6df2 100644 | |||
76 | 42 | ||
77 | - /*send_empty_client_cert(tls); - WRONG (breaks handshake hash calc) */ | 43 | - /*send_empty_client_cert(tls); - WRONG (breaks handshake hash calc) */ |
78 | - /* need to hash _all_ server replies first, up to ServerHelloDone */ | 44 | - /* need to hash _all_ server replies first, up to ServerHelloDone */ |
79 | + //send_empty_client_cert(tls); - WRONG (breaks handshake hash calc) | 45 | + //send_empty_client_cert(tls); - WRONG (breaks handshake hash calc) / |
80 | + //need to hash _all_ server replies first, up to ServerHelloDone | 46 | + // need to hash _all_ server replies first, up to ServerHelloDone / |
81 | len = tls_xread_handshake_block(tls, 4); | 47 | len = tls_xread_handshake_block(tls, 4); |
82 | } | 48 | } |
83 | 49 | ||
@@ -87,18 +53,18 @@ index 9f1dd67ec..7e8da6df2 100644 | |||
87 | send_change_cipher_spec(tls); | 53 | send_change_cipher_spec(tls); |
88 | - /* from now on we should send encrypted */ | 54 | - /* from now on we should send encrypted */ |
89 | - /* tls->write_seq64_be = 0; - already is */ | 55 | - /* tls->write_seq64_be = 0; - already is */ |
90 | + // from now on we should send encrypted | 56 | + // from now on we should send encrypted / |
91 | + // tls->write_seq64_be = 0; - already is | 57 | + // tls->write_seq64_be = 0; - already is / |
92 | tls->flags |= ENCRYPT_ON_WRITE; | 58 | tls->flags |= ENCRYPT_ON_WRITE; |
93 | 59 | ||
94 | send_client_finished(tls); | 60 | send_client_finished(tls); |
95 | 61 | ||
96 | - /* Get CHANGE_CIPHER_SPEC */ | 62 | - /* Get CHANGE_CIPHER_SPEC */ |
97 | + // Get CHANGE_CIPHER_SPEC | 63 | + // Get CHANGE_CIPHER_SPEC / |
98 | len = tls_xread_record(tls, "switch to encrypted traffic"); | 64 | len = tls_xread_record(tls, "switch to encrypted traffic"); |
99 | if (len != 1 || memcmp(tls->inbuf, rec_CHANGE_CIPHER_SPEC, 6) != 0) | 65 | if (len != 1 || memcmp(tls->inbuf, rec_CHANGE_CIPHER_SPEC, 6) != 0) |
100 | bad_record_die(tls, "switch to encrypted traffic", len); | 66 | bad_record_die(tls, "switch to encrypted traffic", len); |
101 | @@ -2327,29 +2328,29 @@ void FAST_FUNC tls_handshake(tls_state_t *tls, const char *sni) | 67 | @@ -2327,29 +2328,30 @@ void FAST_FUNC tls_handshake(tls_state_t *tls, const char *sni) |
102 | } else | 68 | } else |
103 | if (!(tls->flags & ENCRYPTION_AESGCM)) { | 69 | if (!(tls->flags & ENCRYPTION_AESGCM)) { |
104 | unsigned mac_blocks = (unsigned)(TLS_MAC_SIZE(tls) + AES_BLOCK_SIZE-1) / AES_BLOCK_SIZE; | 70 | unsigned mac_blocks = (unsigned)(TLS_MAC_SIZE(tls) + AES_BLOCK_SIZE-1) / AES_BLOCK_SIZE; |
@@ -107,6 +73,7 @@ index 9f1dd67ec..7e8da6df2 100644 | |||
107 | - */ | 73 | - */ |
108 | + // all incoming packets now should be encrypted and have | 74 | + // all incoming packets now should be encrypted and have |
109 | + // at least IV + (MAC padded to blocksize): | 75 | + // at least IV + (MAC padded to blocksize): |
76 | + // | ||
110 | tls->min_encrypted_len_on_read = AES_BLOCK_SIZE + (mac_blocks * AES_BLOCK_SIZE); | 77 | tls->min_encrypted_len_on_read = AES_BLOCK_SIZE + (mac_blocks * AES_BLOCK_SIZE); |
111 | } else { | 78 | } else { |
112 | tls->min_encrypted_len_on_read = 8 + AES_BLOCK_SIZE; | 79 | tls->min_encrypted_len_on_read = 8 + AES_BLOCK_SIZE; |
@@ -114,16 +81,16 @@ index 9f1dd67ec..7e8da6df2 100644 | |||
114 | dbg("min_encrypted_len_on_read: %u\n", tls->min_encrypted_len_on_read); | 81 | dbg("min_encrypted_len_on_read: %u\n", tls->min_encrypted_len_on_read); |
115 | 82 | ||
116 | - /* Get (encrypted) FINISHED from the server */ | 83 | - /* Get (encrypted) FINISHED from the server */ |
117 | + // Get (encrypted) FINISHED from the server | 84 | + // Get (encrypted) FINISHED from the server / |
118 | len = tls_xread_record(tls, "'server finished'"); | 85 | len = tls_xread_record(tls, "'server finished'"); |
119 | if (len < 4 || tls->inbuf[RECHDR_LEN] != HANDSHAKE_FINISHED) | 86 | if (len < 4 || tls->inbuf[RECHDR_LEN] != HANDSHAKE_FINISHED) |
120 | bad_record_die(tls, "'server finished'", len); | 87 | bad_record_die(tls, "'server finished'", len); |
121 | dbg("<< FINISHED\n"); | 88 | dbg("<< FINISHED\n"); |
122 | - /* application data can be sent/received */ | 89 | - /* application data can be sent/received */ |
123 | + // application data can be sent/received | 90 | + // application data can be sent/received / |
124 | 91 | ||
125 | - /* free handshake data */ | 92 | - /* free handshake data */ |
126 | + // free handshake data | 93 | + // free handshake data / |
127 | psRsaKey_clear(&tls->hsd->server_rsa_pub_key); | 94 | psRsaKey_clear(&tls->hsd->server_rsa_pub_key); |
128 | // if (PARANOIA) | 95 | // if (PARANOIA) |
129 | // memset(tls->hsd, 0, tls->hsd->hsd_size); | 96 | // memset(tls->hsd, 0, tls->hsd->hsd_size); |
@@ -135,41 +102,34 @@ index 9f1dd67ec..7e8da6df2 100644 | |||
135 | static void tls_xwrite(tls_state_t *tls, int len) | 102 | static void tls_xwrite(tls_state_t *tls, int len) |
136 | { | 103 | { |
137 | diff --git a/networking/wget.c b/networking/wget.c | 104 | diff --git a/networking/wget.c b/networking/wget.c |
138 | index 6a64836fb..918ad6812 100644 | 105 | index 6a64836fb..4a5b4c9f0 100644 |
139 | --- a/networking/wget.c | 106 | --- a/networking/wget.c |
140 | +++ b/networking/wget.c | 107 | +++ b/networking/wget.c |
141 | @@ -169,7 +169,11 @@ | 108 | @@ -1,4 +1,3 @@ |
142 | //usage: "\n -Y on/off Use proxy" | 109 | -/* vi: set sw=4 ts=4: */ |
143 | 110 | /* | |
144 | #include "libbb.h" | 111 | * wget - retrieve a file using HTTP or FTP |
145 | - | 112 | * |
146 | +#include <string.h> | 113 | @@ -460,6 +459,49 @@ static FILE *open_socket(len_and_sockaddr *lsa) |
147 | +#include <errno.h> | 114 | return fp; |
148 | +#include <tls.h> | 115 | } |
149 | +#include <stdarg.h> | ||
150 | +#include <stdio.h> | ||
151 | #if 0 | ||
152 | # define log_io(...) bb_error_msg(__VA_ARGS__) | ||
153 | # define SENDFMT(fp, fmt, ...) \ | ||
154 | @@ -354,6 +358,39 @@ static ALWAYS_INLINE void progress_meter(int flag UNUSED_PARAM) {} | ||
155 | #endif | ||
156 | |||
157 | 116 | ||
158 | +#if ENABLE_PLATFORM_MINGW32 | 117 | +#if ENABLE_PLATFORM_MINGW32 |
159 | +/* Use windows installed certificates for wget */ | 118 | +/* Use windows installed certificates for wget */ |
160 | +#include <openssl/ssl.h> | 119 | +#include <openssl/ssl.h> |
161 | +#include <openssl/x509.h> | 120 | +#include <openssl/x509.h> |
162 | +#include <wincrypt.h> | 121 | +#include <wincrypt.h> |
163 | +void gather_certificates(struct tls_config *cfg) | 122 | +char* gather_certificates(struct tls_config *cfg) |
164 | +{ | 123 | +{ |
165 | + printf("Gathering certificates\n"); | 124 | + FILE *pemfile; |
125 | + pemfile = tmpfile(); | ||
166 | + HCERTSTORE dstore; | 126 | + HCERTSTORE dstore; |
167 | + dstore = CertOpenSystemStore(0,"CA"); | 127 | + dstore = CertOpenSystemStore(0,"ROOT"); |
168 | + size_t numcerts; | 128 | + size_t numcerts; |
169 | + if(!dstore) | 129 | + if(!dstore) |
170 | + bb_error_msg_and_die("Error opening 'CA' cert store"); | 130 | + bb_error_msg_and_die("Error opening 'CA' cert store"); |
171 | + X509_STORE *store = X509_STORE_new(); | ||
172 | + PCCERT_CONTEXT ctx = NULL; | 131 | + PCCERT_CONTEXT ctx = NULL; |
132 | + size_t certs_len; | ||
173 | + for(;;) | 133 | + for(;;) |
174 | + { | 134 | + { |
175 | + ctx = CertEnumCertificatesInStore(dstore,ctx); | 135 | + ctx = CertEnumCertificatesInStore(dstore,ctx); |
@@ -178,223 +138,121 @@ index 6a64836fb..918ad6812 100644 | |||
178 | + char *dcert = ctx->pbCertEncoded; | 138 | + char *dcert = ctx->pbCertEncoded; |
179 | + size_t dcert_len = ctx->cbCertEncoded; | 139 | + size_t dcert_len = ctx->cbCertEncoded; |
180 | + X509 *x509cert; | 140 | + X509 *x509cert; |
181 | + x509cert = d2i_X509(NULL,dcert,dcert_len); | 141 | + x509cert = d2i_X509(NULL,&dcert,dcert_len); |
182 | + if(x509cert == NULL) | 142 | + if(x509cert == NULL) |
183 | + bb_error_msg_and_die("Failed to convert cert"); | 143 | + bb_error_msg_and_die("Failed to convert cert"); |
184 | + X509_STORE_add_cert(store,x509cert); | 144 | + if(!PEM_write_X509(pemfile, x509cert)) |
145 | + bb_error_msg_and_die("Failed to write cert"); | ||
185 | + X509_free(x509cert); | 146 | + X509_free(x509cert); |
186 | + } | 147 | + } |
187 | + CertCloseStore(store, CERT_CLOSE_STORE_CHECK_FLAG); | 148 | + CertCloseStore(dstore, CERT_CLOSE_STORE_CHECK_FLAG); |
149 | + size_t pemsize = ftell(pemfile); | ||
150 | + char *pemmem = (char*)malloc(pemsize); | ||
151 | + if(pemmem == NULL) | ||
152 | + bb_error_msg_and_die("out of memory"); | ||
153 | + rewind(pemfile); | ||
154 | + if(fread(pemmem, sizeof(char), pemsize, pemfile) != pemsize) | ||
155 | + bb_error_msg_and_die("Failed to read temp ca pem file"); | ||
156 | + tls_config_set_ca_mem(cfg, pemmem, pemsize); | ||
188 | +} | 157 | +} |
189 | + | ||
190 | +#endif | 158 | +#endif |
191 | /* IPv6 knows scoped address types i.e. link and site local addresses. Link | ||
192 | * local addresses can have a scope identifier to specify the | ||
193 | * interface/link an address is valid on (e.g. fe80::1%eth0). This scope | ||
194 | @@ -482,18 +519,45 @@ static char* sanitize_string(char *s) | ||
195 | return s; | ||
196 | } | ||
197 | |||
198 | +static char tlsgets_trim_sanitize(struct tls *ctx, const char *fmt) | ||
199 | +{ | ||
200 | + printf("wget tlsgets_trim_sanitize 1\n"); | ||
201 | + char c; | ||
202 | + char *buf_ptr; | ||
203 | + ssize_t len = TLS_WANT_POLLIN; | ||
204 | + while(len == TLS_WANT_POLLIN) | ||
205 | + len = tls_read(ctx,G.wget_buf, sizeof(G.wget_buf)); | ||
206 | + if(len == -1) | ||
207 | + bb_error_msg_and_die("tls read error: %s", tls_error(ctx)); | ||
208 | + printf("Read %zd bytes\n", len); | ||
209 | + printf("Data Read: %s\n",G.wget_buf); | ||
210 | + buf_ptr = strchrnul(G.wget_buf, '\n'); | ||
211 | + c = *buf_ptr; | ||
212 | + sanitize_string(G.wget_buf); | ||
213 | + log_io("< %s", G.wget_buf); | ||
214 | + if (fmt && (option_mask32 & WGET_OPT_SERVER_RESPONSE)) | ||
215 | + fprintf(stderr, fmt, G.wget_buf); | ||
216 | + return c; | ||
217 | +} | ||
218 | + | 159 | + |
219 | /* Returns '\n' if it was seen, else '\0'. Trims at first '\r' or '\n' */ | 160 | /* We balk at any control chars in other side's messages. |
220 | static char fgets_trim_sanitize(FILE *fp, const char *fmt) | 161 | * This prevents nasty surprises (e.g. ESC sequences) in "Location:" URLs |
221 | { | 162 | * and error messages. |
222 | char c; | 163 | @@ -689,6 +731,9 @@ static void reset_beg_range_to_zero(void) |
223 | char *buf_ptr; | ||
224 | |||
225 | + printf("wget fgets_trim_sanitize 1\n"); | ||
226 | set_alarm(); | ||
227 | - if (fgets(G.wget_buf, sizeof(G.wget_buf), fp) == NULL) | ||
228 | - bb_simple_perror_msg_and_die("error getting response"); | ||
229 | + printf("wget fgets_trim_sanitize 2\n"); | ||
230 | + printf("wget_buf: %d\n",sizeof(G.wget_buf)); | ||
231 | + if (fgets(G.wget_buf, sizeof(G.wget_buf), fp) == NULL){ | ||
232 | + bb_error_msg_and_die("error getting response: %d %s",errno, strerror(errno)); | ||
233 | + } | ||
234 | clear_alarm(); | ||
235 | |||
236 | + printf("wget fgets_trim_sanitize 3\n"); | ||
237 | buf_ptr = strchrnul(G.wget_buf, '\n'); | ||
238 | + printf("wget fgets_trim_sanitize 4\n"); | ||
239 | c = *buf_ptr; | ||
240 | #if 1 | ||
241 | /* Disallow any control chars: trim at first char < 0x20 */ | ||
242 | @@ -504,10 +568,12 @@ static char fgets_trim_sanitize(FILE *fp, const char *fmt) | ||
243 | *buf_ptr = '\0'; | ||
244 | #endif | ||
245 | |||
246 | + printf("wget fgets_trim_sanitize 7\n"); | ||
247 | log_io("< %s", G.wget_buf); | ||
248 | |||
249 | if (fmt && (option_mask32 & WGET_OPT_SERVER_RESPONSE)) | ||
250 | fprintf(stderr, fmt, G.wget_buf); | ||
251 | + printf("wget fgets_trim_sanitize 8\n"); | ||
252 | |||
253 | return c; | ||
254 | } | ||
255 | @@ -636,6 +702,46 @@ static void parse_url(const char *src_url, struct host_info *h) | ||
256 | */ | ||
257 | } | ||
258 | |||
259 | +static int tls_sanitized_hdr(struct tls *ctx, char* start, char **header, char **value) | ||
260 | +{ | ||
261 | + printf("wget tls_sanitized_hdr 1\n"); | ||
262 | + printf("wget_buf was: %s\n",G.wget_buf); | ||
263 | + char c; | ||
264 | + char *s; | ||
265 | + //c = tlsgets_trim_sanitize(ctx, " %s\n"); | ||
266 | + if(*start =='\n'){ | ||
267 | + printf("Found end of headers\n"); | ||
268 | + return 0; | ||
269 | + } | ||
270 | + if(G.wget_buf[0] == '\0') | ||
271 | + return -1; | ||
272 | + printf("While getting header, buf was: %s\n", G.wget_buf); | ||
273 | + *header = G.wget_buf; | ||
274 | + /* Convert to lowercase */ | ||
275 | + for(s = G.wget_buf; isalnum(*s) || *s == '-' || *s == '.' || *s == '_'; ++s) | ||
276 | + *s |= 0x20; | ||
277 | + /* Find seperator */ | ||
278 | + if(*s != ':') | ||
279 | + bb_error_msg_and_die("Bad header line: %s", G.wget_buf); | ||
280 | + *s++ = '\0'; | ||
281 | + s = skip_whitespace(s); | ||
282 | + *value = s; | ||
283 | + s = strchr(s,'\n'); | ||
284 | + if(*s == NULL) { | ||
285 | + printf("Buffer too small!\n"); | ||
286 | + while (tls_read(ctx, &c, sizeof(char)) == 1 && c != '\n') | ||
287 | + /*Consume the rest of the header */; | ||
288 | + } | ||
289 | + if (c != '\n'){ | ||
290 | + printf("buffer too small!\n"); | ||
291 | + while (tls_read(ctx,&c,sizeof(char)) == 1 && c != EOF && c != '\n') | ||
292 | + /* Rats! The buffer isn't big enough to hold the entire header value */ | ||
293 | + printf("."); | ||
294 | + } | ||
295 | + printf("wget tls_sanitized_hdr 2\n"); | ||
296 | + return hdrval; | ||
297 | +} | ||
298 | + | ||
299 | static char *get_sanitized_hdr(FILE *fp) | ||
300 | { | ||
301 | char *s, *hdrval; | ||
302 | @@ -689,6 +795,7 @@ static void reset_beg_range_to_zero(void) | ||
303 | } | 164 | } |
304 | 165 | ||
305 | #if ENABLE_FEATURE_WGET_OPENSSL | 166 | #if ENABLE_FEATURE_WGET_OPENSSL |
306 | +# if !ENABLE_PLATFORM_MINGW32 | 167 | +#include <tls.h> |
168 | +#include <winsock2.h> | ||
169 | +/* | ||
307 | static int spawn_https_helper_openssl(const char *host, unsigned port) | 170 | static int spawn_https_helper_openssl(const char *host, unsigned port) |
308 | { | 171 | { |
309 | char *allocated = NULL; | 172 | char *allocated = NULL; |
310 | @@ -777,6 +884,38 @@ static int spawn_https_helper_openssl(const char *host, unsigned port) | 173 | @@ -698,7 +743,7 @@ static int spawn_https_helper_openssl(const char *host, unsigned port) |
174 | IF_FEATURE_WGET_HTTPS(volatile int child_failed = 0;) | ||
175 | |||
176 | if (socketpair(AF_UNIX, SOCK_STREAM, 0, sp) != 0) | ||
177 | - /* Kernel can have AF_UNIX support disabled */ | ||
178 | + // Kernel can have AF_UNIX support disabled / | ||
179 | bb_simple_perror_msg_and_die("socketpair"); | ||
180 | |||
181 | if (!strchr(host, ':')) | ||
182 | @@ -709,18 +754,18 @@ static int spawn_https_helper_openssl(const char *host, unsigned port) | ||
183 | fflush_all(); | ||
184 | pid = xvfork(); | ||
185 | if (pid == 0) { | ||
186 | - /* Child */ | ||
187 | + // Child / | ||
188 | char *argv[13]; | ||
189 | char **argp; | ||
190 | |||
191 | close(sp[0]); | ||
192 | xmove_fd(sp[1], 0); | ||
193 | xdup2(0, 1); | ||
194 | - /* | ||
195 | - * openssl s_client -quiet -connect www.kernel.org:443 2>/dev/null | ||
196 | - * It prints some debug stuff on stderr, don't know how to suppress it. | ||
197 | - * Work around by dev-nulling stderr. We lose all error messages :( | ||
198 | - */ | ||
199 | + // | ||
200 | + // openssl s_client -quiet -connect www.kernel.org:443 2>/dev/null | ||
201 | + // It prints some debug stuff on stderr, don't know how to suppress it. | ||
202 | + // Work around by dev-nulling stderr. We lose all error messages :( | ||
203 | + // | ||
204 | xmove_fd(2, 3); | ||
205 | xopen("/dev/null", O_RDWR); | ||
206 | memset(&argv, 0, sizeof(argv)); | ||
207 | @@ -729,18 +774,18 @@ static int spawn_https_helper_openssl(const char *host, unsigned port) | ||
208 | argv[2] = (char*)"-quiet"; | ||
209 | argv[3] = (char*)"-connect"; | ||
210 | argv[4] = (char*)host; | ||
211 | - /* | ||
212 | - * Per RFC 6066 Section 3, the only permitted values in the | ||
213 | - * TLS server_name (SNI) field are FQDNs (DNS hostnames). | ||
214 | - * IPv4 and IPv6 addresses, port numbers are not allowed. | ||
215 | - */ | ||
216 | + // | ||
217 | + // Per RFC 6066 Section 3, the only permitted values in the | ||
218 | + // TLS server_name (SNI) field are FQDNs (DNS hostnames). | ||
219 | + // IPv4 and IPv6 addresses, port numbers are not allowed. | ||
220 | + // | ||
221 | argp = &argv[5]; | ||
222 | if (!is_ip_address(servername)) { | ||
223 | *argp++ = (char*)"-servername"; //[5] | ||
224 | *argp++ = (char*)servername; //[6] | ||
225 | } | ||
226 | if (!(option_mask32 & WGET_OPT_NO_CHECK_CERT)) { | ||
227 | - /* Abort on bad server certificate */ | ||
228 | + // Abort on bad server certificate / | ||
229 | *argp++ = (char*)"-verify"; //[7] | ||
230 | *argp++ = (char*)"100"; //[8] | ||
231 | *argp++ = (char*)"-verify_return_error"; //[9] | ||
232 | @@ -762,10 +807,10 @@ static int spawn_https_helper_openssl(const char *host, unsigned port) | ||
233 | # else | ||
234 | bb_perror_msg_and_die("can't execute '%s'", argv[0]); | ||
235 | # endif | ||
236 | - /* notreached */ | ||
237 | + // notreached / | ||
238 | } | ||
239 | |||
240 | - /* Parent */ | ||
241 | + // Parent / | ||
242 | free(servername); | ||
243 | free(allocated); | ||
244 | close(sp[1]); | ||
245 | @@ -777,6 +822,7 @@ static int spawn_https_helper_openssl(const char *host, unsigned port) | ||
311 | # endif | 246 | # endif |
312 | return sp[0]; | 247 | return sp[0]; |
313 | } | 248 | } |
314 | +# else | 249 | +*/ |
315 | +#include <tls.h> | ||
316 | +#include <winsock2.h> | ||
317 | +static int spawn_https_helper_openssl(const char *host, unsigned port) | ||
318 | +{ | ||
319 | + char* allocated = NULL; | ||
320 | + char *servername, *cmd; | ||
321 | + int sp[2]; | ||
322 | + if (socketpair(AF_UNIX, SOCK_STREAM, 0, sp) != 0) | ||
323 | + bb_simple_perror_msg_and_die("socketpair"); | ||
324 | + | ||
325 | + if(!strchr(host,":")) | ||
326 | + host = allocated = xasprintf("%s:%u",host,port); | ||
327 | + servername = xstrdup(host); | ||
328 | + fflush_all(); | ||
329 | + | ||
330 | + struct tls *ctx = tls_client(); | ||
331 | + if(ctx == NULL) | ||
332 | + bb_error_msg_and_die("Out of memory 1"); | ||
333 | + struct tls_config *config = tls_config_new(); | ||
334 | + if(config == NULL) | ||
335 | + bb_error_msg_and_die("Out of memory 2"); | ||
336 | + if(tls_configure(ctx,config) != 0) | ||
337 | + bb_error_msg_and_die("Failed to configure client"); | ||
338 | + tls_connect_fds(ctx, sp[0], sp[1], servername); | ||
339 | + tls_config_free(config); | ||
340 | + free(allocated); | ||
341 | + free(servername); | ||
342 | + printf("Connected sp %s\n"); | ||
343 | + return sp[0]; | ||
344 | +} | ||
345 | +# endif | ||
346 | #endif | 250 | #endif |
347 | 251 | ||
348 | #if ENABLE_FEATURE_WGET_HTTPS | 252 | #if ENABLE_FEATURE_WGET_HTTPS |
349 | @@ -1151,6 +1290,7 @@ static void download_one_url(const char *url) | 253 | @@ -1230,26 +1276,51 @@ static void download_one_url(const char *url) |
350 | server.user = NULL; | ||
351 | target.user = NULL; | ||
352 | |||
353 | + printf("wget download_one_url 1\n"); | ||
354 | parse_url(url, &target); | ||
355 | |||
356 | /* Use the proxy if necessary */ | ||
357 | @@ -1172,6 +1312,7 @@ static void download_one_url(const char *url) | ||
358 | server.host = target.host; | ||
359 | } | ||
360 | } | ||
361 | + printf("wget download_one_url 2\n"); | ||
362 | |||
363 | if (ENABLE_FEATURE_IPV6) | ||
364 | strip_ipv6_scope_id(target.host); | ||
365 | @@ -1191,6 +1332,7 @@ static void download_one_url(const char *url) | ||
366 | G.fname_out = fname_out_alloc = xstrdup(G.fname_out); | ||
367 | } | ||
368 | } | ||
369 | + printf("wget download_one_url 3\n"); | ||
370 | #if ENABLE_FEATURE_WGET_STATUSBAR | ||
371 | G.curfile = bb_get_last_path_component_nostrip(G.fname_out); | ||
372 | #endif | ||
373 | @@ -1206,15 +1348,19 @@ static void download_one_url(const char *url) | ||
374 | * We are not sure it exists on remote side */ | ||
375 | } | ||
376 | |||
377 | + printf("wget download_one_url 4\n"); | ||
378 | redir_limit = 16; | ||
379 | resolve_lsa: | ||
380 | + printf("wget download_one_url 5\n"); | ||
381 | lsa = xhost2sockaddr(server.host, server.port); | ||
382 | if (!(option_mask32 & WGET_OPT_QUIET)) { | ||
383 | char *s = xmalloc_sockaddr2dotted(&lsa->u.sa); | ||
384 | fprintf(stderr, "Connecting to %s (%s)\n", server.host, s); | ||
385 | free(s); | ||
386 | } | ||
387 | + printf("wget download_one_url 6\n"); | ||
388 | establish_session: | ||
389 | + printf("wget download_one_url 7\n"); | ||
390 | /*G.content_len = 0; - redundant, got_clen = 0 is enough */ | ||
391 | G.got_clen = 0; | ||
392 | G.chunked = 0; | ||
393 | @@ -1229,37 +1375,64 @@ static void download_one_url(const char *url) | ||
394 | |||
395 | /* Open socket to http(s) server */ | 254 | /* Open socket to http(s) server */ |
396 | #if ENABLE_FEATURE_WGET_OPENSSL | 255 | #if ENABLE_FEATURE_WGET_OPENSSL |
397 | + printf("wget download_one_url 8\n"); | ||
398 | /* openssl (and maybe internal TLS) support is configured */ | 256 | /* openssl (and maybe internal TLS) support is configured */ |
399 | + struct tls *ctx; | 257 | + struct tls *ctx; |
400 | if (server.protocol == P_HTTPS) { | 258 | if (server.protocol == P_HTTPS) { |
@@ -402,21 +260,21 @@ index 6a64836fb..918ad6812 100644 | |||
402 | * Inconvenient API since we can't give it an open fd | 260 | * Inconvenient API since we can't give it an open fd |
403 | */ | 261 | */ |
404 | - int fd = spawn_https_helper_openssl(server.host, server.port); | 262 | - int fd = spawn_https_helper_openssl(server.host, server.port); |
405 | -# if ENABLE_FEATURE_WGET_HTTPS | 263 | + //int fd = spawn_https_helper_openssl(server.host, server.port); |
264 | # if ENABLE_FEATURE_WGET_HTTPS | ||
406 | - if (fd < 0) { /* no openssl? try internal */ | 265 | - if (fd < 0) { /* no openssl? try internal */ |
407 | - sfp = open_socket(lsa); | 266 | - sfp = open_socket(lsa); |
408 | - spawn_ssl_client(server.host, fileno(sfp), /*flags*/ 0); | 267 | - spawn_ssl_client(server.host, fileno(sfp), /*flags*/ 0); |
409 | - goto socket_opened; | 268 | - goto socket_opened; |
410 | + printf("wget download_one_url 9\n"); | 269 | - } |
411 | + //int fd = spawn_https_helper_openssl(server.host, server.port); | 270 | + char *allocated, *servername, *host, *pemmem; |
412 | + char *allocated, *servername, *p, *host; | 271 | + struct tls_config *config; |
413 | + if(!strchr(server.host, ":")) | 272 | + if(!strchr(server.host, ':')) |
414 | + host = allocated = xasprintf("%s:%u", server.host, server.port); | 273 | + host = allocated = xasprintf("%s:%u", server.host, server.port); |
415 | + servername = xstrdup(host); | 274 | + servername = xstrdup(host); |
416 | + ctx = tls_client(); | 275 | + ctx = tls_client(); |
417 | + if(ctx == NULL) | 276 | + if(ctx == NULL) |
418 | + bb_error_msg_and_die("Out of memory 1"); | 277 | + bb_error_msg_and_die("Out of memory 1"); |
419 | + struct tls_config *config; | ||
420 | + config = tls_config_new(); | 278 | + config = tls_config_new(); |
421 | + if(config == NULL) | 279 | + if(config == NULL) |
422 | + bb_error_msg_and_die("Out of memory 2"); | 280 | + bb_error_msg_and_die("Out of memory 2"); |
@@ -424,287 +282,73 @@ index 6a64836fb..918ad6812 100644 | |||
424 | + bb_error_msg_and_die("Failed to set ca path"); | 282 | + bb_error_msg_and_die("Failed to set ca path"); |
425 | + if(tls_config_set_ca_file(config, "cert.pem") != 0) | 283 | + if(tls_config_set_ca_file(config, "cert.pem") != 0) |
426 | + bb_error_msg_and_die("Failed to set ca file"); | 284 | + bb_error_msg_and_die("Failed to set ca file"); |
285 | + gather_certificates(config); | ||
427 | + if(tls_configure(ctx,config) != 0) | 286 | + if(tls_configure(ctx,config) != 0) |
428 | + bb_error_msg_and_die("Failed to configure client"); | 287 | + bb_error_msg_and_die("Failed to configure client"); |
429 | + sfp = tmpfile(); | 288 | + sfp = tmpfile(); |
430 | + dfp = tmpfile(); | 289 | + dfp = tmpfile(); |
431 | + printf("TLS connection to %s\n", server.host); | ||
432 | + if(tls_connect(ctx, servername, NULL) != 0) | 290 | + if(tls_connect(ctx, servername, NULL) != 0) |
433 | + bb_error_msg_and_die("Failed to connect: %s", tls_error(ctx)); | 291 | + bb_error_msg_and_die("Failed to connect: %s", tls_error(ctx)); |
292 | + free(pemmem); | ||
434 | + tls_config_free(config); | 293 | + tls_config_free(config); |
435 | + free(allocated); | 294 | + free(allocated); |
436 | + free(servername); | 295 | + free(servername); |
437 | + printf("wget download_one_url 10\n"); | ||
438 | + printf("wget download_one_url 13\n"); | ||
439 | + //sfp = fdopen(fd, "r+"); | 296 | + //sfp = fdopen(fd, "r+"); |
440 | + if (!sfp){ | 297 | + if (!sfp) |
441 | + bb_error_msg_and_die("Error opening fd: %s",strerror(errno)); | 298 | + bb_error_msg_and_die("Error opening fd: %s",strerror(errno)); |
442 | } | 299 | # else |
443 | -# else | 300 | /* We don't check for exec("openssl") failure in this case */ |
444 | - /* We don't check for exec("openssl") failure in this case */ | 301 | # endif |
445 | -# endif | ||
446 | - sfp = fdopen(fd, "r+"); | 302 | - sfp = fdopen(fd, "r+"); |
447 | - if (!sfp) | 303 | - if (!sfp) |
448 | - bb_die_memory_exhausted(); | 304 | - bb_die_memory_exhausted(); |
449 | + printf("wget download_one_url 14\n"); | 305 | + //sfp = fdopen(fd, "r+"); |
306 | + //if (!sfp) | ||
307 | + // bb_die_memory_exhausted(); | ||
450 | goto socket_opened; | 308 | goto socket_opened; |
451 | } | 309 | } |
452 | - sfp = open_socket(lsa); | 310 | - sfp = open_socket(lsa); |
453 | + printf("wget download_one_url 15\n"); | ||
454 | + //sfp = open_socket(lsa); | 311 | + //sfp = open_socket(lsa); |
455 | socket_opened: | 312 | socket_opened: |
456 | #elif ENABLE_FEATURE_WGET_HTTPS | 313 | #elif ENABLE_FEATURE_WGET_HTTPS |
457 | /* Only internal TLS support is configured */ | 314 | /* Only internal TLS support is configured */ |
458 | + printf("wget download_one_url 16\n"); | 315 | @@ -1353,7 +1424,35 @@ static void download_one_url(const char *url) |
459 | sfp = open_socket(lsa); | ||
460 | if (server.protocol == P_HTTPS) | ||
461 | spawn_ssl_client(server.host, fileno(sfp), /*flags*/ 0); | ||
462 | #else | ||
463 | + printf("wget download_one_url 17\n"); | ||
464 | /* ssl (https) support is not configured */ | ||
465 | sfp = open_socket(lsa); | ||
466 | #endif | ||
467 | + printf("wget download_one_url 18\n"); | ||
468 | /* Send HTTP request */ | ||
469 | if (use_proxy) { | ||
470 | SENDFMT(sfp, "GET %s://%s/%s HTTP/1.1\r\n", | ||
471 | @@ -1270,6 +1443,7 @@ static void download_one_url(const char *url) | ||
472 | (option_mask32 & WGET_OPT_POST) ? "POST" : "GET", | ||
473 | target.path); | ||
474 | } | ||
475 | + printf("wget download_one_url 19\n"); | ||
476 | if (!USR_HEADER_HOST) | ||
477 | SENDFMT(sfp, "Host: %s\r\n", target.host); | ||
478 | if (!USR_HEADER_USER_AGENT) | ||
479 | @@ -1280,6 +1454,7 @@ static void download_one_url(const char *url) | ||
480 | */ | ||
481 | SENDFMT(sfp, "Connection: close\r\n"); | ||
482 | |||
483 | + printf("wget download_one_url 20\n"); | ||
484 | #if ENABLE_FEATURE_WGET_AUTHENTICATION | ||
485 | if (target.user && !USR_HEADER_AUTH) { | ||
486 | SENDFMT(sfp, "Proxy-Authorization: Basic %s\r\n"+6, | ||
487 | @@ -1291,6 +1466,7 @@ static void download_one_url(const char *url) | ||
488 | } | ||
489 | #endif | ||
490 | |||
491 | + printf("wget download_one_url 21\n"); | ||
492 | if (G.beg_range != 0 && !USR_HEADER_RANGE) | ||
493 | SENDFMT(sfp, "Range: bytes=%"OFF_FMT"u-\r\n", G.beg_range); | ||
494 | |||
495 | @@ -1300,6 +1476,7 @@ static void download_one_url(const char *url) | ||
496 | fputs(G.extra_headers, sfp); | ||
497 | } | ||
498 | |||
499 | + printf("wget download_one_url 22\n"); | ||
500 | if (option_mask32 & WGET_OPT_POST_FILE) { | ||
501 | int fd = xopen_stdin(G.post_file); | ||
502 | G.post_data = xmalloc_read(fd, NULL); | ||
503 | @@ -1314,15 +1491,18 @@ static void download_one_url(const char *url) | ||
504 | ); | ||
505 | } | ||
506 | # if ENABLE_PLATFORM_MINGW32 | ||
507 | + printf("wget download_one_url 23\n"); | ||
508 | if (!USR_HEADER_CONTENT_LENGTH) | ||
509 | SENDFMT(sfp, "Content-Length: %u\r\n", | ||
510 | (int)strlen(G.post_data) | ||
511 | ); | ||
512 | + printf("wget download_one_url 24\n"); | ||
513 | SENDFMT(sfp, | ||
514 | "\r\n" | ||
515 | "%s", | ||
516 | G.post_data | ||
517 | ); | ||
518 | + printf("wget download_one_url 25\n"); | ||
519 | } else | ||
520 | # else | ||
521 | SENDFMT(sfp, | ||
522 | @@ -1338,6 +1518,7 @@ static void download_one_url(const char *url) | ||
523 | SENDFMT(sfp, "\r\n"); | ||
524 | } | ||
525 | |||
526 | + printf("wget download_one_url 26\n"); | ||
527 | fflush(sfp); | ||
528 | |||
529 | /* Tried doing this unconditionally. | ||
530 | @@ -1345,31 +1526,55 @@ static void download_one_url(const char *url) | ||
531 | */ | ||
532 | #if SSL_SUPPORTED | ||
533 | if (target.protocol == P_HTTPS) { | ||
534 | + printf("wget download_one_url 26-2\n"); | ||
535 | /* If we use SSL helper, keeping our end of the socket open for writing | ||
536 | * makes our end (i.e. the same fd!) readable (EAGAIN instead of EOF) | ||
537 | * even after child closes its copy of the fd. | ||
538 | * This helps: | ||
539 | */ | ||
540 | shutdown(fileno(sfp), SHUT_WR); | 316 | shutdown(fileno(sfp), SHUT_WR); |
541 | + printf("wget download_one_url 26-3\n"); | ||
542 | } | 317 | } |
543 | #endif | 318 | #endif |
544 | - | 319 | - |
545 | + | ||
546 | + //How much data did we actually get? | 320 | + //How much data did we actually get? |
547 | + size_t wlen = ftell(sfp); | 321 | + size_t wlen, bufsize; |
548 | + char *outbuf = (char*)malloc(sizeof(char) * wlen); | 322 | + wlen = ftell(sfp); |
323 | + bufsize = 4096; | ||
324 | + char buf[bufsize]; | ||
325 | + char *outbuf; | ||
326 | + outbuf = (char*)malloc(sizeof(char) * wlen); | ||
549 | + rewind(sfp); | 327 | + rewind(sfp); |
550 | + if(fread(outbuf, sizeof(char), wlen, sfp) < wlen) | 328 | + rewind(dfp); |
551 | + bb_error_msg_and_die("Failed to read tmpfile: %s\n", strerror(errno)); | 329 | + if(fread(outbuf, sizeof(char), wlen, sfp) < wlen) |
330 | + bb_error_msg_and_die("Failed to read tmpfile: %s", strerror(errno)); | ||
552 | + if(tls_write(ctx, outbuf, wlen) < wlen) | 331 | + if(tls_write(ctx, outbuf, wlen) < wlen) |
553 | + bb_error_msg_and_die("Failed to write:%s\n",tls_error(ctx)); | 332 | + bb_error_msg_and_die("Failed to write:%s",tls_error(ctx)); |
554 | + | 333 | + ssize_t len; |
555 | + printf("About to seek\n"); | 334 | + len = TLS_WANT_POLLIN; |
556 | + fseek(dfp,0,SEEK_END); | 335 | + while(len == TLS_WANT_POLLIN || len > 0){ |
557 | + printf("Done seeking...\n"); | 336 | + len = tls_read(ctx, buf, bufsize); |
558 | + long dflen = ftell(dfp); | 337 | + if(len == -1) |
559 | + printf("wget download_one_url dflen: %ld\n", dflen); | 338 | + bb_error_msg_and_die("Failed tls read: %s", tls_error(ctx)); |
560 | + long sflen = ftell(sfp); | 339 | + if (len != TLS_WANT_POLLIN){ |
561 | + printf("wget download_one_url sflen: %ld\n", sflen); | 340 | + wlen = fwrite(buf, sizeof(char), len, dfp); |
341 | + if(wlen != len) | ||
342 | + bb_error_msg_and_die("Failed to write to tempfile: (%zu) (%zd) %s", wlen, len, strerror(errno)); | ||
343 | + } | ||
344 | + } | ||
345 | + if(len == -1) | ||
346 | + bb_error_msg_and_die("tls read error: %s", tls_error(ctx)); | ||
562 | + rewind(dfp); | 347 | + rewind(dfp); |
563 | + sfp = dfp; | 348 | + sfp = dfp; |
564 | /* | 349 | /* |
565 | * Retrieve HTTP response line and check for "200" status code. | 350 | * Retrieve HTTP response line and check for "200" status code. |
566 | */ | 351 | */ |
567 | read_response: | ||
568 | - fgets_trim_sanitize(sfp, " %s\n"); | ||
569 | + printf("wget download_one_url 27\n"); | ||
570 | + tlsgets_trim_sanitize(ctx, " %s\n"); | ||
571 | + printf("wget download_one_url 27-1\n"); | ||
572 | |||
573 | str = G.wget_buf; | ||
574 | + printf("wget_buf was: %s\n",G.wget_buf); | ||
575 | str = skip_non_whitespace(str); | ||
576 | str = skip_whitespace(str); | ||
577 | // FIXME: no error check | ||
578 | // xatou wouldn't work: "200 OK" | ||
579 | status = atoi(str); | ||
580 | + printf("Status was: %d\n",status); | ||
581 | switch (status) { | ||
582 | case 0: | ||
583 | case 100: | ||
584 | - while (get_sanitized_hdr(sfp) != NULL) | ||
585 | + while (tls_sanitized_hdr(ctx) != NULL) | ||
586 | /* eat all remaining headers */; | ||
587 | goto read_response; | ||
588 | |||
589 | @@ -1441,7 +1646,13 @@ However, in real world it was observed that some web servers | ||
590 | /* | ||
591 | * Retrieve HTTP headers. | ||
592 | */ | ||
593 | - while ((str = get_sanitized_hdr(sfp)) != NULL) { | ||
594 | + printf("wget download_one_url 28\n"); | ||
595 | + printf("At this point wget_buf is: %s\n",G.wget_buf); | ||
596 | + str = strchr(str,'\n'); | ||
597 | + char *header, *value; | ||
598 | + while (tls_sanitized_hdr(ctx, str, &header, &value) > 0) { | ||
599 | + printf("wget Retreiving the next part of the headers\n"); | ||
600 | + printf("wget str was: %s\n", str); | ||
601 | static const char keywords[] ALIGN1 = | ||
602 | "content-length\0""transfer-encoding\0""location\0"; | ||
603 | enum { | ||
604 | @@ -1453,6 +1664,7 @@ However, in real world it was observed that some web servers | ||
605 | |||
606 | /* strip trailing whitespace */ | ||
607 | char *s = strchrnul(str, '\0') - 1; | ||
608 | + printf("Stripping whitespace at %s\n", s); | ||
609 | while (s >= str && (*s == ' ' || *s == '\t')) { | ||
610 | *s = '\0'; | ||
611 | s--; | ||
612 | @@ -1460,6 +1672,7 @@ However, in real world it was observed that some web servers | ||
613 | key = index_in_strings(keywords, G.wget_buf) + 1; | ||
614 | if (key == KEY_content_length) { | ||
615 | G.content_len = BB_STRTOOFF(str, NULL, 10); | ||
616 | + printf("Got content length: %jd\n", G.content_len); | ||
617 | if (G.content_len < 0 || errno) { | ||
618 | bb_error_msg_and_die("content-length %s is garbage", str); | ||
619 | } | ||
620 | @@ -1469,6 +1682,7 @@ However, in real world it was observed that some web servers | ||
621 | if (key == KEY_transfer_encoding) { | ||
622 | if (strcmp(str_tolower(str), "chunked") != 0) | ||
623 | bb_error_msg_and_die("transfer encoding '%s' is not supported", str); | ||
624 | + printf("Got transfer encodeing: chunked\n"); | ||
625 | G.chunked = 1; | ||
626 | } | ||
627 | if (key == KEY_location && status >= 300) { | ||
628 | @@ -1494,9 +1708,11 @@ However, in real world it was observed that some web servers | ||
629 | goto resolve_lsa; | ||
630 | } /* else: lsa stays the same: we use proxy */ | ||
631 | } | ||
632 | + printf("Got location header: %s\n",target.path); | ||
633 | goto establish_session; | ||
634 | } | ||
635 | } | ||
636 | + printf("wget download_one_url 29\n"); | ||
637 | // if (status >= 300) | ||
638 | // bb_error_msg_and_die("bad redirection (no Location: header from server)"); | ||
639 | |||
640 | @@ -1514,6 +1730,7 @@ However, in real world it was observed that some web servers | ||
641 | |||
642 | free(lsa); | ||
643 | |||
644 | + printf("wget download_one_url 30\n"); | ||
645 | if (!(option_mask32 & WGET_OPT_SPIDER)) { | ||
646 | if (G.output_fd < 0) | ||
647 | G.output_fd = xopen(G.fname_out, G.o_flags); | ||
648 | @@ -1536,6 +1753,7 @@ However, in real world it was observed that some web servers | ||
649 | /* ftpcmd("QUIT", NULL, sfp); - why bother? */ | ||
650 | } | ||
651 | #endif | ||
652 | + printf("wget download_one_url 31\n"); | ||
653 | fclose(sfp); | ||
654 | |||
655 | free(server.allocated); | ||
656 | @@ -1544,11 +1762,13 @@ However, in real world it was observed that some web servers | ||
657 | free(target.user); | ||
658 | free(fname_out_alloc); | ||
659 | free(redirected_path); | ||
660 | + printf("wget download_one_url 32\n"); | ||
661 | } | ||
662 | |||
663 | int wget_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | ||
664 | int wget_main(int argc UNUSED_PARAM, char **argv) | ||
665 | { | ||
666 | + printf("wget main 1\n"); | ||
667 | #if ENABLE_FEATURE_WGET_LONG_OPTIONS | ||
668 | static const char wget_longopts[] ALIGN1 = | ||
669 | /* name, has_arg, val */ | ||
670 | @@ -1590,6 +1810,7 @@ IF_DESKTOP( "no-parent\0" No_argument "\xf0") | ||
671 | #endif | ||
672 | |||
673 | INIT_G(); | ||
674 | + printf("wget main 2\n"); | ||
675 | |||
676 | #if ENABLE_FEATURE_WGET_TIMEOUT | ||
677 | G.timeout_seconds = 900; | ||
678 | @@ -1626,6 +1847,8 @@ IF_DESKTOP( "no-parent\0" No_argument "\xf0") | ||
679 | IF_FEATURE_WGET_LONG_OPTIONS(, &G.post_data) | ||
680 | IF_FEATURE_WGET_LONG_OPTIONS(, &G.post_file) | ||
681 | ); | ||
682 | + | ||
683 | + printf("wget main 3\n"); | ||
684 | #if 0 /* option bits debug */ | ||
685 | if (option_mask32 & WGET_OPT_RETRIES) bb_error_msg("-t NUM"); | ||
686 | if (option_mask32 & WGET_OPT_nsomething) bb_error_msg("-nsomething"); | ||
687 | @@ -1670,6 +1893,7 @@ IF_DESKTOP( "no-parent\0" No_argument "\xf0") | ||
688 | } | ||
689 | #endif | ||
690 | |||
691 | + printf("wget main 4\n"); | ||
692 | G.output_fd = -1; | ||
693 | G.o_flags = O_WRONLY | O_CREAT | O_TRUNC | O_EXCL; | ||
694 | if (G.fname_out) { /* -O FILE ? */ | ||
695 | @@ -1691,8 +1915,11 @@ IF_DESKTOP( "no-parent\0" No_argument "\xf0") | ||
696 | } | ||
697 | } | ||
698 | |||
699 | - while (*argv) | ||
700 | + printf("wget main 5\n"); | ||
701 | + while (*argv) { | ||
702 | + printf("wget main 5-%s\n",argv); | ||
703 | download_one_url(*argv++); | ||
704 | + } | ||
705 | |||
706 | if (G.output_fd >= 0) | ||
707 | xclose(G.output_fd); | ||
708 | diff --git a/scripts/trylink b/scripts/trylink | 352 | diff --git a/scripts/trylink b/scripts/trylink |
709 | index 2456252a3..6186284f1 100755 | 353 | index 2456252a3..6186284f1 100755 |
710 | --- a/scripts/trylink | 354 | --- a/scripts/trylink |