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