Merge branch 'master' into yaz-743
authorAdam Dickmeiss <adam@indexdata.dk>
Tue, 25 Feb 2014 07:33:57 +0000 (08:33 +0100)
committerAdam Dickmeiss <adam@indexdata.dk>
Tue, 25 Feb 2014 07:33:57 +0000 (08:33 +0100)
1  2 
src/tcpip.c

diff --combined src/tcpip.c
@@@ -60,7 -60,6 +60,6 @@@
  #if HAVE_GNUTLS_H
  #include <gnutls/x509.h>
  #include <gnutls/gnutls.h>
- #define ENABLE_SSL 1
  #endif
  
  #include <yaz/comstack.h>
@@@ -81,7 -80,7 +80,7 @@@ static int tcpip_listen(COMSTACK h, cha
                   void *cd);
  static int tcpip_set_blocking(COMSTACK p, int blocking);
  
- #if ENABLE_SSL
+ #if HAVE_GNUTLS_H
  static int ssl_get(COMSTACK h, char **buf, int *bufsize);
  static int ssl_put(COMSTACK h, char *buf, int size);
  #endif
@@@ -119,7 -118,6 +118,7 @@@ typedef struct tcpip_stat
      int (*complete)(const char *buf, int len); /* length/complete. */
  #if HAVE_GETADDRINFO
      struct addrinfo *ai;
 +    struct addrinfo *ai_this;
  #else
      struct sockaddr_in addr;  /* returned by cs_straddr */
  #endif
@@@ -256,9 -254,7 +255,7 @@@ static void tcpip_create_cred(COMSTACK 
  
  COMSTACK ssl_type(int s, int flags, int protocol, void *vp)
  {
- #if !ENABLE_SSL
-     return 0;
- #else
+ #if HAVE_GNUTLS_H
      tcpip_state *sp;
      COMSTACK p;
  
      p->type = ssl_type;
      sp = (tcpip_state *) p->cprivate;
  
- #if HAVE_GNUTLS_H
      sp->session = (gnutls_session_t) vp;
- #endif
      /* note: we don't handle already opened socket in SSL mode - yet */
      return p;
+ #else
+     return 0;
  #endif
  }
  
- #if ENABLE_SSL
+ #if HAVE_GNUTLS_H
  static int ssl_check_error(COMSTACK h, tcpip_state *sp, int res)
  {
- #if HAVE_GNUTLS_H
      TRC(fprintf(stderr, "ssl_check_error error=%d fatal=%d msg=%s\n",
                  res,
                  gnutls_error_is_fatal(res),
          h->io_pending = dir ? CS_WANT_WRITE : CS_WANT_READ;
          return 1;
      }
- #endif
      h->cerrno = CSERRORSSL;
      return 0;
  }
@@@ -424,16 -418,13 +419,16 @@@ void *tcpip_straddr(COMSTACK h, const c
      if (sp->ai && h->state == CS_ST_UNBND)
      {
          int s = -1;
 -        for (ai = sp->ai; ai; ai = ai->ai_next)
 +        if (ipv6_only >= 0)
          {
 -            if (ai->ai_family == AF_INET6)
 +            for (ai = sp->ai; ai; ai = ai->ai_next)
              {
 -                s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
 -                if (s != -1)
 -                    break;
 +                if (ai->ai_family == AF_INET6)
 +                {
 +                    s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
 +                    if (s != -1)
 +                        break;
 +                }
              }
          }
          if (s == -1)
          }
          if (s == -1)
              return 0;
 +        fprintf(stderr, "First socket fd=%d\n", s);
 +        sp->ai_this = ai;
          assert(ai);
          h->iofile = s;
          if (ai->ai_family == AF_INET6 && ipv6_only >= 0 &&
@@@ -500,36 -489,6 +495,36 @@@ int tcpip_more(COMSTACK h
      return sp->altlen && (*sp->complete)(sp->altbuf, sp->altlen);
  }
  
 +static int cont_connect(COMSTACK h)
 +{
 +#if HAVE_GETADDRINFO
 +    tcpip_state *sp = (tcpip_state *)h->cprivate;
 +    struct addrinfo *ai = sp->ai_this;
 +    while (ai && (ai = ai->ai_next))
 +    {
 +        int s;
 +        s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
 +        if (s != -1)
 +        {
 +#ifdef WIN32
 +            closesocket(h->iofile);
 +#else
 +            close(h->iofile);
 +#endif
 +            fprintf(stderr, "Other socket call fd=%d\n", s);
 +            h->state = CS_ST_UNBND;
 +            h->iofile = s;
 +            sp->ai_this = ai;
 +            tcpip_set_blocking(h, h->flags);
 +            return tcpip_connect(h, ai);
 +        }
 +#endif
 +    }
 +    h->cerrno = CSYSERR;
 +    return -1;
 +}
 +
 +
  /*
   * connect(2) will block (sometimes) - nothing we can do short of doing
   * weird things like spawning subprocesses or threading or some weird junk
@@@ -539,6 -498,7 +534,6 @@@ int tcpip_connect(COMSTACK h, void *add
  {
  #if HAVE_GETADDRINFO
      struct addrinfo *ai = (struct addrinfo *) address;
 -    tcpip_state *sp = (tcpip_state *)h->cprivate;
  #else
      struct sockaddr_in *add = (struct sockaddr_in *) address;
  #endif
      }
  #if HAVE_GETADDRINFO
      r = connect(h->iofile, ai->ai_addr, ai->ai_addrlen);
 -    freeaddrinfo(sp->ai);
 -    sp->ai = 0;
  #else
      r = connect(h->iofile, (struct sockaddr *) add, sizeof(*add));
  #endif
  #else
          if (yaz_errno() == EINPROGRESS)
          {
 +            fprintf(stderr, "Pending fd=%d\n", h->iofile);
              h->event = CS_CONNECT;
              h->state = CS_ST_CONNECTING;
              h->io_pending = CS_WANT_WRITE|CS_WANT_READ;
              return 1;
          }
  #endif
 -        h->cerrno = CSYSERR;
 -        return -1;
 +        return cont_connect(h);
      }
      h->event = CS_CONNECT;
      h->state = CS_ST_CONNECTING;
   */
  int tcpip_rcvconnect(COMSTACK h)
  {
- #if ENABLE_SSL
+ #if HAVE_GNUTLS_H
      tcpip_state *sp = (tcpip_state *)h->cprivate;
  #endif
      TRC(fprintf(stderr, "tcpip_rcvconnect\n"));
@@@ -661,6 -623,7 +656,7 @@@ static int tcpip_bind(COMSTACK h, void 
                                                     GNUTLS_X509_FMT_PEM);
          if (res != GNUTLS_E_SUCCESS)
          {
+             fprintf(stderr, "Error 1\n");
              h->cerrno = CSERRORSSL;
              return -1;
          }
@@@ -1047,7 -1010,7 +1043,7 @@@ int tcpip_get(COMSTACK h, char **buf, i
  }
  
  
- #if ENABLE_SSL
+ #if HAVE_GNUTLS_H
  /*
   * Return: -1 error, >1 good, len of buffer, ==1 incomplete buffer,
   * 0=connection closed.
@@@ -1084,7 -1047,6 +1080,6 @@@ int ssl_get(COMSTACK h, char **buf, in
          else if (*bufsize - hasread < CS_TCPIP_BUFCHUNK)
              if (!(*buf =(char *)xrealloc(*buf, *bufsize *= 2)))
                  return -1;
- #if HAVE_GNUTLS_H
          res = gnutls_record_recv(sp->session, *buf + hasread,
                                   CS_TCPIP_BUFCHUNK);
          if (res == 0)
                  break;
              return -1;
          }
- #else
-         res = SSL_read(sp->ssl, *buf + hasread, CS_TCPIP_BUFCHUNK);
-         TRC(fprintf(stderr, "  SSL_read res=%d, hasread=%d\n", res, hasread));
-         if (res <= 0)
-         {
-             if (ssl_check_error(h, sp, res))
-                 break;
-             return -1;
-         }
- #endif
          hasread += res;
      }
      TRC (fprintf (stderr, "  Out of read loop with hasread=%d, berlen=%d\n",
@@@ -1192,7 -1144,8 +1177,7 @@@ int tcpip_put(COMSTACK h, char *buf, in
                  h->io_pending = CS_WANT_WRITE;
                  return 1;
              }
 -            h->cerrno = CSYSERR;
 -            return -1;
 +            return cont_connect(h);
          }
          state->written += res;
          TRC(fprintf(stderr, "  Wrote %d, written=%d, nbytes=%d\n",
  }
  
  
- #if ENABLE_SSL
+ #if HAVE_GNUTLS_H
  /*
   * Returns 1, 0 or -1
   * In nonblocking mode, you must call again with same buffer while
@@@ -1230,7 -1183,6 +1215,6 @@@ int ssl_put(COMSTACK h, char *buf, int 
      }
      while (state->towrite > state->written)
      {
- #if HAVE_GNUTLS_H
          res = gnutls_record_send(state->session, buf + state->written,
                                   size - state->written);
          if (res <= 0)
                  return 1;
              return -1;
          }
- #else
-         res = SSL_write(state->ssl, buf + state->written,
-                         size - state->written);
-         if (res <= 0)
-         {
-             if (ssl_check_error(h, state, res))
-                 return 1;
-             return -1;
-         }
- #endif
          state->written += res;
          TRC(fprintf(stderr, "  Wrote %d, written=%d, nbytes=%d\n",
                      res, state->written, size));
@@@ -1513,7 -1455,7 +1487,7 @@@ void *cs_get_ssl(COMSTACK cs
  
  int cs_set_ssl_ctx(COMSTACK cs, void *ctx)
  {
- #if ENABLE_SSL
+ #if HAVE_GNUTLS_H
      if (cs && cs->type == ssl_type)
      {
          /* doesn't do anything for GNUTLS */
  
  int cs_set_ssl_certificate_file(COMSTACK cs, const char *fname)
  {
- #if ENABLE_SSL
+ #if HAVE_GNUTLS_H
      if (cs && cs->type == ssl_type)
      {
          struct tcpip_state *sp = (struct tcpip_state *) cs->cprivate;