]> git.pld-linux.org Git - packages/glibc.git/blob - glibc-getxxxxinfo.patch
- inet_aton is broken, try ping 10.1.2.3.4
[packages/glibc.git] / glibc-getxxxxinfo.patch
1 ; From GLIBC pre 2.2.1 CVS Repository
2 ;
3 Index: inet/getnameinfo.c
4 ===================================================================
5 RCS file: /cvs/glibc/libc/inet/getnameinfo.c,v
6 retrieving revision 1.21
7 retrieving revision 1.23
8 diff -u -r1.21 -r1.23
9 --- libc/inet/getnameinfo.c     2000/10/28 00:29:47     1.21
10 +++ libc/inet/getnameinfo.c     2000/11/10 05:02:55     1.23
11 @@ -175,25 +175,28 @@
12    struct hostent th;
13    int ok = 0;
14  
15 +  if (flags & ~(NI_NUMERICHOST|NI_NUMERICSERV|NI_NOFQDN|NI_NAMEREQD|NI_DGRAM))
16 +    return EAI_BADFLAGS;
17 +
18    if (sa == NULL || addrlen < sizeof (sa_family_t))
19 -    return -1;
20 +    return EAI_FAMILY;
21  
22    switch (sa->sa_family)
23      {
24      case AF_LOCAL:
25        if (addrlen < (socklen_t) (((struct sockaddr_un *) NULL)->sun_path))
26 -       return -1;
27 +       return EAI_FAMILY;
28        break;
29      case AF_INET:
30        if (addrlen < sizeof (struct sockaddr_in))
31 -       return -1;
32 +       return EAI_FAMILY;
33        break;
34      case AF_INET6:
35        if (addrlen < sizeof (struct sockaddr_in6))
36 -       return -1;
37 +       return EAI_FAMILY;
38        break;
39      default:
40 -      return -1;
41 +      return EAI_FAMILY;
42      }
43  
44    if (host != NULL && hostlen > 0)
45 @@ -224,7 +227,7 @@
46                               {
47                                 __set_h_errno (herrno);
48                                 __set_errno (serrno);
49 -                               return -1;
50 +                               return EAI_SYSTEM;
51                               }
52                           }
53                         else
54 @@ -255,26 +258,23 @@
55  
56             if (h)
57               {
58 -               if (flags & NI_NOFQDN)
59 +               char *c;
60 +               if ((flags & NI_NOFQDN) == 0
61 +                   && (c = nrl_domainname ())
62 +                   && (c = strstr (h->h_name, c))
63 +                   && (c != h->h_name) && (*(--c) == '.'))
64 +                 {
65 +                   strncpy (host, h->h_name,
66 +                            min(hostlen, (size_t) (c - h->h_name)));
67 +                   host[min(hostlen - 1, (size_t) (c - h->h_name))]
68 +                     = '\0';
69 +                   ok = 1;
70 +                 }
71 +               else
72                   {
73 -                   char *c;
74 -                   if ((c = nrl_domainname ()) && (c = strstr(h->h_name, c))
75 -                       && (c != h->h_name) && (*(--c) == '.'))
76 -                     {
77 -                       strncpy (host, h->h_name,
78 -                                min(hostlen, (size_t) (c - h->h_name)));
79 -                       host[min(hostlen - 1, (size_t) (c - h->h_name))]
80 -                         = '\0';
81 -                       ok = 1;
82 -                     }
83 -                   else
84 -                     {
85 -                       strncpy (host, h->h_name, hostlen);
86 -                       ok = 1;
87 -                     }
88 +                   strncpy (host, h->h_name, hostlen);
89 +                   ok = 1;
90                   }
91 -               strncpy (host, h->h_name, hostlen);
92 -               ok = 1;
93               }
94           }
95  
96 @@ -283,7 +283,7 @@
97             if (flags & NI_NAMEREQD)
98               {
99                 __set_errno (serrno);
100 -               return -1;
101 +               return EAI_NONAME;
102               }
103             else
104               {
105 @@ -295,40 +295,43 @@
106  
107                     c = inet_ntop (AF_INET6,
108                                    (void *) &sin6p->sin6_addr, host, hostlen);
109 -                   if (addrlen > sizeof (struct sockaddr_in6)
110 -                       && (scopeid = sin6p->sin6_scope_id))
111 +                   scopeid = sin6p->sin6_scope_id;
112 +                   if (scopeid != 0)
113                       {
114                         /* Buffer is >= IFNAMSIZ+1.  */
115                         char scopebuf[IFNAMSIZ + 1];
116 +                       char *scopeptr;
117                         int ni_numericscope = 0;
118 +                       size_t real_hostlen = __strnlen (host, hostlen);
119 +                       size_t scopelen = 0;
120 +
121 +                       scopebuf[0] = SCOPE_DELIMITER;
122 +                       scopebuf[1] = '\0';
123 +                       scopeptr = &scopebuf[1];
124  
125                         if (IN6_IS_ADDR_LINKLOCAL (&sin6p->sin6_addr)
126                             || IN6_IS_ADDR_MC_LINKLOCAL (&sin6p->sin6_addr))
127                           {
128 -                           if (if_indextoname (scopeid, scopebuf) == NULL)
129 +                           if (if_indextoname (scopeid, scopeptr) == NULL)
130                               ++ni_numericscope;
131 +                           else
132 +                             scopelen = strlen (scopebuf);
133                           }
134                         else
135                           ++ni_numericscope;
136  
137                         if (ni_numericscope)
138 -                         {
139 -                           char *scopeptr = &scopebuf[1];
140 -                           size_t real_hostlen;
141 -                           size_t scopelen;
142 -
143 -                           scopebuf[0] = SCOPE_DELIMITER;
144 -                           scopelen = 1 + __snprintf (scopeptr,
145 -                                                      (scopebuf
146 -                                                       + sizeof scopebuf
147 -                                                       - scopeptr),
148 -                                                      "%u", scopeid);
149 -
150 -                           real_hostlen = __strnlen (host, hostlen);
151 -                           if (real_hostlen + scopelen + 1 > hostlen)
152 -                             return -1;
153 -                           memcpy (host + real_hostlen, scopebuf, scopelen);
154 -                         }
155 +                         scopelen = 1 + __snprintf (scopeptr,
156 +                                                    (scopebuf
157 +                                                     + sizeof scopebuf
158 +                                                     - scopeptr),
159 +                                                    "%u", scopeid);
160 +
161 +                       if (real_hostlen + scopelen + 1 > hostlen)
162 +                         /* XXX We should not fail here.  Simply enlarge
163 +                            the buffer or return with out of memory.  */
164 +                         return EAI_SYSTEM;
165 +                       memcpy (host + real_hostlen, scopebuf, scopelen + 1);
166                       }
167                   }
168                 else
169 @@ -338,7 +341,7 @@
170                 if (c == NULL)
171                   {
172                     __set_errno (serrno);
173 -                   return -1;
174 +                   return EAI_SYSTEM;
175                   }
176               }
177             ok = 1;
178 @@ -360,14 +363,14 @@
179         if (flags & NI_NAMEREQD)
180            {
181             __set_errno (serrno);
182 -           return -1;
183 +           return EAI_NONAME;
184           }
185  
186         strncpy (host, "localhost", hostlen);
187         break;
188  
189        default:
190 -        return -1;
191 +        return EAI_FAMILY;
192      }
193  
194    if (serv && (servlen > 0))
195 @@ -392,7 +395,7 @@
196                     else
197                       {
198                         __set_errno (serrno);
199 -                       return -1;
200 +                       return EAI_SYSTEM;
201                       }
202                   }
203                 else
204 Index: getaddrinfo.c
205 ===================================================================
206 RCS file: /cvs/glibc/libc/sysdeps/posix/getaddrinfo.c,v
207 retrieving revision 1.32
208 retrieving revision 1.34
209 diff -u -r1.32 -r1.34
210 --- libc/sysdeps/posix/getaddrinfo.c    2000/09/29 05:27:20     1.32
211 +++ libc/sysdeps/posix/getaddrinfo.c    2000/11/18 08:30:02     1.34
212 @@ -99,13 +99,14 @@
213  
214  /* Values for `protoflag'.  */
215  #define GAI_PROTO_NOSERVICE    1
216 +#define GAI_PROTO_PROTOANY     2
217  
218  static struct gaih_typeproto gaih_inet_typeproto[] =
219  {
220    { 0, 0, NULL, 0 },
221    { SOCK_STREAM, IPPROTO_TCP, (char *) "tcp", 0 },
222    { SOCK_DGRAM, IPPROTO_UDP, (char *) "udp", 0 },
223 -  { SOCK_RAW, IPPROTO_RAW, (char *) "raw", GAI_PROTO_NOSERVICE },
224 +  { SOCK_RAW, 0, (char *) "raw", GAI_PROTO_PROTOANY|GAI_PROTO_NOSERVICE },
225    { 0, 0, NULL, 0 }
226  };
227  
228 @@ -150,6 +151,7 @@
229              && ((tp->protoflag & GAI_PROTO_NOSERVICE) != 0
230                  || (req->ai_socktype != 0 && req->ai_socktype != tp->socktype)
231                  || (req->ai_protocol != 0
232 +                    && !(tp->protoflag & GAI_PROTO_PROTOANY)
233                      && req->ai_protocol != tp->protocol)))
234         ++tp;
235  
236 @@ -229,7 +231,7 @@
237  
238  static int
239  gaih_inet_serv (const char *servicename, struct gaih_typeproto *tp,
240 -              struct gaih_servtuple *st)
241 +              const struct addrinfo *req, struct gaih_servtuple *st)
242  {
243    struct servent *s;
244    size_t tmpbuflen = 1024;
245 @@ -255,7 +257,8 @@
246  
247    st->next = NULL;
248    st->socktype = tp->socktype;
249 -  st->protocol = tp->protocol;
250 +  st->protocol = ((tp->protoflag & GAI_PROTO_PROTOANY)
251 +                 ? req->ai_protocol : tp->protocol);
252    st->port = s->s_port;
253  
254    return 0;
255 @@ -268,6 +271,7 @@
256    struct hostent th;                                           \
257    char *tmpbuf;                                                        \
258    tmpbuflen = 512;                                             \
259 +  no_data = 0;                                                 \
260    do {                                                         \
261      tmpbuflen *= 2;                                            \
262      tmpbuf = __alloca (tmpbuflen);                             \
263 @@ -282,17 +286,18 @@
264           return -EAI_SYSTEM;                                   \
265         }                                                       \
266        if (herrno == TRY_AGAIN)                                 \
267 -       {                                                       \
268 -         __set_h_errno (herrno);                               \
269 -         return -EAI_AGAIN;                                    \
270 -       }                                                       \
271 +       no_data = EAI_AGAIN;                                    \
272 +      else                                                     \
273 +       no_data = herrno == NO_DATA;                            \
274      }                                                          \
275 -  if (h != NULL)                                               \
276 +  else if (h != NULL)                                          \
277      {                                                          \
278        for (i = 0; h->h_addr_list[i]; i++)                      \
279         {                                                       \
280 -         if (*pat == NULL)                                     \
281 +         if (*pat == NULL) {                                   \
282             *pat = __alloca (sizeof(struct gaih_addrtuple));    \
283 +           (*pat)->scopeid = 0;                                \
284 +         }                                                     \
285           (*pat)->next = NULL;                                  \
286           (*pat)->family = _family;                             \
287           memcpy ((*pat)->addr, h->h_addr_list[i],              \
288 @@ -300,7 +305,6 @@
289           pat = &((*pat)->next);                                \
290         }                                                       \
291      }                                                          \
292 -  no_data = rc != 0 && herrno == NO_DATA;                      \
293   }
294  
295  static int
296 @@ -319,6 +323,7 @@
297        while (tp->name != NULL
298              && ((req->ai_socktype != 0 && req->ai_socktype != tp->socktype)
299                  || (req->ai_protocol != 0
300 +                    && !(tp->protoflag & GAI_PROTO_PROTOANY)
301                      && req->ai_protocol != tp->protocol)))
302         ++tp;
303  
304 @@ -343,7 +348,7 @@
305               st = (struct gaih_servtuple *)
306                 __alloca (sizeof (struct gaih_servtuple));
307  
308 -             if ((rc = gaih_inet_serv (service->name, tp, st)))
309 +             if ((rc = gaih_inet_serv (service->name, tp, req, st)))
310                 return rc;
311             }
312           else
313 @@ -359,11 +364,15 @@
314                   if (req->ai_socktype != 0
315                       && req->ai_socktype != tp->socktype)
316                     continue;
317 +                 if (req->ai_protocol != 0
318 +                     && !(tp->protoflag & GAI_PROTO_PROTOANY)
319 +                     && req->ai_protocol != tp->protocol)
320 +                   continue;
321  
322                   newp = (struct gaih_servtuple *)
323                     __alloca (sizeof (struct gaih_servtuple));
324  
325 -                 if ((rc = gaih_inet_serv (service->name, tp, newp)))
326 +                 if ((rc = gaih_inet_serv (service->name, tp, req, newp)))
327                     {
328                       if (rc & GAIH_OKIFUNSPEC)
329                         continue;
330 @@ -382,7 +391,8 @@
331           st = __alloca (sizeof (struct gaih_servtuple));
332           st->next = NULL;
333           st->socktype = tp->socktype;
334 -         st->protocol = tp->protocol;
335 +         st->protocol = ((tp->protoflag & GAI_PROTO_PROTOANY)
336 +                         ? req->ai_protocol : tp->protocol);
337           st->port = htons (service->num);
338         }
339      }
340 @@ -390,8 +400,9 @@
341      {
342        st = __alloca (sizeof (struct gaih_servtuple));
343        st->next = NULL;
344 -      st->socktype = req->ai_socktype;
345 -      st->protocol = req->ai_protocol;
346 +      st->socktype = tp->socktype;
347 +      st->protocol = ((tp->protoflag & GAI_PROTO_PROTOANY)
348 +                     ? req->ai_protocol : tp->protocol);
349        st->port = 0;
350      }
351    else
352 @@ -498,9 +509,15 @@
353             gethosts (AF_INET, struct in_addr);
354  
355           if (no_data != 0 && no_inet6_data != 0)
356 -           /* We made requests but they turned out no data.  The name
357 -              is known, though.  */
358 -           return (GAIH_OKIFUNSPEC | -EAI_NODATA);
359 +           {
360 +             /* If both requests timed out report this.  */
361 +             if (no_data == EAI_AGAIN && no_inet6_data == EAI_AGAIN)
362 +               return -EAI_AGAIN;
363 +
364 +             /* We made requests but they turned out no data.  The name
365 +                is known, though.  */
366 +             return (GAIH_OKIFUNSPEC | -EAI_NODATA);
367 +           }
368         }
369  
370        if (at->family == AF_UNSPEC)
371 @@ -542,6 +559,7 @@
372      struct gaih_servtuple *st2;
373      struct gaih_addrtuple *at2 = at;
374      size_t socklen, namelen;
375 +    sa_family_t family;
376  
377      /*
378        buffer is the size of an unformatted IPv6 address in printable format.
379 @@ -597,9 +615,15 @@
380           namelen = 0;
381  
382         if (at2->family == AF_INET6)
383 -         socklen = sizeof (struct sockaddr_in6);
384 +         {
385 +           family = AF_INET6;
386 +           socklen = sizeof (struct sockaddr_in6);
387 +         }
388         else
389 -         socklen = sizeof (struct sockaddr_in);
390 +         {
391 +           family = AF_INET;
392 +           socklen = sizeof (struct sockaddr_in);
393 +         }
394  
395         for (st2 = st; st2 != NULL; st2 = st2->next)
396           {
397 @@ -608,7 +632,7 @@
398               return -EAI_MEMORY;
399  
400             (*pai)->ai_flags = req->ai_flags;
401 -           (*pai)->ai_family = at2->family;
402 +           (*pai)->ai_family = family;
403             (*pai)->ai_socktype = st2->socktype;
404             (*pai)->ai_protocol = st2->protocol;
405             (*pai)->ai_addrlen = socklen;
406 @@ -616,9 +640,9 @@
407  #if SALEN
408             (*pai)->ai_addr->sa_len = socklen;
409  #endif /* SALEN */
410 -           (*pai)->ai_addr->sa_family = at2->family;
411 +           (*pai)->ai_addr->sa_family = family;
412  
413 -           if (at2->family == AF_INET6)
414 +           if (family == AF_INET6)
415               {
416                 struct sockaddr_in6 *sin6p =
417                   (struct sockaddr_in6 *) (*pai)->ai_addr;
418 @@ -703,7 +727,7 @@
419        else
420         /* Can't specify a numerical socket unless a protocol family was
421            given. */
422 -        if (hints->ai_socktype == 0)
423 +        if (hints->ai_socktype == 0 && hints->ai_protocol == 0)
424            return EAI_SERVICE;
425        pservice = &gaih_service;
426      }
427
This page took 0.10795 seconds and 3 git commands to generate.