0971d4769d4e78bbf0135f1ec07226a5273b2de7
[debian/amanda] / gnulib / regenerate / getaddrinfo-cygwin.patch
1 --- gnulib/getaddrinfo.c.orig   2007-10-25 16:46:34.728843739 -0500
2 +++ gnulib/getaddrinfo.c        2007-10-25 16:47:17.395395249 -0500
3 @@ -42,6 +42,8 @@
4  
5  #include "inet_ntop.h"
6  
7 +extern int h_errno;
8 +
9  /* BeOS has AF_INET, but not PF_INET.  */
10  #ifndef PF_INET
11  # define PF_INET AF_INET
12 @@ -149,25 +151,29 @@
13      return getaddrinfo_ptr (nodename, servname, hints, res);
14  #endif
15  
16 -  if (hints && (hints->ai_flags & ~(AI_CANONNAME|AI_PASSIVE)))
17 +  if (hints && (hints->ai_flags & ~(AI_CANONNAME | AI_PASSIVE)))
18      /* FIXME: Support more flags. */
19      return EAI_BADFLAGS;
20  
21    if (hints && !validate_family (hints->ai_family))
22      return EAI_FAMILY;
23  
24 -  if (hints &&
25 -      hints->ai_socktype != SOCK_STREAM && hints->ai_socktype != SOCK_DGRAM)
26 -    /* FIXME: Support other socktype. */
27 -    return EAI_SOCKTYPE; /* FIXME: Better return code? */
28 +  if ((hints != NULL) &&
29 +      (hints->ai_socktype != 0) &&
30 +      (hints->ai_socktype != SOCK_STREAM) &&
31 +      (hints->ai_socktype != SOCK_DGRAM))
32 +    {
33 +      /* FIXME: Support other socktype. */
34 +      return EAI_SOCKTYPE; /* FIXME: Better return code? */
35 +    }
36  
37    if (!nodename)
38      {
39 -      if (!(hints->ai_flags & AI_PASSIVE))
40 +      if (hints && !(hints->ai_flags & AI_PASSIVE))
41         return EAI_NONAME;
42  
43  #ifdef HAVE_IPV6
44 -      nodename = (hints->ai_family == AF_INET6) ? "::" : "0.0.0.0";
45 +      nodename = (hints && (hints->ai_family == AF_INET6)) ? "::" : "0.0.0.0";
46  #else
47        nodename = "0.0.0.0";
48  #endif
49 @@ -198,7 +204,7 @@
50      }
51  
52    /* FIXME: Use gethostbyname_r if available. */
53 -  he = gethostbyname (nodename);
54 +  he = gethostbyname(nodename);
55    if (!he || he->h_addr_list[0] == NULL)
56      return EAI_NONAME;
57  
58 @@ -279,7 +285,7 @@
59        return EAI_NODATA;
60      }
61  
62 -  if (hints && hints->ai_flags & AI_CANONNAME)
63 +  if (hints && (hints->ai_flags & AI_CANONNAME))
64      {
65        const char *cn;
66        if (he->h_name)
67 @@ -343,9 +349,7 @@
68  #endif
69  
70    /* FIXME: Support other flags. */
71 -  if ((node && nodelen > 0 && !(flags & NI_NUMERICHOST)) ||
72 -      (service && servicelen > 0 && !(flags & NI_NUMERICHOST)) ||
73 -      (flags & ~(NI_NUMERICHOST|NI_NUMERICSERV)))
74 +  if (flags & ~(NI_NUMERICHOST | NI_NUMERICSERV))
75      return EAI_BADFLAGS;
76  
77    if (sa == NULL || salen < sizeof (sa->sa_family))
78 @@ -369,34 +373,89 @@
79        return EAI_FAMILY;
80      }
81  
82 -  if (node && nodelen > 0 && flags & NI_NUMERICHOST)
83 +  if (node && (nodelen > 0))
84      {
85 +      char     addrbuf[256];
86 +
87        switch (sa->sa_family)
88         {
89  #if HAVE_IPV4
90         case AF_INET:
91 -         if (!inet_ntop (AF_INET,
92 +         if (flags & NI_NUMERICHOST)
93 +           {
94 +             if (!inet_ntop (AF_INET,
95                           &(((const struct sockaddr_in *) sa)->sin_addr),
96 -                         node, nodelen))
97 -           return EAI_SYSTEM;
98 +                         addrbuf, sizeof(addrbuf)))
99 +             return EAI_SYSTEM;
100 +           }
101 +         else
102 +           {
103 +             struct hostent *host_ent = gethostbyaddr(
104 +                         (char *)&(((struct sockaddr_in *)sa)->sin_addr),
105 +                         sizeof(struct sockaddr_in),
106 +                         sa->sa_family);
107 +             if (host_ent != NULL)
108 +               {
109 +                 if (nodelen <= snprintf(node, nodelen, "%s",
110 +                                       host_ent->h_name))
111 +                    return EAI_OVERFLOW;
112 +               }
113 +             else
114 +               {
115 +                 if (!inet_ntop (AF_INET,
116 +                         &(((const struct sockaddr_in *) sa)->sin_addr),
117 +                         addrbuf, sizeof(addrbuf)))
118 +                   { 
119 +                     return EAI_SYSTEM;
120 +                   }
121 +                   if (nodelen <= snprintf(node, nodelen, "%s", addrbuf))
122 +                     return EAI_OVERFLOW;
123 +               }
124 +           }
125           break;
126  #endif
127  
128  #if HAVE_IPV6
129         case AF_INET6:
130 -         if (!inet_ntop (AF_INET6,
131 +         if (flags & NI_NUMERICHOST)
132 +           {
133 +             if (!inet_ntop (AF_INET6,
134 +                         &(((const struct sockaddr_in6 *) sa)->sin6_addr),
135 +                         addrbuf, sizeof(addrbuf)))
136 +             return EAI_SYSTEM;
137 +           }
138 +         else
139 +           {
140 +             struct hostent *host_ent = gethostbyaddr(
141 +                         (char *)&(((struct sockaddr_in6 *)sa)->sin6_addr),
142 +                         sizeof(struct sockaddr_in6),
143 +                         sa->sa_family);
144 +             if (host_ent != NULL)
145 +               {
146 +                 if (nodelen <= snprintf(node, nodelen, "%s",
147 +                                       host_ent->h_name))
148 +                    return EAI_OVERFLOW;
149 +               }
150 +             else
151 +               {
152 +                 if (!inet_ntop (AF_INET6,
153                           &(((const struct sockaddr_in6 *) sa)->sin6_addr),
154 -                         node, nodelen))
155 -           return EAI_SYSTEM;
156 +                         addrbuf, sizeof(addrbuf)))
157 +                   { 
158 +                     return EAI_SYSTEM;
159 +                   }
160 +                   if (nodelen <= snprintf(node, nodelen, "%s", addrbuf))
161 +                     return EAI_OVERFLOW;
162 +               }
163 +           }
164           break;
165  #endif
166 -
167         default:
168           return EAI_FAMILY;
169         }
170      }
171  
172 -  if (service && servicelen > 0 && flags & NI_NUMERICSERV)
173 +  if (service && (servicelen > 0))
174      switch (sa->sa_family)
175        {
176  #if HAVE_IPV4