/[cvs]/eggdrop1.8/src/net.c
ViewVC logotype

Diff of /eggdrop1.8/src/net.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.4 by pseudo, Tue Sep 14 19:45:29 2010 UTC revision 1.5 by pseudo, Tue Oct 19 12:13:33 2010 UTC
# Line 44  Line 44 
44  #endif  #endif
45  #include <setjmp.h>  #include <setjmp.h>
46    
47    #ifdef TLS
48    #  include <openssl/err.h>
49    #endif
50    
51  #ifndef HAVE_GETDTABLESIZE  #ifndef HAVE_GETDTABLESIZE
52  #  ifdef FD_SETSIZE  #  ifdef FD_SETSIZE
53  #    define getdtablesize() FD_SETSIZE  #    define getdtablesize() FD_SETSIZE
# Line 271  int allocsock(int sock, int options) Line 275  int allocsock(int sock, int options)
275        td->socklist[i].handler.sock.outbuflen = 0;        td->socklist[i].handler.sock.outbuflen = 0;
276        td->socklist[i].flags = options;        td->socklist[i].flags = options;
277        td->socklist[i].sock = sock;        td->socklist[i].sock = sock;
278    #ifdef TLS
279          td->socklist[i].ssl = 0;
280    #endif
281        return i;        return i;
282      }      }
283    }    }
# Line 369  void killsock(register int sock) Line 376  void killsock(register int sock)
376    for (i = 0; i < td->MAXSOCKS; i++) {    for (i = 0; i < td->MAXSOCKS; i++) {
377      if ((td->socklist[i].sock == sock) && !(td->socklist[i].flags & SOCK_UNUSED)) {      if ((td->socklist[i].sock == sock) && !(td->socklist[i].flags & SOCK_UNUSED)) {
378        if (!(td->socklist[i].flags & SOCK_TCL)) { /* nothing to free for tclsocks */        if (!(td->socklist[i].flags & SOCK_TCL)) { /* nothing to free for tclsocks */
379    #ifdef TLS
380            if (td->socklist[i].ssl) {
381              SSL_shutdown(td->socklist[i].ssl);
382              nfree(SSL_get_app_data(td->socklist[i].ssl));
383              SSL_free(td->socklist[i].ssl);
384              td->socklist[i].ssl = NULL;
385            }
386    #endif
387          close(td->socklist[i].sock);          close(td->socklist[i].sock);
388          if (td->socklist[i].handler.sock.inbuf != NULL) {          if (td->socklist[i].handler.sock.inbuf != NULL) {
389            nfree(td->socklist[i].handler.sock.inbuf);            nfree(td->socklist[i].handler.sock.inbuf);
# Line 716  int sockread(char *s, int *len, sock_lis Line 731  int sockread(char *s, int *len, sock_lis
731      for (i = 0; i < slistmax; i++) {      for (i = 0; i < slistmax; i++) {
732        if (!tclonly && ((!(slist[i].flags & (SOCK_UNUSED | SOCK_TCL))) &&        if (!tclonly && ((!(slist[i].flags & (SOCK_UNUSED | SOCK_TCL))) &&
733            ((FD_ISSET(slist[i].sock, &fdr)) ||            ((FD_ISSET(slist[i].sock, &fdr)) ||
734    #ifdef TLS
735              (slist[i].ssl && SSL_pending(slist[i].ssl)) ||
736    #endif
737            ((slist[i].sock == STDOUT) && (!backgrd) &&            ((slist[i].sock == STDOUT) && (!backgrd) &&
738            (FD_ISSET(STDIN, &fdr)))))) {            (FD_ISSET(STDIN, &fdr)))))) {
739          if (slist[i].flags & (SOCK_LISTEN | SOCK_CONNECT)) {          if (slist[i].flags & (SOCK_LISTEN | SOCK_CONNECT)) {
# Line 725  int sockread(char *s, int *len, sock_lis Line 743  int sockread(char *s, int *len, sock_lis
743            if (slist[i].flags & SOCK_PROXYWAIT) /* drummer */            if (slist[i].flags & SOCK_PROXYWAIT) /* drummer */
744              /* Hang around to get the return code from proxy */              /* Hang around to get the return code from proxy */
745              grab = 10;              grab = 10;
746    #ifdef TLS
747              else if (!(slist[i].flags & SOCK_STRONGCONN) &&
748                (!(slist[i].ssl) || !SSL_in_init(slist[i].ssl))) {
749    #else
750            else if (!(slist[i].flags & SOCK_STRONGCONN)) {            else if (!(slist[i].flags & SOCK_STRONGCONN)) {
751    #endif
752              debug1("net: connect! sock %d", slist[i].sock);              debug1("net: connect! sock %d", slist[i].sock);
753              s[0] = 0;              s[0] = 0;
754              *len = 0;              *len = 0;
# Line 740  int sockread(char *s, int *len, sock_lis Line 763  int sockread(char *s, int *len, sock_lis
763          if ((slist[i].sock == STDOUT) && !backgrd)          if ((slist[i].sock == STDOUT) && !backgrd)
764            x = read(STDIN, s, grab);            x = read(STDIN, s, grab);
765          else          else
766    #ifdef TLS
767        {
768              if (slist[i].ssl) {
769                x = SSL_read(slist[i].ssl, s, grab);
770                if (x < 0) {
771              int err = SSL_get_error(slist[i].ssl, x);
772              if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE)
773                errno = EAGAIN;
774                  else
775                    debug1("SSL error: %s", ERR_error_string(ERR_get_error(), 0));
776                  x = -1;
777                }
778              } else
779                x = read(slist[i].sock, s, grab);
780        }
781    #else
782            x = read(slist[i].sock, s, grab);            x = read(slist[i].sock, s, grab);
783    #endif  
784          if (x <= 0) {           /* eof */          if (x <= 0) {           /* eof */
785            if (errno != EAGAIN) { /* EAGAIN happens when the operation would            if (errno != EAGAIN) { /* EAGAIN happens when the operation would
786                                    * block on a non-blocking socket, if the                                    * block on a non-blocking socket, if the
# Line 1047  void tputs(register int z, char *s, unsi Line 1087  void tputs(register int z, char *s, unsi
1087          socklist[i].handler.sock.outbuflen += len;          socklist[i].handler.sock.outbuflen += len;
1088          return;          return;
1089        }        }
1090    #ifdef TLS
1091          if (socklist[i].ssl) {
1092            x = SSL_write(socklist[i].ssl, s, len);
1093            if (x < 0) {
1094              int err = SSL_get_error(socklist[i].ssl, x);
1095              if (err == SSL_ERROR_WANT_WRITE || err == SSL_ERROR_WANT_READ)
1096                errno = EAGAIN;
1097              else if (!inhere) { /* Out there, somewhere */
1098                inhere = 1;
1099                debug1("SSL error: %s", ERR_error_string(ERR_get_error(), 0));
1100                inhere = 0;
1101              }
1102              x = -1;
1103            }
1104          } else /* not ssl, use regular write() */
1105    #endif      
1106        /* Try. */        /* Try. */
1107        x = write(z, s, len);        x = write(z, s, len);
1108        if (x == -1)        if (x == -1)
# Line 1114  void dequeue_sockets() Line 1170  void dequeue_sockets()
1170          (socklist[i].handler.sock.outbuf != NULL) && (FD_ISSET(socklist[i].sock, &wfds))) {          (socklist[i].handler.sock.outbuf != NULL) && (FD_ISSET(socklist[i].sock, &wfds))) {
1171        /* Trick tputs into doing the work */        /* Trick tputs into doing the work */
1172        errno = 0;        errno = 0;
1173    #ifdef TLS
1174          if (socklist[i].ssl) {
1175            x = SSL_write(socklist[i].ssl, socklist[i].handler.sock.outbuf,
1176            socklist[i].handler.sock.outbuflen);
1177            if (x < 0) {
1178              int err = SSL_get_error(socklist[i].ssl, x);
1179              if (err == SSL_ERROR_WANT_WRITE || err == SSL_ERROR_WANT_READ)
1180                errno = EAGAIN;
1181              else
1182                debug1("SSL error: %s", ERR_error_string(ERR_get_error(), 0));
1183              x = -1;
1184            }
1185          } else
1186    #endif  
1187        x = write(socklist[i].sock, socklist[i].handler.sock.outbuf, socklist[i].handler.sock.outbuflen);        x = write(socklist[i].sock, socklist[i].handler.sock.outbuf, socklist[i].handler.sock.outbuflen);
1188        if ((x < 0) && (errno != EAGAIN)        if ((x < 0) && (errno != EAGAIN)
1189  #ifdef EBADSLT  #ifdef EBADSLT
# Line 1183  void tell_netdebug(int idx) Line 1253  void tell_netdebug(int idx)
1253          strcat(s, " (strong)");          strcat(s, " (strong)");
1254        if (socklist[i].flags & SOCK_NONSOCK)        if (socklist[i].flags & SOCK_NONSOCK)
1255          strcat(s, " (file)");          strcat(s, " (file)");
1256    #ifdef TLS
1257          if (socklist[i].ssl)
1258            strcat(s, " (TLS)");
1259    #endif
1260        if (socklist[i].flags & SOCK_TCL)        if (socklist[i].flags & SOCK_TCL)
1261          strcat(s, " (tcl)");          strcat(s, " (tcl)");
1262        if (!(socklist[i].flags & SOCK_TCL)) {        if (!(socklist[i].flags & SOCK_TCL)) {
# Line 1346  int flush_inbuf(int idx) Line 1420  int flush_inbuf(int idx)
1420    }    }
1421    return -1;    return -1;
1422  }  }
1423    
1424    /* Find sock in socklist.
1425     *
1426     * Returns index in socklist or -1 if not found.
1427     */
1428    int findsock(int sock)
1429    {
1430      int i;
1431      struct threaddata *td = threaddata();
1432    
1433      for (i = 0; i < td->MAXSOCKS; i++)
1434        if (td->socklist[i].sock == sock)
1435          break;
1436      if (i == td->MAXSOCKS)
1437        return -1;
1438      return i;
1439    }

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.5

webmaster@eggheads.org
ViewVC Help
Powered by ViewVC 1.1.23