日期:2014-05-16  浏览次数:20919 次

在linux2.6内核中为什么找不到地址转换函数inet_pton的实现?在很多FreeBSD的内核中却能够找到?
在linux2.6内核中为什么找不到inet_pton的实现?在很多FreeBSD的内核中却能够找到?
真的很疑惑,不知道这个inet_pton到底是在linux2.6内核的什么地方呢?不可能找不到的呀?FreeBSD的很多内核里却能找到。实现如下:
C/C++ code

#if defined(LIBC_SCCS) && !defined(lint)
   19 static const char rcsid[] = "$Id: inet_pton.c,v 1.3.18.2 2005/07/28 07:38:07 marka Exp $";
   20 #endif /* LIBC_SCCS and not lint */
   21 #include <sys/cdefs.h>
   22 __FBSDID("$FreeBSD: head/sys/libkern/inet_pton.c 213103 2010-09-24 15:01:45Z attilio $");
   23 
   24 #include <sys/param.h>
   25 #include <sys/socket.h>
   26 #include <sys/systm.h>
   27 
   28 #include <netinet/in.h>
   29 
   30 #if __FreeBSD_version < 700000
   31 #define strchr index
   32 #endif
   33 
   34 /*%
   35  * WARNING: Don't even consider trying to compile this on a system where
   36  * sizeof(int) < 4.  sizeof(int) > 4 is fine; all the world's not a VAX.
   37  */
   38 
   39 static int      inet_pton4(const char *src, u_char *dst);
   40 static int      inet_pton6(const char *src, u_char *dst);
   41 
   42 /* int
   43  * inet_pton(af, src, dst)
   44  *      convert from presentation format (which usually means ASCII printable)
   45  *      to network format (which is usually some kind of binary format).
   46  * return:
   47  *      1 if the address was valid for the specified address family
   48  *      0 if the address wasn't valid (`dst' is untouched in this case)
   49  *      -1 if some other error occurred (`dst' is untouched in this case, too)
   50  * author:
   51  *      Paul Vixie, 1996.
   52  */
   53 int
   54 inet_pton(int af, const char *src, void *dst)
   55 {
   56         switch (af) {
   57         case AF_INET:
   58                 return (inet_pton4(src, dst));
   59         case AF_INET6:
   60                 return (inet_pton6(src, dst));
   61         default:
   62                 return (-1);
   63         }
   64         /* NOTREACHED */
   65 }
   66 
   67 /* int
   68  * inet_pton4(src, dst)
   69  *      like inet_aton() but without all the hexadecimal and shorthand.
   70  * return:
   71  *      1 if `src' is a valid dotted quad, else 0.
   72  * notice:
   73  *      does not touch `dst' unless it's returning 1.
   74  * author:
   75  *      Paul Vixie, 1996.
   76  */
   77 static int
   78 inet_pton4(const char *src, u_char *dst)
   79 {
   80         static const char digits[] = "0123456789";
   81         int saw_digit, octets, ch;
   82 #define NS_INADDRSZ     4
   83         u_char tmp[NS_INADDRSZ], *tp;
   84 
   85         saw_digit = 0;
   86         octets = 0;
   87         *(tp = tmp) = 0;
   88         while ((ch = *src++) != '\0') {
   89                 const char *pch;
   90 
   91                 if ((pch = strchr(digits, ch)) != NULL) {
   92                         u_int new = *tp * 10 + (pch - digits);
   93 
   94                         if (saw_digit && *tp == 0)
   95                                 return (0);
   96                         if (new > 255)
   97                                 return (0);
   98                         *tp = new;
   99                         if (!saw_digit) {
  100                                 if (++octets > 4)
  101                                         return (0);
  102                                 saw_digit = 1;
  103                         }
  104                 } else if (ch == '.' && saw_digit) {
  105                         if (octets == 4)
  106                                 return (0);
  107                         *++tp = 0;
  108                         saw_digit = 0;
  109                 } else
  110                         return (0);
  111         }
  112         if (octets < 4)
  113                 return (0);
  114         memcpy(d