Deleted Added
full compact
common.c (198339) common.c (210568)
1/*-
2 * Copyright (c) 1998-2004 Dag-Erling Co�dan Sm�rgrav
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 13 unchanged lines hidden (view full) ---

22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 1998-2004 Dag-Erling Co�dan Sm�rgrav
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 13 unchanged lines hidden (view full) ---

22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <sys/cdefs.h>
30__FBSDID("$FreeBSD: head/lib/libfetch/common.c 198339 2009-10-21 18:29:26Z fabient $");
30__FBSDID("$FreeBSD: head/lib/libfetch/common.c 210568 2010-07-28 16:11:22Z des $");
31
32#include <sys/param.h>
33#include <sys/socket.h>
34#include <sys/time.h>
35#include <sys/uio.h>
36
37#include <netinet/in.h>
38
39#include <ctype.h>
40#include <errno.h>
31
32#include <sys/param.h>
33#include <sys/socket.h>
34#include <sys/time.h>
35#include <sys/uio.h>
36
37#include <netinet/in.h>
38
39#include <ctype.h>
40#include <errno.h>
41#include <fcntl.h>
41#include <netdb.h>
42#include <pwd.h>
43#include <stdarg.h>
44#include <stdlib.h>
45#include <stdio.h>
46#include <string.h>
47#include <unistd.h>
48

--- 241 unchanged lines hidden (view full) ---

290 res->ai_protocol)) == -1)
291 continue;
292 if (bindaddr != NULL && *bindaddr != '\0' &&
293 fetch_bind(sd, res->ai_family, bindaddr) != 0) {
294 fetch_info("failed to bind to '%s'", bindaddr);
295 close(sd);
296 continue;
297 }
42#include <netdb.h>
43#include <pwd.h>
44#include <stdarg.h>
45#include <stdlib.h>
46#include <stdio.h>
47#include <string.h>
48#include <unistd.h>
49

--- 241 unchanged lines hidden (view full) ---

291 res->ai_protocol)) == -1)
292 continue;
293 if (bindaddr != NULL && *bindaddr != '\0' &&
294 fetch_bind(sd, res->ai_family, bindaddr) != 0) {
295 fetch_info("failed to bind to '%s'", bindaddr);
296 close(sd);
297 continue;
298 }
298 if (connect(sd, res->ai_addr, res->ai_addrlen) == 0)
299 if (connect(sd, res->ai_addr, res->ai_addrlen) == 0 &&
300 fcntl(sd, F_SETFL, O_NONBLOCK) == 0)
299 break;
300 close(sd);
301 }
302 freeaddrinfo(res0);
303 if (sd == -1) {
304 fetch_syserr();
305 return (NULL);
306 }

--- 7 unchanged lines hidden (view full) ---

314
315
316/*
317 * Enable SSL on a connection.
318 */
319int
320fetch_ssl(conn_t *conn, int verbose)
321{
301 break;
302 close(sd);
303 }
304 freeaddrinfo(res0);
305 if (sd == -1) {
306 fetch_syserr();
307 return (NULL);
308 }

--- 7 unchanged lines hidden (view full) ---

316
317
318/*
319 * Enable SSL on a connection.
320 */
321int
322fetch_ssl(conn_t *conn, int verbose)
323{
324 int ret, ssl_err;
322
323#ifdef WITH_SSL
324 /* Init the SSL library and context */
325 if (!SSL_library_init()){
326 fprintf(stderr, "SSL library init failed\n");
327 return (-1);
328 }
329

--- 4 unchanged lines hidden (view full) ---

334 SSL_CTX_set_mode(conn->ssl_ctx, SSL_MODE_AUTO_RETRY);
335
336 conn->ssl = SSL_new(conn->ssl_ctx);
337 if (conn->ssl == NULL){
338 fprintf(stderr, "SSL context creation failed\n");
339 return (-1);
340 }
341 SSL_set_fd(conn->ssl, conn->sd);
325
326#ifdef WITH_SSL
327 /* Init the SSL library and context */
328 if (!SSL_library_init()){
329 fprintf(stderr, "SSL library init failed\n");
330 return (-1);
331 }
332

--- 4 unchanged lines hidden (view full) ---

337 SSL_CTX_set_mode(conn->ssl_ctx, SSL_MODE_AUTO_RETRY);
338
339 conn->ssl = SSL_new(conn->ssl_ctx);
340 if (conn->ssl == NULL){
341 fprintf(stderr, "SSL context creation failed\n");
342 return (-1);
343 }
344 SSL_set_fd(conn->ssl, conn->sd);
342 if (SSL_connect(conn->ssl) == -1){
343 ERR_print_errors_fp(stderr);
344 return (-1);
345 while ((ret = SSL_connect(conn->ssl)) == -1) {
346 ssl_err = SSL_get_error(conn->ssl, ret);
347 if (ssl_err != SSL_ERROR_WANT_READ &&
348 ssl_err != SSL_ERROR_WANT_WRITE) {
349 ERR_print_errors_fp(stderr);
350 return (-1);
351 }
345 }
346
347 if (verbose) {
348 X509_NAME *name;
349 char *str;
350
351 fprintf(stderr, "SSL connection established using %s\n",
352 SSL_get_cipher(conn->ssl));

--- 12 unchanged lines hidden (view full) ---

365#else
366 (void)conn;
367 (void)verbose;
368 fprintf(stderr, "SSL support disabled\n");
369 return (-1);
370#endif
371}
372
352 }
353
354 if (verbose) {
355 X509_NAME *name;
356 char *str;
357
358 fprintf(stderr, "SSL connection established using %s\n",
359 SSL_get_cipher(conn->ssl));

--- 12 unchanged lines hidden (view full) ---

372#else
373 (void)conn;
374 (void)verbose;
375 fprintf(stderr, "SSL support disabled\n");
376 return (-1);
377#endif
378}
379
380#define FETCH_READ_WAIT -2
381#define FETCH_READ_ERROR -1
382#define FETCH_READ_DONE 0
373
383
384#ifdef WITH_SSL
385static ssize_t
386fetch_ssl_read(SSL *ssl, char *buf, size_t len)
387{
388 ssize_t rlen;
389 int ssl_err;
390
391 rlen = SSL_read(ssl, buf, len);
392 if (rlen < 0) {
393 ssl_err = SSL_get_error(ssl, rlen);
394 if (ssl_err == SSL_ERROR_WANT_READ ||
395 ssl_err == SSL_ERROR_WANT_WRITE) {
396 return (FETCH_READ_WAIT);
397 } else {
398 ERR_print_errors_fp(stderr);
399 return (FETCH_READ_ERROR);
400 }
401 }
402 return (rlen);
403}
404#endif
405
406static ssize_t
407fetch_socket_read(int sd, char *buf, size_t len)
408{
409 ssize_t rlen;
410
411 rlen = read(sd, buf, len);
412 if (rlen < 0) {
413 if (errno == EAGAIN || (errno == EINTR && fetchRestartCalls))
414 return (FETCH_READ_WAIT);
415 else
416 return (FETCH_READ_ERROR);
417 }
418 return (rlen);
419}
420
374/*
375 * Read a character from a connection w/ timeout
376 */
377ssize_t
378fetch_read(conn_t *conn, char *buf, size_t len)
379{
380 struct timeval now, timeout, delta;
381 fd_set readfds;
382 ssize_t rlen, total;
383 int r;
384
385 if (fetchTimeout) {
386 FD_ZERO(&readfds);
387 gettimeofday(&timeout, NULL);
388 timeout.tv_sec += fetchTimeout;
389 }
390
391 total = 0;
392 while (len > 0) {
421/*
422 * Read a character from a connection w/ timeout
423 */
424ssize_t
425fetch_read(conn_t *conn, char *buf, size_t len)
426{
427 struct timeval now, timeout, delta;
428 fd_set readfds;
429 ssize_t rlen, total;
430 int r;
431
432 if (fetchTimeout) {
433 FD_ZERO(&readfds);
434 gettimeofday(&timeout, NULL);
435 timeout.tv_sec += fetchTimeout;
436 }
437
438 total = 0;
439 while (len > 0) {
440 /*
441 * The socket is non-blocking. Instead of the canonical
442 * select() -> read(), we do the following:
443 *
444 * 1) call read() or SSL_read().
445 * 2) if an error occurred, return -1.
446 * 3) if we received data but we still expect more,
447 * update our counters and loop.
448 * 4) if read() or SSL_read() signaled EOF, return.
449 * 5) if we did not receive any data but we're not at EOF,
450 * call select().
451 *
452 * In the SSL case, this is necessary because if we
453 * receive a close notification, we have to call
454 * SSL_read() one additional time after we've read
455 * everything we received.
456 *
457 * In the non-SSL case, it may improve performance (very
458 * slightly) when reading small amounts of data.
459 */
460#ifdef WITH_SSL
461 if (conn->ssl != NULL)
462 rlen = fetch_ssl_read(conn->ssl, buf, len);
463 else
464#endif
465 rlen = fetch_socket_read(conn->sd, buf, len);
466 if (rlen == 0) {
467 break;
468 } else if (rlen > 0) {
469 len -= rlen;
470 buf += rlen;
471 total += rlen;
472 continue;
473 } else if (rlen == FETCH_READ_ERROR) {
474 return (-1);
475 }
476 // assert(rlen == FETCH_READ_WAIT);
393 while (fetchTimeout && !FD_ISSET(conn->sd, &readfds)) {
394 FD_SET(conn->sd, &readfds);
395 gettimeofday(&now, NULL);
396 delta.tv_sec = timeout.tv_sec - now.tv_sec;
397 delta.tv_usec = timeout.tv_usec - now.tv_usec;
398 if (delta.tv_usec < 0) {
399 delta.tv_usec += 1000000;
400 delta.tv_sec--;

--- 7 unchanged lines hidden (view full) ---

408 r = select(conn->sd + 1, &readfds, NULL, NULL, &delta);
409 if (r == -1) {
410 if (errno == EINTR && fetchRestartCalls)
411 continue;
412 fetch_syserr();
413 return (-1);
414 }
415 }
477 while (fetchTimeout && !FD_ISSET(conn->sd, &readfds)) {
478 FD_SET(conn->sd, &readfds);
479 gettimeofday(&now, NULL);
480 delta.tv_sec = timeout.tv_sec - now.tv_sec;
481 delta.tv_usec = timeout.tv_usec - now.tv_usec;
482 if (delta.tv_usec < 0) {
483 delta.tv_usec += 1000000;
484 delta.tv_sec--;

--- 7 unchanged lines hidden (view full) ---

492 r = select(conn->sd + 1, &readfds, NULL, NULL, &delta);
493 if (r == -1) {
494 if (errno == EINTR && fetchRestartCalls)
495 continue;
496 fetch_syserr();
497 return (-1);
498 }
499 }
416#ifdef WITH_SSL
417 if (conn->ssl != NULL)
418 rlen = SSL_read(conn->ssl, buf, len);
419 else
420#endif
421 rlen = read(conn->sd, buf, len);
422 if (rlen == 0)
423 break;
424 if (rlen < 0) {
425 if (errno == EINTR && fetchRestartCalls)
426 continue;
427 return (-1);
428 }
429 len -= rlen;
430 buf += rlen;
431 total += rlen;
432 }
433 return (total);
434}
435
436
437/*
438 * Read a line of text from a connection w/ timeout
439 */

--- 103 unchanged lines hidden (view full) ---

543 if (conn->ssl != NULL)
544 wlen = SSL_write(conn->ssl,
545 iov->iov_base, iov->iov_len);
546 else
547#endif
548 wlen = writev(conn->sd, iov, iovcnt);
549 if (wlen == 0) {
550 /* we consider a short write a failure */
500 }
501 return (total);
502}
503
504
505/*
506 * Read a line of text from a connection w/ timeout
507 */

--- 103 unchanged lines hidden (view full) ---

611 if (conn->ssl != NULL)
612 wlen = SSL_write(conn->ssl,
613 iov->iov_base, iov->iov_len);
614 else
615#endif
616 wlen = writev(conn->sd, iov, iovcnt);
617 if (wlen == 0) {
618 /* we consider a short write a failure */
619 /* XXX perhaps we shouldn't in the SSL case */
551 errno = EPIPE;
552 fetch_syserr();
553 return (-1);
554 }
555 if (wlen < 0) {
556 if (errno == EINTR && fetchRestartCalls)
557 continue;
558 return (-1);

--- 228 unchanged lines hidden ---
620 errno = EPIPE;
621 fetch_syserr();
622 return (-1);
623 }
624 if (wlen < 0) {
625 if (errno == EINTR && fetchRestartCalls)
626 continue;
627 return (-1);

--- 228 unchanged lines hidden ---