diff options
Diffstat (limited to 'inet')
-rw-r--r-- | inet/arpa/tftp.h | 26 | ||||
-rw-r--r-- | inet/inet_ntoa.c | 146 | ||||
-rw-r--r-- | inet/rcmd.c | 44 |
3 files changed, 127 insertions, 89 deletions
diff --git a/inet/arpa/tftp.h b/inet/arpa/tftp.h index 036720011f..0904407c73 100644 --- a/inet/arpa/tftp.h +++ b/inet/arpa/tftp.h @@ -33,8 +33,8 @@ * @(#)tftp.h 8.1 (Berkeley) 6/2/93 */ -#ifndef _TFTP_H_ -#define _TFTP_H_ +#ifndef _ARPA_TFTP_H +#define _ARPA_TFTP_H 1 /* * Trivial File Transfer Protocol (IEN-133) @@ -44,20 +44,20 @@ /* * Packet types. */ -#define RRQ 01 /* read request */ -#define WRQ 02 /* write request */ -#define DATA 03 /* data packet */ -#define ACK 04 /* acknowledgement */ -#define ERROR 05 /* error code */ +#define RRQ 01 /* read request */ +#define WRQ 02 /* write request */ +#define DATA 03 /* data packet */ +#define ACK 04 /* acknowledgement */ +#define ERROR 05 /* error code */ struct tftphdr { - short th_opcode; /* packet type */ + short th_opcode; /* packet type */ union { - short tu_block; /* block # */ - short tu_code; /* error code */ - char tu_stuff[1]; /* request packet stuff */ + unsigned short tu_block; /* block # */ + short tu_code; /* error code */ + char tu_stuff[1]; /* request packet stuff */ } th_u; - char th_data[1]; /* data or error string */ + char th_data[1]; /* data or error string */ }; #define th_block th_u.tu_block @@ -77,4 +77,4 @@ struct tftphdr { #define EEXISTS 6 /* file already exists */ #define ENOUSER 7 /* no such user */ -#endif /* !_TFTP_H_ */ +#endif /* arpa/tftp.h */ diff --git a/inet/inet_ntoa.c b/inet/inet_ntoa.c index a37b1dbeef..a72d7ba7e3 100644 --- a/inet/inet_ntoa.c +++ b/inet/inet_ntoa.c @@ -1,59 +1,97 @@ -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)inet_ntoa.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -/* - * Convert network-format internet address - * to base 256 d.d.d.d representation. - */ -#include <sys/types.h> -#include <netinet/in.h> -#include <arpa/inet.h> +/* Convert Inet number to ASCII representation. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + 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 <stdlib.h> +#include <arpa/inet.h> +#include <libc-lock.h> + +/* The interface of this function is completely stupid, it requires a + static buffer. We relax this a bit in that we allow at least one + buffer for each thread. */ + +/* This is the key for the thread specific memory. */ +static __libc_key_t key; + +/* If nonzero the key allocation failed and we should better use a + static buffer than fail. */ +static char local_buf[18]; +static char *static_buf; + +/* Destructor for the thread-specific data. */ +static void init (void); +static void free_key_mem (void *mem); + char * -inet_ntoa(in) - struct in_addr in; +inet_ntoa (struct in_addr in) +{ + __libc_once_define (once); + char *buffer; + unsigned char *bytes; + + /* If we have not yet initialized the buffer do it now. */ + __libc_once (once, init); + + if (static_buf != NULL) + buffer = static_buf; + else + { + /* We don't use the static buffer and so we have a key. Use it + to get the thread-specific buffer. */ + buffer = __libc_getspecific (key); + if (buffer == NULL) + { + /* No buffer allocated so far. */ + buffer = malloc (18); + if (buffer == NULL) + /* No more memory available. We use the static buffer. */ + buffer = local_buf; + else + __libc_setspecific (key, buffer); + } + } + + bytes = (unsigned char *) ∈ + snprintf (buffer, 18, "%d.%d.%d.%d", bytes[0], bytes[1], bytes[2], bytes[3]); + + return buffer; +} + + +/* Initialize buffer. */ +static void +init (void) +{ + if (__libc_key_create (&key, free_key_mem)) + /* Creating the key failed. This means something really went + wrong. In any case use a static buffer which is better than + nothing. */ + static_buf = local_buf; +} + + +/* free the thread specific data, this is done if a thread terminates. */ +static void +free_key_mem (void *mem) { - static char b[18]; - register char *p; - - p = (char *)∈ -#define UC(b) (((int)b)&0xff) - (void)snprintf(b, sizeof(b), - "%d.%d.%d.%d", UC(p[0]), UC(p[1]), UC(p[2]), UC(p[3])); - return (b); + free (mem); + __libc_setspecific (key, NULL); } diff --git a/inet/rcmd.c b/inet/rcmd.c index d390a8d809..6a680c18b7 100644 --- a/inet/rcmd.c +++ b/inet/rcmd.c @@ -105,7 +105,7 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p) else (void)fprintf(stderr, "rcmd: socket: %m\n"); sigsetmask(oldmask); - return (-1); + return -1; } fcntl(s, F_SETOWN, pid); sin.sin_family = hp->h_addrtype; @@ -140,7 +140,7 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p) } (void)fprintf(stderr, "%s: %m\n", hp->h_name); sigsetmask(oldmask); - return (-1); + return -1; } lport--; if (fd2p == 0) { @@ -149,7 +149,7 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p) } else { char num[8]; int s2 = rresvport(&lport), s3; - int len = sizeof(from); + size_t len = sizeof(from); if (s2 < 0) goto bad; @@ -211,14 +211,14 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p) goto bad2; } sigsetmask(oldmask); - return (s); + return s; bad2: if (lport) (void)close(*fd2p); bad: (void)close(s); sigsetmask(oldmask); - return (-1); + return -1; } int @@ -232,20 +232,20 @@ rresvport(alport) sin.sin_addr.s_addr = INADDR_ANY; s = socket(AF_INET, SOCK_STREAM, 0); if (s < 0) - return (-1); + return -1; for (;;) { sin.sin_port = htons((u_short)*alport); if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) >= 0) - return (s); + return s; if (errno != EADDRINUSE) { (void)close(s); - return (-1); + return -1; } (*alport)--; if (*alport == IPPORT_RESERVED/2) { (void)close(s); __set_errno (EAGAIN); /* close */ - return (-1); + return -1; } } } @@ -282,9 +282,9 @@ ruserok(rhost, superuser, ruser, luser) for (ap = hp->h_addr_list; *ap; ++ap) { bcopy(*ap, &addr, sizeof(addr)); if (iruserok(addr, superuser, ruser, luser) == 0) - return (0); + return 0; } - return (-1); + return -1; } /* @@ -314,7 +314,7 @@ again: if (hostf) { if (__ivaliduser(hostf, raddr, luser, ruser) == 0) { (void)fclose(hostf); - return (0); + return 0; } (void)fclose(hostf); } @@ -349,7 +349,7 @@ again: } if (hostf == NULL) - return (-1); + return -1; /* * If not a regular file, or is owned by someone other than * user or root or if writeable by anyone but the owner, quit. @@ -369,11 +369,11 @@ again: if (cp) { __rcmd_errstr = cp; (void)fclose(hostf); - return (-1); + return -1; } goto again; } - return (-1); + return -1; } /* @@ -415,11 +415,11 @@ __ivaliduser(hostf, raddr, luser, ruser) if (__icheckhost(raddr, buf) && strcmp(ruser, *user ? user : luser) == 0) { free (buf); - return (0); + return 0; } } free (buf); - return (-1); + return -1; } /* @@ -430,7 +430,7 @@ __icheckhost(raddr, lhost) u_int32_t raddr; register char *lhost; { - register struct hostent hostbuf, *hp; + struct hostent hostbuf, *hp; size_t buflen; char *buffer; register u_int32_t laddr; @@ -439,7 +439,7 @@ __icheckhost(raddr, lhost) /* Try for raw ip address first. */ if (isdigit(*lhost) && (int32_t)(laddr = inet_addr(lhost)) != -1) - return (raddr == laddr); + return raddr == laddr; /* Better be a hostname. */ buflen = 1024; @@ -452,14 +452,14 @@ __icheckhost(raddr, lhost) { /* Enlarge the buffer. */ buflen *= 2; - buflen = __alloca (buflen); + buffer = __alloca (buflen); } /* Spin through ip addresses. */ for (pp = hp->h_addr_list; *pp; ++pp) if (!bcmp(&raddr, *pp, sizeof(u_int32_t))) - return (1); + return 1; /* No match. */ - return (0); + return 0; } |