diff options
Diffstat (limited to 'inet')
-rw-r--r-- | inet/Makefile | 5 | ||||
-rw-r--r-- | inet/ether_aton.c | 30 | ||||
-rw-r--r-- | inet/ether_aton_r.c | 63 | ||||
-rw-r--r-- | inet/ether_hton.c | 82 | ||||
-rw-r--r-- | inet/ether_line.c | 79 | ||||
-rw-r--r-- | inet/ether_ntoa.c | 30 | ||||
-rw-r--r-- | inet/ether_ntoa_r.c | 33 | ||||
-rw-r--r-- | inet/ether_ntoh.c | 85 | ||||
-rw-r--r-- | inet/netinet/ether.h | 48 |
9 files changed, 454 insertions, 1 deletions
diff --git a/inet/Makefile b/inet/Makefile index da300c7376..197e9d03a4 100644 --- a/inet/Makefile +++ b/inet/Makefile @@ -21,7 +21,8 @@ # subdir := inet -headers := netinet/in.h $(wildcard arpa/*.h protocols/*.h) +headers := netinet/ether.h netinet/in.h netinet/if_ether.h \ + $(wildcard arpa/*.h protocols/*.h) routines := ntohl ntohs htonl htons \ inet_lnaof inet_mkadr \ @@ -35,6 +36,8 @@ routines := ntohl ntohs htonl htons \ getservent_r \ getrpcent getrpcbyname getrpcbynumber \ getrpcent_r getrpcbyname_r getrpcbynumber_r \ + ether_aton ether_aton_r ether_hton ether_line \ + ether_ntoa ether_ntoa_r ether_ntoh \ rcmd rexec ruserpass # No warnings about losing BSD code. diff --git a/inet/ether_aton.c b/inet/ether_aton.c new file mode 100644 index 0000000000..eb27b244d9 --- /dev/null +++ b/inet/ether_aton.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include <netinet/ether.h> +#include <netinet/if_ether.h> + + +struct ether_addr * +ether_aton (const char *asc) +{ + struct ether_addr result; + + return ether_aton_r (asc, &result); +} diff --git a/inet/ether_aton_r.c b/inet/ether_aton_r.c new file mode 100644 index 0000000000..4b38f034cc --- /dev/null +++ b/inet/ether_aton_r.c @@ -0,0 +1,63 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include <ctype.h> +#include <stdlib.h> +#include <netinet/ether.h> +#include <netinet/if_ether.h> + + +struct ether_addr * +ether_aton_r (const char *asc, struct ether_addr *addr) +{ + size_t cnt; + + for (cnt = 0; cnt < 6; ++cnt) + { + unsigned int number; + char ch; + + ch = tolower (*asc++); + if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f')) + return NULL; + number = isdigit (ch) ? (ch - '0') : (ch - 'a' + 10); + + ch = tolower (*asc); + if ((cnt < 5 && ch != ':') || (cnt == 5 && ch != '\0' && !isspace (ch))) + { + ++asc; + if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f')) + return NULL; + number <<= 4; + number = isdigit (ch) ? (ch - '0') : (ch - 'a' + 10); + + ch = *asc; + if (cnt < 5 && ch != ':') + return NULL; + } + + /* Store result. */ + addr->ether_addr_octet[cnt] = (unsigned char) number; + + /* Skip ':'. */ + ++asc; + } + + return addr; +} diff --git a/inet/ether_hton.c b/inet/ether_hton.c new file mode 100644 index 0000000000..fb62d2dab5 --- /dev/null +++ b/inet/ether_hton.c @@ -0,0 +1,82 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include <netinet/ether.h> +#include <netinet/if_ether.h> + +#include "../nss/nsswitch.h" + +/* Because the `ethers' lookup does not fit so well in the scheme so + we define a dummy struct here which helps us to use the available + functions. */ +struct etherent +{ + const char *e_name; + struct ether_addr e_addr; +}; + + +/* Type of the lookup function we need here. */ +typedef int (*lookup_function) (const char *, struct etherent *, char *, int); + + +int +ether_hostton (const char *hostname, struct ether_addr *addr) +{ + static service_user *startp = NULL; + static lookup_function start_fct; + service_user *nip; + lookup_function fct; + int no_more; + int result; + enum nss_status status = NSS_STATUS_UNAVAIL; + struct etherent etherent; + + if (startp == NULL) + { + no_more = __nss_ethers_lookup (&nip, "gethostton_r", (void **) &fct); + if (no_more) + startp = (service_user *) -1; + else + { + startp = nip; + start_fct = fct; + } + } + else + { + fct = start_fct; + no_more = (nip = startp) == (service_user *) -1; + } + + while (no_more == 0) + { + char buffer[1024]; + + status = (*fct) (hostname, ðerent, buffer, sizeof buffer); + + no_more = __nss_next (&nip, "gethostton_r", (void **) &fct, status, 0); + } + + if (status == NSS_STATUS_SUCCESS) + memcpy (addr, etherent.e_addr.ether_addr_octet, + sizeof (struct ether_addr)); + + return status == NSS_STATUS_SUCCESS ? 0 : -1; +} diff --git a/inet/ether_line.c b/inet/ether_line.c new file mode 100644 index 0000000000..1400f5ae96 --- /dev/null +++ b/inet/ether_line.c @@ -0,0 +1,79 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include <stdlib.h> +#include <netinet/ether.h> +#include <netinet/if_ether.h> + + +int +ether_line (const char *line, struct ether_addr *addr, char *hostname) +{ + size_t cnt; + char *cp; + + for (cnt = 0; cnt < 6; ++cnt) + { + unsigned int number; + char ch; + + ch = tolower (*line++); + if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f')) + return -1; + number = isdigit (ch) ? (ch - '0') : (ch - 'a' + 10); + + ch = tolower (*line); + if ((cnt < 5 && ch != ':') || (cnt == 5 && ch != '\0' && !isspace (ch))) + { + ++line; + if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f')) + return -1; + number <<= 4; + number = isdigit (ch) ? (ch - '0') : (ch - 'a' + 10); + + ch = *line; + if (cnt < 5 && ch != ':') + return -1; + } + + /* Store result. */ + addr->ether_addr_octet[cnt] = (unsigned char) number; + + /* Skip ':'. */ + if (ch != '\0') + ++line; + } + + /* Remove trailing white space. */ + cp = strchr (line, '#'); + if (cp == NULL) + cp = strchr (line, '\0'); + while (cp > line && isspace (cp[-1])) + --cp; + *cp = '\0'; + + if (*line == '\0') + /* No hostname. */ + return -1; + + /* XXX This can cause trouble because the hostname might be too long + but we have no possibility to check it here. */ + strcpy (hostname, line); + + return 0; +} diff --git a/inet/ether_ntoa.c b/inet/ether_ntoa.c new file mode 100644 index 0000000000..728f841c92 --- /dev/null +++ b/inet/ether_ntoa.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include <netinet/ether.h> +#include <netinet/if_ether.h> + + +char * +ether_ntoa (const struct ether_addr *addr) +{ + char asc[18]; + + return ether_ntoa_r (addr, asc); +} diff --git a/inet/ether_ntoa_r.c b/inet/ether_ntoa_r.c new file mode 100644 index 0000000000..a2735ab421 --- /dev/null +++ b/inet/ether_ntoa_r.c @@ -0,0 +1,33 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include <stdio.h> +#include <netinet/ether.h> +#include <netinet/if_ether.h> + + +char * +ether_ntoa_r (const struct ether_addr *addr, char *buf) +{ + sprintf (buf, "%x:%x:%x:%x:%x:%x", + addr->ether_addr_octet[0], addr->ether_addr_octet[1], + addr->ether_addr_octet[2], addr->ether_addr_octet[3], + addr->ether_addr_octet[4], addr->ether_addr_octet[5]); + return buf; +} diff --git a/inet/ether_ntoh.c b/inet/ether_ntoh.c new file mode 100644 index 0000000000..26a4e471ad --- /dev/null +++ b/inet/ether_ntoh.c @@ -0,0 +1,85 @@ +/* Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#include <netinet/ether.h> +#include <netinet/if_ether.h> + +#include "../nss/nsswitch.h" + +/* Because the `ethers' lookup does not fit so well in the scheme so + we define a dummy struct here which helps us to use the available + functions. */ +struct etherent +{ + const char *e_name; + struct ether_addr e_addr; +}; + + +/* Type of the lookup function we need here. */ +typedef int (*lookup_function) (const struct ether_addr *, struct etherent *, + char *, int); + + +int +ether_ntohost (char *hostname, const struct ether_addr *addr) +{ + static service_user *startp = NULL; + static lookup_function start_fct; + service_user *nip; + lookup_function fct; + int no_more; + int result; + enum nss_status status = NSS_STATUS_UNAVAIL; + struct etherent etherent; + + if (startp == NULL) + { + no_more = __nss_ethers_lookup (&nip, "getntohost_r", (void **) &fct); + if (no_more) + startp = (service_user *) -1; + else + { + startp = nip; + start_fct = fct; + } + } + else + { + fct = start_fct; + no_more = (nip = startp) == (service_user *) -1; + } + + while (no_more == 0) + { + char buffer[1024]; + + status = (*fct) (addr, ðerent, buffer, sizeof buffer); + + no_more = __nss_next (&nip, "getntohost_r", (void **) &fct, status, 0); + } + + if (status == NSS_STATUS_SUCCESS) + /* XXX This is a potential cause of trouble because the size of + the HOSTNAME buffer is not known but the interface does not + provide this information. */ + strcpy (hostname, etherent.e_name); + + return status == NSS_STATUS_SUCCESS ? 0 : -1; +} diff --git a/inet/netinet/ether.h b/inet/netinet/ether.h new file mode 100644 index 0000000000..b14377a13d --- /dev/null +++ b/inet/netinet/ether.h @@ -0,0 +1,48 @@ +/* Functions for storing Ethernet addresses in ASCII and mapping to hostnames. +Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with the GNU C Library; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ + +#ifndef __NETINET_ETHER_H + +#define __NETINET_ETHER_H 1 +#include <features.h> + +/* Get definition of `struct ether_addr'. */ +#include <netinet/if_ether.h> + + +/* Convert 48 bit Ethernet ADDRess to ASCII. */ +char *ether_ntoa __P ((const struct ether_addr *__addr)); +char *ether_ntoa_r __P ((const struct ether_addr *__addr, char *__buf)); + +/* Convert ASCII string S to 48 bit Ethernet address. */ +struct ether_addr *ether_aton __P ((const char *__asc)); +struct ether_addr *ether_aton_r __P ((const char *__asc, + struct ether_addr *__addr)); + +/* Map 48 bit Ethernet number ADDR to HOSTNAME. */ +int ether_ntohost __P ((char *__hostname, const struct ether_addr *__addr)); + +/* Map HOSTNAME to 48 bit Ethernet address. */ +int ether_hostton __P ((const char *__hostname, struct ether_addr *__addr)); + +/* Scan LINE and set ADDR and HOSTNAME. */ +int ether_line __P ((const char *__line, struct ether_addr *__addr, + char *__hostname)); + +#endif /* netinet/ether.h */ |