shishi-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

CVS shishi/gl


From: shishi-commit
Subject: CVS shishi/gl
Date: Tue, 09 Nov 2004 19:18:50 +0100

Update of /home/cvs/shishi/gl
In directory dopio:/tmp/cvs-serv4285/gl

Modified Files:
        Makefile.am 
Added Files:
        gai_strerror.c getaddrinfo.c getaddrinfo.h 
Log Message:
Add getaddrinfo.

--- /home/cvs/shishi/gl/Makefile.am     2004/11/08 14:50:17     1.48
+++ /home/cvs/shishi/gl/Makefile.am     2004/11/09 18:18:50     1.49
@@ -9,7 +9,7 @@
 #
 # Generated by gnulib-tool.
 # Invoked as: gnulib-tool --import
-# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=gl 
--m4-base=gl/m4 --libtool  alloca alloca-opt allocsa error extensions getdate 
getdomainname gethostname getline getopt getpass getsubopt gettext gettime 
gettimeofday mktime progname readlink realloc restrict setenv stdbool strcase 
strchrnul strdup strndup strnlen timegm time_r timespec vasnprintf vasprintf 
xalloc xgetdomainname xgethostname xreadlink xsize xstrndup
+# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=gl 
--m4-base=gl/m4 --libtool  alloca alloca-opt allocsa error extensions 
getaddrinfo getdate getdomainname gethostname getline getopt getpass getsubopt 
gettext gettime gettimeofday mktime progname readlink realloc restrict setenv 
stdbool strcase strchrnul strdup strndup strnlen timegm time_r timespec 
vasnprintf vasprintf xalloc xgetdomainname xgethostname xreadlink xsize xstrndup
 
 AUTOMAKE_OPTIONS = 1.5 gnits no-dependencies
 
@@ -63,6 +63,12 @@
 
 ## end   gnulib module allocsa
 
+## begin gnulib module getaddrinfo
+
+libgnu_la_SOURCES += getaddrinfo.h
+
+## end   gnulib module getaddrinfo
+
 ## begin gnulib module getdate
 
 libgnu_la_SOURCES += getdate.h getdate.y

--- /home/cvs/shishi/gl/gai_strerror.c  2004/11/09 18:18:50     NONE
+++ /home/cvs/shishi/gl/gai_strerror.c  2004/11/09 18:18:50     1.1
/* Copyright (C) 1997, 2001, 2002, 2004 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Philip Blundell <address@hidden>, 1997.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */

#include <stdio.h>
#include <netdb.h>

#ifdef _LIBC
# include <libintl.h>
#else
# include "getaddrinfo.h"
# include "gettext.h"
# define _(String) gettext (String)
# define N_(String) String
#endif

static struct
  {
    int code;
    const char *msg;
  }
values[] =
  {
    { EAI_ADDRFAMILY, N_("Address family for hostname not supported") },
    { EAI_AGAIN, N_("Temporary failure in name resolution") },
    { EAI_BADFLAGS, N_("Bad value for ai_flags") },
    { EAI_FAIL, N_("Non-recoverable failure in name resolution") },
    { EAI_FAMILY, N_("ai_family not supported") },
    { EAI_MEMORY, N_("Memory allocation failure") },
    { EAI_NODATA, N_("No address associated with hostname") },
    { EAI_NONAME, N_("Name or service not known") },
    { EAI_SERVICE, N_("Servname not supported for ai_socktype") },
    { EAI_SOCKTYPE, N_("ai_socktype not supported") },
    { EAI_SYSTEM, N_("System error") },
#ifdef __USE_GNU
    { EAI_INPROGRESS, N_("Processing request in progress") },
    { EAI_CANCELED, N_("Request canceled") },
    { EAI_NOTCANCELED, N_("Request not canceled") },
    { EAI_ALLDONE, N_("All requests done") },
    { EAI_INTR, N_("Interrupted by a signal") },
    { EAI_IDN_ENCODE, N_("Parameter string not correctly encoded") }
#endif
  };

const char *
gai_strerror (int code)
{
  size_t i;
  for (i = 0; i < sizeof (values) / sizeof (values[0]); ++i)
    if (values[i].code == code)
      return _(values[i].msg);

  return _("Unknown error");
}
#ifdef _LIBC
libc_hidden_def (gai_strerror)
#endif
--- /home/cvs/shishi/gl/getaddrinfo.c   2004/11/09 18:18:50     NONE
+++ /home/cvs/shishi/gl/getaddrinfo.c   2004/11/09 18:18:50     1.1
/* Get address information (partial implementation).
   Copyright (C) 1997, 2001, 2002, 2004 Free Software Foundation, Inc.
   Contributed by Simon Josefsson <address@hidden>.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software Foundation,
   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

#if HAVE_CONFIG_H
# include <config.h>
#endif

/* Get calloc. */
#include <stdlib.h>

/* Get memcpy. */
#include <string.h>

#include "gettext.h"
#define _(String) gettext (String)
#define N_(String) String

/* Get struct hostent. */
#include <netdb.h>

#include "getaddrinfo.h"

/* Translate name of a service location and/or a service name to set of
   socket addresses. */
int
getaddrinfo (const char *restrict nodename,
             const char *restrict servname,
             const struct addrinfo *restrict hints,
             struct addrinfo **restrict res)
{
  struct addrinfo *tmp;
  struct servent *se;
  struct hostent *he;
  size_t sinlen;

  if (hints && hints->ai_flags)
    /* FIXME: Support more flags. */
    return EAI_BADFLAGS;

  if (hints
#if HAVE_IPV4
      && hints->ai_family != PF_INET
#endif
#if HAVE_IPV6
      && hints->ai_family != PF_INET6
#endif
      && hints->ai_family != PF_UNSPEC)
    /* FIXME: Support more families. */
    return EAI_FAMILY;

  if (hints && hints->ai_socktype)
    /* FIXME: Support more socket types. */
    return EAI_SOCKTYPE;

  if (hints &&
      hints->ai_protocol != SOCK_STREAM && hints->ai_protocol != SOCK_DGRAM)
    /* FIXME: Support other protocols. */
    return EAI_SERVICE;         /* FIXME: Better return code? */

  if (!nodename)
    /* FIXME: Support server bind mode. */
    return EAI_NONAME;

  if (servname)
    {
      const char *proto =
        (hints && hints->ai_protocol == SOCK_DGRAM) ? "udp" : "tcp";

      /* FIXME: Use getservbyname_r if available. */
      se = getservbyname (servname, proto);

      if (!se)
        return EAI_SERVICE;
    }

  /* FIXME: Use gethostbyname_r if available. */
  he = gethostbyname (nodename);
  if (!he || he->h_addr_list[0] == NULL)
    return EAI_NONAME;

  switch (he->h_addrtype)
    {
#if HAVE_IPV6
    case PF_INET6:
      sinlen = sizeof (struct sockaddr_in6);
      break;
#endif

#if HAVE_IPV4
    case PF_INET:
      sinlen = sizeof (struct sockaddr_in);
      break;
#endif

    default:
      return EAI_NODATA;
    }

  tmp = calloc (1, sizeof (*tmp) + sinlen);
  if (!tmp)
    return EAI_MEMORY;

  switch (he->h_addrtype)
    {
#if HAVE_IPV6
    case PF_INET6:
      {
        struct sockaddr_in6 *sinp = (void *) tmp + sizeof (*tmp);

        if (se)
          sinp->sin6_port = se->s_port;

        if (he->h_length != sizeof (sinp->sin6_addr))
          return EAI_SYSTEM; /* FIXME: Better return code?  Set errno? */

        memcpy (&sinp->sin6_addr, he->h_addr_list[0], he->h_length);

        tmp->ai_addr = (struct sockaddr *) sinp;
        tmp->ai_addrlen = sinlen;
      }
      break;
#endif

#if HAVE_IPV4
    case PF_INET:
      {
        struct sockaddr_in *sinp = (void *) tmp + sizeof (*tmp);

        if (se)
          sinp->sin_port = se->s_port;

        if (he->h_length != sizeof (sinp->sin_addr))
          return EAI_SYSTEM; /* FIXME: Better return code?  Set errno? */

        memcpy (&sinp->sin_addr, he->h_addr_list[0], he->h_length);

        tmp->ai_addr = (struct sockaddr *) sinp;
        tmp->ai_addrlen = sinlen;
      }
      break;
#endif

    default:
      free (tmp);
      return EAI_NODATA;
    }

  tmp->ai_addr->sa_family = he->h_addrtype;

  /* FIXME: If more than one address, create linked list of addrinfo's. */

  *res = tmp;

  return 0;
}

/* Free `addrinfo' structure AI including associated storage.  */
void
freeaddrinfo (struct addrinfo *ai)
{
  while (ai)
    {
      struct addrinfo *cur;

      cur = ai;
      ai = ai->ai_next;
      free (cur);
    }
}
--- /home/cvs/shishi/gl/getaddrinfo.h   2004/11/09 18:18:50     NONE
+++ /home/cvs/shishi/gl/getaddrinfo.h   2004/11/09 18:18:50     1.1
/* Get address information.
   Copyright (C) 1996-2002, 2003, 2004 Free Software Foundation, Inc.
   Contributed by Simon Josefsson <address@hidden>.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software Foundation,
   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

#ifndef GETADDRINFO_H
# define GETADDRINFO_H

/* Get getaddrinfo declarations, if available. */
# include <sys/socket.h>
# include <netdb.h>

# if defined HAVE_GETADDRINFO && !HAVE_GETADDRINFO

/* Get socklen_t, struct sockaddr. */
#  include <sys/types.h>

/* Structure to contain information about address of a service provider.  */
struct addrinfo
{
  int ai_flags;                 /* Input flags.  */
  int ai_family;                /* Protocol family for socket.  */
  int ai_socktype;              /* Socket type.  */
  int ai_protocol;              /* Protocol for socket.  */
  socklen_t ai_addrlen;         /* Length of socket address.  */
  struct sockaddr *ai_addr;     /* Socket address for socket.  */
  char *ai_canonname;           /* Canonical name for service location.  */
  struct addrinfo *ai_next;     /* Pointer to next in list.  */
};

/* Possible values for `ai_flags' field in `addrinfo' structure.  */
# define AI_PASSIVE     0x0001  /* Socket address is intended for `bind'.  */
# define AI_CANONNAME   0x0002  /* Request for canonical name.  */
# define AI_NUMERICHOST 0x0004  /* Don't use name resolution.  */
# define AI_V4MAPPED    0x0008  /* IPv4 mapped addresses are acceptable.  */
# define AI_ALL         0x0010  /* Return IPv4 mapped and IPv6 addresses.  */
# define AI_ADDRCONFIG  0x0020  /* Use configuration of this host to choose
                                   returned address type..  */

/* Error values for `getaddrinfo' function.  */
# define EAI_BADFLAGS     -1    /* Invalid value for `ai_flags' field.  */
# define EAI_NONAME       -2    /* NAME or SERVICE is unknown.  */
# define EAI_AGAIN        -3    /* Temporary failure in name resolution.  */
# define EAI_FAIL         -4    /* Non-recoverable failure in name res.  */
# define EAI_NODATA       -5    /* No address associated with NAME.  */
# define EAI_FAMILY       -6    /* `ai_family' not supported.  */
# define EAI_SOCKTYPE     -7    /* `ai_socktype' not supported.  */
# define EAI_SERVICE      -8    /* SERVICE not supported for `ai_socktype'.  */
# define EAI_ADDRFAMILY   -9    /* Address family for NAME not supported.  */
# define EAI_MEMORY       -10   /* Memory allocation failure.  */
# define EAI_SYSTEM       -11   /* System error returned in `errno'.  */
# define EAI_OVERFLOW     -12   /* Argument buffer overflow.  */
# ifdef __USE_GNU
#  define EAI_INPROGRESS  -100  /* Processing request in progress.  */
#  define EAI_CANCELED    -101  /* Request canceled.  */
#  define EAI_NOTCANCELED -102  /* Request not canceled.  */
#  define EAI_ALLDONE     -103  /* All requests done.  */
#  define EAI_INTR        -104  /* Interrupted by a signal.  */
#  define EAI_IDN_ENCODE  -105  /* IDN encoding failed.  */
# endif

/* Translate name of a service location and/or a service name to set of
   socket addresses.  */
extern int getaddrinfo (const char *restrict nodename,
                        const char *restrict servname,
                        const struct addrinfo *restrict hints,
                        struct addrinfo **restrict res);

/* Free `addrinfo' structure AI including associated storage.  */
extern void freeaddrinfo (struct addrinfo *ai);

/* Convert error return from getaddrinfo() to a string.  */
extern const char *gai_strerror (int ecode);

# endif

#endif /* GETADDRINFO_H */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]