Imported Upstream version 2.5.2p1
[debian/amanda] / gnulib / regenerate / getaddrinfo-cygwin.patch
1 --- gnulib/getaddrinfo.c        2007-03-06 13:17:25.733225500 -0600
2 +++ gnulib/getaddrinfo.c        2007-03-06 13:17:32.345638750 -0600
3 @@ -40,6 +40,8 @@
4  #include "inet_ntop.h"
5  #include "snprintf.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 @@ -147,25 +149,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 @@ -175,11 +181,13 @@
50      {
51        struct servent *se = NULL;
52        const char *proto =
53 -       (hints && hints->ai_socktype == SOCK_DGRAM) ? "udp" : "tcp";
54 +       (hints && (hints->ai_socktype == SOCK_DGRAM)) ? "udp" : "tcp";
55  
56 -      if (!(hints->ai_flags & AI_NUMERICSERV))
57 -       /* FIXME: Use getservbyname_r if available. */
58 -       se = getservbyname (servname, proto);
59 +      if ((hints == NULL) || !(hints->ai_flags & AI_NUMERICSERV))
60 +        {
61 +         /* FIXME: Use getservbyname_r if available. */
62 +         se = getservbyname (servname, proto);
63 +        }
64  
65        if (!se)
66         {
67 @@ -196,7 +204,7 @@
68      }
69  
70    /* FIXME: Use gethostbyname_r if available. */
71 -  he = gethostbyname (nodename);
72 +  he = gethostbyname(nodename);
73    if (!he || he->h_addr_list[0] == NULL)
74      return EAI_NONAME;
75  
76 @@ -277,7 +285,7 @@
77        return EAI_NODATA;
78      }
79  
80 -  if (hints && hints->ai_flags & AI_CANONNAME)
81 +  if (hints && (hints->ai_flags & AI_CANONNAME))
82      {
83        const char *cn;
84        if (he->h_name)
85 @@ -341,9 +349,7 @@
86  #endif
87  
88    /* FIXME: Support other flags. */
89 -  if ((node && nodelen > 0 && !(flags & NI_NUMERICHOST)) ||
90 -      (service && servicelen > 0 && !(flags & NI_NUMERICHOST)) ||
91 -      (flags & ~(NI_NUMERICHOST|NI_NUMERICSERV)))
92 +  if (flags & ~(NI_NUMERICHOST | NI_NUMERICSERV))
93      return EAI_BADFLAGS;
94  
95    if (sa == NULL || salen < sizeof (sa->sa_family))
96 @@ -367,34 +373,89 @@
97        return EAI_FAMILY;
98      }
99  
100 -  if (node && nodelen > 0 && flags & NI_NUMERICHOST)
101 +  if (node && (nodelen > 0))
102      {
103 +      char     addrbuf[256];
104 +
105        switch (sa->sa_family)
106         {
107  #if HAVE_IPV4
108         case AF_INET:
109 -         if (!inet_ntop (AF_INET,
110 +         if (flags & NI_NUMERICHOST)
111 +           {
112 +             if (!inet_ntop (AF_INET,
113                           &(((const struct sockaddr_in *) sa)->sin_addr),
114 -                         node, nodelen))
115 -           return EAI_SYSTEM;
116 +                         addrbuf, sizeof(addrbuf)))
117 +             return EAI_SYSTEM;
118 +           }
119 +         else
120 +           {
121 +             struct hostent *host_ent = gethostbyaddr(
122 +                         (char *)&(((struct sockaddr_in *)sa)->sin_addr),
123 +                         sizeof(struct sockaddr_in),
124 +                         sa->sa_family);
125 +             if (host_ent != NULL)
126 +               {
127 +                 if (nodelen <= snprintf(node, nodelen, "%s",
128 +                                       host_ent->h_name))
129 +                    return EAI_OVERFLOW;
130 +               }
131 +             else
132 +               {
133 +                 if (!inet_ntop (AF_INET,
134 +                         &(((const struct sockaddr_in *) sa)->sin_addr),
135 +                         addrbuf, sizeof(addrbuf)))
136 +                   { 
137 +                     return EAI_SYSTEM;
138 +                   }
139 +                   if (nodelen <= snprintf(node, nodelen, "%s", addrbuf))
140 +                     return EAI_OVERFLOW;
141 +               }
142 +           }
143           break;
144  #endif
145  
146  #if HAVE_IPV6
147         case AF_INET6:
148 -         if (!inet_ntop (AF_INET6,
149 +         if (flags & NI_NUMERICHOST)
150 +           {
151 +             if (!inet_ntop (AF_INET6,
152 +                         &(((const struct sockaddr_in6 *) sa)->sin6_addr),
153 +                         addrbuf, sizeof(addrbuf)))
154 +             return EAI_SYSTEM;
155 +           }
156 +         else
157 +           {
158 +             struct hostent *host_ent = gethostbyaddr(
159 +                         (char *)&(((struct sockaddr_in6 *)sa)->sin6_addr),
160 +                         sizeof(struct sockaddr_in6),
161 +                         sa->sa_family);
162 +             if (host_ent != NULL)
163 +               {
164 +                 if (nodelen <= snprintf(node, nodelen, "%s",
165 +                                       host_ent->h_name))
166 +                    return EAI_OVERFLOW;
167 +               }
168 +             else
169 +               {
170 +                 if (!inet_ntop (AF_INET6,
171                           &(((const struct sockaddr_in6 *) sa)->sin6_addr),
172 -                         node, nodelen))
173 -           return EAI_SYSTEM;
174 +                         addrbuf, sizeof(addrbuf)))
175 +                   { 
176 +                     return EAI_SYSTEM;
177 +                   }
178 +                   if (nodelen <= snprintf(node, nodelen, "%s", addrbuf))
179 +                     return EAI_OVERFLOW;
180 +               }
181 +           }
182           break;
183  #endif
184 -
185         default:
186           return EAI_FAMILY;
187         }
188      }
189  
190 -  if (service && servicelen > 0 && flags & NI_NUMERICSERV)
191 +  if (service && (servicelen > 0))
192      switch (sa->sa_family)
193        {
194  #if HAVE_IPV4