ipv6-connect.c
上传用户:xxcykj
上传日期:2007-01-04
资源大小:727k
文件大小:2k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. /*
  2. %%% copyright-cmetz-97
  3. This software is Copyright 1997-1998 by Craig Metz, All Rights Reserved.
  4. The Inner Net License Version 2 applies to this software.
  5. You should have received a copy of the license with this software. If
  6. you didn't get a copy, you may request one from <license@inner.net>.
  7. */
  8. #include <sys/types.h>
  9. #include <stdio.h>
  10. #include <sys/socket.h>
  11. #include <netinet/in.h>
  12. #include <errno.h>
  13. #include <netdb.h>
  14. #include <signal.h>
  15. #include "config.h"
  16. #ifndef SA_LEN
  17. #define SA_LEN(sa) ((sa)->sa_len)
  18. #endif
  19. #ifdef INET6_ENABLE
  20. static int default_trying_callback(struct sockaddr *sa)
  21. {
  22.   char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
  23.   if (getnameinfo(sa, SA_LEN(sa), hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV)) {
  24.     fprintf(stderr, "inner_getstream: getnameinfo failedn");
  25.     return -1;
  26.   };
  27.   fprintf(stderr, "Trying %s.%s...n", hbuf, sbuf);
  28.   return 0;
  29. };
  30. static int default_error_callback(char *myname, char *message)
  31. {
  32.   fprintf(stderr, "%s: %sn", myname, message);
  33.   return 0;
  34. };
  35. int inner_connect(struct addrinfo *ai, void *request, int requestlen, int (*trying_callback)(struct sockaddr *sa), int (*error_callback)(char *myname, char *message), char *myname, struct addrinfo **pai)
  36. {
  37.   int fd;
  38.   char errorbuf[128];
  39.   if (!trying_callback)
  40.     trying_callback = default_trying_callback;
  41.   if (!error_callback)
  42.     error_callback = default_error_callback;
  43.   for (; ai; ai = ai->ai_next) {
  44.     if (trying_callback(ai->ai_addr))
  45.       continue;
  46.     if ((fd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {
  47.       snprintf(errorbuf, sizeof(errorbuf), "socket: %s(%d)", strerror(errno), errno);
  48.       error_callback(myname, errorbuf);
  49.       continue;
  50.     };
  51.     if (connect(fd, ai->ai_addr, ai->ai_addrlen) < 0) {
  52.       snprintf(errorbuf, sizeof(errorbuf), "connect: %s(%d)", strerror(errno), errno);
  53.       error_callback(myname, errorbuf);
  54.       close(fd); /* just after a connect; no reads or writes yet */
  55.       continue;
  56.     }
  57.     break;
  58.   };
  59.   if (ai) {
  60.     if (pai)
  61.       *pai = ai;
  62.   } else {
  63.     snprintf(errorbuf, sizeof(errorbuf), "no connections result");
  64.     error_callback(myname, errorbuf);
  65.     fd = -1;
  66.   };
  67.   return fd;
  68. };
  69. #endif /* INET6_ENABLE */