diff options
| author | Kyle Evans <kevans@FreeBSD.org> | 2018-02-11 19:51:29 +0000 |
|---|---|---|
| committer | Kyle Evans <kevans@FreeBSD.org> | 2018-02-11 19:51:29 +0000 |
| commit | 2c35cd73fcc9217586cea8d44823bb048070c06e (patch) | |
| tree | efe44753ca84bf8f780df70b379d85b4f02b3d5d /lib | |
| parent | 43ac7bccda02c311127382a1c6a7f413a1fa5d5c (diff) | |
Notes
Diffstat (limited to 'lib')
82 files changed, 0 insertions, 18675 deletions
diff --git a/lib/libstand/Makefile b/lib/libstand/Makefile deleted file mode 100644 index b2e12fe469bb..000000000000 --- a/lib/libstand/Makefile +++ /dev/null @@ -1,163 +0,0 @@ -# $FreeBSD$ -# Originally from $NetBSD: Makefile,v 1.21 1997/10/26 22:08:38 lukem Exp $ -# -# Notes: -# - We don't use the libc strerror/sys_errlist because the string table is -# quite large. -# - -PACKAGE=lib${LIB} -MK_PROFILE= no -MK_SSP= no - -.include <src.opts.mk> - -LIBSTAND_SRC?= ${.CURDIR} -LIBSTAND_CPUARCH?=${MACHINE_CPUARCH} -LIBC_SRC= ${LIBSTAND_SRC}/../libc - -LIB= stand -NO_PIC= -INCS?= stand.h -MAN?= libstand.3 - -WARNS?= 0 - -CFLAGS+= -I${LIBSTAND_SRC} - -# standalone components and stuff we have modified locally -SRCS+= gzguts.h zutil.h __main.c assert.c bcd.c environment.c getopt.c gets.c \ - globals.c pager.c printf.c strdup.c strerror.c strtol.c strtoul.c random.c \ - sbrk.c twiddle.c zalloc.c zalloc_malloc.c - -# private (pruned) versions of libc string functions -SRCS+= strcasecmp.c - -.PATH: ${LIBC_SRC}/net - -SRCS+= ntoh.c - -# string functions from libc -.PATH: ${LIBC_SRC}/string -SRCS+= bcmp.c bcopy.c bzero.c ffs.c fls.c \ - memccpy.c memchr.c memcmp.c memcpy.c memmove.c memset.c \ - qdivrem.c strcat.c strchr.c strcmp.c strcpy.c stpcpy.c stpncpy.c \ - strcspn.c strlcat.c strlcpy.c strlen.c strncat.c strncmp.c strncpy.c \ - strnlen.c strpbrk.c strrchr.c strsep.c strspn.c strstr.c strtok.c swab.c -.if ${MACHINE_CPUARCH} == "arm" -.PATH: ${LIBC_SRC}/arm/gen - -# Do not generate movt/movw, because the relocation fixup for them does not -# translate to the -Bsymbolic -pie format required by self_reloc() in loader(8). -# Also, the fpu is not available in a standalone environment. -.if ${COMPILER_VERSION} < 30800 -CFLAGS.clang+= -mllvm -arm-use-movt=0 -.else -CFLAGS.clang+= -mno-movt -.endif -CFLAGS.clang+= -mfpu=none - -# Compiler support functions -.PATH: ${LIBSTAND_SRC}/../../contrib/compiler-rt/lib/builtins/ -# __clzsi2 and ctzsi2 for various builtin functions -SRCS+= clzsi2.c ctzsi2.c -# Divide and modulus functions called by the compiler -SRCS+= divmoddi4.c divmodsi4.c divdi3.c divsi3.c moddi3.c modsi3.c -SRCS+= udivmoddi4.c udivmodsi4.c udivdi3.c udivsi3.c umoddi3.c umodsi3.c - -.PATH: ${LIBSTAND_SRC}/../../contrib/compiler-rt/lib/builtins/arm/ -SRCS+= aeabi_idivmod.S aeabi_ldivmod.S aeabi_uidivmod.S aeabi_uldivmod.S -SRCS+= aeabi_memcmp.S aeabi_memcpy.S aeabi_memmove.S aeabi_memset.S -.endif - -.if ${MACHINE_CPUARCH} == "aarch64" || ${MACHINE_CPUARCH} == "riscv" -.PATH: ${LIBC_SRC}/${MACHINE_CPUARCH}/gen -.endif - -.if ${MACHINE_CPUARCH} == "powerpc" -.PATH: ${LIBC_SRC}/quad -SRCS+= ashldi3.c ashrdi3.c -SRCS+= syncicache.c -.endif - -# uuid functions from libc -.PATH: ${LIBC_SRC}/uuid -SRCS+= uuid_create_nil.c uuid_equal.c uuid_from_string.c uuid_is_nil.c uuid_to_string.c - -# _setjmp/_longjmp -.PATH: ${LIBSTAND_SRC}/${LIBSTAND_CPUARCH} -SRCS+= _setjmp.S - -# decompression functionality from libbz2 -# NOTE: to actually test this functionality after libbz2 upgrade compile -# loader(8) with LOADER_BZIP2_SUPPORT defined -.PATH: ${LIBSTAND_SRC}/../../contrib/bzip2 -CFLAGS+= -DBZ_NO_STDIO -DBZ_NO_COMPRESS -SRCS+= libstand_bzlib_private.h - -.for file in bzlib.c crctable.c decompress.c huffman.c randtable.c -SRCS+= _${file} -CLEANFILES+= _${file} - -_${file}: ${file} - sed "s|bzlib_private\.h|libstand_bzlib_private.h|" \ - ${.ALLSRC} > ${.TARGET} -.endfor - -CLEANFILES+= libstand_bzlib_private.h -libstand_bzlib_private.h: bzlib_private.h - sed -e 's|<stdlib.h>|"stand.h"|' \ - ${.ALLSRC} > ${.TARGET} - -# decompression functionality from zlib -.PATH: ${LIBSTAND_SRC}/../../contrib/zlib -CFLAGS+=-DHAVE_MEMCPY -I${LIBSTAND_SRC}/../../contrib/zlib -SRCS+= adler32.c crc32.c libstand_zutil.h libstand_gzguts.h - -.for file in infback.c inffast.c inflate.c inftrees.c zutil.c -SRCS+= _${file} -CLEANFILES+= _${file} - -_${file}: ${file} - sed -e "s|zutil\.h|libstand_zutil.h|" \ - -e "s|gzguts\.h|libstand_gzguts.h|" \ - ${.ALLSRC} > ${.TARGET} -.endfor - -# depend on stand.h being able to be included multiple times -.for file in zutil.h gzguts.h -CLEANFILES+= libstand_${file} -libstand_${file}: ${file} - sed -e 's|<fcntl.h>|"stand.h"|' \ - -e 's|<stddef.h>|"stand.h"|' \ - -e 's|<string.h>|"stand.h"|' \ - -e 's|<stdio.h>|"stand.h"|' \ - -e 's|<stdlib.h>|"stand.h"|' \ - ${.ALLSRC} > ${.TARGET} -.endfor - -# io routines -SRCS+= closeall.c dev.c ioctl.c nullfs.c stat.c \ - fstat.c close.c lseek.c open.c read.c write.c readdir.c - -# network routines -SRCS+= arp.c ether.c ip.c inet_ntoa.c in_cksum.c net.c udp.c netif.c rpc.c - -# network info services: -SRCS+= bootp.c rarp.c bootparam.c - -# boot filesystems -SRCS+= ufs.c nfs.c cd9660.c tftp.c gzipfs.c bzipfs.c -SRCS+= dosfs.c ext2fs.c -SRCS+= splitfs.c -SRCS+= pkgfs.c -.if ${MK_NAND} != "no" -SRCS+= nandfs.c -.endif - -# explicit_bzero -.PATH: ${SRCTOP}/sys/libkern -SRCS+= explicit_bzero.c - -.include <bsd.stand.mk> -.include <bsd.lib.mk> diff --git a/lib/libstand/Makefile.depend b/lib/libstand/Makefile.depend deleted file mode 100644 index 1d86fce1441d..000000000000 --- a/lib/libstand/Makefile.depend +++ /dev/null @@ -1,15 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - include \ - include/arpa \ - include/xlocale \ - lib/libbz2 \ - - -.include <dirdeps.mk> - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif diff --git a/lib/libstand/__main.c b/lib/libstand/__main.c deleted file mode 100644 index e38f33865c05..000000000000 --- a/lib/libstand/__main.c +++ /dev/null @@ -1,43 +0,0 @@ -/* $NetBSD: __main.c,v 1.4 1996/03/14 18:52:03 christos Exp $ */ - -/* - * Copyright (c) 1993 Christopher G. Demetriou - * 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 Christopher G. Demetriou. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/types.h> - -void __main(void); - -void -__main(void) -{ -} diff --git a/lib/libstand/amd64/_setjmp.S b/lib/libstand/amd64/_setjmp.S deleted file mode 100644 index e841f493f6fb..000000000000 --- a/lib/libstand/amd64/_setjmp.S +++ /dev/null @@ -1,93 +0,0 @@ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz. - * - * 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. - * 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) - .asciz "@(#)_setjmp.s 5.1 (Berkeley) 4/23/90" -#endif /* LIBC_SCCS and not lint */ -#include <machine/asm.h> -__FBSDID("$FreeBSD$"); - -/* - * C library -- _setjmp, _longjmp - * - * _longjmp(a,v) - * will generate a "return(v)" from the last call to - * _setjmp(a) - * by restoring registers from the environment 'a'. - * The previous signal state is NOT restored. - */ - -ENTRY(_setjmp) - movq %rdi,%rax - movq 0(%rsp),%rdx /* retval */ - movq %rdx, 0(%rax) /* 0; retval */ - movq %rbx, 8(%rax) /* 1; rbx */ - movq %rsp,16(%rax) /* 2; rsp */ - movq %rbp,24(%rax) /* 3; rbp */ - movq %r12,32(%rax) /* 4; r12 */ - movq %r13,40(%rax) /* 5; r13 */ - movq %r14,48(%rax) /* 6; r14 */ - movq %r15,56(%rax) /* 7; r15 */ - fnstcw 64(%rax) /* 8; fpu cw */ - stmxcsr 68(%rax) /* and mxcsr */ - xorq %rax,%rax - ret -END(_setjmp) - - .weak CNAME(_longjmp) -ENTRY(_longjmp) - movq %rdi,%rdx - /* Restore the mxcsr, but leave exception flags intact. */ - stmxcsr -4(%rsp) - movl 68(%rdx),%eax - andl $0xffffffc0,%eax - movl -4(%rsp),%edi - andl $0x3f,%edi - xorl %eax,%edi - movl %edi,-4(%rsp) - ldmxcsr -4(%rsp) - movq %rsi,%rax /* retval */ - movq 0(%rdx),%rcx - movq 8(%rdx),%rbx - movq 16(%rdx),%rsp - movq 24(%rdx),%rbp - movq 32(%rdx),%r12 - movq 40(%rdx),%r13 - movq 48(%rdx),%r14 - movq 56(%rdx),%r15 - fldcw 64(%rdx) - testq %rax,%rax - jnz 1f - incq %rax -1: movq %rcx,0(%rsp) - ret -END(_longjmp) diff --git a/lib/libstand/arp.c b/lib/libstand/arp.c deleted file mode 100644 index 61b5f1fc2701..000000000000 --- a/lib/libstand/arp.c +++ /dev/null @@ -1,305 +0,0 @@ -/* $NetBSD: arp.c,v 1.18 1997/07/07 15:52:49 drochner Exp $ */ - -/* - * Copyright (c) 1992 Regents of the University of California. - * All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * 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. - * 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. - * - * @(#) Header: arp.c,v 1.5 93/07/15 05:52:26 leres Exp (LBL) - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/types.h> -#include <sys/socket.h> -#include <net/if.h> -#include <netinet/in.h> -#include <netinet/if_ether.h> - -#include <netinet/in_systm.h> - -#include <string.h> - -#include "stand.h" -#include "net.h" - -/* Cache stuff */ -#define ARP_NUM 8 /* need at most 3 arp entries */ - -struct arp_list { - struct in_addr addr; - u_char ea[6]; -} arp_list[ARP_NUM] = { - /* XXX - net order `INADDR_BROADCAST' must be a constant */ - { {0xffffffff}, BA } -}; -int arp_num = 1; - -/* Local forwards */ -static ssize_t arpsend(struct iodesc *, void *, size_t); -static ssize_t arprecv(struct iodesc *, void **, void **, time_t); - -/* Broadcast an ARP packet, asking who has addr on interface d */ -u_char * -arpwhohas(struct iodesc *d, struct in_addr addr) -{ - int i; - struct ether_arp *ah; - struct arp_list *al; - void *pkt; - struct { - struct ether_header eh; - struct { - struct ether_arp arp; - u_char pad[18]; /* 60 - sizeof(...) */ - } data; - } wbuf; - - /* Try for cached answer first */ - for (i = 0, al = arp_list; i < arp_num; ++i, ++al) - if (addr.s_addr == al->addr.s_addr) - return (al->ea); - - /* Don't overflow cache */ - if (arp_num > ARP_NUM - 1) { - arp_num = 1; /* recycle */ - printf("arpwhohas: overflowed arp_list!\n"); - } - -#ifdef ARP_DEBUG - if (debug) - printf("arpwhohas: send request for %s\n", inet_ntoa(addr)); -#endif - - bzero((char*)&wbuf.data, sizeof(wbuf.data)); - ah = &wbuf.data.arp; - ah->arp_hrd = htons(ARPHRD_ETHER); - ah->arp_pro = htons(ETHERTYPE_IP); - ah->arp_hln = sizeof(ah->arp_sha); /* hardware address length */ - ah->arp_pln = sizeof(ah->arp_spa); /* protocol address length */ - ah->arp_op = htons(ARPOP_REQUEST); - MACPY(d->myea, ah->arp_sha); - bcopy(&d->myip, ah->arp_spa, sizeof(ah->arp_spa)); - /* Leave zeros in arp_tha */ - bcopy(&addr, ah->arp_tpa, sizeof(ah->arp_tpa)); - - /* Store ip address in cache (incomplete entry). */ - al->addr = addr; - - pkt = NULL; - ah = NULL; - i = sendrecv(d, - arpsend, &wbuf.data, sizeof(wbuf.data), - arprecv, &pkt, (void **)&ah); - if (i == -1) { - panic("arp: no response for %s\n", - inet_ntoa(addr)); - } - - /* Store ethernet address in cache */ -#ifdef ARP_DEBUG - if (debug) { - struct ether_header *eh; - - eh = (struct ether_header *)((uintptr_t)pkt + ETHER_ALIGN); - printf("arp: response from %s\n", - ether_sprintf(eh->ether_shost)); - printf("arp: cacheing %s --> %s\n", - inet_ntoa(addr), ether_sprintf(ah->arp_sha)); - } -#endif - MACPY(ah->arp_sha, al->ea); - ++arp_num; - - free(pkt); - return (al->ea); -} - -static ssize_t -arpsend(struct iodesc *d, void *pkt, size_t len) -{ - -#ifdef ARP_DEBUG - if (debug) - printf("arpsend: called\n"); -#endif - - return (sendether(d, pkt, len, bcea, ETHERTYPE_ARP)); -} - -/* - * Returns 0 if this is the packet we're waiting for - * else -1 (and errno == 0) - */ -static ssize_t -arprecv(struct iodesc *d, void **pkt, void **payload, time_t tleft) -{ - ssize_t n; - struct ether_arp *ah; - u_int16_t etype; /* host order */ - void *ptr; - -#ifdef ARP_DEBUG - if (debug) - printf("arprecv: "); -#endif - - ptr = NULL; - n = readether(d, &ptr, (void **)&ah, tleft, &etype); - errno = 0; /* XXX */ - if (n == -1 || n < sizeof(struct ether_arp)) { -#ifdef ARP_DEBUG - if (debug) - printf("bad len=%d\n", n); -#endif - free(ptr); - return (-1); - } - - if (etype != ETHERTYPE_ARP) { -#ifdef ARP_DEBUG - if (debug) - printf("not arp type=%d\n", etype); -#endif - free(ptr); - return (-1); - } - - /* Ethernet address now checked in readether() */ - if (ah->arp_hrd != htons(ARPHRD_ETHER) || - ah->arp_pro != htons(ETHERTYPE_IP) || - ah->arp_hln != sizeof(ah->arp_sha) || - ah->arp_pln != sizeof(ah->arp_spa) ) - { -#ifdef ARP_DEBUG - if (debug) - printf("bad hrd/pro/hln/pln\n"); -#endif - free(ptr); - return (-1); - } - - if (ah->arp_op == htons(ARPOP_REQUEST)) { -#ifdef ARP_DEBUG - if (debug) - printf("is request\n"); -#endif - arp_reply(d, ah); - free(ptr); - return (-1); - } - - if (ah->arp_op != htons(ARPOP_REPLY)) { -#ifdef ARP_DEBUG - if (debug) - printf("not ARP reply\n"); -#endif - free(ptr); - return (-1); - } - - /* Is the reply from the source we want? */ - if (bcmp(&arp_list[arp_num].addr, - ah->arp_spa, sizeof(ah->arp_spa))) - { -#ifdef ARP_DEBUG - if (debug) - printf("unwanted address\n"); -#endif - free(ptr); - return (-1); - } - /* We don't care who the reply was sent to. */ - - /* We have our answer. */ -#ifdef ARP_DEBUG - if (debug) - printf("got it\n"); -#endif - *pkt = ptr; - *payload = ah; - return (n); -} - -/* - * Convert an ARP request into a reply and send it. - * Notes: Re-uses buffer. Pad to length = 46. - */ -void -arp_reply(struct iodesc *d, void *pkt) -{ - struct ether_arp *arp = pkt; - - if (arp->arp_hrd != htons(ARPHRD_ETHER) || - arp->arp_pro != htons(ETHERTYPE_IP) || - arp->arp_hln != sizeof(arp->arp_sha) || - arp->arp_pln != sizeof(arp->arp_spa) ) - { -#ifdef ARP_DEBUG - if (debug) - printf("arp_reply: bad hrd/pro/hln/pln\n"); -#endif - return; - } - - if (arp->arp_op != htons(ARPOP_REQUEST)) { -#ifdef ARP_DEBUG - if (debug) - printf("arp_reply: not request!\n"); -#endif - return; - } - - /* If we are not the target, ignore the request. */ - if (bcmp(arp->arp_tpa, &d->myip, sizeof(arp->arp_tpa))) - return; - -#ifdef ARP_DEBUG - if (debug) { - printf("arp_reply: to %s\n", ether_sprintf(arp->arp_sha)); - } -#endif - - arp->arp_op = htons(ARPOP_REPLY); - /* source becomes target */ - bcopy(arp->arp_sha, arp->arp_tha, sizeof(arp->arp_tha)); - bcopy(arp->arp_spa, arp->arp_tpa, sizeof(arp->arp_tpa)); - /* here becomes source */ - bcopy(d->myea, arp->arp_sha, sizeof(arp->arp_sha)); - bcopy(&d->myip, arp->arp_spa, sizeof(arp->arp_spa)); - - /* - * No need to get fancy here. If the send fails, the - * requestor will just ask again. - */ - (void) sendether(d, pkt, sizeof(*arp) + 18, - arp->arp_tha, ETHERTYPE_ARP); -} diff --git a/lib/libstand/assert.c b/lib/libstand/assert.c deleted file mode 100644 index 8eec63a4729a..000000000000 --- a/lib/libstand/assert.c +++ /dev/null @@ -1,44 +0,0 @@ -/*- - * Copyright (c) 1998 Michael Smith. - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <assert.h> - -#include "stand.h" - -void -__assert(const char *func, const char *file, int line, const char *expression) -{ - if (func == NULL) - panic("Assertion failed: (%s), file %s, line %d.\n", - expression, file, line); - else - panic( - "Assertion failed: (%s), function %s, file %s, line %d.\n", - expression, func, file, line); -} diff --git a/lib/libstand/bcd.c b/lib/libstand/bcd.c deleted file mode 100644 index 7bd67c91620a..000000000000 --- a/lib/libstand/bcd.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Some data-tables that are often used. - * Cannot be copyrighted. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/types.h> - -u_char const bcd2bin_data[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 0, 0, 0, 0, 0, 0, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 0, 0, 0, 0, 0, 0, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 0, 0, 0, 0, 0, 0, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 0, 0, 0, 0, 0, 0, - 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 0, 0, 0, 0, 0, 0, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 -}; - -u_char const bin2bcd_data[] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99 -}; - -/* This is actually used with radix [2..36] */ -char const hex2ascii_data[] = "0123456789abcdefghijklmnopqrstuvwxyz"; diff --git a/lib/libstand/bootp.c b/lib/libstand/bootp.c deleted file mode 100644 index 9f08fafe2e82..000000000000 --- a/lib/libstand/bootp.c +++ /dev/null @@ -1,791 +0,0 @@ -/* $NetBSD: bootp.c,v 1.14 1998/02/16 11:10:54 drochner Exp $ */ - -/* - * Copyright (c) 1992 Regents of the University of California. - * All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * 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. - * 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. - * - * @(#) Header: bootp.c,v 1.4 93/09/11 03:13:51 leres Exp (LBL) - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <stddef.h> -#include <sys/types.h> -#include <sys/limits.h> -#include <sys/endian.h> -#include <netinet/in.h> -#include <netinet/in_systm.h> - -#include <string.h> - -#define BOOTP_DEBUGxx -#define SUPPORT_DHCP - -#define DHCP_ENV_NOVENDOR 1 /* do not parse vendor options */ -#define DHCP_ENV_PXE 10 /* assume pxe vendor options */ -#define DHCP_ENV_FREEBSD 11 /* assume freebsd vendor options */ -/* set DHCP_ENV to one of the values above to export dhcp options to kenv */ -#define DHCP_ENV DHCP_ENV_NO_VENDOR - -#include "stand.h" -#include "net.h" -#include "netif.h" -#include "bootp.h" - - -struct in_addr servip; - -static time_t bot; - -static char vm_rfc1048[4] = VM_RFC1048; -#ifdef BOOTP_VEND_CMU -static char vm_cmu[4] = VM_CMU; -#endif - -/* Local forwards */ -static ssize_t bootpsend(struct iodesc *, void *, size_t); -static ssize_t bootprecv(struct iodesc *, void **, void **, time_t); -static int vend_rfc1048(u_char *, u_int); -#ifdef BOOTP_VEND_CMU -static void vend_cmu(u_char *); -#endif - -#ifdef DHCP_ENV /* export the dhcp response to kenv */ -struct dhcp_opt; -static void setenv_(u_char *cp, u_char *ep, struct dhcp_opt *opts); -#else -#define setenv_(a, b, c) -#endif - -#ifdef SUPPORT_DHCP -static char expected_dhcpmsgtype = -1, dhcp_ok; -struct in_addr dhcp_serverip; -#endif -struct bootp *bootp_response; -size_t bootp_response_size; - -static void -bootp_fill_request(unsigned char *bp_vend) -{ - /* - * We are booting from PXE, we want to send the string - * 'PXEClient' to the DHCP server so you have the option of - * only responding to PXE aware dhcp requests. - */ - bp_vend[0] = TAG_CLASSID; - bp_vend[1] = 9; - bcopy("PXEClient", &bp_vend[2], 9); - bp_vend[11] = TAG_USER_CLASS; - /* len of each user class + number of user class */ - bp_vend[12] = 8; - /* len of the first user class */ - bp_vend[13] = 7; - bcopy("FreeBSD", &bp_vend[14], 7); - bp_vend[21] = TAG_PARAM_REQ; - bp_vend[22] = 7; - bp_vend[23] = TAG_ROOTPATH; - bp_vend[24] = TAG_HOSTNAME; - bp_vend[25] = TAG_SWAPSERVER; - bp_vend[26] = TAG_GATEWAY; - bp_vend[27] = TAG_SUBNET_MASK; - bp_vend[28] = TAG_INTF_MTU; - bp_vend[29] = TAG_SERVERID; - bp_vend[30] = TAG_END; -} - -/* Fetch required bootp infomation */ -void -bootp(int sock) -{ - void *pkt; - struct iodesc *d; - struct bootp *bp; - struct { - u_char header[HEADER_SIZE]; - struct bootp wbootp; - } wbuf; - struct bootp *rbootp; - -#ifdef BOOTP_DEBUG - if (debug) - printf("bootp: socket=%d\n", sock); -#endif - if (!bot) - bot = getsecs(); - - if (!(d = socktodesc(sock))) { - printf("bootp: bad socket. %d\n", sock); - return; - } -#ifdef BOOTP_DEBUG - if (debug) - printf("bootp: d=%lx\n", (long)d); -#endif - - bp = &wbuf.wbootp; - bzero(bp, sizeof(*bp)); - - bp->bp_op = BOOTREQUEST; - bp->bp_htype = 1; /* 10Mb Ethernet (48 bits) */ - bp->bp_hlen = 6; - bp->bp_xid = htonl(d->xid); - MACPY(d->myea, bp->bp_chaddr); - strncpy(bp->bp_file, bootfile, sizeof(bp->bp_file)); - bcopy(vm_rfc1048, bp->bp_vend, sizeof(vm_rfc1048)); -#ifdef SUPPORT_DHCP - bp->bp_vend[4] = TAG_DHCP_MSGTYPE; - bp->bp_vend[5] = 1; - bp->bp_vend[6] = DHCPDISCOVER; - bootp_fill_request(&bp->bp_vend[7]); - -#else - bp->bp_vend[4] = TAG_END; -#endif - - d->myip.s_addr = INADDR_ANY; - d->myport = htons(IPPORT_BOOTPC); - d->destip.s_addr = INADDR_BROADCAST; - d->destport = htons(IPPORT_BOOTPS); - -#ifdef SUPPORT_DHCP - expected_dhcpmsgtype = DHCPOFFER; - dhcp_ok = 0; -#endif - - if(sendrecv(d, - bootpsend, bp, sizeof(*bp), - bootprecv, &pkt, (void **)&rbootp) == -1) { - printf("bootp: no reply\n"); - return; - } - -#ifdef SUPPORT_DHCP - if(dhcp_ok) { - u_int32_t leasetime; - bp->bp_vend[6] = DHCPREQUEST; - bp->bp_vend[7] = TAG_REQ_ADDR; - bp->bp_vend[8] = 4; - bcopy(&rbootp->bp_yiaddr, &bp->bp_vend[9], 4); - bp->bp_vend[13] = TAG_SERVERID; - bp->bp_vend[14] = 4; - bcopy(&dhcp_serverip.s_addr, &bp->bp_vend[15], 4); - bp->bp_vend[19] = TAG_LEASETIME; - bp->bp_vend[20] = 4; - leasetime = htonl(300); - bcopy(&leasetime, &bp->bp_vend[21], 4); - bootp_fill_request(&bp->bp_vend[25]); - - expected_dhcpmsgtype = DHCPACK; - - free(pkt); - if(sendrecv(d, - bootpsend, bp, sizeof(*bp), - bootprecv, &pkt, (void **)&rbootp) == -1) { - printf("DHCPREQUEST failed\n"); - return; - } - } -#endif - - myip = d->myip = rbootp->bp_yiaddr; - servip = rbootp->bp_siaddr; - if (rootip.s_addr == INADDR_ANY) - rootip = servip; - bcopy(rbootp->bp_file, bootfile, sizeof(bootfile)); - bootfile[sizeof(bootfile) - 1] = '\0'; - - if (!netmask) { - if (IN_CLASSA(ntohl(myip.s_addr))) - netmask = htonl(IN_CLASSA_NET); - else if (IN_CLASSB(ntohl(myip.s_addr))) - netmask = htonl(IN_CLASSB_NET); - else - netmask = htonl(IN_CLASSC_NET); -#ifdef BOOTP_DEBUG - if (debug) - printf("'native netmask' is %s\n", intoa(netmask)); -#endif - } - -#ifdef BOOTP_DEBUG - if (debug) - printf("mask: %s\n", intoa(netmask)); -#endif - - /* We need a gateway if root is on a different net */ - if (!SAMENET(myip, rootip, netmask)) { -#ifdef BOOTP_DEBUG - if (debug) - printf("need gateway for root ip\n"); -#endif - } - - /* Toss gateway if on a different net */ - if (!SAMENET(myip, gateip, netmask)) { -#ifdef BOOTP_DEBUG - if (debug) - printf("gateway ip (%s) bad\n", inet_ntoa(gateip)); -#endif - gateip.s_addr = 0; - } - - /* Bump xid so next request will be unique. */ - ++d->xid; - free(pkt); -} - -/* Transmit a bootp request */ -static ssize_t -bootpsend(struct iodesc *d, void *pkt, size_t len) -{ - struct bootp *bp; - -#ifdef BOOTP_DEBUG - if (debug) - printf("bootpsend: d=%lx called.\n", (long)d); -#endif - - bp = pkt; - bp->bp_secs = htons((u_short)(getsecs() - bot)); - -#ifdef BOOTP_DEBUG - if (debug) - printf("bootpsend: calling sendudp\n"); -#endif - - return (sendudp(d, pkt, len)); -} - -static ssize_t -bootprecv(struct iodesc *d, void **pkt, void **payload, time_t tleft) -{ - ssize_t n; - struct bootp *bp; - void *ptr; - -#ifdef BOOTP_DEBUG - if (debug) - printf("bootp_recvoffer: called\n"); -#endif - - ptr = NULL; - n = readudp(d, &ptr, (void **)&bp, tleft); - if (n == -1 || n < sizeof(struct bootp) - BOOTP_VENDSIZE) - goto bad; - -#ifdef BOOTP_DEBUG - if (debug) - printf("bootprecv: checked. bp = %p, n = %zd\n", bp, n); -#endif - if (bp->bp_xid != htonl(d->xid)) { -#ifdef BOOTP_DEBUG - if (debug) { - printf("bootprecv: expected xid 0x%lx, got 0x%x\n", - d->xid, ntohl(bp->bp_xid)); - } -#endif - goto bad; - } - -#ifdef BOOTP_DEBUG - if (debug) - printf("bootprecv: got one!\n"); -#endif - - /* Suck out vendor info */ - if (bcmp(vm_rfc1048, bp->bp_vend, sizeof(vm_rfc1048)) == 0) { - int vsize = n - offsetof(struct bootp, bp_vend); - if (vend_rfc1048(bp->bp_vend, vsize) != 0) - goto bad; - - /* Save copy of bootp reply or DHCP ACK message */ - if (bp->bp_op == BOOTREPLY && - ((dhcp_ok == 1 && expected_dhcpmsgtype == DHCPACK) || - dhcp_ok == 0)) { - free(bootp_response); - bootp_response = malloc(n); - if (bootp_response != NULL) { - bootp_response_size = n; - bcopy(bp, bootp_response, bootp_response_size); - } - } - } -#ifdef BOOTP_VEND_CMU - else if (bcmp(vm_cmu, bp->bp_vend, sizeof(vm_cmu)) == 0) - vend_cmu(bp->bp_vend); -#endif - else - printf("bootprecv: unknown vendor 0x%lx\n", (long)bp->bp_vend); - - *pkt = ptr; - *payload = bp; - return (n); -bad: - free(ptr); - errno = 0; - return (-1); -} - -int -dhcp_try_rfc1048(u_char *cp, u_int len) -{ - - expected_dhcpmsgtype = DHCPACK; - if (bcmp(vm_rfc1048, cp, sizeof(vm_rfc1048)) == 0) { - return (vend_rfc1048(cp, len)); - } - return (-1); -} - -static int -vend_rfc1048(u_char *cp, u_int len) -{ - u_char *ep; - int size; - u_char tag; - const char *val; - -#ifdef BOOTP_DEBUG - if (debug) - printf("vend_rfc1048 bootp info. len=%d\n", len); -#endif - ep = cp + len; - - /* Step over magic cookie */ - cp += sizeof(int); - - setenv_(cp, ep, NULL); - - while (cp < ep) { - tag = *cp++; - size = *cp++; - if (tag == TAG_END) - break; - - if (tag == TAG_SUBNET_MASK) { - bcopy(cp, &netmask, sizeof(netmask)); - } - if (tag == TAG_GATEWAY) { - bcopy(cp, &gateip.s_addr, sizeof(gateip.s_addr)); - } - if (tag == TAG_SWAPSERVER) { - /* let it override bp_siaddr */ - bcopy(cp, &rootip.s_addr, sizeof(rootip.s_addr)); - } - if (tag == TAG_ROOTPATH) { - if ((val = getenv("dhcp.root-path")) == NULL) - val = (const char *)cp; - strlcpy(rootpath, val, sizeof(rootpath)); - } - if (tag == TAG_HOSTNAME) { - if ((val = getenv("dhcp.host-name")) == NULL) - val = (const char *)cp; - strlcpy(hostname, val, sizeof(hostname)); - } - if (tag == TAG_INTF_MTU) { - intf_mtu = 0; - if ((val = getenv("dhcp.interface-mtu")) != NULL) { - unsigned long tmp; - char *end; - - errno = 0; - /* - * Do not allow MTU to exceed max IPv4 packet - * size, max value of 16-bit word. - */ - tmp = strtoul(val, &end, 0); - if (errno != 0 || - *val == '\0' || *end != '\0' || - tmp > USHRT_MAX) { - printf("%s: bad value: \"%s\", " - "ignoring\n", - "dhcp.interface-mtu", val); - } else { - intf_mtu = (u_int)tmp; - } - } - if (intf_mtu <= 0) - intf_mtu = be16dec(cp); - } -#ifdef SUPPORT_DHCP - if (tag == TAG_DHCP_MSGTYPE) { - if(*cp != expected_dhcpmsgtype) - return(-1); - dhcp_ok = 1; - } - if (tag == TAG_SERVERID) { - bcopy(cp, &dhcp_serverip.s_addr, - sizeof(dhcp_serverip.s_addr)); - } -#endif - cp += size; - } - return(0); -} - -#ifdef BOOTP_VEND_CMU -static void -vend_cmu(u_char *cp) -{ - struct cmu_vend *vp; - -#ifdef BOOTP_DEBUG - if (debug) - printf("vend_cmu bootp info.\n"); -#endif - vp = (struct cmu_vend *)cp; - - if (vp->v_smask.s_addr != 0) { - netmask = vp->v_smask.s_addr; - } - if (vp->v_dgate.s_addr != 0) { - gateip = vp->v_dgate; - } -} -#endif - -#ifdef DHCP_ENV -/* - * Parse DHCP options and store them into kenv variables. - * Original code from Danny Braniss, modifications by Luigi Rizzo. - * - * The parser is driven by tables which specify the type and name of - * each dhcp option and how it appears in kenv. - * The first entry in the list contains the prefix used to set the kenv - * name (including the . if needed), the last entry must have a 0 tag. - * Entries do not need to be sorted though it helps for readability. - * - * Certain vendor-specific tables can be enabled according to DHCP_ENV. - * Set it to 0 if you don't want any. - */ -enum opt_fmt { __NONE = 0, - __8 = 1, __16 = 2, __32 = 4, /* Unsigned fields, value=size */ - __IP, /* IPv4 address */ - __TXT, /* C string */ - __BYTES, /* byte sequence, printed %02x */ - __INDIR, /* name=value */ - __ILIST, /* name=value;name=value ... */ - __VE, /* vendor specific, recurse */ -}; - -struct dhcp_opt { - uint8_t tag; - uint8_t fmt; - const char *desc; -}; - -static struct dhcp_opt vndr_opt[] = { /* Vendor Specific Options */ -#if DHCP_ENV == DHCP_ENV_FREEBSD /* FreeBSD table in the original code */ - {0, 0, "FreeBSD"}, /* prefix */ - {1, __TXT, "kernel"}, - {2, __TXT, "kernelname"}, - {3, __TXT, "kernel_options"}, - {4, __IP, "usr-ip"}, - {5, __TXT, "conf-path"}, - {6, __TXT, "rc.conf0"}, - {7, __TXT, "rc.conf1"}, - {8, __TXT, "rc.conf2"}, - {9, __TXT, "rc.conf3"}, - {10, __TXT, "rc.conf4"}, - {11, __TXT, "rc.conf5"}, - {12, __TXT, "rc.conf6"}, - {13, __TXT, "rc.conf7"}, - {14, __TXT, "rc.conf8"}, - {15, __TXT, "rc.conf9"}, - - {20, __TXT, "boot.nfsroot.options"}, - - {245, __INDIR, ""}, - {246, __INDIR, ""}, - {247, __INDIR, ""}, - {248, __INDIR, ""}, - {249, __INDIR, ""}, - {250, __INDIR, ""}, - {251, __INDIR, ""}, - {252, __INDIR, ""}, - {253, __INDIR, ""}, - {254, __INDIR, ""}, - -#elif DHCP_ENV == DHCP_ENV_PXE /* some pxe options, RFC4578 */ - {0, 0, "pxe"}, /* prefix */ - {93, __16, "system-architecture"}, - {94, __BYTES, "network-interface"}, - {97, __BYTES, "machine-identifier"}, -#else /* default (empty) table */ - {0, 0, "dhcp.vendor."}, /* prefix */ -#endif - {0, __TXT, "%soption-%d"} -}; - -static struct dhcp_opt dhcp_opt[] = { - /* DHCP Option names, formats and codes, from RFC2132. */ - {0, 0, "dhcp."}, // prefix - {1, __IP, "subnet-mask"}, - {2, __32, "time-offset"}, /* this is signed */ - {3, __IP, "routers"}, - {4, __IP, "time-servers"}, - {5, __IP, "ien116-name-servers"}, - {6, __IP, "domain-name-servers"}, - {7, __IP, "log-servers"}, - {8, __IP, "cookie-servers"}, - {9, __IP, "lpr-servers"}, - {10, __IP, "impress-servers"}, - {11, __IP, "resource-location-servers"}, - {12, __TXT, "host-name"}, - {13, __16, "boot-size"}, - {14, __TXT, "merit-dump"}, - {15, __TXT, "domain-name"}, - {16, __IP, "swap-server"}, - {17, __TXT, "root-path"}, - {18, __TXT, "extensions-path"}, - {19, __8, "ip-forwarding"}, - {20, __8, "non-local-source-routing"}, - {21, __IP, "policy-filter"}, - {22, __16, "max-dgram-reassembly"}, - {23, __8, "default-ip-ttl"}, - {24, __32, "path-mtu-aging-timeout"}, - {25, __16, "path-mtu-plateau-table"}, - {26, __16, "interface-mtu"}, - {27, __8, "all-subnets-local"}, - {28, __IP, "broadcast-address"}, - {29, __8, "perform-mask-discovery"}, - {30, __8, "mask-supplier"}, - {31, __8, "perform-router-discovery"}, - {32, __IP, "router-solicitation-address"}, - {33, __IP, "static-routes"}, - {34, __8, "trailer-encapsulation"}, - {35, __32, "arp-cache-timeout"}, - {36, __8, "ieee802-3-encapsulation"}, - {37, __8, "default-tcp-ttl"}, - {38, __32, "tcp-keepalive-interval"}, - {39, __8, "tcp-keepalive-garbage"}, - {40, __TXT, "nis-domain"}, - {41, __IP, "nis-servers"}, - {42, __IP, "ntp-servers"}, - {43, __VE, "vendor-encapsulated-options"}, - {44, __IP, "netbios-name-servers"}, - {45, __IP, "netbios-dd-server"}, - {46, __8, "netbios-node-type"}, - {47, __TXT, "netbios-scope"}, - {48, __IP, "x-font-servers"}, - {49, __IP, "x-display-managers"}, - {50, __IP, "dhcp-requested-address"}, - {51, __32, "dhcp-lease-time"}, - {52, __8, "dhcp-option-overload"}, - {53, __8, "dhcp-message-type"}, - {54, __IP, "dhcp-server-identifier"}, - {55, __8, "dhcp-parameter-request-list"}, - {56, __TXT, "dhcp-message"}, - {57, __16, "dhcp-max-message-size"}, - {58, __32, "dhcp-renewal-time"}, - {59, __32, "dhcp-rebinding-time"}, - {60, __TXT, "vendor-class-identifier"}, - {61, __TXT, "dhcp-client-identifier"}, - {64, __TXT, "nisplus-domain"}, - {65, __IP, "nisplus-servers"}, - {66, __TXT, "tftp-server-name"}, - {67, __TXT, "bootfile-name"}, - {68, __IP, "mobile-ip-home-agent"}, - {69, __IP, "smtp-server"}, - {70, __IP, "pop-server"}, - {71, __IP, "nntp-server"}, - {72, __IP, "www-server"}, - {73, __IP, "finger-server"}, - {74, __IP, "irc-server"}, - {75, __IP, "streettalk-server"}, - {76, __IP, "streettalk-directory-assistance-server"}, - {77, __TXT, "user-class"}, - {85, __IP, "nds-servers"}, - {86, __TXT, "nds-tree-name"}, - {87, __TXT, "nds-context"}, - {210, __TXT, "authenticate"}, - - /* use the following entries for arbitrary variables */ - {246, __ILIST, ""}, - {247, __ILIST, ""}, - {248, __ILIST, ""}, - {249, __ILIST, ""}, - {250, __INDIR, ""}, - {251, __INDIR, ""}, - {252, __INDIR, ""}, - {253, __INDIR, ""}, - {254, __INDIR, ""}, - {0, __TXT, "%soption-%d"} -}; - -/* - * parse a dhcp response, set environment variables translating options - * names and values according to the tables above. Also set dhcp.tags - * to the list of selected tags. - */ -static void -setenv_(u_char *cp, u_char *ep, struct dhcp_opt *opts) -{ - u_char *ncp; - u_char tag; - char tags[512], *tp; /* the list of tags */ - -#define FLD_SEP ',' /* separator in list of elements */ - ncp = cp; - tp = tags; - if (opts == NULL) - opts = dhcp_opt; - - while (ncp < ep) { - unsigned int size; /* option size */ - char *vp, *endv, buf[256]; /* the value buffer */ - struct dhcp_opt *op; - - tag = *ncp++; /* extract tag and size */ - size = *ncp++; - cp = ncp; /* current payload */ - ncp += size; /* point to the next option */ - - if (tag == TAG_END) - break; - if (tag == 0) - continue; - - for (op = opts+1; op->tag && op->tag != tag; op++) - ; - /* if not found we end up on the default entry */ - - /* - * Copy data into the buffer. libstand does not have snprintf so we - * need to be careful with sprintf(). With strings, the source is - * always <256 char so shorter than the buffer so we are safe; with - * other arguments, the longest string is inet_ntoa which is 16 bytes - * so we make sure to have always enough room in the string before - * trying an sprint. - */ - vp = buf; - *vp = '\0'; - endv = buf + sizeof(buf) - 1 - 16; /* last valid write position */ - - switch(op->fmt) { - case __NONE: - break; /* should not happen */ - - case __VE: /* recurse, vendor specific */ - setenv_(cp, cp+size, vndr_opt); - break; - - case __IP: /* ip address */ - for (; size > 0 && vp < endv; size -= 4, cp += 4) { - struct in_addr in_ip; /* ip addresses */ - if (vp != buf) - *vp++ = FLD_SEP; - bcopy(cp, &in_ip.s_addr, sizeof(in_ip.s_addr)); - sprintf(vp, "%s", inet_ntoa(in_ip)); - vp += strlen(vp); - } - break; - - case __BYTES: /* opaque byte string */ - for (; size > 0 && vp < endv; size -= 1, cp += 1) { - sprintf(vp, "%02x", *cp); - vp += strlen(vp); - } - break; - - case __TXT: - bcopy(cp, buf, size); /* cannot overflow */ - buf[size] = 0; - break; - - case __32: - case __16: - case __8: /* op->fmt is also the length of each field */ - for (; size > 0 && vp < endv; size -= op->fmt, cp += op->fmt) { - uint32_t v; - if (op->fmt == __32) - v = (cp[0]<<24) + (cp[1]<<16) + (cp[2]<<8) + cp[3]; - else if (op->fmt == __16) - v = (cp[0]<<8) + cp[1]; - else - v = cp[0]; - if (vp != buf) - *vp++ = FLD_SEP; - sprintf(vp, "%u", v); - vp += strlen(vp); - } - break; - - case __INDIR: /* name=value */ - case __ILIST: /* name=value;name=value... */ - bcopy(cp, buf, size); /* cannot overflow */ - buf[size] = '\0'; - for (endv = buf; endv; endv = vp) { - u_char *s = NULL; /* semicolon ? */ - - /* skip leading whitespace */ - while (*endv && strchr(" \t\n\r", *endv)) - endv++; - vp = strchr(endv, '='); /* find name=value separator */ - if (!vp) - break; - *vp++ = 0; - if (op->fmt == __ILIST && (s = strchr(vp, ';'))) - *s++ = '\0'; - setenv(endv, vp, 1); - vp = s; /* prepare for next round */ - } - buf[0] = '\0'; /* option already done */ - } - - if (tp - tags < sizeof(tags) - 5) { /* add tag to the list */ - if (tp != tags) - *tp++ = FLD_SEP; - sprintf(tp, "%d", tag); - tp += strlen(tp); - } - if (buf[0]) { - char env[128]; /* the string name */ - - if (op->tag == 0) - sprintf(env, op->desc, opts[0].desc, tag); - else - sprintf(env, "%s%s", opts[0].desc, op->desc); - /* - * Do not replace existing values in the environment, so that - * locally-obtained values can override server-provided values. - */ - setenv(env, buf, 0); - } - } - if (tp != tags) { - char env[128]; /* the string name */ - sprintf(env, "%stags", opts[0].desc); - setenv(env, tags, 1); - } -} -#endif /* additional dhcp */ diff --git a/lib/libstand/bootp.h b/lib/libstand/bootp.h deleted file mode 100644 index 2e7049b872af..000000000000 --- a/lib/libstand/bootp.h +++ /dev/null @@ -1,151 +0,0 @@ -/* $NetBSD: bootp.h,v 1.4 1997/09/06 13:55:57 drochner Exp $ */ - -/* - * Bootstrap Protocol (BOOTP). RFC951 and RFC1048. - * - * This file specifies the "implementation-independent" BOOTP protocol - * information which is common to both client and server. - * - * Copyright 1988 by Carnegie Mellon. - * - * Permission to use, copy, modify, and distribute this program for any - * purpose and without fee is hereby granted, provided that this copyright - * and permission notice appear on all copies and supporting documentation, - * the name of Carnegie Mellon not be used in advertising or publicity - * pertaining to distribution of the program without specific prior - * permission, and notice be given in supporting documentation that copying - * and distribution is by permission of Carnegie Mellon and Stanford - * University. Carnegie Mellon makes no representations about the - * suitability of this software for any purpose. It is provided "as is" - * without express or implied warranty. - * - * $FreeBSD$ - */ - -#ifndef _BOOTP_H_ -#define _BOOTP_H_ - -struct bootp { - unsigned char bp_op; /* packet opcode type */ - unsigned char bp_htype; /* hardware addr type */ - unsigned char bp_hlen; /* hardware addr length */ - unsigned char bp_hops; /* gateway hops */ - unsigned int bp_xid; /* transaction ID */ - unsigned short bp_secs; /* seconds since boot began */ - unsigned short bp_flags; - struct in_addr bp_ciaddr; /* client IP address */ - struct in_addr bp_yiaddr; /* 'your' IP address */ - struct in_addr bp_siaddr; /* server IP address */ - struct in_addr bp_giaddr; /* gateway IP address */ - unsigned char bp_chaddr[16]; /* client hardware address */ - unsigned char bp_sname[64]; /* server host name */ - unsigned char bp_file[128]; /* boot file name */ -#ifdef SUPPORT_DHCP -#define BOOTP_VENDSIZE 312 -#else -#define BOOTP_VENDSIZE 64 -#endif - unsigned char bp_vend[BOOTP_VENDSIZE]; /* vendor-specific area */ -}; - -/* - * UDP port numbers, server and client. - */ -#define IPPORT_BOOTPS 67 -#define IPPORT_BOOTPC 68 - -#define BOOTREPLY 2 -#define BOOTREQUEST 1 - - -/* - * Vendor magic cookie (v_magic) for CMU - */ -#define VM_CMU "CMU" - -/* - * Vendor magic cookie (v_magic) for RFC1048 - */ -#define VM_RFC1048 { 99, 130, 83, 99 } - - - -/* - * RFC1048 tag values used to specify what information is being supplied in - * the vendor field of the packet. - */ - -#define TAG_PAD ((unsigned char) 0) -#define TAG_SUBNET_MASK ((unsigned char) 1) -#define TAG_TIME_OFFSET ((unsigned char) 2) -#define TAG_GATEWAY ((unsigned char) 3) -#define TAG_TIME_SERVER ((unsigned char) 4) -#define TAG_NAME_SERVER ((unsigned char) 5) -#define TAG_DOMAIN_SERVER ((unsigned char) 6) -#define TAG_LOG_SERVER ((unsigned char) 7) -#define TAG_COOKIE_SERVER ((unsigned char) 8) -#define TAG_LPR_SERVER ((unsigned char) 9) -#define TAG_IMPRESS_SERVER ((unsigned char) 10) -#define TAG_RLP_SERVER ((unsigned char) 11) -#define TAG_HOSTNAME ((unsigned char) 12) -#define TAG_BOOTSIZE ((unsigned char) 13) -#define TAG_DUMPFILE ((unsigned char) 14) -#define TAG_DOMAINNAME ((unsigned char) 15) -#define TAG_SWAPSERVER ((unsigned char) 16) -#define TAG_ROOTPATH ((unsigned char) 17) -#define TAG_INTF_MTU ((unsigned char) 26) - -#ifdef SUPPORT_DHCP -#define TAG_REQ_ADDR ((unsigned char) 50) -#define TAG_LEASETIME ((unsigned char) 51) -#define TAG_OVERLOAD ((unsigned char) 52) -#define TAG_DHCP_MSGTYPE ((unsigned char) 53) -#define TAG_SERVERID ((unsigned char) 54) -#define TAG_PARAM_REQ ((unsigned char) 55) -#define TAG_MSG ((unsigned char) 56) -#define TAG_MAXSIZE ((unsigned char) 57) -#define TAG_T1 ((unsigned char) 58) -#define TAG_T2 ((unsigned char) 59) -#define TAG_CLASSID ((unsigned char) 60) -#define TAG_CLIENTID ((unsigned char) 61) -#define TAG_USER_CLASS ((unsigned char) 77) -#endif - -#define TAG_END ((unsigned char) 255) - -#ifdef SUPPORT_DHCP -#define DHCPDISCOVER 1 -#define DHCPOFFER 2 -#define DHCPREQUEST 3 -#define DHCPDECLINE 4 -#define DHCPACK 5 -#define DHCPNAK 6 -#define DHCPRELEASE 7 -#endif - -/* - * "vendor" data permitted for CMU bootp clients. - */ - -struct cmu_vend { - unsigned char v_magic[4]; /* magic number */ - unsigned int v_flags; /* flags/opcodes, etc. */ - struct in_addr v_smask; /* Subnet mask */ - struct in_addr v_dgate; /* Default gateway */ - struct in_addr v_dns1, v_dns2; /* Domain name servers */ - struct in_addr v_ins1, v_ins2; /* IEN-116 name servers */ - struct in_addr v_ts1, v_ts2; /* Time servers */ - unsigned char v_unused[25]; /* currently unused */ -}; - - -/* v_flags values */ -#define VF_SMASK 1 /* Subnet mask field contains valid data */ - -/* cached bootp response/dhcp ack */ -extern struct bootp *bootp_response; -extern size_t bootp_response_size; - -int dhcp_try_rfc1048(u_char *cp, u_int len); - -#endif /* _BOOTP_H_ */ diff --git a/lib/libstand/bootparam.c b/lib/libstand/bootparam.c deleted file mode 100644 index 1de2d53d77fe..000000000000 --- a/lib/libstand/bootparam.c +++ /dev/null @@ -1,435 +0,0 @@ -/* $NetBSD: bootparam.c,v 1.11 1997/06/26 19:11:32 drochner Exp $ */ - -/* - * Copyright (c) 1995 Gordon W. Ross - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * 4. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Gordon W. Ross - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * RPC/bootparams - */ - -#include <sys/param.h> -#include <sys/socket.h> - -#include <net/if.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> - -#include <string.h> - -#include "rpcv2.h" - -#include "stand.h" -#include "net.h" -#include "netif.h" -#include "rpc.h" -#include "bootparam.h" - -#ifdef DEBUG_RPC -#define RPC_PRINTF(a) printf a -#else -#define RPC_PRINTF(a) -#endif - -struct in_addr bp_server_addr; /* net order */ -n_short bp_server_port; /* net order */ - -/* - * RPC definitions for bootparamd - */ -#define BOOTPARAM_PROG 100026 -#define BOOTPARAM_VERS 1 -#define BOOTPARAM_WHOAMI 1 -#define BOOTPARAM_GETFILE 2 - -/* - * Inet address in RPC messages - * (Note, really four ints, NOT chars. Blech.) - */ -struct xdr_inaddr { - u_int32_t atype; - int32_t addr[4]; -}; - -int xdr_inaddr_encode(char **p, struct in_addr ia); -int xdr_inaddr_decode(char **p, struct in_addr *ia); - -int xdr_string_encode(char **p, char *str, int len); -int xdr_string_decode(char **p, char *str, int *len_p); - - -/* - * RPC: bootparam/whoami - * Given client IP address, get: - * client name (hostname) - * domain name (domainname) - * gateway address - * - * The hostname and domainname are set here for convenience. - * - * Note - bpsin is initialized to the broadcast address, - * and will be replaced with the bootparam server address - * after this call is complete. Have to use PMAP_PROC_CALL - * to make sure we get responses only from a servers that - * know about us (don't want to broadcast a getport call). - */ -int -bp_whoami(int sockfd) -{ - /* RPC structures for PMAPPROC_CALLIT */ - struct args { - u_int32_t prog; - u_int32_t vers; - u_int32_t proc; - u_int32_t arglen; - struct xdr_inaddr xina; - } *args; - struct repl { - u_int16_t _pad; - u_int16_t port; - u_int32_t encap_len; - /* encapsulated data here */ - n_long capsule[64]; - } *repl; - struct { - n_long h[RPC_HEADER_WORDS]; - struct args d; - } sdata; - char *send_tail, *recv_head; - struct iodesc *d; - void *pkt; - int len, x, rc; - - RPC_PRINTF(("bp_whoami: myip=%s\n", inet_ntoa(myip))); - - rc = -1; - if (!(d = socktodesc(sockfd))) { - RPC_PRINTF(("bp_whoami: bad socket. %d\n", sockfd)); - return (rc); - } - args = &sdata.d; - - /* - * Build request args for PMAPPROC_CALLIT. - */ - args->prog = htonl(BOOTPARAM_PROG); - args->vers = htonl(BOOTPARAM_VERS); - args->proc = htonl(BOOTPARAM_WHOAMI); - args->arglen = htonl(sizeof(struct xdr_inaddr)); - send_tail = (char*) &args->xina; - - /* - * append encapsulated data (client IP address) - */ - if (xdr_inaddr_encode(&send_tail, myip)) - return (rc); - - /* RPC: portmap/callit */ - d->myport = htons(--rpc_port); - d->destip.s_addr = INADDR_BROADCAST; /* XXX: subnet bcast? */ - /* rpc_call will set d->destport */ - - pkt = NULL; - len = rpc_call(d, PMAPPROG, PMAPVERS, PMAPPROC_CALLIT, - args, send_tail - (char*)args, (void **)&repl, &pkt); - if (len < 8) { - printf("bootparamd: 'whoami' call failed\n"); - goto done; - } - - /* Save bootparam server address (from IP header). */ - rpc_fromaddr(repl, &bp_server_addr, &bp_server_port); - - /* - * Note that bp_server_port is now 111 due to the - * indirect call (using PMAPPROC_CALLIT), so get the - * actual port number from the reply data. - */ - bp_server_port = repl->port; - - RPC_PRINTF(("bp_whoami: server at %s:%d\n", - inet_ntoa(bp_server_addr), ntohs(bp_server_port))); - - /* We have just done a portmap call, so cache the portnum. */ - rpc_pmap_putcache(bp_server_addr, - BOOTPARAM_PROG, - BOOTPARAM_VERS, - (int)ntohs(bp_server_port)); - - /* - * Parse the encapsulated results from bootparam/whoami - */ - x = ntohl(repl->encap_len); - if (len < x) { - printf("bp_whoami: short reply, %d < %d\n", len, x); - goto done; - } - recv_head = (char*) repl->capsule; - - /* client name */ - hostnamelen = MAXHOSTNAMELEN-1; - if (xdr_string_decode(&recv_head, hostname, &hostnamelen)) { - RPC_PRINTF(("bp_whoami: bad hostname\n")); - goto done; - } - - /* domain name */ - domainnamelen = MAXHOSTNAMELEN-1; - if (xdr_string_decode(&recv_head, domainname, &domainnamelen)) { - RPC_PRINTF(("bp_whoami: bad domainname\n")); - goto done; - } - - /* gateway address */ - if (xdr_inaddr_decode(&recv_head, &gateip)) { - RPC_PRINTF(("bp_whoami: bad gateway\n")); - goto done; - } - - /* success */ - rc = 0; -done: - free(pkt); - return (rc); -} - - -/* - * RPC: bootparam/getfile - * Given client name and file "key", get: - * server name - * server IP address - * server pathname - */ -int -bp_getfile(int sockfd, char *key, struct in_addr *serv_addr, char *pathname) -{ - struct { - n_long h[RPC_HEADER_WORDS]; - n_long d[64]; - } sdata; - void *pkt; - char serv_name[FNAME_SIZE]; - char *rdata, *send_tail; - /* misc... */ - struct iodesc *d; - int rc = -1, sn_len, path_len, rlen; - - if (!(d = socktodesc(sockfd))) { - RPC_PRINTF(("bp_getfile: bad socket. %d\n", sockfd)); - return (-1); - } - - send_tail = (char*) sdata.d; - - /* - * Build request message. - */ - - /* client name (hostname) */ - if (xdr_string_encode(&send_tail, hostname, hostnamelen)) { - RPC_PRINTF(("bp_getfile: bad client\n")); - return (-1); - } - - /* key name (root or swap) */ - if (xdr_string_encode(&send_tail, key, strlen(key))) { - RPC_PRINTF(("bp_getfile: bad key\n")); - return (-1); - } - - /* RPC: bootparam/getfile */ - d->myport = htons(--rpc_port); - d->destip = bp_server_addr; - /* rpc_call will set d->destport */ - pkt = NULL; - rlen = rpc_call(d, - BOOTPARAM_PROG, BOOTPARAM_VERS, BOOTPARAM_GETFILE, - sdata.d, send_tail - (char*)sdata.d, - (void **)&rdata, &pkt); - if (rlen < 4) { - RPC_PRINTF(("bp_getfile: short reply\n")); - errno = EBADRPC; - goto done; - } - - /* - * Parse result message. - */ - - /* server name */ - sn_len = FNAME_SIZE-1; - if (xdr_string_decode(&rdata, serv_name, &sn_len)) { - RPC_PRINTF(("bp_getfile: bad server name\n")); - goto done; - } - - /* server IP address (mountd/NFS) */ - if (xdr_inaddr_decode(&rdata, serv_addr)) { - RPC_PRINTF(("bp_getfile: bad server addr\n")); - goto done; - } - - /* server pathname */ - path_len = MAXPATHLEN-1; - if (xdr_string_decode(&rdata, pathname, &path_len)) { - RPC_PRINTF(("bp_getfile: bad server path\n")); - goto done; - } - - /* success */ - rc = 0; -done: - free(pkt); - return (rc); -} - - -/* - * eXternal Data Representation routines. - * (but with non-standard args...) - */ - - -int -xdr_string_encode(char **pkt, char *str, int len) -{ - uint32_t *lenp; - char *datap; - int padlen = (len + 3) & ~3; /* padded length */ - - /* The data will be int aligned. */ - lenp = (uint32_t *) *pkt; - *pkt += sizeof(*lenp); - *lenp = htonl(len); - - datap = *pkt; - *pkt += padlen; - bcopy(str, datap, len); - - return (0); -} - -int -xdr_string_decode(char **pkt, char *str, int *len_p) -{ - uint32_t *lenp; - char *datap; - int slen; /* string length */ - int plen; /* padded length */ - - /* The data will be int aligned. */ - lenp = (uint32_t *) *pkt; - *pkt += sizeof(*lenp); - slen = ntohl(*lenp); - plen = (slen + 3) & ~3; - - if (slen > *len_p) - slen = *len_p; - datap = *pkt; - *pkt += plen; - bcopy(datap, str, slen); - - str[slen] = '\0'; - *len_p = slen; - - return (0); -} - - -int -xdr_inaddr_encode(char **pkt, struct in_addr ia) -{ - struct xdr_inaddr *xi; - u_char *cp; - int32_t *ip; - union { - n_long l; /* network order */ - u_char c[4]; - } uia; - - /* The data will be int aligned. */ - xi = (struct xdr_inaddr *) *pkt; - *pkt += sizeof(*xi); - xi->atype = htonl(1); - uia.l = ia.s_addr; - cp = uia.c; - ip = xi->addr; - /* - * Note: the htonl() calls below DO NOT - * imply that uia.l is in host order. - * In fact this needs it in net order. - */ - *ip++ = htonl((unsigned int)*cp++); - *ip++ = htonl((unsigned int)*cp++); - *ip++ = htonl((unsigned int)*cp++); - *ip++ = htonl((unsigned int)*cp++); - - return (0); -} - -int -xdr_inaddr_decode(char **pkt, struct in_addr *ia) -{ - struct xdr_inaddr *xi; - u_char *cp; - int32_t *ip; - union { - n_long l; /* network order */ - u_char c[4]; - } uia; - - /* The data will be int aligned. */ - xi = (struct xdr_inaddr *) *pkt; - *pkt += sizeof(*xi); - if (xi->atype != htonl(1)) { - RPC_PRINTF(("xdr_inaddr_decode: bad addrtype=%d\n", - ntohl(xi->atype))); - return(-1); - } - - cp = uia.c; - ip = xi->addr; - /* - * Note: the ntohl() calls below DO NOT - * imply that uia.l is in host order. - * In fact this needs it in net order. - */ - *cp++ = ntohl(*ip++); - *cp++ = ntohl(*ip++); - *cp++ = ntohl(*ip++); - *cp++ = ntohl(*ip++); - ia->s_addr = uia.l; - - return (0); -} diff --git a/lib/libstand/bootparam.h b/lib/libstand/bootparam.h deleted file mode 100644 index 6f0c773a0759..000000000000 --- a/lib/libstand/bootparam.h +++ /dev/null @@ -1,5 +0,0 @@ -/* $NetBSD: bootparam.h,v 1.3 1998/01/05 19:19:41 perry Exp $ */ - -int bp_whoami(int sock); -int bp_getfile(int sock, char *key, struct in_addr *addrp, char *path); - diff --git a/lib/libstand/bzipfs.c b/lib/libstand/bzipfs.c deleted file mode 100644 index ff1514efeed3..000000000000 --- a/lib/libstand/bzipfs.c +++ /dev/null @@ -1,388 +0,0 @@ -/* - * Copyright (c) 1998 Michael Smith. - * Copyright (c) 2000 Maxim Sobolev - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#ifndef REGRESSION -#include "stand.h" -#else -#include <stdlib.h> -#include <sys/errno.h> -#include <sys/fcntl.h> -#include <sys/types.h> -#include <sys/unistd.h> - -struct open_file { - int f_flags; /* see F_* below */ - void *f_fsdata; /* file system specific data */ -}; -#define F_READ 0x0001 /* file opened for reading */ -#define EOFFSET (ELAST+8) /* relative seek not supported */ -static inline u_int min(u_int a, u_int b) { return(a < b ? a : b); } -#define panic(x, y) abort() -#endif - -#include <sys/stat.h> -#include <string.h> -#include <bzlib.h> - -#define BZ_BUFSIZE 2048 /* XXX larger? */ - -struct bz_file -{ - int bzf_rawfd; - bz_stream bzf_bzstream; - char bzf_buf[BZ_BUFSIZE]; - int bzf_endseen; -}; - -static int bzf_fill(struct bz_file *z); -static int bzf_open(const char *path, struct open_file *f); -static int bzf_close(struct open_file *f); -static int bzf_read(struct open_file *f, void *buf, size_t size, size_t *resid); -static off_t bzf_seek(struct open_file *f, off_t offset, int where); -static int bzf_stat(struct open_file *f, struct stat *sb); - -#ifndef REGRESSION -struct fs_ops bzipfs_fsops = { - "bzip", - bzf_open, - bzf_close, - bzf_read, - null_write, - bzf_seek, - bzf_stat, - null_readdir -}; -#endif - -static int -bzf_fill(struct bz_file *bzf) -{ - int result; - int req; - - req = BZ_BUFSIZE - bzf->bzf_bzstream.avail_in; - result = 0; - - /* If we need more */ - if (req > 0) { - /* move old data to bottom of buffer */ - if (req < BZ_BUFSIZE) - bcopy(bzf->bzf_buf + req, bzf->bzf_buf, BZ_BUFSIZE - req); - - /* read to fill buffer and update availibility data */ - result = read(bzf->bzf_rawfd, bzf->bzf_buf + bzf->bzf_bzstream.avail_in, req); - bzf->bzf_bzstream.next_in = bzf->bzf_buf; - if (result >= 0) - bzf->bzf_bzstream.avail_in += result; - } - return(result); -} - -/* - * Adapted from get_byte/check_header in libz - * - * Returns 0 if the header is OK, nonzero if not. - */ -static int -get_byte(struct bz_file *bzf) -{ - if ((bzf->bzf_bzstream.avail_in == 0) && (bzf_fill(bzf) == -1)) - return(-1); - bzf->bzf_bzstream.avail_in--; - return(*(bzf->bzf_bzstream.next_in)++); -} - -static int bz_magic[3] = {'B', 'Z', 'h'}; /* bzip2 magic header */ - -static int -check_header(struct bz_file *bzf) -{ - unsigned int len; - int c; - - /* Check the bzip2 magic header */ - for (len = 0; len < 3; len++) { - c = get_byte(bzf); - if (c != bz_magic[len]) { - return(1); - } - } - /* Check that the block size is valid */ - c = get_byte(bzf); - if (c < '1' || c > '9') - return(1); - - /* Put back bytes that we've took from the input stream */ - bzf->bzf_bzstream.next_in -= 4; - bzf->bzf_bzstream.avail_in += 4; - - return(0); -} - -static int -bzf_open(const char *fname, struct open_file *f) -{ - static char *bzfname; - int rawfd; - struct bz_file *bzf; - char *cp; - int error; - struct stat sb; - - /* Have to be in "just read it" mode */ - if (f->f_flags != F_READ) - return(EPERM); - - /* If the name already ends in .gz or .bz2, ignore it */ - if ((cp = strrchr(fname, '.')) && (!strcmp(cp, ".gz") - || !strcmp(cp, ".bz2") || !strcmp(cp, ".split"))) - return(ENOENT); - - /* Construct new name */ - bzfname = malloc(strlen(fname) + 5); - if (bzfname == NULL) - return(ENOMEM); - sprintf(bzfname, "%s.bz2", fname); - - /* Try to open the compressed datafile */ - rawfd = open(bzfname, O_RDONLY); - free(bzfname); - if (rawfd == -1) - return(ENOENT); - - if (fstat(rawfd, &sb) < 0) { - printf("bzf_open: stat failed\n"); - close(rawfd); - return(ENOENT); - } - if (!S_ISREG(sb.st_mode)) { - printf("bzf_open: not a file\n"); - close(rawfd); - return(EISDIR); /* best guess */ - } - - /* Allocate a bz_file structure, populate it */ - bzf = malloc(sizeof(struct bz_file)); - if (bzf == NULL) - return(ENOMEM); - bzero(bzf, sizeof(struct bz_file)); - bzf->bzf_rawfd = rawfd; - - /* Verify that the file is bzipped */ - if (check_header(bzf)) { - close(bzf->bzf_rawfd); - free(bzf); - return(EFTYPE); - } - - /* Initialise the inflation engine */ - if ((error = BZ2_bzDecompressInit(&(bzf->bzf_bzstream), 0, 1)) != BZ_OK) { - printf("bzf_open: BZ2_bzDecompressInit returned %d\n", error); - close(bzf->bzf_rawfd); - free(bzf); - return(EIO); - } - - /* Looks OK, we'll take it */ - f->f_fsdata = bzf; - return(0); -} - -static int -bzf_close(struct open_file *f) -{ - struct bz_file *bzf = (struct bz_file *)f->f_fsdata; - - BZ2_bzDecompressEnd(&(bzf->bzf_bzstream)); - close(bzf->bzf_rawfd); - free(bzf); - return(0); -} - -static int -bzf_read(struct open_file *f, void *buf, size_t size, size_t *resid) -{ - struct bz_file *bzf = (struct bz_file *)f->f_fsdata; - int error; - - bzf->bzf_bzstream.next_out = buf; /* where and how much */ - bzf->bzf_bzstream.avail_out = size; - - while (bzf->bzf_bzstream.avail_out && bzf->bzf_endseen == 0) { - if ((bzf->bzf_bzstream.avail_in == 0) && (bzf_fill(bzf) == -1)) { - printf("bzf_read: fill error\n"); - return(EIO); - } - if (bzf->bzf_bzstream.avail_in == 0) { /* oops, unexpected EOF */ - printf("bzf_read: unexpected EOF\n"); - if (bzf->bzf_bzstream.avail_out == size) - return(EIO); - break; - } - - error = BZ2_bzDecompress(&bzf->bzf_bzstream); /* decompression pass */ - if (error == BZ_STREAM_END) { /* EOF, all done */ - bzf->bzf_endseen = 1; - break; - } - if (error != BZ_OK) { /* argh, decompression error */ - printf("bzf_read: BZ2_bzDecompress returned %d\n", error); - return(EIO); - } - } - if (resid != NULL) - *resid = bzf->bzf_bzstream.avail_out; - return(0); -} - -static int -bzf_rewind(struct open_file *f) -{ - struct bz_file *bzf = (struct bz_file *)f->f_fsdata; - struct bz_file *bzf_tmp; - - /* - * Since bzip2 does not have an equivalent inflateReset function a crude - * one needs to be provided. The functions all called in such a way that - * at any time an error occurs a roll back can be done (effectively making - * this rewind 'atomic', either the reset occurs successfully or not at all, - * with no 'undefined' state happening). - */ - - /* Allocate a bz_file structure, populate it */ - bzf_tmp = malloc(sizeof(struct bz_file)); - if (bzf_tmp == NULL) - return(-1); - bzero(bzf_tmp, sizeof(struct bz_file)); - bzf_tmp->bzf_rawfd = bzf->bzf_rawfd; - - /* Initialise the inflation engine */ - if (BZ2_bzDecompressInit(&(bzf_tmp->bzf_bzstream), 0, 1) != BZ_OK) { - free(bzf_tmp); - return(-1); - } - - /* Seek back to the beginning of the file */ - if (lseek(bzf->bzf_rawfd, 0, SEEK_SET) == -1) { - BZ2_bzDecompressEnd(&(bzf_tmp->bzf_bzstream)); - free(bzf_tmp); - return(-1); - } - - /* Free old bz_file data */ - BZ2_bzDecompressEnd(&(bzf->bzf_bzstream)); - free(bzf); - - /* Use the new bz_file data */ - f->f_fsdata = bzf_tmp; - - return(0); -} - -static off_t -bzf_seek(struct open_file *f, off_t offset, int where) -{ - struct bz_file *bzf = (struct bz_file *)f->f_fsdata; - off_t target; - char discard[16]; - - switch (where) { - case SEEK_SET: - target = offset; - break; - case SEEK_CUR: - target = offset + bzf->bzf_bzstream.total_out_lo32; - break; - default: - errno = EINVAL; - return(-1); - } - - /* Can we get there from here? */ - if (target < bzf->bzf_bzstream.total_out_lo32 && bzf_rewind(f) != 0) { - errno = EOFFSET; - return -1; - } - - /* if bzf_rewind was called then bzf has changed */ - bzf = (struct bz_file *)f->f_fsdata; - - /* skip forwards if required */ - while (target > bzf->bzf_bzstream.total_out_lo32) { - errno = bzf_read(f, discard, min(sizeof(discard), - target - bzf->bzf_bzstream.total_out_lo32), NULL); - if (errno) - return(-1); - } - /* This is where we are (be honest if we overshot) */ - return(bzf->bzf_bzstream.total_out_lo32); -} - -static int -bzf_stat(struct open_file *f, struct stat *sb) -{ - struct bz_file *bzf = (struct bz_file *)f->f_fsdata; - int result; - - /* stat as normal, but indicate that size is unknown */ - if ((result = fstat(bzf->bzf_rawfd, sb)) == 0) - sb->st_size = -1; - return(result); -} - -void -bz_internal_error(int errorcode) -{ - panic("bzipfs: critical error %d in bzip2 library occured\n", errorcode); -} - -#ifdef REGRESSION -/* Small test case, open and decompress test.bz2 */ -int main() -{ - struct open_file f; - char buf[1024]; - size_t resid; - int err; - - memset(&f, '\0', sizeof(f)); - f.f_flags = F_READ; - err = bzf_open("test", &f); - if (err != 0) - exit(1); - do { - err = bzf_read(&f, buf, sizeof(buf), &resid); - } while (err == 0 && resid != sizeof(buf)); - - if (err != 0) - exit(2); - exit(0); -} -#endif diff --git a/lib/libstand/cd9660.c b/lib/libstand/cd9660.c deleted file mode 100644 index c5618838e4a6..000000000000 --- a/lib/libstand/cd9660.c +++ /dev/null @@ -1,600 +0,0 @@ -/* $NetBSD: cd9660.c,v 1.5 1997/06/26 19:11:33 drochner Exp $ */ - -/* - * Copyright (C) 1996 Wolfgang Solfrank. - * Copyright (C) 1996 TooLs GmbH. - * 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 TooLs GmbH. - * 4. The name of TooLs GmbH may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``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 TOOLS GMBH 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * Stand-alone ISO9660 file reading package. - * - * Note: This doesn't support Rock Ridge extensions, extended attributes, - * blocksizes other than 2048 bytes, multi-extent files, etc. - */ -#include <sys/param.h> -#include <string.h> -#include <sys/dirent.h> -#include <isofs/cd9660/iso.h> -#include <isofs/cd9660/cd9660_rrip.h> - -#include "stand.h" - -#define SUSP_CONTINUATION "CE" -#define SUSP_PRESENT "SP" -#define SUSP_STOP "ST" -#define SUSP_EXTREF "ER" -#define RRIP_NAME "NM" - -typedef struct { - ISO_SUSP_HEADER h; - u_char signature [ISODCL ( 5, 6)]; - u_char len_skp [ISODCL ( 7, 7)]; /* 711 */ -} ISO_SUSP_PRESENT; - -static int buf_read_file(struct open_file *f, char **buf_p, - size_t *size_p); -static int cd9660_open(const char *path, struct open_file *f); -static int cd9660_close(struct open_file *f); -static int cd9660_read(struct open_file *f, void *buf, size_t size, - size_t *resid); -static int cd9660_write(struct open_file *f, void *buf, size_t size, - size_t *resid); -static off_t cd9660_seek(struct open_file *f, off_t offset, int where); -static int cd9660_stat(struct open_file *f, struct stat *sb); -static int cd9660_readdir(struct open_file *f, struct dirent *d); -static int dirmatch(struct open_file *f, const char *path, - struct iso_directory_record *dp, int use_rrip, int lenskip); -static int rrip_check(struct open_file *f, struct iso_directory_record *dp, - int *lenskip); -static char *rrip_lookup_name(struct open_file *f, - struct iso_directory_record *dp, int lenskip, size_t *len); -static ISO_SUSP_HEADER *susp_lookup_record(struct open_file *f, - const char *identifier, struct iso_directory_record *dp, - int lenskip); - -struct fs_ops cd9660_fsops = { - "cd9660", - cd9660_open, - cd9660_close, - cd9660_read, - cd9660_write, - cd9660_seek, - cd9660_stat, - cd9660_readdir -}; - -#define F_ISDIR 0x0001 /* Directory */ -#define F_ROOTDIR 0x0002 /* Root directory */ -#define F_RR 0x0004 /* Rock Ridge on this volume */ - -struct file { - int f_flags; /* file flags */ - off_t f_off; /* Current offset within file */ - daddr_t f_bno; /* Starting block number */ - off_t f_size; /* Size of file */ - daddr_t f_buf_blkno; /* block number of data block */ - char *f_buf; /* buffer for data block */ - int f_susp_skip; /* len_skip for SUSP records */ -}; - -struct ptable_ent { - char namlen [ISODCL( 1, 1)]; /* 711 */ - char extlen [ISODCL( 2, 2)]; /* 711 */ - char block [ISODCL( 3, 6)]; /* 732 */ - char parent [ISODCL( 7, 8)]; /* 722 */ - char name [1]; -}; -#define PTFIXSZ 8 -#define PTSIZE(pp) roundup(PTFIXSZ + isonum_711((pp)->namlen), 2) - -#define cdb2devb(bno) ((bno) * ISO_DEFAULT_BLOCK_SIZE / DEV_BSIZE) - -static ISO_SUSP_HEADER * -susp_lookup_record(struct open_file *f, const char *identifier, - struct iso_directory_record *dp, int lenskip) -{ - static char susp_buffer[ISO_DEFAULT_BLOCK_SIZE]; - ISO_SUSP_HEADER *sh; - ISO_RRIP_CONT *shc; - char *p, *end; - int error; - size_t read; - - p = dp->name + isonum_711(dp->name_len) + lenskip; - /* Names of even length have a padding byte after the name. */ - if ((isonum_711(dp->name_len) & 1) == 0) - p++; - end = (char *)dp + isonum_711(dp->length); - while (p + 3 < end) { - sh = (ISO_SUSP_HEADER *)p; - if (bcmp(sh->type, identifier, 2) == 0) - return (sh); - if (bcmp(sh->type, SUSP_STOP, 2) == 0) - return (NULL); - if (bcmp(sh->type, SUSP_CONTINUATION, 2) == 0) { - shc = (ISO_RRIP_CONT *)sh; - error = f->f_dev->dv_strategy(f->f_devdata, F_READ, - cdb2devb(isonum_733(shc->location)), - ISO_DEFAULT_BLOCK_SIZE, susp_buffer, &read); - - /* Bail if it fails. */ - if (error != 0 || read != ISO_DEFAULT_BLOCK_SIZE) - return (NULL); - p = susp_buffer + isonum_733(shc->offset); - end = p + isonum_733(shc->length); - } else { - /* Ignore this record and skip to the next. */ - p += isonum_711(sh->length); - - /* Avoid infinite loops with corrupted file systems */ - if (isonum_711(sh->length) == 0) - return (NULL); - } - } - return (NULL); -} - -static char * -rrip_lookup_name(struct open_file *f, struct iso_directory_record *dp, - int lenskip, size_t *len) -{ - ISO_RRIP_ALTNAME *p; - - if (len == NULL) - return (NULL); - - p = (ISO_RRIP_ALTNAME *)susp_lookup_record(f, RRIP_NAME, dp, lenskip); - if (p == NULL) - return (NULL); - switch (*p->flags) { - case ISO_SUSP_CFLAG_CURRENT: - *len = 1; - return ("."); - case ISO_SUSP_CFLAG_PARENT: - *len = 2; - return (".."); - case 0: - *len = isonum_711(p->h.length) - 5; - return ((char *)p + 5); - default: - /* - * We don't handle hostnames or continued names as they are - * too hard, so just bail and use the default name. - */ - return (NULL); - } -} - -static int -rrip_check(struct open_file *f, struct iso_directory_record *dp, int *lenskip) -{ - ISO_SUSP_PRESENT *sp; - ISO_RRIP_EXTREF *er; - char *p; - - /* First, see if we can find a SP field. */ - p = dp->name + isonum_711(dp->name_len); - if (p > (char *)dp + isonum_711(dp->length)) - return (0); - sp = (ISO_SUSP_PRESENT *)p; - if (bcmp(sp->h.type, SUSP_PRESENT, 2) != 0) - return (0); - if (isonum_711(sp->h.length) != sizeof(ISO_SUSP_PRESENT)) - return (0); - if (sp->signature[0] != 0xbe || sp->signature[1] != 0xef) - return (0); - *lenskip = isonum_711(sp->len_skp); - - /* - * Now look for an ER field. If RRIP is present, then there must - * be at least one of these. It would be more pedantic to walk - * through the list of fields looking for a Rock Ridge ER field. - */ - er = (ISO_RRIP_EXTREF *)susp_lookup_record(f, SUSP_EXTREF, dp, 0); - if (er == NULL) - return (0); - return (1); -} - -static int -dirmatch(struct open_file *f, const char *path, struct iso_directory_record *dp, - int use_rrip, int lenskip) -{ - size_t len; - char *cp; - int i, icase; - - if (use_rrip) - cp = rrip_lookup_name(f, dp, lenskip, &len); - else - cp = NULL; - if (cp == NULL) { - len = isonum_711(dp->name_len); - cp = dp->name; - icase = 1; - } else - icase = 0; - for (i = len; --i >= 0; path++, cp++) { - if (!*path || *path == '/') - break; - if (*path == *cp) - continue; - if (!icase && toupper(*path) == *cp) - continue; - return 0; - } - if (*path && *path != '/') - return 0; - /* - * Allow stripping of trailing dots and the version number. - * Note that this will find the first instead of the last version - * of a file. - */ - if (i >= 0 && (*cp == ';' || *cp == '.')) { - /* This is to prevent matching of numeric extensions */ - if (*cp == '.' && cp[1] != ';') - return 0; - while (--i >= 0) - if (*++cp != ';' && (*cp < '0' || *cp > '9')) - return 0; - } - return 1; -} - -static int -cd9660_open(const char *path, struct open_file *f) -{ - struct file *fp = NULL; - void *buf; - struct iso_primary_descriptor *vd; - size_t buf_size, read, dsize, off; - daddr_t bno, boff; - struct iso_directory_record rec; - struct iso_directory_record *dp = NULL; - int rc, first, use_rrip, lenskip; - - /* First find the volume descriptor */ - buf = malloc(buf_size = ISO_DEFAULT_BLOCK_SIZE); - vd = buf; - for (bno = 16;; bno++) { - twiddle(1); - rc = f->f_dev->dv_strategy(f->f_devdata, F_READ, cdb2devb(bno), - ISO_DEFAULT_BLOCK_SIZE, buf, &read); - if (rc) - goto out; - if (read != ISO_DEFAULT_BLOCK_SIZE) { - rc = EIO; - goto out; - } - rc = EINVAL; - if (bcmp(vd->id, ISO_STANDARD_ID, sizeof vd->id) != 0) - goto out; - if (isonum_711(vd->type) == ISO_VD_END) - goto out; - if (isonum_711(vd->type) == ISO_VD_PRIMARY) - break; - } - if (isonum_723(vd->logical_block_size) != ISO_DEFAULT_BLOCK_SIZE) - goto out; - - rec = *(struct iso_directory_record *) vd->root_directory_record; - if (*path == '/') path++; /* eat leading '/' */ - - first = 1; - use_rrip = 0; - while (*path) { - bno = isonum_733(rec.extent) + isonum_711(rec.ext_attr_length); - dsize = isonum_733(rec.size); - off = 0; - boff = 0; - - while (off < dsize) { - if ((off % ISO_DEFAULT_BLOCK_SIZE) == 0) { - twiddle(1); - rc = f->f_dev->dv_strategy - (f->f_devdata, F_READ, - cdb2devb(bno + boff), - ISO_DEFAULT_BLOCK_SIZE, - buf, &read); - if (rc) - goto out; - if (read != ISO_DEFAULT_BLOCK_SIZE) { - rc = EIO; - goto out; - } - boff++; - dp = (struct iso_directory_record *) buf; - } - if (isonum_711(dp->length) == 0) { - /* skip to next block, if any */ - off = boff * ISO_DEFAULT_BLOCK_SIZE; - continue; - } - - /* See if RRIP is in use. */ - if (first) - use_rrip = rrip_check(f, dp, &lenskip); - - if (dirmatch(f, path, dp, use_rrip, - first ? 0 : lenskip)) { - first = 0; - break; - } else - first = 0; - - dp = (struct iso_directory_record *) - ((char *) dp + isonum_711(dp->length)); - /* If the new block has zero length, it is padding. */ - if (isonum_711(dp->length) == 0) { - /* Skip to next block, if any. */ - off = boff * ISO_DEFAULT_BLOCK_SIZE; - continue; - } - off += isonum_711(dp->length); - } - if (off >= dsize) { - rc = ENOENT; - goto out; - } - - rec = *dp; - while (*path && *path != '/') /* look for next component */ - path++; - if (*path) path++; /* skip '/' */ - } - - /* allocate file system specific data structure */ - fp = malloc(sizeof(struct file)); - bzero(fp, sizeof(struct file)); - f->f_fsdata = (void *)fp; - - if ((isonum_711(rec.flags) & 2) != 0) { - fp->f_flags = F_ISDIR; - } - if (first) { - fp->f_flags |= F_ROOTDIR; - - /* Check for Rock Ridge since we didn't in the loop above. */ - bno = isonum_733(rec.extent) + isonum_711(rec.ext_attr_length); - twiddle(1); - rc = f->f_dev->dv_strategy(f->f_devdata, F_READ, cdb2devb(bno), - ISO_DEFAULT_BLOCK_SIZE, buf, &read); - if (rc) - goto out; - if (read != ISO_DEFAULT_BLOCK_SIZE) { - rc = EIO; - goto out; - } - dp = (struct iso_directory_record *)buf; - use_rrip = rrip_check(f, dp, &lenskip); - } - if (use_rrip) { - fp->f_flags |= F_RR; - fp->f_susp_skip = lenskip; - } - fp->f_off = 0; - fp->f_bno = isonum_733(rec.extent) + isonum_711(rec.ext_attr_length); - fp->f_size = isonum_733(rec.size); - free(buf); - - return 0; - -out: - if (fp) - free(fp); - free(buf); - - return rc; -} - -static int -cd9660_close(struct open_file *f) -{ - struct file *fp = (struct file *)f->f_fsdata; - - f->f_fsdata = NULL; - free(fp); - - return 0; -} - -static int -buf_read_file(struct open_file *f, char **buf_p, size_t *size_p) -{ - struct file *fp = (struct file *)f->f_fsdata; - daddr_t blkno, blkoff; - int rc = 0; - size_t read; - - blkno = fp->f_off / ISO_DEFAULT_BLOCK_SIZE + fp->f_bno; - blkoff = fp->f_off % ISO_DEFAULT_BLOCK_SIZE; - - if (blkno != fp->f_buf_blkno) { - if (fp->f_buf == (char *)0) - fp->f_buf = malloc(ISO_DEFAULT_BLOCK_SIZE); - - twiddle(16); - rc = f->f_dev->dv_strategy(f->f_devdata, F_READ, - cdb2devb(blkno), ISO_DEFAULT_BLOCK_SIZE, - fp->f_buf, &read); - if (rc) - return (rc); - if (read != ISO_DEFAULT_BLOCK_SIZE) - return (EIO); - - fp->f_buf_blkno = blkno; - } - - *buf_p = fp->f_buf + blkoff; - *size_p = ISO_DEFAULT_BLOCK_SIZE - blkoff; - - if (*size_p > fp->f_size - fp->f_off) - *size_p = fp->f_size - fp->f_off; - return (rc); -} - -static int -cd9660_read(struct open_file *f, void *start, size_t size, size_t *resid) -{ - struct file *fp = (struct file *)f->f_fsdata; - char *buf, *addr; - size_t buf_size, csize; - int rc = 0; - - addr = start; - while (size) { - if (fp->f_off < 0 || fp->f_off >= fp->f_size) - break; - - rc = buf_read_file(f, &buf, &buf_size); - if (rc) - break; - - csize = size > buf_size ? buf_size : size; - bcopy(buf, addr, csize); - - fp->f_off += csize; - addr += csize; - size -= csize; - } - if (resid) - *resid = size; - return (rc); -} - -static int -cd9660_readdir(struct open_file *f, struct dirent *d) -{ - struct file *fp = (struct file *)f->f_fsdata; - struct iso_directory_record *ep; - size_t buf_size, reclen, namelen; - int error = 0; - int lenskip; - char *buf, *name; - -again: - if (fp->f_off >= fp->f_size) - return (ENOENT); - error = buf_read_file(f, &buf, &buf_size); - if (error) - return (error); - ep = (struct iso_directory_record *)buf; - - if (isonum_711(ep->length) == 0) { - daddr_t blkno; - - /* skip to next block, if any */ - blkno = fp->f_off / ISO_DEFAULT_BLOCK_SIZE; - fp->f_off = (blkno + 1) * ISO_DEFAULT_BLOCK_SIZE; - goto again; - } - - if (fp->f_flags & F_RR) { - if (fp->f_flags & F_ROOTDIR && fp->f_off == 0) - lenskip = 0; - else - lenskip = fp->f_susp_skip; - name = rrip_lookup_name(f, ep, lenskip, &namelen); - } else - name = NULL; - if (name == NULL) { - namelen = isonum_711(ep->name_len); - name = ep->name; - if (namelen == 1) { - if (ep->name[0] == 0) - name = "."; - else if (ep->name[0] == 1) { - namelen = 2; - name = ".."; - } - } - } - reclen = sizeof(struct dirent) - (MAXNAMLEN+1) + namelen + 1; - reclen = (reclen + 3) & ~3; - - d->d_fileno = isonum_733(ep->extent); - d->d_reclen = reclen; - if (isonum_711(ep->flags) & 2) - d->d_type = DT_DIR; - else - d->d_type = DT_REG; - d->d_namlen = namelen; - - bcopy(name, d->d_name, d->d_namlen); - d->d_name[d->d_namlen] = 0; - - fp->f_off += isonum_711(ep->length); - return (0); -} - -static int -cd9660_write(struct open_file *f __unused, void *start __unused, size_t size __unused, size_t *resid __unused) -{ - return EROFS; -} - -static off_t -cd9660_seek(struct open_file *f, off_t offset, int where) -{ - struct file *fp = (struct file *)f->f_fsdata; - - switch (where) { - case SEEK_SET: - fp->f_off = offset; - break; - case SEEK_CUR: - fp->f_off += offset; - break; - case SEEK_END: - fp->f_off = fp->f_size - offset; - break; - default: - return -1; - } - return fp->f_off; -} - -static int -cd9660_stat(struct open_file *f, struct stat *sb) -{ - struct file *fp = (struct file *)f->f_fsdata; - - /* only important stuff */ - sb->st_mode = S_IRUSR | S_IRGRP | S_IROTH; - if (fp->f_flags & F_ISDIR) - sb->st_mode |= S_IFDIR; - else - sb->st_mode |= S_IFREG; - sb->st_uid = sb->st_gid = 0; - sb->st_size = fp->f_size; - return 0; -} diff --git a/lib/libstand/close.c b/lib/libstand/close.c deleted file mode 100644 index 939f025b8fd0..000000000000 --- a/lib/libstand/close.c +++ /dev/null @@ -1,98 +0,0 @@ -/* $NetBSD: close.c,v 1.7 1997/01/22 00:38:09 cgd Exp $ */ - -/*- - * Copyright (c) 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * The Mach Operating System project at Carnegie-Mellon University. - * - * 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. - * 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. - * - * @(#)close.c 8.1 (Berkeley) 6/11/93 - * - * - * Copyright (c) 1989, 1990, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Author: Alessandro Forin - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include "stand.h" - -int -close(int fd) -{ - struct open_file *f = &files[fd]; - int err1 = 0, err2 = 0; - - if ((unsigned)fd >= SOPEN_MAX || f->f_flags == 0) { - errno = EBADF; - return (-1); - } - if (f->f_rabuf != NULL) { - free(f->f_rabuf); - f->f_rabuf = NULL; - } - if (!(f->f_flags & F_RAW) && f->f_ops) - err1 = (f->f_ops->fo_close)(f); - if (!(f->f_flags & F_NODEV) && f->f_dev) - err2 = (f->f_dev->dv_close)(f); - if (f->f_devdata != NULL) - devclose(f); - f->f_flags = 0; - if (err1) { - errno = err1; - return (-1); - } - if (err2) { - errno = err2; - return (-1); - } - return (0); -} diff --git a/lib/libstand/closeall.c b/lib/libstand/closeall.c deleted file mode 100644 index a66142676354..000000000000 --- a/lib/libstand/closeall.c +++ /dev/null @@ -1,76 +0,0 @@ -/* $NetBSD: closeall.c,v 1.1 1996/01/13 22:25:36 leo Exp $ */ - -/*- - * Copyright (c) 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * The Mach Operating System project at Carnegie-Mellon University. - * - * 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. - * 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. - * - * @(#)close.c 8.1 (Berkeley) 6/11/93 - * - * - * Copyright (c) 1989, 1990, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Author: Alessandro Forin - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include "stand.h" - -void -closeall() -{ - int i; - - for (i = 0; i < SOPEN_MAX; i++) - if (files[i].f_flags != 0) - (void)close(i); -} diff --git a/lib/libstand/dev.c b/lib/libstand/dev.c deleted file mode 100644 index 482c08211723..000000000000 --- a/lib/libstand/dev.c +++ /dev/null @@ -1,61 +0,0 @@ -/* $NetBSD: dev.c,v 1.4 1994/10/30 21:48:23 cgd Exp $ */ - -/*- - * Copyright (c) 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. - * 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. - * - * @(#)dev.c 8.1 (Berkeley) 6/11/93 - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/reboot.h> - -#include "stand.h" - -int -nodev() -{ - return (ENXIO); -} - -void -nullsys() -{ -} - -/* ARGSUSED */ -int -noioctl(f, cmd, data) - struct open_file *f; - u_long cmd; - void *data; -{ - return (EINVAL); -} diff --git a/lib/libstand/dosfs.c b/lib/libstand/dosfs.c deleted file mode 100644 index 6bbe961dccc7..000000000000 --- a/lib/libstand/dosfs.c +++ /dev/null @@ -1,868 +0,0 @@ -/* - * Copyright (c) 1996, 1998 Robert Nordier - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``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 AUTHOR(S) 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * Readonly filesystem for Microsoft FAT12/FAT16/FAT32 filesystems, - * also supports VFAT. - */ - -#include <sys/types.h> -#include <string.h> -#include <stddef.h> - -#include "stand.h" - -#include "dosfs.h" - - -static int dos_open(const char *path, struct open_file *fd); -static int dos_close(struct open_file *fd); -static int dos_read(struct open_file *fd, void *buf, size_t size, size_t *resid); -static off_t dos_seek(struct open_file *fd, off_t offset, int whence); -static int dos_stat(struct open_file *fd, struct stat *sb); -static int dos_readdir(struct open_file *fd, struct dirent *d); - -struct fs_ops dosfs_fsops = { - "dosfs", - dos_open, - dos_close, - dos_read, - null_write, - dos_seek, - dos_stat, - dos_readdir -}; - -#define SECSIZ 512 /* sector size */ -#define SSHIFT 9 /* SECSIZ shift */ -#define DEPSEC 16 /* directory entries per sector */ -#define DSHIFT 4 /* DEPSEC shift */ -#define LOCLUS 2 /* lowest cluster number */ -#define FATBLKSZ 0x20000 /* size of block in the FAT cache buffer */ - -/* DOS "BIOS Parameter Block" */ -typedef struct { - u_char secsiz[2]; /* sector size */ - u_char spc; /* sectors per cluster */ - u_char ressec[2]; /* reserved sectors */ - u_char fats; /* FATs */ - u_char dirents[2]; /* root directory entries */ - u_char secs[2]; /* total sectors */ - u_char media; /* media descriptor */ - u_char spf[2]; /* sectors per FAT */ - u_char spt[2]; /* sectors per track */ - u_char heads[2]; /* drive heads */ - u_char hidsec[4]; /* hidden sectors */ - u_char lsecs[4]; /* huge sectors */ - u_char lspf[4]; /* huge sectors per FAT */ - u_char xflg[2]; /* flags */ - u_char vers[2]; /* filesystem version */ - u_char rdcl[4]; /* root directory start cluster */ - u_char infs[2]; /* filesystem info sector */ - u_char bkbs[2]; /* backup boot sector */ -} DOS_BPB; - -/* Initial portion of DOS boot sector */ -typedef struct { - u_char jmp[3]; /* usually 80x86 'jmp' opcode */ - u_char oem[8]; /* OEM name and version */ - DOS_BPB bpb; /* BPB */ -} DOS_BS; - -/* Supply missing "." and ".." root directory entries */ -static const char *const dotstr[2] = {".", ".."}; -static DOS_DE dot[2] = { - {". ", " ", FA_DIR, {0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, - {0, 0}, {0x21, 0}, {0, 0}, {0, 0, 0, 0}}, - {".. ", " ", FA_DIR, {0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, - {0, 0}, {0x21, 0}, {0, 0}, {0, 0, 0, 0}} -}; - -/* The usual conversion macros to avoid multiplication and division */ -#define bytsec(n) ((n) >> SSHIFT) -#define secbyt(s) ((s) << SSHIFT) -#define entsec(e) ((e) >> DSHIFT) -#define bytblk(fs, n) ((n) >> (fs)->bshift) -#define blkbyt(fs, b) ((b) << (fs)->bshift) -#define secblk(fs, s) ((s) >> ((fs)->bshift - SSHIFT)) -#define blksec(fs, b) ((b) << ((fs)->bshift - SSHIFT)) - -/* Convert cluster number to offset within filesystem */ -#define blkoff(fs, b) (secbyt((fs)->lsndta) + blkbyt(fs, (b) - LOCLUS)) - -/* Convert cluster number to logical sector number */ -#define blklsn(fs, b) ((fs)->lsndta + blksec(fs, (b) - LOCLUS)) - -/* Convert cluster number to offset within FAT */ -#define fatoff(sz, c) ((sz) == 12 ? (c) + ((c) >> 1) : \ - (sz) == 16 ? (c) << 1 : \ - (c) << 2) - -/* Does cluster number reference a valid data cluster? */ -#define okclus(fs, c) ((c) >= LOCLUS && (c) <= (fs)->xclus) - -/* Get start cluster from directory entry */ -#define stclus(sz, de) ((sz) != 32 ? cv2((de)->clus) : \ - ((u_int)cv2((de)->dex.h_clus) << 16) | \ - cv2((de)->clus)) - -static int parsebs(DOS_FS *, DOS_BS *); -static int namede(DOS_FS *, const char *, DOS_DE **); -static int lookup(DOS_FS *, u_int, const char *, DOS_DE **); -static void cp_xdnm(u_char *, DOS_XDE *); -static void cp_sfn(u_char *, DOS_DE *); -static off_t fsize(DOS_FS *, DOS_DE *); -static int fatcnt(DOS_FS *, u_int); -static int fatget(DOS_FS *, u_int *); -static int fatend(u_int, u_int); -static int ioread(DOS_FS *, u_int, void *, size_t); -static int ioget(struct open_file *, daddr_t, void *, size_t); - -static int -dos_read_fatblk(DOS_FS *fs, struct open_file *fd, u_int blknum) -{ - int err; - size_t io_size; - daddr_t offset_in_fat, max_offset_in_fat; - - offset_in_fat = ((daddr_t)blknum) * FATBLKSZ; - max_offset_in_fat = secbyt(fs->spf); - io_size = FATBLKSZ; - if (offset_in_fat > max_offset_in_fat) - offset_in_fat = max_offset_in_fat; - if (offset_in_fat + io_size > max_offset_in_fat) - io_size = ((size_t)(max_offset_in_fat - offset_in_fat)); - - if (io_size != 0) { - err = ioget(fd, fs->lsnfat + bytsec(offset_in_fat), - fs->fatbuf, io_size); - if (err != 0) { - fs->fatbuf_blknum = ((u_int)(-1)); - return (err); - } - } - if (io_size < FATBLKSZ) - memset(fs->fatbuf + io_size, 0, FATBLKSZ - io_size); - - fs->fatbuf_blknum = blknum; - return (0); -} - -/* - * Mount DOS filesystem - */ -static int -dos_mount(DOS_FS *fs, struct open_file *fd) -{ - int err; - u_char *buf; - - bzero(fs, sizeof(DOS_FS)); - fs->fd = fd; - - if ((buf = malloc(secbyt(1))) == NULL) - return (errno); - if ((err = ioget(fs->fd, 0, buf, secbyt(1))) || - (err = parsebs(fs, (DOS_BS *)buf))) { - free(buf); - return (err); - } - free(buf); - - if ((fs->fatbuf = malloc(FATBLKSZ)) == NULL) - return (errno); - err = dos_read_fatblk(fs, fd, 0); - if (err != 0) { - free(fs->fatbuf); - return (err); - } - - fs->root = dot[0]; - fs->root.name[0] = ' '; - if (fs->fatsz == 32) { - fs->root.clus[0] = fs->rdcl & 0xff; - fs->root.clus[1] = (fs->rdcl >> 8) & 0xff; - fs->root.dex.h_clus[0] = (fs->rdcl >> 16) & 0xff; - fs->root.dex.h_clus[1] = (fs->rdcl >> 24) & 0xff; - } - return (0); -} - -/* - * Unmount mounted filesystem - */ -static int -dos_unmount(DOS_FS *fs) -{ - if (fs->links) - return (EBUSY); - free(fs->fatbuf); - free(fs); - return (0); -} - -/* - * Open DOS file - */ -static int -dos_open(const char *path, struct open_file *fd) -{ - DOS_DE *de; - DOS_FILE *f; - DOS_FS *fs; - u_int size, clus; - int err; - - /* Allocate mount structure, associate with open */ - if ((fs = malloc(sizeof(DOS_FS))) == NULL) - return (errno); - if ((err = dos_mount(fs, fd))) { - free(fs); - return (err); - } - - if ((err = namede(fs, path, &de))) { - dos_unmount(fs); - return (err); - } - - clus = stclus(fs->fatsz, de); - size = cv4(de->size); - - if ((!(de->attr & FA_DIR) && (!clus != !size)) || - ((de->attr & FA_DIR) && size) || - (clus && !okclus(fs, clus))) { - dos_unmount(fs); - return (EINVAL); - } - if ((f = malloc(sizeof(DOS_FILE))) == NULL) { - err = errno; - dos_unmount(fs); - return (err); - } - bzero(f, sizeof(DOS_FILE)); - f->fs = fs; - fs->links++; - f->de = *de; - fd->f_fsdata = (void *)f; - return (0); -} - -/* - * Read from file - */ -static int -dos_read(struct open_file *fd, void *buf, size_t nbyte, size_t *resid) -{ - off_t size; - u_int nb, off, clus, c, cnt, n; - DOS_FILE *f = (DOS_FILE *)fd->f_fsdata; - int err = 0; - - /* - * as ioget() can be called *a lot*, use twiddle here. - * also 4 seems to be good value not to slow loading down too much: - * with 270MB file (~540k ioget() calls, twiddle can easily waste 4-5sec. - */ - twiddle(4); - nb = (u_int)nbyte; - if ((size = fsize(f->fs, &f->de)) == -1) - return (EINVAL); - if (nb > (n = size - f->offset)) - nb = n; - off = f->offset; - if ((clus = stclus(f->fs->fatsz, &f->de))) - off &= f->fs->bsize - 1; - c = f->c; - cnt = nb; - while (cnt) { - n = 0; - if (!c) { - if ((c = clus)) - n = bytblk(f->fs, f->offset); - } else if (!off) - n++; - while (n--) { - if ((err = fatget(f->fs, &c))) - goto out; - if (!okclus(f->fs, c)) { - err = EINVAL; - goto out; - } - } - if (!clus || (n = f->fs->bsize - off) > cnt) - n = cnt; - if ((err = ioread(f->fs, (c ? blkoff(f->fs, c) : - secbyt(f->fs->lsndir)) + off, buf, n))) - goto out; - f->offset += n; - f->c = c; - off = 0; - buf = (char *)buf + n; - cnt -= n; - } - out: - if (resid) - *resid = nbyte - nb + cnt; - return (err); -} - -/* - * Reposition within file - */ -static off_t -dos_seek(struct open_file *fd, off_t offset, int whence) -{ - off_t off; - u_int size; - DOS_FILE *f = (DOS_FILE *)fd->f_fsdata; - - size = cv4(f->de.size); - switch (whence) { - case SEEK_SET: - off = 0; - break; - case SEEK_CUR: - off = f->offset; - break; - case SEEK_END: - off = size; - break; - default: - errno = EINVAL; - return (-1); - } - off += offset; - if (off < 0 || off > size) { - errno = EINVAL; - return (-1); - } - f->offset = (u_int)off; - f->c = 0; - return (off); -} - -/* - * Close open file - */ -static int -dos_close(struct open_file *fd) -{ - DOS_FILE *f = (DOS_FILE *)fd->f_fsdata; - DOS_FS *fs = f->fs; - - f->fs->links--; - free(f); - dos_unmount(fs); - return (0); -} - -/* - * Return some stat information on a file. - */ -static int -dos_stat(struct open_file *fd, struct stat *sb) -{ - DOS_FILE *f = (DOS_FILE *)fd->f_fsdata; - - /* only important stuff */ - sb->st_mode = f->de.attr & FA_DIR ? S_IFDIR | 0555 : S_IFREG | 0444; - sb->st_nlink = 1; - sb->st_uid = 0; - sb->st_gid = 0; - if ((sb->st_size = fsize(f->fs, &f->de)) == -1) - return (EINVAL); - return (0); -} - -static int -dos_checksum(char *name, char *ext) -{ - int x, i; - char buf[11]; - - bcopy(name, buf, 8); - bcopy(ext, buf+8, 3); - x = 0; - for (i = 0; i < 11; i++) { - x = ((x & 1) << 7) | (x >> 1); - x += buf[i]; - x &= 0xff; - } - return (x); -} - -static int -dos_readdir(struct open_file *fd, struct dirent *d) -{ - /* DOS_FILE *f = (DOS_FILE *)fd->f_fsdata; */ - u_char fn[261]; - DOS_DIR dd; - size_t res; - u_int chk, i, x, xdn; - int err; - - x = chk = 0; - while (1) { - xdn = x; - x = 0; - err = dos_read(fd, &dd, sizeof(dd), &res); - if (err) - return (err); - if (res == sizeof(dd)) - return (ENOENT); - if (dd.de.name[0] == 0) - return (ENOENT); - - /* Skip deleted entries */ - if (dd.de.name[0] == 0xe5) - continue; - - /* Check if directory entry is volume label */ - if (dd.de.attr & FA_LABEL) { - /* - * If volume label set, check if the current entry is - * extended entry (FA_XDE) for long file names. - */ - if ((dd.de.attr & FA_MASK) == FA_XDE) { - /* - * Read through all following extended entries - * to get the long file name. 0x40 marks the - * last entry containing part of long file name. - */ - if (dd.xde.seq & 0x40) - chk = dd.xde.chk; - else if (dd.xde.seq != xdn - 1 || dd.xde.chk != chk) - continue; - x = dd.xde.seq & ~0x40; - if (x < 1 || x > 20) { - x = 0; - continue; - } - cp_xdnm(fn, &dd.xde); - } else { - /* skip only volume label entries */ - continue; - } - } else { - if (xdn == 1) { - x = dos_checksum(dd.de.name, dd.de.ext); - if (x == chk) - break; - } else { - cp_sfn(fn, &dd.de); - break; - } - x = 0; - } - } - - d->d_fileno = (dd.de.clus[1] << 8) + dd.de.clus[0]; - d->d_reclen = sizeof(*d); - d->d_type = (dd.de.attr & FA_DIR) ? DT_DIR : DT_REG; - memcpy(d->d_name, fn, sizeof(d->d_name)); - return (0); -} - -/* - * Parse DOS boot sector - */ -static int -parsebs(DOS_FS *fs, DOS_BS *bs) -{ - u_int sc; - - if ((bs->jmp[0] != 0x69 && - bs->jmp[0] != 0xe9 && - (bs->jmp[0] != 0xeb || bs->jmp[2] != 0x90)) || - bs->bpb.media < 0xf0) - return (EINVAL); - if (cv2(bs->bpb.secsiz) != SECSIZ) - return (EINVAL); - if (!(fs->spc = bs->bpb.spc) || fs->spc & (fs->spc - 1)) - return (EINVAL); - fs->bsize = secbyt(fs->spc); - fs->bshift = ffs(fs->bsize) - 1; - if ((fs->spf = cv2(bs->bpb.spf))) { - if (bs->bpb.fats != 2) - return (EINVAL); - if (!(fs->dirents = cv2(bs->bpb.dirents))) - return (EINVAL); - } else { - if (!(fs->spf = cv4(bs->bpb.lspf))) - return (EINVAL); - if (!bs->bpb.fats || bs->bpb.fats > 16) - return (EINVAL); - if ((fs->rdcl = cv4(bs->bpb.rdcl)) < LOCLUS) - return (EINVAL); - } - if (!(fs->lsnfat = cv2(bs->bpb.ressec))) - return (EINVAL); - fs->lsndir = fs->lsnfat + fs->spf * bs->bpb.fats; - fs->lsndta = fs->lsndir + entsec(fs->dirents); - if (!(sc = cv2(bs->bpb.secs)) && !(sc = cv4(bs->bpb.lsecs))) - return (EINVAL); - if (fs->lsndta > sc) - return (EINVAL); - if ((fs->xclus = secblk(fs, sc - fs->lsndta) + 1) < LOCLUS) - return (EINVAL); - fs->fatsz = fs->dirents ? fs->xclus < 0xff6 ? 12 : 16 : 32; - sc = (secbyt(fs->spf) << 1) / (fs->fatsz >> 2) - 1; - if (fs->xclus > sc) - fs->xclus = sc; - return (0); -} - -/* - * Return directory entry from path - */ -static int -namede(DOS_FS *fs, const char *path, DOS_DE **dep) -{ - char name[256]; - DOS_DE *de; - char *s; - size_t n; - int err; - - err = 0; - de = &fs->root; - while (*path) { - while (*path == '/') - path++; - if (*path == '\0') - break; - if (!(s = strchr(path, '/'))) - s = strchr(path, 0); - if ((n = s - path) > 255) - return (ENAMETOOLONG); - memcpy(name, path, n); - name[n] = 0; - path = s; - if (!(de->attr & FA_DIR)) - return (ENOTDIR); - if ((err = lookup(fs, stclus(fs->fatsz, de), name, &de))) - return (err); - } - *dep = de; - return (0); -} - -/* - * Lookup path segment - */ -static int -lookup(DOS_FS *fs, u_int clus, const char *name, DOS_DE **dep) -{ - static DOS_DIR dir[DEPSEC]; - u_char lfn[261]; - u_char sfn[13]; - u_int nsec, lsec, xdn, chk, sec, ent, x; - int err, ok, i; - - if (!clus) - for (ent = 0; ent < 2; ent++) - if (!strcasecmp(name, dotstr[ent])) { - *dep = dot + ent; - return (0); - } - if (!clus && fs->fatsz == 32) - clus = fs->rdcl; - nsec = !clus ? entsec(fs->dirents) : fs->spc; - lsec = 0; - xdn = chk = 0; - for (;;) { - if (!clus && !lsec) - lsec = fs->lsndir; - else if (okclus(fs, clus)) - lsec = blklsn(fs, clus); - else - return (EINVAL); - for (sec = 0; sec < nsec; sec++) { - if ((err = ioget(fs->fd, lsec + sec, dir, secbyt(1)))) - return (err); - for (ent = 0; ent < DEPSEC; ent++) { - if (!*dir[ent].de.name) - return (ENOENT); - if (*dir[ent].de.name != 0xe5) { - if ((dir[ent].de.attr & FA_MASK) == FA_XDE) { - x = dir[ent].xde.seq; - if (x & 0x40 || (x + 1 == xdn && - dir[ent].xde.chk == chk)) { - if (x & 0x40) { - chk = dir[ent].xde.chk; - x &= ~0x40; - } - if (x >= 1 && x <= 20) { - cp_xdnm(lfn, &dir[ent].xde); - xdn = x; - continue; - } - } - } else if (!(dir[ent].de.attr & FA_LABEL)) { - if ((ok = xdn == 1)) { - x = dos_checksum(dir[ent].de.name, dir[ent].de.ext); - ok = chk == x && - !strcasecmp(name, (const char *)lfn); - } - if (!ok) { - cp_sfn(sfn, &dir[ent].de); - ok = !strcasecmp(name, (const char *)sfn); - } - if (ok) { - *dep = &dir[ent].de; - return (0); - } - } - } - xdn = 0; - } - } - if (!clus) - break; - if ((err = fatget(fs, &clus))) - return (err); - if (fatend(fs->fatsz, clus)) - break; - } - return (ENOENT); -} - -/* - * Copy name from extended directory entry - */ -static void -cp_xdnm(u_char *lfn, DOS_XDE *xde) -{ - static struct { - u_int off; - u_int dim; - } ix[3] = { - {offsetof(DOS_XDE, name1), sizeof(xde->name1) / 2}, - {offsetof(DOS_XDE, name2), sizeof(xde->name2) / 2}, - {offsetof(DOS_XDE, name3), sizeof(xde->name3) / 2} - }; - u_char *p; - u_int n, x, c; - - lfn += 13 * ((xde->seq & ~0x40) - 1); - for (n = 0; n < 3; n++) - for (p = (u_char *)xde + ix[n].off, x = ix[n].dim; x; - p += 2, x--) { - if ((c = cv2(p)) && (c < 32 || c > 127)) - c = '?'; - if (!(*lfn++ = c)) - return; - } - if (xde->seq & 0x40) - *lfn = 0; -} - -/* - * Copy short filename - */ -static void -cp_sfn(u_char *sfn, DOS_DE *de) -{ - u_char *p; - int j, i; - - p = sfn; - if (*de->name != ' ') { - for (j = 7; de->name[j] == ' '; j--); - for (i = 0; i <= j; i++) - *p++ = de->name[i]; - if (*de->ext != ' ') { - *p++ = '.'; - for (j = 2; de->ext[j] == ' '; j--); - for (i = 0; i <= j; i++) - *p++ = de->ext[i]; - } - } - *p = 0; - if (*sfn == 5) - *sfn = 0xe5; -} - -/* - * Return size of file in bytes - */ -static off_t -fsize(DOS_FS *fs, DOS_DE *de) -{ - u_long size; - u_int c; - int n; - - if (!(size = cv4(de->size)) && de->attr & FA_DIR) { - if (!(c = cv2(de->clus))) - size = fs->dirents * sizeof(DOS_DE); - else { - if ((n = fatcnt(fs, c)) == -1) - return (n); - size = blkbyt(fs, n); - } - } - return (size); -} - -/* - * Count number of clusters in chain - */ -static int -fatcnt(DOS_FS *fs, u_int c) -{ - int n; - - for (n = 0; okclus(fs, c); n++) - if (fatget(fs, &c)) - return (-1); - return (fatend(fs->fatsz, c) ? n : -1); -} - -/* - * Get next cluster in cluster chain. Use in core fat cache unless - * the number of current 128K block in FAT has changed. - */ -static int -fatget(DOS_FS *fs, u_int *c) -{ - u_int val_in, val_out, offset, blknum, nbyte; - const u_char *p_entry; - int err; - - /* check input value to prevent overflow in fatoff() */ - val_in = *c; - if (val_in & 0xf0000000) - return (EINVAL); - - /* ensure that current 128K FAT block is cached */ - offset = fatoff(fs->fatsz, val_in); - nbyte = fs->fatsz != 32 ? 2 : 4; - if (offset + nbyte > secbyt(fs->spf)) - return (EINVAL); - blknum = offset / FATBLKSZ; - offset %= FATBLKSZ; - if (offset + nbyte > FATBLKSZ) - return (EINVAL); - if (blknum != fs->fatbuf_blknum) { - err = dos_read_fatblk(fs, fs->fd, blknum); - if (err != 0) - return (err); - } - p_entry = fs->fatbuf + offset; - - /* extract cluster number from FAT entry */ - switch (fs->fatsz) { - case 32: - val_out = cv4(p_entry); - val_out &= 0x0fffffff; - break; - case 16: - val_out = cv2(p_entry); - break; - case 12: - val_out = cv2(p_entry); - if (val_in & 1) - val_out >>= 4; - else - val_out &= 0xfff; - break; - default: - return (EINVAL); - } - *c = val_out; - return (0); -} - -/* - * Is cluster an end-of-chain marker? - */ -static int -fatend(u_int sz, u_int c) -{ - return (c > (sz == 12 ? 0xff7U : sz == 16 ? 0xfff7U : 0xffffff7)); -} - -/* - * Offset-based I/O primitive - */ -static int -ioread(DOS_FS *fs, u_int offset, void *buf, size_t nbyte) -{ - char *s; - u_int off, n; - int err; - u_char local_buf[SECSIZ]; - - s = buf; - if ((off = offset & (SECSIZ - 1))) { - offset -= off; - if ((n = SECSIZ - off) > nbyte) - n = nbyte; - if ((err = ioget(fs->fd, bytsec(offset), local_buf, sizeof(local_buf)))) - return (err); - memcpy(s, local_buf + off, n); - offset += SECSIZ; - s += n; - nbyte -= n; - } - n = nbyte & (SECSIZ - 1); - if (nbyte -= n) { - if ((err = ioget(fs->fd, bytsec(offset), s, nbyte))) - return (err); - offset += nbyte; - s += nbyte; - } - if (n) { - if ((err = ioget(fs->fd, bytsec(offset), local_buf, sizeof(local_buf)))) - return (err); - memcpy(s, local_buf, n); - } - return (0); -} - -/* - * Sector-based I/O primitive - */ -static int -ioget(struct open_file *fd, daddr_t lsec, void *buf, size_t size) -{ - size_t rsize; - int rv; - - /* Make sure we get full read or error. */ - rsize = 0; - rv = (fd->f_dev->dv_strategy)(fd->f_devdata, F_READ, lsec, - size, buf, &rsize); - if ((rv == 0) && (size != rsize)) - rv = EIO; - return (rv); -} diff --git a/lib/libstand/dosfs.h b/lib/libstand/dosfs.h deleted file mode 100644 index 5b11e0fc375a..000000000000 --- a/lib/libstand/dosfs.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 1996, 1998 Robert Nordier - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``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 AUTHOR(S) 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. - * - * $FreeBSD$ - */ - -#ifndef DOSIO_H -#define DOSIO_H - -/* - * DOS file attributes - */ - -#define FA_RDONLY 001 /* read-only */ -#define FA_HIDDEN 002 /* hidden file */ -#define FA_SYSTEM 004 /* system file */ -#define FA_LABEL 010 /* volume label */ -#define FA_DIR 020 /* directory */ -#define FA_ARCH 040 /* archive (file modified) */ -#define FA_XDE 017 /* extended directory entry */ -#define FA_MASK 077 /* all attributes */ - -/* - * Macros to convert DOS-format 16-bit and 32-bit quantities - */ - -#define cv2(p) ((u_int16_t)(p)[0] | \ - ((u_int16_t)(p)[1] << 010)) -#define cv4(p) ((u_int32_t)(p)[0] | \ - ((u_int32_t)(p)[1] << 010) | \ - ((u_int32_t)(p)[2] << 020) | \ - ((u_int32_t)(p)[3] << 030)) - -/* - * Directory, filesystem, and file structures. - */ - -typedef struct { - u_char x_case; /* case */ - u_char c_hsec; /* created: secs/100 */ - u_char c_time[2]; /* created: time */ - u_char c_date[2]; /* created: date */ - u_char a_date[2]; /* accessed: date */ - u_char h_clus[2]; /* clus[hi] */ -} DOS_DEX; - -typedef struct { - u_char name[8]; /* name */ - u_char ext[3]; /* extension */ - u_char attr; /* attributes */ - DOS_DEX dex; /* VFAT/FAT32 only */ - u_char time[2]; /* modified: time */ - u_char date[2]; /* modified: date */ - u_char clus[2]; /* starting cluster */ - u_char size[4]; /* size */ -} DOS_DE; - -typedef struct { - u_char seq; /* flags */ - u_char name1[5][2]; /* 1st name area */ - u_char attr; /* (see fat_de) */ - u_char res; /* reserved */ - u_char chk; /* checksum */ - u_char name2[6][2]; /* 2nd name area */ - u_char clus[2]; /* (see fat_de) */ - u_char name3[2][2]; /* 3rd name area */ -} DOS_XDE; - -typedef union { - DOS_DE de; /* standard directory entry */ - DOS_XDE xde; /* extended directory entry */ -} DOS_DIR; - -typedef struct { - struct open_file *fd; /* file descriptor */ - u_char *fatbuf; /* FAT cache buffer */ - u_int fatbuf_blknum; /* number of 128K block in FAT cache buffer */ - u_int links; /* active links to structure */ - u_int spc; /* sectors per cluster */ - u_int bsize; /* cluster size in bytes */ - u_int bshift; /* cluster conversion shift */ - u_int dirents; /* root directory entries */ - u_int spf; /* sectors per fat */ - u_int rdcl; /* root directory start cluster */ - u_int lsnfat; /* start of fat */ - u_int lsndir; /* start of root dir */ - u_int lsndta; /* start of data area */ - u_int fatsz; /* FAT entry size */ - u_int xclus; /* maximum cluster number */ - DOS_DE root; -} DOS_FS; - -typedef struct { - DOS_FS *fs; /* associated filesystem */ - DOS_DE de; /* directory entry */ - u_int offset; /* current offset */ - u_int c; /* last cluster read */ -} DOS_FILE; - -#endif /* !DOSIO_H */ diff --git a/lib/libstand/environment.c b/lib/libstand/environment.c deleted file mode 100644 index 83349f1a8fe5..000000000000 --- a/lib/libstand/environment.c +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (c) 1998 Michael Smith. - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * Manage an environment-like space in which string variables may be stored. - * Provide support for some method-like operations for setting/retrieving - * variables in order to allow some type strength. - */ - -#include "stand.h" - -#include <string.h> - -static void env_discard(struct env_var *ev); - -struct env_var *environ = NULL; - -/* - * Look up (name) and return it's env_var structure. - */ -struct env_var * -env_getenv(const char *name) -{ - struct env_var *ev; - - for (ev = environ; ev != NULL; ev = ev->ev_next) - if (!strcmp(ev->ev_name, name)) - break; - return(ev); -} - -/* - * Some notes: - * - * If the EV_VOLATILE flag is set, a copy of the variable is made. - * If EV_DYNAMIC is set, the variable has been allocated with - * malloc and ownership transferred to the environment. - * If (value) is NULL, the variable is set but has no value. - */ -int -env_setenv(const char *name, int flags, const void *value, - ev_sethook_t sethook, ev_unsethook_t unsethook) -{ - struct env_var *ev, *curr, *last; - - if ((ev = env_getenv(name)) != NULL) { - /* - * If there's a set hook, let it do the work (unless we are working - * for one already. - */ - if ((ev->ev_sethook != NULL) && !(flags & EV_NOHOOK)) - return (ev->ev_sethook(ev, flags, value)); - - /* If there is data in the variable, discard it. */ - if (ev->ev_value != NULL && (ev->ev_flags & EV_DYNAMIC) != 0) - free(ev->ev_value); - ev->ev_value = NULL; - ev->ev_flags &= ~EV_DYNAMIC; - - } else { - - /* - * New variable; create and sort into list - */ - ev = malloc(sizeof(struct env_var)); - ev->ev_name = strdup(name); - ev->ev_value = NULL; - ev->ev_flags = 0; - /* hooks can only be set when the variable is instantiated */ - ev->ev_sethook = sethook; - ev->ev_unsethook = unsethook; - - /* Sort into list */ - ev->ev_prev = NULL; - ev->ev_next = NULL; - /* Search for the record to insert before */ - for (last = NULL, curr = environ; - curr != NULL; - last = curr, curr = curr->ev_next) { - - if (strcmp(ev->ev_name, curr->ev_name) < 0) { - if (curr->ev_prev) { - curr->ev_prev->ev_next = ev; - } else { - environ = ev; - } - ev->ev_next = curr; - ev->ev_prev = curr->ev_prev; - curr->ev_prev = ev; - break; - } - } - if (curr == NULL) { - if (last == NULL) { - environ = ev; - } else { - last->ev_next = ev; - ev->ev_prev = last; - } - } - } - - /* If we have a new value, use it */ - if (flags & EV_VOLATILE) { - ev->ev_value = strdup(value); - ev->ev_flags |= EV_DYNAMIC; - } else { - ev->ev_value = (char *)value; - ev->ev_flags |= flags & EV_DYNAMIC; - } - - return(0); -} - -char * -getenv(const char *name) -{ - struct env_var *ev; - - /* Set but no value gives empty string */ - if ((ev = env_getenv(name)) != NULL) { - if (ev->ev_value != NULL) - return(ev->ev_value); - return(""); - } - return(NULL); -} - -int -setenv(const char *name, const char *value, int overwrite) -{ - /* No guarantees about state, always assume volatile */ - if (overwrite || (env_getenv(name) == NULL)) - return(env_setenv(name, EV_VOLATILE, value, NULL, NULL)); - return(0); -} - -int -putenv(char *string) -{ - char *value, *copy; - int result; - - copy = strdup(string); - if ((value = strchr(copy, '=')) != NULL) - *(value++) = 0; - result = setenv(copy, value, 1); - free(copy); - return(result); -} - -int -unsetenv(const char *name) -{ - struct env_var *ev; - int err; - - err = 0; - if ((ev = env_getenv(name)) == NULL) { - err = ENOENT; - } else { - if (ev->ev_unsethook != NULL) - err = ev->ev_unsethook(ev); - if (err == 0) { - env_discard(ev); - } - } - return(err); -} - -static void -env_discard(struct env_var *ev) -{ - if (ev->ev_prev) - ev->ev_prev->ev_next = ev->ev_next; - if (ev->ev_next) - ev->ev_next->ev_prev = ev->ev_prev; - if (environ == ev) - environ = ev->ev_next; - free(ev->ev_name); - if (ev->ev_value != NULL && (ev->ev_flags & EV_DYNAMIC) != 0) - free(ev->ev_value); - free(ev); -} - -int -env_noset(struct env_var *ev __unused, int flags __unused, - const void *value __unused) -{ - return(EPERM); -} - -int -env_nounset(struct env_var *ev __unused) -{ - return(EPERM); -} diff --git a/lib/libstand/ether.c b/lib/libstand/ether.c deleted file mode 100644 index 7ab9d74e3253..000000000000 --- a/lib/libstand/ether.c +++ /dev/null @@ -1,147 +0,0 @@ -/* $NetBSD: ether.c,v 1.11 1997/07/07 15:52:50 drochner Exp $ */ - -/* - * Copyright (c) 1992 Regents of the University of California. - * All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * 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. - * 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. - * - * @(#) Header: net.c,v 1.9 93/08/06 19:32:15 leres Exp (LBL) - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/socket.h> -#include <string.h> - -#include <net/if.h> -#include <netinet/in.h> -#include <netinet/if_ether.h> -#include <netinet/in_systm.h> -#include <netinet/ip.h> - -#include "stand.h" -#include "net.h" -#include "netif.h" - -/* Caller must leave room for ethernet header in front!! */ -ssize_t -sendether(struct iodesc *d, void *pkt, size_t len, uint8_t *dea, int etype) -{ - ssize_t n; - struct ether_header *eh; - -#ifdef ETHER_DEBUG - if (debug) - printf("sendether: called\n"); -#endif - - eh = (struct ether_header *)pkt - 1; - len += sizeof(*eh); - - MACPY(d->myea, eh->ether_shost); /* by byte */ - MACPY(dea, eh->ether_dhost); /* by byte */ - eh->ether_type = htons(etype); - - n = netif_put(d, eh, len); - if (n == -1 || n < sizeof(*eh)) - return (-1); - - n -= sizeof(*eh); - return (n); -} - -/* - * Get a packet of any Ethernet type, with our address or - * the broadcast address. Save the Ether type in etype. - * Unless there is an error, we pass the whole packet and the unencapsulated - * data. - */ -ssize_t -readether(struct iodesc *d, void **pkt, void **payload, time_t tleft, - uint16_t *etype) -{ - ssize_t n; - struct ether_header *eh; - void *ptr; - -#ifdef ETHER_DEBUG - if (debug) - printf("readether: called\n"); -#endif - - ptr = NULL; - n = netif_get(d, &ptr, tleft); - if (n == -1 || n < sizeof(*eh)) { - free(ptr); - return (-1); - } - - eh = (struct ether_header *)((uintptr_t)ptr + ETHER_ALIGN); - /* Validate Ethernet address. */ - if (bcmp(d->myea, eh->ether_dhost, 6) != 0 && - bcmp(bcea, eh->ether_dhost, 6) != 0) { -#ifdef ETHER_DEBUG - if (debug) - printf("readether: not ours (ea=%s)\n", - ether_sprintf(eh->ether_dhost)); -#endif - free(ptr); - return (-1); - } - - *pkt = ptr; - *payload = (void *)((uintptr_t)eh + sizeof(*eh)); - *etype = ntohs(eh->ether_type); - - n -= sizeof(*eh); - return (n); -} - -/* - * Convert Ethernet address to printable (loggable) representation. - */ -static char digits[] = "0123456789abcdef"; -char * -ether_sprintf(u_char *ap) -{ - int i; - static char etherbuf[18]; - char *cp = etherbuf; - - for (i = 0; i < 6; i++) { - *cp++ = digits[*ap >> 4]; - *cp++ = digits[*ap++ & 0xf]; - *cp++ = ':'; - } - *--cp = 0; - return (etherbuf); -} diff --git a/lib/libstand/ext2fs.c b/lib/libstand/ext2fs.c deleted file mode 100644 index d0b91e04466f..000000000000 --- a/lib/libstand/ext2fs.c +++ /dev/null @@ -1,908 +0,0 @@ -/*- - * Copyright (c) 1999,2000 Jonathan Lemon <jlemon@freebsd.org> - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/*- - * Copyright (c) 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * The Mach Operating System project at Carnegie-Mellon University. - * - * 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. - * - * - * Copyright (c) 1990, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Author: David Golub - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include <sys/param.h> -#include <sys/time.h> -#include "stand.h" -#include "string.h" - -static int ext2fs_open(const char *path, struct open_file *f); -static int ext2fs_close(struct open_file *f); -static int ext2fs_read(struct open_file *f, void *buf, - size_t size, size_t *resid); -static off_t ext2fs_seek(struct open_file *f, off_t offset, int where); -static int ext2fs_stat(struct open_file *f, struct stat *sb); -static int ext2fs_readdir(struct open_file *f, struct dirent *d); - -static int dtmap[] = { DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, - DT_BLK, DT_FIFO, DT_SOCK, DT_LNK }; -#define EXTFTODT(x) (x) > sizeof(dtmap) / sizeof(dtmap[0]) ? \ - DT_UNKNOWN : dtmap[x] - -struct fs_ops ext2fs_fsops = { - "ext2fs", - ext2fs_open, - ext2fs_close, - ext2fs_read, - null_write, - ext2fs_seek, - ext2fs_stat, - ext2fs_readdir -}; - -#define EXT2_SBSIZE 1024 -#define EXT2_SBLOCK (1024 / DEV_BSIZE) /* block offset of superblock */ -#define EXT2_MAGIC 0xef53 -#define EXT2_ROOTINO 2 - -#define EXT2_REV0 0 /* original revision of ext2 */ -#define EXT2_R0_ISIZE 128 /* inode size */ -#define EXT2_R0_FIRSTINO 11 /* first inode */ - -#define EXT2_MINBSHIFT 10 /* mininum block shift */ -#define EXT2_MINFSHIFT 10 /* mininum frag shift */ - -#define NDADDR 12 /* # of direct blocks */ -#define NIADDR 3 /* # of indirect blocks */ - -/* - * file system block to disk address - */ -#define fsb_to_db(fs, blk) ((blk) << (fs)->fs_fsbtodb) - -/* - * inode to block group offset - * inode to block group - * inode to disk address - * inode to block offset - */ -#define ino_to_bgo(fs, ino) (((ino) - 1) % (fs)->fs_ipg) -#define ino_to_bg(fs, ino) (((ino) - 1) / (fs)->fs_ipg) -#define ino_to_db(fs, bg, ino) \ - fsb_to_db(fs, ((bg)[ino_to_bg(fs, ino)].bg_inotbl + \ - ino_to_bgo(fs, ino) / (fs)->fs_ipb)) -#define ino_to_bo(fs, ino) (ino_to_bgo(fs, ino) % (fs)->fs_ipb) - -#define nindir(fs) \ - ((fs)->fs_bsize / sizeof(u_int32_t)) -#define lblkno(fs, loc) /* loc / bsize */ \ - ((loc) >> (fs)->fs_bshift) -#define smalllblktosize(fs, blk) /* blk * bsize */ \ - ((blk) << (fs)->fs_bshift) -#define blkoff(fs, loc) /* loc % bsize */ \ - ((loc) & (fs)->fs_bmask) -#define fragroundup(fs, size) /* roundup(size, fsize) */ \ - (((size) + (fs)->fs_fmask) & ~(fs)->fs_fmask) -#define dblksize(fs, dip, lbn) \ - (((lbn) >= NDADDR || (dip)->di_size >= smalllblktosize(fs, (lbn) + 1)) \ - ? (fs)->fs_bsize \ - : (fragroundup(fs, blkoff(fs, (dip)->di_size)))) - -/* - * superblock describing ext2fs - */ -struct ext2fs_disk { - u_int32_t fd_inodes; /* # of inodes */ - u_int32_t fd_blocks; /* # of blocks */ - u_int32_t fd_resblk; /* # of reserved blocks */ - u_int32_t fd_freeblk; /* # of free blocks */ - u_int32_t fd_freeino; /* # of free inodes */ - u_int32_t fd_firstblk; /* first data block */ - u_int32_t fd_bsize; /* block size */ - u_int32_t fd_fsize; /* frag size */ - u_int32_t fd_bpg; /* blocks per group */ - u_int32_t fd_fpg; /* frags per group */ - u_int32_t fd_ipg; /* inodes per group */ - u_int32_t fd_mtime; /* mount time */ - u_int32_t fd_wtime; /* write time */ - u_int16_t fd_mount; /* # of mounts */ - int16_t fd_maxmount; /* max # of mounts */ - u_int16_t fd_magic; /* magic number */ - u_int16_t fd_state; /* state */ - u_int16_t fd_eflag; /* error flags */ - u_int16_t fd_mnrrev; /* minor revision */ - u_int32_t fd_lastchk; /* last check */ - u_int32_t fd_chkintvl; /* maximum check interval */ - u_int32_t fd_os; /* os */ - u_int32_t fd_revision; /* revision */ - u_int16_t fd_uid; /* uid for reserved blocks */ - u_int16_t fd_gid; /* gid for reserved blocks */ - - u_int32_t fd_firstino; /* first non-reserved inode */ - u_int16_t fd_isize; /* inode size */ - u_int16_t fd_nblkgrp; /* block group # of superblock */ - u_int32_t fd_fcompat; /* compatible features */ - u_int32_t fd_fincompat; /* incompatible features */ - u_int32_t fd_frocompat; /* read-only compatibilties */ - u_int8_t fd_uuid[16]; /* volume uuid */ - char fd_volname[16]; /* volume name */ - char fd_fsmnt[64]; /* name last mounted on */ - u_int32_t fd_bitmap; /* compression bitmap */ - - u_int8_t fd_nblkpa; /* # of blocks to preallocate */ - u_int8_t fd_ndblkpa; /* # of dir blocks to preallocate */ -}; - -struct ext2fs_core { - int fc_bsize; /* block size */ - int fc_bshift; /* block shift amount */ - int fc_bmask; /* block mask */ - int fc_fsize; /* frag size */ - int fc_fshift; /* frag shift amount */ - int fc_fmask; /* frag mask */ - int fc_isize; /* inode size */ - int fc_imask; /* inode mask */ - int fc_firstino; /* first non-reserved inode */ - int fc_ipb; /* inodes per block */ - int fc_fsbtodb; /* fsb to ds shift */ -}; - -struct ext2fs { - struct ext2fs_disk fs_fd; - char fs_pad[EXT2_SBSIZE - sizeof(struct ext2fs_disk)]; - struct ext2fs_core fs_fc; - -#define fs_magic fs_fd.fd_magic -#define fs_revision fs_fd.fd_revision -#define fs_blocks fs_fd.fd_blocks -#define fs_firstblk fs_fd.fd_firstblk -#define fs_bpg fs_fd.fd_bpg -#define fs_ipg fs_fd.fd_ipg - -#define fs_bsize fs_fc.fc_bsize -#define fs_bshift fs_fc.fc_bshift -#define fs_bmask fs_fc.fc_bmask -#define fs_fsize fs_fc.fc_fsize -#define fs_fshift fs_fc.fc_fshift -#define fs_fmask fs_fc.fc_fmask -#define fs_isize fs_fc.fc_isize -#define fs_imask fs_fc.fc_imask -#define fs_firstino fs_fc.fc_firstino -#define fs_ipb fs_fc.fc_ipb -#define fs_fsbtodb fs_fc.fc_fsbtodb -}; - -struct ext2blkgrp { - u_int32_t bg_blkmap; /* block bitmap */ - u_int32_t bg_inomap; /* inode bitmap */ - u_int32_t bg_inotbl; /* inode table */ - u_int16_t bg_nfblk; /* # of free blocks */ - u_int16_t bg_nfino; /* # of free inodes */ - u_int16_t bg_ndirs; /* # of dirs */ - char bg_pad[14]; -}; - -struct ext2dinode { - u_int16_t di_mode; /* mode */ - u_int16_t di_uid; /* uid */ - u_int32_t di_size; /* byte size */ - u_int32_t di_atime; /* access time */ - u_int32_t di_ctime; /* creation time */ - u_int32_t di_mtime; /* modification time */ - u_int32_t di_dtime; /* deletion time */ - u_int16_t di_gid; /* gid */ - u_int16_t di_nlink; /* link count */ - u_int32_t di_nblk; /* block count */ - u_int32_t di_flags; /* file flags */ - - u_int32_t di_osdep1; /* os dependent stuff */ - - u_int32_t di_db[NDADDR]; /* direct blocks */ - u_int32_t di_ib[NIADDR]; /* indirect blocks */ - u_int32_t di_version; /* version */ - u_int32_t di_facl; /* file acl */ - u_int32_t di_dacl; /* dir acl */ - u_int32_t di_faddr; /* fragment addr */ - - u_int8_t di_frag; /* fragment number */ - u_int8_t di_fsize; /* fragment size */ - - char di_pad[10]; - -#define di_shortlink di_db -}; - -#define EXT2_MAXNAMLEN 255 - -struct ext2dirent { - u_int32_t d_ino; /* inode */ - u_int16_t d_reclen; /* directory entry length */ - u_int8_t d_namlen; /* name length */ - u_int8_t d_type; /* file type */ - char d_name[EXT2_MAXNAMLEN]; -}; - -struct file { - off_t f_seekp; /* seek pointer */ - struct ext2fs *f_fs; /* pointer to super-block */ - struct ext2blkgrp *f_bg; /* pointer to blkgrp map */ - struct ext2dinode f_di; /* copy of on-disk inode */ - int f_nindir[NIADDR]; /* number of blocks mapped by - indirect block at level i */ - char *f_blk[NIADDR]; /* buffer for indirect block - at level i */ - size_t f_blksize[NIADDR]; /* size of buffer */ - daddr_t f_blkno[NIADDR]; /* disk address of block in - buffer */ - char *f_buf; /* buffer for data block */ - size_t f_buf_size; /* size of data block */ - daddr_t f_buf_blkno; /* block number of data block */ -}; - -/* forward decls */ -static int read_inode(ino_t inumber, struct open_file *f); -static int block_map(struct open_file *f, daddr_t file_block, - daddr_t *disk_block_p); -static int buf_read_file(struct open_file *f, char **buf_p, - size_t *size_p); -static int search_directory(char *name, struct open_file *f, - ino_t *inumber_p); - -/* - * Open a file. - */ -static int -ext2fs_open(const char *upath, struct open_file *f) -{ - struct file *fp; - struct ext2fs *fs; - size_t buf_size; - ino_t inumber, parent_inumber; - int i, len, groups, bg_per_blk, blkgrps, mult; - int nlinks = 0; - int error = 0; - char *cp, *ncp, *path = NULL, *buf = NULL; - char namebuf[MAXPATHLEN+1]; - char c; - - /* allocate file system specific data structure */ - fp = malloc(sizeof(struct file)); - if (fp == NULL) - return (ENOMEM); - bzero(fp, sizeof(struct file)); - f->f_fsdata = (void *)fp; - - /* allocate space and read super block */ - fs = (struct ext2fs *)malloc(sizeof(*fs)); - fp->f_fs = fs; - twiddle(1); - error = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, - EXT2_SBLOCK, EXT2_SBSIZE, (char *)fs, &buf_size); - if (error) - goto out; - - if (buf_size != EXT2_SBSIZE || fs->fs_magic != EXT2_MAGIC) { - error = EINVAL; - goto out; - } - - /* - * compute in-core values for the superblock - */ - fs->fs_bshift = EXT2_MINBSHIFT + fs->fs_fd.fd_bsize; - fs->fs_bsize = 1 << fs->fs_bshift; - fs->fs_bmask = fs->fs_bsize - 1; - - fs->fs_fshift = EXT2_MINFSHIFT + fs->fs_fd.fd_fsize; - fs->fs_fsize = 1 << fs->fs_fshift; - fs->fs_fmask = fs->fs_fsize - 1; - - if (fs->fs_revision == EXT2_REV0) { - fs->fs_isize = EXT2_R0_ISIZE; - fs->fs_firstino = EXT2_R0_FIRSTINO; - } else { - fs->fs_isize = fs->fs_fd.fd_isize; - fs->fs_firstino = fs->fs_fd.fd_firstino; - } - fs->fs_imask = fs->fs_isize - 1; - fs->fs_ipb = fs->fs_bsize / fs->fs_isize; - fs->fs_fsbtodb = (fs->fs_bsize / DEV_BSIZE) - 1; - - /* - * we have to load in the "group descriptors" here - */ - groups = howmany(fs->fs_blocks - fs->fs_firstblk, fs->fs_bpg); - bg_per_blk = fs->fs_bsize / sizeof(struct ext2blkgrp); - blkgrps = howmany(groups, bg_per_blk); - len = blkgrps * fs->fs_bsize; - - fp->f_bg = malloc(len); - twiddle(1); - error = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, - EXT2_SBLOCK + EXT2_SBSIZE / DEV_BSIZE, len, - (char *)fp->f_bg, &buf_size); - if (error) - goto out; - - /* - * XXX - * validation of values? (blocksize, descriptors, etc?) - */ - - /* - * Calculate indirect block levels. - */ - mult = 1; - for (i = 0; i < NIADDR; i++) { - mult *= nindir(fs); - fp->f_nindir[i] = mult; - } - - inumber = EXT2_ROOTINO; - if ((error = read_inode(inumber, f)) != 0) - goto out; - - path = strdup(upath); - if (path == NULL) { - error = ENOMEM; - goto out; - } - cp = path; - while (*cp) { - /* - * Remove extra separators - */ - while (*cp == '/') - cp++; - if (*cp == '\0') - break; - - /* - * Check that current node is a directory. - */ - if (! S_ISDIR(fp->f_di.di_mode)) { - error = ENOTDIR; - goto out; - } - - /* - * Get next component of path name. - */ - len = 0; - - ncp = cp; - while ((c = *cp) != '\0' && c != '/') { - if (++len > EXT2_MAXNAMLEN) { - error = ENOENT; - goto out; - } - cp++; - } - *cp = '\0'; - - /* - * Look up component in current directory. - * Save directory inumber in case we find a - * symbolic link. - */ - parent_inumber = inumber; - error = search_directory(ncp, f, &inumber); - *cp = c; - if (error) - goto out; - - /* - * Open next component. - */ - if ((error = read_inode(inumber, f)) != 0) - goto out; - - /* - * Check for symbolic link. - */ - if (S_ISLNK(fp->f_di.di_mode)) { - int link_len = fp->f_di.di_size; - int len; - - len = strlen(cp); - if (link_len + len > MAXPATHLEN || - ++nlinks > MAXSYMLINKS) { - error = ENOENT; - goto out; - } - - bcopy(cp, &namebuf[link_len], len + 1); - if (fp->f_di.di_nblk == 0) { - bcopy(fp->f_di.di_shortlink, - namebuf, link_len); - } else { - /* - * Read file for symbolic link - */ - struct ext2fs *fs = fp->f_fs; - daddr_t disk_block; - size_t buf_size; - - if (! buf) - buf = malloc(fs->fs_bsize); - error = block_map(f, (daddr_t)0, &disk_block); - if (error) - goto out; - - twiddle(1); - error = (f->f_dev->dv_strategy)(f->f_devdata, - F_READ, fsb_to_db(fs, disk_block), - fs->fs_bsize, buf, &buf_size); - if (error) - goto out; - - bcopy((char *)buf, namebuf, link_len); - } - - /* - * If relative pathname, restart at parent directory. - * If absolute pathname, restart at root. - */ - cp = namebuf; - if (*cp != '/') - inumber = parent_inumber; - else - inumber = (ino_t)EXT2_ROOTINO; - - if ((error = read_inode(inumber, f)) != 0) - goto out; - } - } - - /* - * Found terminal component. - */ - error = 0; - fp->f_seekp = 0; -out: - if (buf) - free(buf); - if (path) - free(path); - if (error) { - if (fp->f_buf) - free(fp->f_buf); - free(fp->f_fs); - free(fp); - } - return (error); -} - -/* - * Read a new inode into a file structure. - */ -static int -read_inode(ino_t inumber, struct open_file *f) -{ - struct file *fp = (struct file *)f->f_fsdata; - struct ext2fs *fs = fp->f_fs; - struct ext2dinode *dp; - char *buf; - size_t rsize; - int level, error = 0; - - /* - * Read inode and save it. - */ - buf = malloc(fs->fs_bsize); - twiddle(1); - error = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, - ino_to_db(fs, fp->f_bg, inumber), fs->fs_bsize, buf, &rsize); - if (error) - goto out; - if (rsize != fs->fs_bsize) { - error = EIO; - goto out; - } - - dp = (struct ext2dinode *)buf; - fp->f_di = dp[ino_to_bo(fs, inumber)]; - - /* clear out old buffers */ - for (level = 0; level < NIADDR; level++) - fp->f_blkno[level] = -1; - fp->f_buf_blkno = -1; - fp->f_seekp = 0; - -out: - free(buf); - return (error); -} - -/* - * Given an offset in a file, find the disk block number that - * contains that block. - */ -static int -block_map(struct open_file *f, daddr_t file_block, daddr_t *disk_block_p) -{ - struct file *fp = (struct file *)f->f_fsdata; - struct ext2fs *fs = fp->f_fs; - daddr_t ind_block_num; - int32_t *ind_p; - int idx, level; - int error; - - /* - * Index structure of an inode: - * - * di_db[0..NDADDR-1] hold block numbers for blocks - * 0..NDADDR-1 - * - * di_ib[0] index block 0 is the single indirect block - * holds block numbers for blocks - * NDADDR .. NDADDR + NINDIR(fs)-1 - * - * di_ib[1] index block 1 is the double indirect block - * holds block numbers for INDEX blocks for blocks - * NDADDR + NINDIR(fs) .. - * NDADDR + NINDIR(fs) + NINDIR(fs)**2 - 1 - * - * di_ib[2] index block 2 is the triple indirect block - * holds block numbers for double-indirect - * blocks for blocks - * NDADDR + NINDIR(fs) + NINDIR(fs)**2 .. - * NDADDR + NINDIR(fs) + NINDIR(fs)**2 - * + NINDIR(fs)**3 - 1 - */ - - if (file_block < NDADDR) { - /* Direct block. */ - *disk_block_p = fp->f_di.di_db[file_block]; - return (0); - } - - file_block -= NDADDR; - - /* - * nindir[0] = NINDIR - * nindir[1] = NINDIR**2 - * nindir[2] = NINDIR**3 - * etc - */ - for (level = 0; level < NIADDR; level++) { - if (file_block < fp->f_nindir[level]) - break; - file_block -= fp->f_nindir[level]; - } - if (level == NIADDR) { - /* Block number too high */ - return (EFBIG); - } - - ind_block_num = fp->f_di.di_ib[level]; - - for (; level >= 0; level--) { - if (ind_block_num == 0) { - *disk_block_p = 0; /* missing */ - return (0); - } - - if (fp->f_blkno[level] != ind_block_num) { - if (fp->f_blk[level] == (char *)0) - fp->f_blk[level] = - malloc(fs->fs_bsize); - twiddle(1); - error = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, - fsb_to_db(fp->f_fs, ind_block_num), fs->fs_bsize, - fp->f_blk[level], &fp->f_blksize[level]); - if (error) - return (error); - if (fp->f_blksize[level] != fs->fs_bsize) - return (EIO); - fp->f_blkno[level] = ind_block_num; - } - - ind_p = (int32_t *)fp->f_blk[level]; - - if (level > 0) { - idx = file_block / fp->f_nindir[level - 1]; - file_block %= fp->f_nindir[level - 1]; - } else { - idx = file_block; - } - ind_block_num = ind_p[idx]; - } - - *disk_block_p = ind_block_num; - - return (0); -} - -/* - * Read a portion of a file into an internal buffer. Return - * the location in the buffer and the amount in the buffer. - */ -static int -buf_read_file(struct open_file *f, char **buf_p, size_t *size_p) -{ - struct file *fp = (struct file *)f->f_fsdata; - struct ext2fs *fs = fp->f_fs; - long off; - daddr_t file_block; - daddr_t disk_block; - size_t block_size; - int error = 0; - - off = blkoff(fs, fp->f_seekp); - file_block = lblkno(fs, fp->f_seekp); - block_size = dblksize(fs, &fp->f_di, file_block); - - if (file_block != fp->f_buf_blkno) { - error = block_map(f, file_block, &disk_block); - if (error) - goto done; - - if (fp->f_buf == (char *)0) - fp->f_buf = malloc(fs->fs_bsize); - - if (disk_block == 0) { - bzero(fp->f_buf, block_size); - fp->f_buf_size = block_size; - } else { - twiddle(4); - error = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, - fsb_to_db(fs, disk_block), block_size, - fp->f_buf, &fp->f_buf_size); - if (error) - goto done; - } - fp->f_buf_blkno = file_block; - } - - /* - * Return address of byte in buffer corresponding to - * offset, and size of remainder of buffer after that - * byte. - */ - *buf_p = fp->f_buf + off; - *size_p = block_size - off; - - /* - * But truncate buffer at end of file. - */ - if (*size_p > fp->f_di.di_size - fp->f_seekp) - *size_p = fp->f_di.di_size - fp->f_seekp; -done: - return (error); -} - -/* - * Search a directory for a name and return its - * i_number. - */ -static int -search_directory(char *name, struct open_file *f, ino_t *inumber_p) -{ - struct file *fp = (struct file *)f->f_fsdata; - struct ext2dirent *dp, *edp; - char *buf; - size_t buf_size; - int namlen, length; - int error; - - length = strlen(name); - fp->f_seekp = 0; - while (fp->f_seekp < fp->f_di.di_size) { - error = buf_read_file(f, &buf, &buf_size); - if (error) - return (error); - dp = (struct ext2dirent *)buf; - edp = (struct ext2dirent *)(buf + buf_size); - while (dp < edp) { - if (dp->d_ino == (ino_t)0) - goto next; - namlen = dp->d_namlen; - if (namlen == length && - strncmp(name, dp->d_name, length) == 0) { - /* found entry */ - *inumber_p = dp->d_ino; - return (0); - } - next: - dp = (struct ext2dirent *)((char *)dp + dp->d_reclen); - } - fp->f_seekp += buf_size; - } - return (ENOENT); -} - -static int -ext2fs_close(struct open_file *f) -{ - struct file *fp = (struct file *)f->f_fsdata; - int level; - - f->f_fsdata = (void *)0; - if (fp == (struct file *)0) - return (0); - - for (level = 0; level < NIADDR; level++) { - if (fp->f_blk[level]) - free(fp->f_blk[level]); - } - if (fp->f_buf) - free(fp->f_buf); - if (fp->f_bg) - free(fp->f_bg); - free(fp->f_fs); - free(fp); - return (0); -} - -static int -ext2fs_read(struct open_file *f, void *addr, size_t size, size_t *resid) -{ - struct file *fp = (struct file *)f->f_fsdata; - size_t csize, buf_size; - char *buf; - int error = 0; - - while (size != 0) { - if (fp->f_seekp >= fp->f_di.di_size) - break; - - error = buf_read_file(f, &buf, &buf_size); - if (error) - break; - - csize = size; - if (csize > buf_size) - csize = buf_size; - - bcopy(buf, addr, csize); - - fp->f_seekp += csize; - addr = (char *)addr + csize; - size -= csize; - } - if (resid) - *resid = size; - return (error); -} - -static off_t -ext2fs_seek(struct open_file *f, off_t offset, int where) -{ - struct file *fp = (struct file *)f->f_fsdata; - - switch (where) { - case SEEK_SET: - fp->f_seekp = offset; - break; - case SEEK_CUR: - fp->f_seekp += offset; - break; - case SEEK_END: - fp->f_seekp = fp->f_di.di_size - offset; - break; - default: - errno = EINVAL; - return (-1); - } - return (fp->f_seekp); -} - -static int -ext2fs_stat(struct open_file *f, struct stat *sb) -{ - struct file *fp = (struct file *)f->f_fsdata; - - /* only important stuff */ - sb->st_mode = fp->f_di.di_mode; - sb->st_uid = fp->f_di.di_uid; - sb->st_gid = fp->f_di.di_gid; - sb->st_size = fp->f_di.di_size; - return (0); -} - -static int -ext2fs_readdir(struct open_file *f, struct dirent *d) -{ - struct file *fp = (struct file *)f->f_fsdata; - struct ext2dirent *ed; - char *buf; - size_t buf_size; - int error; - - /* - * assume that a directory entry will not be split across blocks - */ -again: - if (fp->f_seekp >= fp->f_di.di_size) - return (ENOENT); - error = buf_read_file(f, &buf, &buf_size); - if (error) - return (error); - ed = (struct ext2dirent *)buf; - fp->f_seekp += ed->d_reclen; - if (ed->d_ino == (ino_t)0) - goto again; - d->d_type = EXTFTODT(ed->d_type); - strncpy(d->d_name, ed->d_name, ed->d_namlen); - d->d_name[ed->d_namlen] = '\0'; - return (0); -} diff --git a/lib/libstand/fstat.c b/lib/libstand/fstat.c deleted file mode 100644 index 13bed08d085f..000000000000 --- a/lib/libstand/fstat.c +++ /dev/null @@ -1,61 +0,0 @@ -/* $NetBSD: fstat.c,v 1.1 1996/01/13 22:25:38 leo Exp $ */ - -/*- - * Copyright (c) 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. - * 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. - * - * @(#)stat.c 8.1 (Berkeley) 6/11/93 - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include "stand.h" - -int -fstat(fd, sb) - int fd; - struct stat *sb; -{ - struct open_file *f = &files[fd]; - - if ((unsigned)fd >= SOPEN_MAX || f->f_flags == 0) { - errno = EBADF; - return (-1); - } - - /* operation not defined on raw devices */ - if (f->f_flags & F_RAW) { - errno = EOPNOTSUPP; - return (-1); - } - - errno = (f->f_ops->fo_stat)(f, sb); - if (errno) - return (-1); - return (0); -} diff --git a/lib/libstand/getopt.c b/lib/libstand/getopt.c deleted file mode 100644 index cfe405a85d63..000000000000 --- a/lib/libstand/getopt.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 1987, 1993, 1994 - * 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. - * 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95"; -#endif /* LIBC_SCCS and not lint */ - -#include "stand.h" -#include <string.h> - -int opterr = 1, /* if error message should be printed */ - optind = 1, /* index into parent argv vector */ - optopt, /* character checked for validity */ - optreset; /* reset getopt */ -char *optarg; /* argument associated with option */ - -#define BADCH (int)'?' -#define BADARG (int)':' -#define EMSG "" - -/* - * getopt -- - * Parse argc/argv argument vector. - */ -int -getopt(int nargc, char * const *nargv, const char *ostr) -{ - static char *place = EMSG; /* option letter processing */ - char *oli; /* option letter list index */ - - if (optreset || !*place) { /* update scanning pointer */ - optreset = 0; - if (optind >= nargc || *(place = nargv[optind]) != '-') { - place = EMSG; - return (-1); - } - if (place[1] && *++place == '-') { /* found "--" */ - ++optind; - place = EMSG; - return (-1); - } - } /* option letter okay? */ - if ((optopt = (int)*place++) == (int)':' || - !(oli = strchr(ostr, optopt))) { - /* - * if the user didn't specify '-' as an option, - * assume it means -1. - */ - if (optopt == (int)'-') - return (-1); - if (!*place) - ++optind; - if (opterr && *ostr != ':') - (void)printf("illegal option -- %c\n", optopt); - return (BADCH); - } - if (*++oli != ':') { /* don't need argument */ - optarg = NULL; - if (!*place) - ++optind; - } - else { /* need an argument */ - if (*place) /* no white space */ - optarg = place; - else if (nargc <= ++optind) { /* no arg */ - place = EMSG; - if (*ostr == ':') - return (BADARG); - if (opterr) - (void)printf("option requires an argument -- %c\n", optopt); - return (BADCH); - } - else /* white space */ - optarg = nargv[optind]; - place = EMSG; - ++optind; - } - return (optopt); /* dump back option letter */ -} diff --git a/lib/libstand/gets.c b/lib/libstand/gets.c deleted file mode 100644 index 7d54b0001775..000000000000 --- a/lib/libstand/gets.c +++ /dev/null @@ -1,112 +0,0 @@ -/* $NetBSD: gets.c,v 1.6 1995/10/11 21:16:57 pk Exp $ */ - -/*- - * Copyright (c) 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. - * 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. - * - * @(#)gets.c 8.1 (Berkeley) 6/11/93 - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include "stand.h" - -/* gets() with constrained input length */ - -void -ngets(char *buf, int n) -{ - int c; - char *lp; - - for (lp = buf;;) - switch (c = getchar() & 0177) { - case '\n': - case '\r': - *lp = '\0'; - putchar('\n'); - return; - case '\b': - case '\177': - if (lp > buf) { - lp--; - putchar('\b'); - putchar(' '); - putchar('\b'); - } - break; - case 'r'&037: { - char *p; - - putchar('\n'); - for (p = buf; p < lp; ++p) - putchar(*p); - break; - } - case 'u'&037: - case 'w'&037: - lp = buf; - putchar('\n'); - break; - default: - if ((n < 1) || ((lp - buf) < n - 1)) { - *lp++ = c; - putchar(c); - } - } - /*NOTREACHED*/ -} - -int -fgetstr(char *buf, int size, int fd) -{ - char c; - int err, len; - - size--; /* leave space for terminator */ - len = 0; - while (size != 0) { - err = read(fd, &c, sizeof(c)); - if (err < 0) /* read error */ - return(-1); - if (err == 0) { /* EOF */ - if (len == 0) - return(-1); /* nothing to read */ - break; - } - if ((c == '\r') || /* line terminators */ - (c == '\n')) - break; - *buf++ = c; /* keep char */ - size--; - len++; - } - *buf = 0; - return(len); -} - diff --git a/lib/libstand/globals.c b/lib/libstand/globals.c deleted file mode 100644 index 8fb56cf23e6b..000000000000 --- a/lib/libstand/globals.c +++ /dev/null @@ -1,38 +0,0 @@ -/* $NetBSD: globals.c,v 1.3 1995/09/18 21:19:27 pk Exp $ */ - -/* - * globals.c: - * - * global variables should be separate, so nothing else - * must be included extraneously. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <netinet/in.h> -#include <netinet/in_systm.h> - -#include "stand.h" -#include "net.h" - -u_char bcea[6] = BA; /* broadcast ethernet address */ - -char rootpath[FNAME_SIZE] = "/"; /* root mount path */ -char bootfile[FNAME_SIZE]; /* bootp says to boot this */ -char hostname[FNAME_SIZE]; /* our hostname */ -int hostnamelen; -char domainname[FNAME_SIZE]; /* our DNS domain */ -int domainnamelen; -int netproto = NET_NONE; /* Network prototol */ -char ifname[IFNAME_SIZE]; /* name of interface (e.g. "le0") */ -struct in_addr myip; /* my ip address */ -struct in_addr nameip; /* DNS server ip address */ -struct in_addr rootip; /* root ip address */ -struct in_addr swapip; /* swap ip address */ -struct in_addr gateip; /* gateway ip address */ -n_long netmask = 0xffffff00; /* subnet or net mask */ -u_int intf_mtu; /* interface mtu from bootp/dhcp */ -int errno; /* our old friend */ - diff --git a/lib/libstand/gzipfs.c b/lib/libstand/gzipfs.c deleted file mode 100644 index 6057c2835fec..000000000000 --- a/lib/libstand/gzipfs.c +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Copyright (c) 1998 Michael Smith. - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include "stand.h" - -#include <sys/stat.h> -#include <string.h> -#include <zlib.h> - -#define Z_BUFSIZE 2048 /* XXX larger? */ - -struct z_file -{ - int zf_rawfd; - off_t zf_dataoffset; - z_stream zf_zstream; - char zf_buf[Z_BUFSIZE]; - int zf_endseen; -}; - -static int zf_fill(struct z_file *z); -static int zf_open(const char *path, struct open_file *f); -static int zf_close(struct open_file *f); -static int zf_read(struct open_file *f, void *buf, size_t size, size_t *resid); -static off_t zf_seek(struct open_file *f, off_t offset, int where); -static int zf_stat(struct open_file *f, struct stat *sb); - -struct fs_ops gzipfs_fsops = { - "zip", - zf_open, - zf_close, - zf_read, - null_write, - zf_seek, - zf_stat, - null_readdir -}; - -static int -zf_fill(struct z_file *zf) -{ - int result; - int req; - - req = Z_BUFSIZE - zf->zf_zstream.avail_in; - result = 0; - - /* If we need more */ - if (req > 0) { - /* move old data to bottom of buffer */ - if (req < Z_BUFSIZE) - bcopy(zf->zf_buf + req, zf->zf_buf, Z_BUFSIZE - req); - - /* read to fill buffer and update availibility data */ - result = read(zf->zf_rawfd, zf->zf_buf + zf->zf_zstream.avail_in, req); - zf->zf_zstream.next_in = zf->zf_buf; - if (result >= 0) - zf->zf_zstream.avail_in += result; - } - return(result); -} - -/* - * Adapted from get_byte/check_header in libz - * - * Returns 0 if the header is OK, nonzero if not. - */ -static int -get_byte(struct z_file *zf, off_t *curoffp) -{ - if ((zf->zf_zstream.avail_in == 0) && (zf_fill(zf) == -1)) - return(-1); - zf->zf_zstream.avail_in--; - ++*curoffp; - return(*(zf->zf_zstream.next_in)++); -} - -static int gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ - -/* gzip flag byte */ -#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ -#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ -#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ -#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ -#define COMMENT 0x10 /* bit 4 set: file comment present */ -#define RESERVED 0xE0 /* bits 5..7: reserved */ - -static int -check_header(struct z_file *zf) -{ - int method; /* method byte */ - int flags; /* flags byte */ - uInt len; - int c; - - zf->zf_dataoffset = 0; - /* Check the gzip magic header */ - for (len = 0; len < 2; len++) { - c = get_byte(zf, &zf->zf_dataoffset); - if (c != gz_magic[len]) { - return(1); - } - } - method = get_byte(zf, &zf->zf_dataoffset); - flags = get_byte(zf, &zf->zf_dataoffset); - if (method != Z_DEFLATED || (flags & RESERVED) != 0) { - return(1); - } - - /* Discard time, xflags and OS code: */ - for (len = 0; len < 6; len++) (void)get_byte(zf, &zf->zf_dataoffset); - - if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ - len = (uInt)get_byte(zf, &zf->zf_dataoffset); - len += ((uInt)get_byte(zf, &zf->zf_dataoffset))<<8; - /* len is garbage if EOF but the loop below will quit anyway */ - while (len-- != 0 && get_byte(zf, &zf->zf_dataoffset) != -1) ; - } - if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ - while ((c = get_byte(zf, &zf->zf_dataoffset)) != 0 && c != -1) ; - } - if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ - while ((c = get_byte(zf, &zf->zf_dataoffset)) != 0 && c != -1) ; - } - if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ - for (len = 0; len < 2; len++) c = get_byte(zf, &zf->zf_dataoffset); - } - /* if there's data left, we're in business */ - return((c == -1) ? 1 : 0); -} - -static int -zf_open(const char *fname, struct open_file *f) -{ - static char *zfname; - int rawfd; - struct z_file *zf; - char *cp; - int error; - struct stat sb; - - /* Have to be in "just read it" mode */ - if (f->f_flags != F_READ) - return(EPERM); - - /* If the name already ends in .gz or .bz2, ignore it */ - if ((cp = strrchr(fname, '.')) && (!strcmp(cp, ".gz") - || !strcmp(cp, ".bz2") || !strcmp(cp, ".split"))) - return(ENOENT); - - /* Construct new name */ - zfname = malloc(strlen(fname) + 4); - if (zfname == NULL) - return(ENOMEM); - sprintf(zfname, "%s.gz", fname); - - /* Try to open the compressed datafile */ - rawfd = open(zfname, O_RDONLY); - free(zfname); - if (rawfd == -1) - return(ENOENT); - - if (fstat(rawfd, &sb) < 0) { - printf("zf_open: stat failed\n"); - close(rawfd); - return(ENOENT); - } - if (!S_ISREG(sb.st_mode)) { - printf("zf_open: not a file\n"); - close(rawfd); - return(EISDIR); /* best guess */ - } - - /* Allocate a z_file structure, populate it */ - zf = malloc(sizeof(struct z_file)); - if (zf == NULL) - return(ENOMEM); - bzero(zf, sizeof(struct z_file)); - zf->zf_rawfd = rawfd; - - /* Verify that the file is gzipped */ - if (check_header(zf)) { - close(zf->zf_rawfd); - free(zf); - return(EFTYPE); - } - - /* Initialise the inflation engine */ - if ((error = inflateInit2(&(zf->zf_zstream), -15)) != Z_OK) { - printf("zf_open: inflateInit returned %d : %s\n", error, zf->zf_zstream.msg); - close(zf->zf_rawfd); - free(zf); - return(EIO); - } - - /* Looks OK, we'll take it */ - f->f_fsdata = zf; - return(0); -} - -static int -zf_close(struct open_file *f) -{ - struct z_file *zf = (struct z_file *)f->f_fsdata; - - inflateEnd(&(zf->zf_zstream)); - close(zf->zf_rawfd); - free(zf); - return(0); -} - -static int -zf_read(struct open_file *f, void *buf, size_t size, size_t *resid) -{ - struct z_file *zf = (struct z_file *)f->f_fsdata; - int error; - - zf->zf_zstream.next_out = buf; /* where and how much */ - zf->zf_zstream.avail_out = size; - - while (zf->zf_zstream.avail_out && zf->zf_endseen == 0) { - if ((zf->zf_zstream.avail_in == 0) && (zf_fill(zf) == -1)) { - printf("zf_read: fill error\n"); - return(EIO); - } - if (zf->zf_zstream.avail_in == 0) { /* oops, unexpected EOF */ - printf("zf_read: unexpected EOF\n"); - if (zf->zf_zstream.avail_out == size) - return(EIO); - break; - } - - error = inflate(&zf->zf_zstream, Z_SYNC_FLUSH); /* decompression pass */ - if (error == Z_STREAM_END) { /* EOF, all done */ - zf->zf_endseen = 1; - break; - } - if (error != Z_OK) { /* argh, decompression error */ - printf("inflate: %s\n", zf->zf_zstream.msg); - return(EIO); - } - } - if (resid != NULL) - *resid = zf->zf_zstream.avail_out; - return(0); -} - -static int -zf_rewind(struct open_file *f) -{ - struct z_file *zf = (struct z_file *)f->f_fsdata; - - if (lseek(zf->zf_rawfd, zf->zf_dataoffset, SEEK_SET) == -1) - return(-1); - zf->zf_zstream.avail_in = 0; - zf->zf_zstream.next_in = NULL; - zf->zf_endseen = 0; - (void)inflateReset(&zf->zf_zstream); - - return(0); -} - -static off_t -zf_seek(struct open_file *f, off_t offset, int where) -{ - struct z_file *zf = (struct z_file *)f->f_fsdata; - off_t target; - char discard[16]; - - switch (where) { - case SEEK_SET: - target = offset; - break; - case SEEK_CUR: - target = offset + zf->zf_zstream.total_out; - break; - default: - errno = EINVAL; - return(-1); - } - - /* rewind if required */ - if (target < zf->zf_zstream.total_out && zf_rewind(f) != 0) - return(-1); - - /* skip forwards if required */ - while (target > zf->zf_zstream.total_out) { - errno = zf_read(f, discard, min(sizeof(discard), - target - zf->zf_zstream.total_out), NULL); - if (errno) - return(-1); - } - /* This is where we are (be honest if we overshot) */ - return(zf->zf_zstream.total_out); -} - - -static int -zf_stat(struct open_file *f, struct stat *sb) -{ - struct z_file *zf = (struct z_file *)f->f_fsdata; - int result; - - /* stat as normal, but indicate that size is unknown */ - if ((result = fstat(zf->zf_rawfd, sb)) == 0) - sb->st_size = -1; - return(result); -} - - - diff --git a/lib/libstand/i386/_setjmp.S b/lib/libstand/i386/_setjmp.S deleted file mode 100644 index cc9de5cdb88e..000000000000 --- a/lib/libstand/i386/_setjmp.S +++ /dev/null @@ -1,77 +0,0 @@ -/*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz. - * - * 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. - * 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_RCS) && !defined(lint) - .text - .asciz "$FreeBSD$" -#endif /* LIBC_RCS and not lint */ - -/* - * C library -- _setjmp, _longjmp - * - * _longjmp(a,v) - * will generate a "return(v)" from the last call to - * _setjmp(a) - * by restoring registers from the environment 'a'. - * The previous signal state is NOT restored. - */ - -#include <machine/asm.h> - -ENTRY(_setjmp) - movl 4(%esp),%eax - movl 0(%esp),%edx - movl %edx, 0(%eax) /* rta */ - movl %ebx, 4(%eax) - movl %esp, 8(%eax) - movl %ebp,12(%eax) - movl %esi,16(%eax) - movl %edi,20(%eax) - xorl %eax,%eax - ret -END(_setjmp) - -ENTRY(_longjmp) - movl 4(%esp),%edx - movl 8(%esp),%eax - movl 0(%edx),%ecx - movl 4(%edx),%ebx - movl 8(%edx),%esp - movl 12(%edx),%ebp - movl 16(%edx),%esi - movl 20(%edx),%edi - testl %eax,%eax - jnz 1f - incl %eax -1: movl %ecx,0(%esp) - ret -END(_longjmp) diff --git a/lib/libstand/in_cksum.c b/lib/libstand/in_cksum.c deleted file mode 100644 index e6051bf16656..000000000000 --- a/lib/libstand/in_cksum.c +++ /dev/null @@ -1,94 +0,0 @@ -/* $NetBSD: in_cksum.c,v 1.6 2000/03/31 19:55:09 castor Exp $ */ - -/* - * Copyright (c) 1992 Regents of the University of California. - * All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * 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. - * 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. - * - * @(#) Header: in_cksum.c,v 1.1 92/09/11 01:15:55 leres Exp (LBL) - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/types.h> -#include <machine/endian.h> - -#include "stand.h" - -/* - * Checksum routine for Internet Protocol family headers. - * This routine is very heavily used in the network - * code and should be modified for each CPU to be as fast as possible. - * In particular, it should not be this one. - */ -int -in_cksum(p, len) - void *p; - int len; -{ - int sum = 0, oddbyte = 0, v = 0; - u_char *cp = p; - - /* we assume < 2^16 bytes being summed */ - while (len > 0) { - if (oddbyte) { - sum += v + *cp++; - len--; - } - if (((long)cp & 1) == 0) { - while ((len -= 2) >= 0) { - sum += *(u_short *)cp; - cp += 2; - } - } else { - while ((len -= 2) >= 0) { -#if BYTE_ORDER == BIG_ENDIAN - sum += *cp++ << 8; - sum += *cp++; -#else - sum += *cp++; - sum += *cp++ << 8; -#endif - } - } - if ((oddbyte = len & 1) != 0) -#if BYTE_ORDER == BIG_ENDIAN - v = *cp << 8; -#else - v = *cp; -#endif - } - if (oddbyte) - sum += v; - sum = (sum >> 16) + (sum & 0xffff); /* add in accumulated carries */ - sum += sum >> 16; /* add potential last carry */ - return (0xffff & ~sum); -} diff --git a/lib/libstand/inet_ntoa.c b/lib/libstand/inet_ntoa.c deleted file mode 100644 index 5bc85335412a..000000000000 --- a/lib/libstand/inet_ntoa.c +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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. - * 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)inet_ntoa.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include "stand.h" - -/* - * Convert network-format internet address - * to base 256 d.d.d.d representation. - */ -char * -inet_ntoa(in) - struct in_addr in; -{ - static const char fmt[] = "%u.%u.%u.%u"; - static char ret[sizeof "255.255.255.255"]; - unsigned char *src = (unsigned char *) ∈ - - sprintf(ret, fmt, src[0], src[1], src[2], src[3]); - return (ret); -} - -/* - * Weak aliases for applications that use certain private entry points, - * and fail to include <arpa/inet.h>. - */ -#undef inet_ntoa -__weak_reference(__inet_ntoa, inet_ntoa); diff --git a/lib/libstand/ioctl.c b/lib/libstand/ioctl.c deleted file mode 100644 index a4512af05ed2..000000000000 --- a/lib/libstand/ioctl.c +++ /dev/null @@ -1,88 +0,0 @@ -/* $NetBSD: ioctl.c,v 1.4 1994/10/30 21:48:24 cgd Exp $ */ - -/*- - * Copyright (c) 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * The Mach Operating System project at Carnegie-Mellon University. - * - * 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. - * 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. - * - * @(#)ioctl.c 8.1 (Berkeley) 6/11/93 - * - * - * Copyright (c) 1989, 1990, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Author: Alessandro Forin - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include "stand.h" - -int -ioctl(fd, cmd, arg) - int fd; - u_long cmd; - char *arg; -{ - struct open_file *f = &files[fd]; - - if ((unsigned)fd >= SOPEN_MAX || f->f_flags == 0) { - errno = EBADF; - return (-1); - } - if (f->f_flags & F_RAW) { - errno = (f->f_dev->dv_ioctl)(f, cmd, arg); - if (errno) - return (-1); - return (0); - } - errno = EIO; - return (-1); -} diff --git a/lib/libstand/iodesc.h b/lib/libstand/iodesc.h deleted file mode 100644 index 0da1946dbf30..000000000000 --- a/lib/libstand/iodesc.h +++ /dev/null @@ -1,52 +0,0 @@ -/* $NetBSD: iodesc.h,v 1.4 1995/09/23 03:31:50 gwr Exp $ */ - -/* - * Copyright (c) 1993 Adam Glass - * Copyright (c) 1992 Regents of the University of California. - * All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * 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. - * 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. - * - * $FreeBSD$ - */ - -#ifndef __SYS_LIBNETBOOT_IODESC_H -#define __SYS_LIBNETBOOT_IODESC_H - -struct iodesc { - struct in_addr destip; /* dest. ip addr, net order */ - struct in_addr myip; /* local ip addr, net order */ - u_short destport; /* dest. port, net order */ - u_short myport; /* local port, net order */ - u_long xid; /* transaction identification */ - u_char myea[6]; /* my ethernet address */ - struct netif *io_netif; -}; - -#endif /* __SYS_LIBNETBOOT_IODESC_H */ diff --git a/lib/libstand/ip.c b/lib/libstand/ip.c deleted file mode 100644 index 541cabc4bdd8..000000000000 --- a/lib/libstand/ip.c +++ /dev/null @@ -1,422 +0,0 @@ -/* - * Copyright (c) 1992 Regents of the University of California. - * All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * 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. 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. - */ - -/* - * The send and receive functions were originally implemented in udp.c and - * moved here. Also it is likely some more cleanup can be done, especially - * once we will implement the support for tcp. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/socket.h> -#include <sys/queue.h> - -#include <string.h> - -#include <net/if.h> -#include <netinet/in.h> -#include <netinet/if_ether.h> -#include <netinet/in_systm.h> - -#include <netinet/in_pcb.h> -#include <netinet/ip.h> -#include <netinet/ip_var.h> -#include <netinet/udp.h> -#include <netinet/udp_var.h> - -#include "stand.h" -#include "net.h" - -typedef STAILQ_HEAD(ipqueue, ip_queue) ip_queue_t; -struct ip_queue { - void *ipq_pkt; - struct ip *ipq_hdr; - STAILQ_ENTRY(ip_queue) ipq_next; -}; - -/* - * Fragment re-assembly queue. - */ -struct ip_reasm { - struct in_addr ip_src; - struct in_addr ip_dst; - uint16_t ip_id; - uint8_t ip_proto; - uint8_t ip_ttl; - size_t ip_total_size; - ip_queue_t ip_queue; - void *ip_pkt; - struct ip *ip_hdr; - STAILQ_ENTRY(ip_reasm) ip_next; -}; - -STAILQ_HEAD(ire_list, ip_reasm) ire_list = STAILQ_HEAD_INITIALIZER(ire_list); - -/* Caller must leave room for ethernet and ip headers in front!! */ -ssize_t -sendip(struct iodesc *d, void *pkt, size_t len, uint8_t proto) -{ - ssize_t cc; - struct ip *ip; - u_char *ea; - -#ifdef NET_DEBUG - if (debug) { - printf("sendip: proto: %x d=%p called.\n", proto, (void *)d); - if (d) { - printf("saddr: %s:%d", - inet_ntoa(d->myip), ntohs(d->myport)); - printf(" daddr: %s:%d\n", - inet_ntoa(d->destip), ntohs(d->destport)); - } - } -#endif - - ip = (struct ip *)pkt - 1; - len += sizeof(*ip); - - bzero(ip, sizeof(*ip)); - - ip->ip_v = IPVERSION; /* half-char */ - ip->ip_hl = sizeof(*ip) >> 2; /* half-char */ - ip->ip_len = htons(len); - ip->ip_p = proto; /* char */ - ip->ip_ttl = IPDEFTTL; /* char */ - ip->ip_src = d->myip; - ip->ip_dst = d->destip; - ip->ip_sum = in_cksum(ip, sizeof(*ip)); /* short, but special */ - - if (ip->ip_dst.s_addr == INADDR_BROADCAST || ip->ip_src.s_addr == 0 || - netmask == 0 || SAMENET(ip->ip_src, ip->ip_dst, netmask)) - ea = arpwhohas(d, ip->ip_dst); - else - ea = arpwhohas(d, gateip); - - cc = sendether(d, ip, len, ea, ETHERTYPE_IP); - if (cc == -1) - return (-1); - if (cc != len) - panic("sendip: bad write (%zd != %zd)", cc, len); - return (cc - sizeof(*ip)); -} - -static void -ip_reasm_free(struct ip_reasm *ipr) -{ - struct ip_queue *ipq; - - while ((ipq = STAILQ_FIRST(&ipr->ip_queue)) != NULL) { - STAILQ_REMOVE_HEAD(&ipr->ip_queue, ipq_next); - free(ipq->ipq_pkt); - free(ipq); - } - free(ipr->ip_pkt); - free(ipr); -} - -static int -ip_reasm_add(struct ip_reasm *ipr, void *pkt, struct ip *ip) -{ - struct ip_queue *ipq, *prev, *p; - - if ((ipq = calloc(1, sizeof (*ipq))) == NULL) - return (1); - - ipq->ipq_pkt = pkt; - ipq->ipq_hdr = ip; - - prev = NULL; - STAILQ_FOREACH(p, &ipr->ip_queue, ipq_next) { - if ((ntohs(p->ipq_hdr->ip_off) & IP_OFFMASK) < - (ntohs(ip->ip_off) & IP_OFFMASK)) { - prev = p; - continue; - } - if (prev == NULL) - break; - - STAILQ_INSERT_AFTER(&ipr->ip_queue, prev, ipq, ipq_next); - return (0); - } - STAILQ_INSERT_HEAD(&ipr->ip_queue, ipq, ipq_next); - return (0); -} - -/* - * Receive a IP packet and validate it is for us. - */ -static ssize_t -readipv4(struct iodesc *d, void **pkt, void **payload, time_t tleft, - uint8_t proto) -{ - ssize_t n; - size_t hlen; - struct ether_header *eh; - struct ip *ip; - struct udphdr *uh; - uint16_t etype; /* host order */ - char *ptr; - struct ip_reasm *ipr; - struct ip_queue *ipq, *last; - -#ifdef NET_DEBUG - if (debug) - printf("readip: called\n"); -#endif - - ip = NULL; - ptr = NULL; - n = readether(d, (void **)&ptr, (void **)&ip, tleft, &etype); - if (n == -1 || n < sizeof(*ip) + sizeof(*uh)) { - free(ptr); - return (-1); - } - - /* Ethernet address checks now in readether() */ - - /* Need to respond to ARP requests. */ - if (etype == ETHERTYPE_ARP) { - struct arphdr *ah = (void *)ip; - if (ah->ar_op == htons(ARPOP_REQUEST)) { - /* Send ARP reply */ - arp_reply(d, ah); - } - free(ptr); - errno = EAGAIN; /* Call me again. */ - return (-1); - } - - if (etype != ETHERTYPE_IP) { -#ifdef NET_DEBUG - if (debug) - printf("readip: not IP. ether_type=%x\n", etype); -#endif - free(ptr); - return (-1); - } - - /* Check ip header */ - if (ip->ip_v != IPVERSION || - ip->ip_p != proto) { /* half char */ -#ifdef NET_DEBUG - if (debug) { - printf("readip: IP version or proto. ip_v=%d ip_p=%d\n", - ip->ip_v, ip->ip_p); - } -#endif - free(ptr); - return (-1); - } - - hlen = ip->ip_hl << 2; - if (hlen < sizeof(*ip) || - in_cksum(ip, hlen) != 0) { -#ifdef NET_DEBUG - if (debug) - printf("readip: short hdr or bad cksum.\n"); -#endif - free(ptr); - return (-1); - } - if (n < ntohs(ip->ip_len)) { -#ifdef NET_DEBUG - if (debug) - printf("readip: bad length %d < %d.\n", - (int)n, ntohs(ip->ip_len)); -#endif - free(ptr); - return (-1); - } - if (d->myip.s_addr && ip->ip_dst.s_addr != d->myip.s_addr) { -#ifdef NET_DEBUG - if (debug) { - printf("readip: bad saddr %s != ", inet_ntoa(d->myip)); - printf("%s\n", inet_ntoa(ip->ip_dst)); - } -#endif - free(ptr); - return (-1); - } - - /* Unfragmented packet. */ - if ((ntohs(ip->ip_off) & IP_MF) == 0 && - (ntohs(ip->ip_off) & IP_OFFMASK) == 0) { - uh = (struct udphdr *)((uintptr_t)ip + sizeof (*ip)); - /* If there were ip options, make them go away */ - if (hlen != sizeof(*ip)) { - bcopy(((u_char *)ip) + hlen, uh, uh->uh_ulen - hlen); - ip->ip_len = htons(sizeof(*ip)); - n -= hlen - sizeof(*ip); - } - - n = (n > (ntohs(ip->ip_len) - sizeof(*ip))) ? - ntohs(ip->ip_len) - sizeof(*ip) : n; - *pkt = ptr; - *payload = (void *)((uintptr_t)ip + sizeof(*ip)); - return (n); - } - - STAILQ_FOREACH(ipr, &ire_list, ip_next) { - if (ipr->ip_src.s_addr == ip->ip_src.s_addr && - ipr->ip_dst.s_addr == ip->ip_dst.s_addr && - ipr->ip_id == ip->ip_id && - ipr->ip_proto == ip->ip_p) - break; - } - - /* Allocate new reassembly entry */ - if (ipr == NULL) { - if ((ipr = calloc(1, sizeof (*ipr))) == NULL) { - free(ptr); - return (-1); - } - - ipr->ip_src = ip->ip_src; - ipr->ip_dst = ip->ip_dst; - ipr->ip_id = ip->ip_id; - ipr->ip_proto = ip->ip_p; - ipr->ip_ttl = MAXTTL; - STAILQ_INIT(&ipr->ip_queue); - STAILQ_INSERT_TAIL(&ire_list, ipr, ip_next); - } - - if (ip_reasm_add(ipr, ptr, ip) != 0) { - STAILQ_REMOVE(&ire_list, ipr, ip_reasm, ip_next); - free(ipr); - free(ptr); - return (-1); - } - - if ((ntohs(ip->ip_off) & IP_MF) == 0) { - ipr->ip_total_size = (8 * (ntohs(ip->ip_off) & IP_OFFMASK)); - ipr->ip_total_size += n + sizeof (*ip); - ipr->ip_total_size += sizeof (struct ether_header); - - ipr->ip_pkt = malloc(ipr->ip_total_size + 2); - if (ipr->ip_pkt == NULL) { - STAILQ_REMOVE(&ire_list, ipr, ip_reasm, ip_next); - ip_reasm_free(ipr); - return (-1); - } - } - - /* - * If we do not have re-assembly buffer ipr->ip_pkt, we are still - * missing fragments, so just restart the read. - */ - if (ipr->ip_pkt == NULL) { - errno = EAGAIN; - return (-1); - } - - /* - * Walk the packet list in reassembly queue, if we got all the - * fragments, build the packet. - */ - n = 0; - last = NULL; - STAILQ_FOREACH(ipq, &ipr->ip_queue, ipq_next) { - if ((ntohs(ipq->ipq_hdr->ip_off) & IP_OFFMASK) != n / 8) { - errno = EAGAIN; - return (-1); - } - - n += ntohs(ipq->ipq_hdr->ip_len) - (ipq->ipq_hdr->ip_hl << 2); - last = ipq; - } - if ((ntohs(last->ipq_hdr->ip_off) & IP_MF) != 0) { - errno = EAGAIN; - return (-1); - } - - ipq = STAILQ_FIRST(&ipr->ip_queue); - /* Fabricate ethernet header */ - eh = (struct ether_header *)((uintptr_t)ipr->ip_pkt + 2); - bcopy((void *)((uintptr_t)ipq->ipq_pkt + 2), eh, sizeof (*eh)); - - /* Fabricate IP header */ - ipr->ip_hdr = (struct ip *)((uintptr_t)eh + sizeof (*eh)); - bcopy(ipq->ipq_hdr, ipr->ip_hdr, sizeof (*ipr->ip_hdr)); - ipr->ip_hdr->ip_hl = sizeof (*ipr->ip_hdr) >> 2; - ipr->ip_hdr->ip_len = htons(n); - ipr->ip_hdr->ip_sum = 0; - ipr->ip_hdr->ip_sum = in_cksum(ipr->ip_hdr, sizeof (*ipr->ip_hdr)); - - n = 0; - ptr = (char *)((uintptr_t)ipr->ip_hdr + sizeof (*ipr->ip_hdr)); - STAILQ_FOREACH(ipq, &ipr->ip_queue, ipq_next) { - char *data; - size_t len; - - hlen = ipq->ipq_hdr->ip_hl << 2; - len = ntohs(ipq->ipq_hdr->ip_len) - hlen; - data = (char *)((uintptr_t)ipq->ipq_hdr + hlen); - - bcopy(data, ptr + n, len); - n += len; - } - - *pkt = ipr->ip_pkt; - ipr->ip_pkt = NULL; /* Avoid free from ip_reasm_free() */ - *payload = ptr; - - /* Clean up the reassembly list */ - while ((ipr = STAILQ_FIRST(&ire_list)) != NULL) { - STAILQ_REMOVE_HEAD(&ire_list, ip_next); - ip_reasm_free(ipr); - } - return (n); -} - -/* - * Receive a IP packet. - */ -ssize_t -readip(struct iodesc *d, void **pkt, void **payload, time_t tleft, - uint8_t proto) -{ - time_t t; - ssize_t ret = -1; - - t = getsecs(); - while ((getsecs() - t) < tleft) { - errno = 0; - ret = readipv4(d, pkt, payload, tleft, proto); - if (errno != EAGAIN) - break; - } - return (ret); -} diff --git a/lib/libstand/libstand.3 b/lib/libstand/libstand.3 deleted file mode 100644 index acb979f8e27f..000000000000 --- a/lib/libstand/libstand.3 +++ /dev/null @@ -1,676 +0,0 @@ -.\" Copyright (c) Michael Smith -.\" 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. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. -.\" -.\" $FreeBSD$ -.\" -.Dd August 6, 2004 -.Dt LIBSTAND 3 -.Os -.Sh NAME -.Nm libstand -.Nd support library for standalone executables -.Sh SYNOPSIS -.In stand.h -.Sh DESCRIPTION -The -.Nm -library provides a set of supporting functions for standalone -applications, mimicking where possible the standard -.Bx -programming -environment. -The following sections group these functions by kind. -Unless specifically described here, see the corresponding section 3 -manpages for the given functions. -.Sh STRING FUNCTIONS -String functions are available as documented in -.Xr string 3 -and -.Xr bstring 3 . -.Sh MEMORY ALLOCATION -.Bl -hang -width 10n -.It Xo -.Ft "void *" -.Fn malloc "size_t size" -.Xc -.Pp -Allocate -.Fa size -bytes of memory from the heap using a best-fit algorithm. -.It Xo -.Ft void -.Fn free "void *ptr" -.Xc -.Pp -Free the allocated object at -.Fa ptr . -.It Xo -.Ft void -.Fn setheap "void *start" "void *limit" -.Xc -.Pp -Initialise the heap. -This function must be called before calling -.Fn alloc -for the first time. -The region between -.Fa start -and -.Fa limit -will be used for the heap; attempting to allocate beyond this will result -in a panic. -.It Xo -.Ft "char *" -.Fn sbrk "int junk" -.Xc -.Pp -Provides the behaviour of -.Fn sbrk 0 , -i.e., returns the highest point that the heap has reached. -This value can -be used during testing to determine the actual heap usage. -The -.Fa junk -argument is ignored. -.El -.Sh ENVIRONMENT -A set of functions are provided for manipulating a flat variable space similar -to the traditional shell-supported environment. -Major enhancements are support -for set/unset hook functions. -.Bl -hang -width 10n -.It Xo -.Ft "char *" -.Fn getenv "const char *name" -.Xc -.It Xo -.Ft int -.Fn setenv "const char *name" "const char *value" "int overwrite" -.Xc -.It Xo -.Ft int -.Fn putenv "char *string" -.Xc -.It Xo -.Ft int -.Fn unsetenv "const char *name" -.Xc -.Pp -These functions behave similarly to their standard library counterparts. -.It Xo -.Ft "struct env_var *" -.Fn env_getenv "const char *name" -.Xc -.Pp -Looks up a variable in the environment and returns its entire -data structure. -.It Xo -.Ft int -.Fn env_setenv "const char *name" "int flags" "const void *value" "ev_sethook_t sethook" "ev_unsethook_t unsethook" -.Xc -.Pp -Creates a new or sets an existing environment variable called -.Fa name . -If creating a new variable, the -.Fa sethook -and -.Fa unsethook -arguments may be specified. -.Pp -The set hook is invoked whenever an attempt -is made to set the variable, unless the EV_NOHOOK flag is set. -Typically -a set hook will validate the -.Fa value -argument, and then call -.Fn env_setenv -again with EV_NOHOOK set to actually save the value. -The predefined function -.Fn env_noset -may be specified to refuse all attempts to set a variable. -.Pp -The unset hook is invoked when an attempt is made to unset a variable. -If it -returns zero, the variable will be unset. -The predefined function -.Fa env_nounset -may be used to prevent a variable being unset. -.El -.Sh STANDARD LIBRARY SUPPORT -.Bl -hang -width 10n -.It Xo -.Ft int -.Fn getopt "int argc" "char * const *argv" "const char *optstring" -.Xc -.It Xo -.Ft long -.Fn strtol "const char *nptr" "char **endptr" "int base" -.Xc -.It Xo -.Ft void -.Fn srandom "unsigned long seed" -.Xc -.It Xo -.Ft "long" -.Fn random void -.Xc -.It Xo -.Ft "char *" -.Fn strerror "int error" -.Xc -.Pp -Returns error messages for the subset of errno values supported by -.Nm . -.It Fn assert expression -.Pp -Requires -.In assert.h . -.It Xo -.Ft int -.Fn setjmp "jmp_buf env" -.Xc -.It Xo -.Ft void -.Fn longjmp "jmp_buf env" "int val" -.Xc -.Pp -Defined as -.Fn _setjmp -and -.Fn _longjmp -respectively as there is no signal state to manipulate. -Requires -.In setjmp.h . -.El -.Sh CHARACTER I/O -.Bl -hang -width 10n -.It Xo -.Ft void -.Fn gets "char *buf" -.Xc -.Pp -Read characters from the console into -.Fa buf . -All of the standard cautions apply to this function. -.It Xo -.Ft void -.Fn ngets "char *buf" "int size" -.Xc -.Pp -Read at most -.Fa size -- 1 characters from the console into -.Fa buf . -If -.Fa size -is less than 1, the function's behaviour is as for -.Fn gets . -.It Xo -.Ft int -.Fn fgetstr "char *buf" "int size" "int fd" -.Xc -.Pp -Read a line of at most -.Fa size -characters into -.Fa buf . -Line terminating characters are stripped, and the buffer is always -.Dv NUL -terminated. -Returns the number of characters in -.Fa buf -if successful, or -1 if a read error occurs. -.It Xo -.Ft int -.Fn printf "const char *fmt" "..." -.Xc -.It Xo -.Ft void -.Fn vprintf "const char *fmt" "va_list ap" -.Xc -.It Xo -.Ft int -.Fn sprintf "char *buf" "const char *fmt" "..." -.Xc -.It Xo -.Ft void -.Fn vsprintf "char *buf" "const char *fmt" "va_list ap" -.Xc -.Pp -The *printf functions implement a subset of the standard -.Fn printf -family functionality and some extensions. -The following standard conversions -are supported: c,d,n,o,p,s,u,x. -The following modifiers are supported: -+,-,#,*,0,field width,precision,l. -.Pp -The -.Li b -conversion is provided to decode error registers. -Its usage is: -.Bd -ragged -offset indent -printf( -.Qq reg=%b\en , -regval, -.Qq <base><arg>* -); -.Ed -.Pp -where <base> is the output expressed as a control character, e.g.\& \e10 gives -octal, \e20 gives hex. -Each <arg> is a sequence of characters, the first of -which gives the bit number to be inspected (origin 1) and the next characters -(up to a character less than 32) give the text to be displayed if the bit is set. -Thus -.Bd -ragged -offset indent -printf( -.Qq reg=%b\en , -3, -.Qq \e10\e2BITTWO\e1BITONE -); -.Ed -.Pp -would give the output -.Bd -ragged -offset indent -reg=3<BITTWO,BITONE> -.Ed -.Pp -The -.Li D -conversion provides a hexdump facility, e.g. -.Bd -ragged -offset indent -printf( -.Qq %6D , -ptr, -.Qq \&: -); gives -.Qq XX:XX:XX:XX:XX:XX -.Ed -.Bd -ragged -offset indent -printf( -.Qq %*D , -len, -ptr, -.Qq "\ " -); gives -.Qq XX XX XX ... -.Ed -.El -.Sh CHARACTER TESTS AND CONVERSIONS -.Bl -hang -width 10n -.It Xo -.Ft int -.Fn isupper "int c" -.Xc -.It Xo -.Ft int -.Fn islower "int c" -.Xc -.It Xo -.Ft int -.Fn isspace "int c" -.Xc -.It Xo -.Ft int -.Fn isdigit "int c" -.Xc -.It Xo -.Ft int -.Fn isxdigit "int c" -.Xc -.It Xo -.Ft int -.Fn isascii "int c" -.Xc -.It Xo -.Ft int -.Fn isalpha "int c" -.Xc -.It Xo -.Ft int -.Fn toupper "int c" -.Xc -.It Xo -.Ft int -.Fn tolower "int c" -.Xc -.El -.Sh FILE I/O -.Bl -hang -width 10n -.It Xo -.Ft int -.Fn open "const char *path" "int flags" -.Xc -.Pp -Similar to the behaviour as specified in -.Xr open 2 , -except that file creation is not supported, so the mode parameter is not -required. -The -.Fa flags -argument may be one of O_RDONLY, O_WRONLY and O_RDWR (although no file systems -currently support writing). -.It Xo -.Ft int -.Fn close "int fd" -.Xc -.It Xo -.Ft void -.Fn closeall void -.Xc -.Pp -Close all open files. -.It Xo -.Ft ssize_t -.Fn read "int fd" "void *buf" "size_t len" -.Xc -.It Xo -.Ft ssize_t -.Fn write "int fd" "void *buf" "size_t len" -.Xc -.Pp -(No file systems currently support writing.) -.It Xo -.Ft off_t -.Fn lseek "int fd" "off_t offset" "int whence" -.Xc -.Pp -Files being automatically uncompressed during reading cannot seek backwards -from the current point. -.It Xo -.Ft int -.Fn stat "const char *path" "struct stat *sb" -.Xc -.It Xo -.Ft int -.Fn fstat "int fd" "struct stat *sb" -.Xc -.Pp -The -.Fn stat -and -.Fn fstat -functions only fill out the following fields in the -.Fa sb -structure: st_mode,st_nlink,st_uid,st_gid,st_size. -The -.Nm tftp -file system cannot provide meaningful values for this call, and the -.Nm cd9660 -file system always reports files having uid/gid of zero. -.El -.Sh PAGER -The -.Nm -library supplies a simple internal pager to ease reading the output of large -commands. -.Bl -hang -width 10n -.It Xo -.Ft void -.Fn pager_open -.Xc -.Pp -Initialises the pager and tells it that the next line output will be the top of the -display. -The environment variable LINES is consulted to determine the number of -lines to be displayed before pausing. -.It Xo -.Ft void -.Fn pager_close void -.Xc -.Pp -Closes the pager. -.It Xo -.Ft int -.Fn pager_output "const char *lines" -.Xc -.Pp -Sends the lines in the -.Dv NUL Ns --terminated buffer at -.Fa lines -to the pager. -Newline characters are counted in order to determine the number -of lines being output (wrapped lines are not accounted for). -The -.Fn pager_output -function will return zero when all of the lines have been output, or nonzero -if the display was paused and the user elected to quit. -.It Xo -.Ft int -.Fn pager_file "const char *fname" -.Xc -.Pp -Attempts to open and display the file -.Fa fname . -Returns -1 on error, 0 at EOF, or 1 if the user elects to quit while reading. -.El -.Sh MISC -.Bl -hang -width 10n -.It Xo -.Ft void -.Fn twiddle void -.Xc -.Pp -Successive calls emit the characters in the sequence |,/,-,\\ followed by a -backspace in order to provide reassurance to the user. -.El -.Sh REQUIRED LOW-LEVEL SUPPORT -The following resources are consumed by -.Nm -- stack, heap, console and devices. -.Pp -The stack must be established before -.Nm -functions can be invoked. -Stack requirements vary depending on the functions -and file systems used by the consumer and the support layer functions detailed -below. -.Pp -The heap must be established before calling -.Fn alloc -or -.Fn open -by calling -.Fn setheap . -Heap usage will vary depending on the number of simultaneously open files, -as well as client behaviour. -Automatic decompression will allocate more -than 64K of data per open file. -.Pp -Console access is performed via the -.Fn getchar , -.Fn putchar -and -.Fn ischar -functions detailed below. -.Pp -Device access is initiated via -.Fn devopen -and is performed through the -.Fn dv_strategy , -.Fn dv_ioctl -and -.Fn dv_close -functions in the device switch structure that -.Fn devopen -returns. -.Pp -The consumer must provide the following support functions: -.Bl -hang -width 10n -.It Xo -.Ft int -.Fn getchar void -.Xc -.Pp -Return a character from the console, used by -.Fn gets , -.Fn ngets -and pager functions. -.It Xo -.Ft int -.Fn ischar void -.Xc -.Pp -Returns nonzero if a character is waiting from the console. -.It Xo -.Ft void -.Fn putchar int -.Xc -.Pp -Write a character to the console, used by -.Fn gets , -.Fn ngets , -.Fn *printf , -.Fn panic -and -.Fn twiddle -and thus by many other functions for debugging and informational output. -.It Xo -.Ft int -.Fn devopen "struct open_file *of" "const char *name" "const char **file" -.Xc -.Pp -Open the appropriate device for the file named in -.Fa name , -returning in -.Fa file -a pointer to the remaining body of -.Fa name -which does not refer to the device. -The -.Va f_dev -field in -.Fa of -will be set to point to the -.Vt devsw -structure for the opened device if successful. -Device identifiers must -always precede the path component, but may otherwise be arbitrarily formatted. -Used by -.Fn open -and thus for all device-related I/O. -.It Xo -.Ft int -.Fn devclose "struct open_file *of" -.Xc -.Pp -Close the device allocated for -.Fa of . -The device driver itself will already have been called for the close; this call -should clean up any allocation made by devopen only. -.It Xo -.Ft void -.Fn panic "const char *msg" "..." -.Xc -.Pp -Signal a fatal and unrecoverable error condition. -The -.Fa msg ... -arguments are as for -.Fn printf . -.El -.Sh INTERNAL FILE SYSTEMS -Internal file systems are enabled by the consumer exporting the array -.Vt struct fs_ops *file_system[] , -which should be initialised with pointers -to -.Vt struct fs_ops -structures. -The following file system handlers are supplied by -.Nm , -the consumer may supply other file systems of their own: -.Bl -hang -width ".Va cd9660_fsops" -.It Va ufs_fsops -The -.Bx -UFS. -.It Va ext2fs_fsops -Linux ext2fs file system. -.It Va tftp_fsops -File access via TFTP. -.It Va nfs_fsops -File access via NFS. -.It Va cd9660_fsops -ISO 9660 (CD-ROM) file system. -.It Va gzipfs_fsops -Stacked file system supporting gzipped files. -When trying the gzipfs file system, -.Nm -appends -.Li .gz -to the end of the filename, and then tries to locate the file using the other -file systems. -Placement of this file system in the -.Va file_system[] -array determines whether gzipped files will be opened in preference to non-gzipped -files. -It is only possible to seek a gzipped file forwards, and -.Fn stat -and -.Fn fstat -on gzipped files will report an invalid length. -.It Va bzipfs_fsops -The same as -.Va gzipfs_fsops , -but for -.Xr bzip2 1 Ns -compressed -files. -.El -.Pp -The array of -.Vt struct fs_ops -pointers should be terminated with a NULL. -.Sh DEVICES -Devices are exported by the supporting code via the array -.Vt struct devsw *devsw[] -which is a NULL terminated array of pointers to device switch structures. -.Sh HISTORY -The -.Nm -library contains contributions from many sources, including: -.Bl -bullet -compact -.It -.Nm libsa -from -.Nx -.It -.Nm libc -and -.Nm libkern -from -.Fx 3.0 . -.It -.Nm zalloc -from -.An Matthew Dillon Aq Mt dillon@backplane.com -.El -.Pp -The reorganisation and port to -.Fx 3.0 , -the environment functions and this manpage were written by -.An Mike Smith Aq Mt msmith@FreeBSD.org . -.Sh BUGS -The lack of detailed memory usage data is unhelpful. diff --git a/lib/libstand/lseek.c b/lib/libstand/lseek.c deleted file mode 100644 index b9debd1044cb..000000000000 --- a/lib/libstand/lseek.c +++ /dev/null @@ -1,141 +0,0 @@ -/* $NetBSD: lseek.c,v 1.4 1997/01/22 00:38:10 cgd Exp $ */ - -/*- - * Copyright (c) 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * The Mach Operating System project at Carnegie-Mellon University. - * - * 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. - * 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. - * - * @(#)lseek.c 8.1 (Berkeley) 6/11/93 - * - * - * Copyright (c) 1989, 1990, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Author: Alessandro Forin - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include "stand.h" - -off_t -lseek(int fd, off_t offset, int where) -{ - off_t bufpos, filepos, target; - struct open_file *f = &files[fd]; - - if ((unsigned)fd >= SOPEN_MAX || f->f_flags == 0) { - errno = EBADF; - return (-1); - } - - if (f->f_flags & F_RAW) { - /* - * On RAW devices, update internal offset. - */ - switch (where) { - case SEEK_SET: - f->f_offset = offset; - break; - case SEEK_CUR: - f->f_offset += offset; - break; - default: - errno = EOFFSET; - return (-1); - } - return (f->f_offset); - } - - /* - * If there is some unconsumed data in the readahead buffer and it - * contains the desired offset, simply adjust the buffer offset and - * length. We don't bother with SEEK_END here, since the code to - * handle it would fail in the same cases where the non-readahead - * code fails (namely, for streams which cannot seek backward and whose - * size isn't known in advance). - */ - if (f->f_ralen != 0 && where != SEEK_END) { - if ((filepos = (f->f_ops->fo_seek)(f, (off_t)0, SEEK_CUR)) == -1) - return (-1); - bufpos = filepos - f->f_ralen; - switch (where) { - case SEEK_SET: - target = offset; - break; - case SEEK_CUR: - target = bufpos + offset; - break; - default: - errno = EINVAL; - return (-1); - } - if (bufpos <= target && target < filepos) { - f->f_raoffset += target - bufpos; - f->f_ralen -= target - bufpos; - return (target); - } - } - - /* - * If this is a relative seek, we need to correct the offset for - * bytes that we have already read but the caller doesn't know - * about. - */ - if (where == SEEK_CUR) - offset -= f->f_ralen; - - /* - * Invalidate the readahead buffer. - */ - f->f_ralen = 0; - - return (f->f_ops->fo_seek)(f, offset, where); -} diff --git a/lib/libstand/mips/_setjmp.S b/lib/libstand/mips/_setjmp.S deleted file mode 100644 index 0289b0ec9274..000000000000 --- a/lib/libstand/mips/_setjmp.S +++ /dev/null @@ -1,108 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Ralph Campbell. - * - * 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. - * - * $FreeBSD$ - */ - -#include <machine/regnum.h> -#include <machine/asm.h> - -#if 0 -#if defined(LIBC_SCCS) - .text - .asciz "$OpenBSD: _setjmp.S,v 1.6 1996/09/23 21:27:53 imp Exp $" -#endif /* LIBC_SCCS */ -#endif - -/* - * C library -- _setjmp, _longjmp - * - * _longjmp(a,v) - * will generate a "return(v)" from - * the last call to - * _setjmp(a) - * by restoring registers from the stack, - * The previous signal state is NOT restored. - */ - -LEAF(_setjmp) - .set noreorder - REG_LI v0, 0xACEDBADE # sigcontext magic number - REG_S ra, (2 * SZREG)(a0) # sc_pc = return address - REG_S v0, (3 * SZREG)(a0) # saved in sc_regs[0] - REG_S s0, ((S0 + 3) * SZREG)(a0) - REG_S s1, ((S1 + 3) * SZREG)(a0) - REG_S s2, ((S2 + 3) * SZREG)(a0) - REG_S s3, ((S3 + 3) * SZREG)(a0) - REG_S s4, ((S4 + 3) * SZREG)(a0) - REG_S s5, ((S5 + 3) * SZREG)(a0) - REG_S s6, ((S6 + 3) * SZREG)(a0) - REG_S s7, ((S7 + 3) * SZREG)(a0) - REG_S sp, ((SP + 3) * SZREG)(a0) - REG_S s8, ((S8 + 3) * SZREG)(a0) - j ra - move v0, zero -END(_setjmp) - -LEAF(_longjmp) -#ifdef ABICALLS - subu sp, sp, 32 - .cprestore 16 -#endif - .set noreorder - REG_L v0, (3 * SZREG)(a0) # get magic number - REG_L ra, (2 * SZREG)(a0) - bne v0, 0xACEDBADE, botch # jump if error - - addu sp, sp, 32 # does not matter, sanity - REG_L s0, ((S0 + 3) * SZREG)(a0) - REG_L s1, ((S1 + 3) * SZREG)(a0) - REG_L s2, ((S2 + 3) * SZREG)(a0) - REG_L s3, ((S3 + 3) * SZREG)(a0) - REG_L s4, ((S4 + 3) * SZREG)(a0) - REG_L s5, ((S5 + 3) * SZREG)(a0) - REG_L s6, ((S6 + 3) * SZREG)(a0) - REG_L s7, ((S7 + 3) * SZREG)(a0) - REG_L sp, ((SP + 3) * SZREG)(a0) - REG_L s8, ((S8 + 3) * SZREG)(a0) - - j ra - move v0, a1 -botch: - jal _C_LABEL(longjmperror) - nop - jal _C_LABEL(abort) - nop -END(_longjmp) diff --git a/lib/libstand/nandfs.c b/lib/libstand/nandfs.c deleted file mode 100644 index fe3a8ab38339..000000000000 --- a/lib/libstand/nandfs.c +++ /dev/null @@ -1,1061 +0,0 @@ -/*- - * Copyright (c) 2010-2012 Semihalf. - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/queue.h> -#include <sys/stdint.h> -#include <ufs/ufs/dinode.h> -#include <fs/nandfs/nandfs_fs.h> -#include "stand.h" -#include "string.h" -#include "zlib.h" - -#define DEBUG -#undef DEBUG -#ifdef DEBUG -#define NANDFS_DEBUG(fmt, args...) do { \ - printf("NANDFS_DEBUG:" fmt "\n", ##args); } while (0) -#else -#define NANDFS_DEBUG(fmt, args...) -#endif - -struct nandfs_mdt { - uint32_t entries_per_block; - uint32_t entries_per_group; - uint32_t blocks_per_group; - uint32_t groups_per_desc_block; /* desc is super group */ - uint32_t blocks_per_desc_block; /* desc is super group */ -}; - -struct bmap_buf { - LIST_ENTRY(bmap_buf) list; - nandfs_daddr_t blknr; - uint64_t *map; -}; - -struct nandfs_node { - struct nandfs_inode *inode; - LIST_HEAD(, bmap_buf) bmap_bufs; -}; -struct nandfs { - int nf_blocksize; - int nf_sectorsize; - int nf_cpno; - - struct open_file *nf_file; - struct nandfs_node *nf_opened_node; - u_int nf_offset; - uint8_t *nf_buf; - int64_t nf_buf_blknr; - - struct nandfs_fsdata *nf_fsdata; - struct nandfs_super_block *nf_sb; - struct nandfs_segment_summary nf_segsum; - struct nandfs_checkpoint nf_checkpoint; - struct nandfs_super_root nf_sroot; - struct nandfs_node nf_ifile; - struct nandfs_node nf_datfile; - struct nandfs_node nf_cpfile; - struct nandfs_mdt nf_datfile_mdt; - struct nandfs_mdt nf_ifile_mdt; - - int nf_nindir[NIADDR]; -}; - -static int nandfs_open(const char *, struct open_file *); -static int nandfs_close(struct open_file *); -static int nandfs_read(struct open_file *, void *, size_t, size_t *); -static off_t nandfs_seek(struct open_file *, off_t, int); -static int nandfs_stat(struct open_file *, struct stat *); -static int nandfs_readdir(struct open_file *, struct dirent *); - -static int nandfs_buf_read(struct nandfs *, void **, size_t *); -static struct nandfs_node *nandfs_lookup_path(struct nandfs *, const char *); -static int nandfs_read_inode(struct nandfs *, struct nandfs_node *, - nandfs_lbn_t, u_int, void *, int); -static int nandfs_read_blk(struct nandfs *, nandfs_daddr_t, void *, int); -static int nandfs_bmap_lookup(struct nandfs *, struct nandfs_node *, - nandfs_lbn_t, nandfs_daddr_t *, int); -static int nandfs_get_checkpoint(struct nandfs *, uint64_t, - struct nandfs_checkpoint *); -static nandfs_daddr_t nandfs_vtop(struct nandfs *, nandfs_daddr_t); -static void nandfs_calc_mdt_consts(int, struct nandfs_mdt *, int); -static void nandfs_mdt_trans(struct nandfs_mdt *, uint64_t, - nandfs_daddr_t *, uint32_t *); -static int ioread(struct open_file *, off_t, void *, u_int); -static int nandfs_probe_sectorsize(struct open_file *); - -struct fs_ops nandfs_fsops = { - "nandfs", - nandfs_open, - nandfs_close, - nandfs_read, - null_write, - nandfs_seek, - nandfs_stat, - nandfs_readdir -}; - -#define NINDIR(fs) ((fs)->nf_blocksize / sizeof(nandfs_daddr_t)) - -/* from NetBSD's src/sys/net/if_ethersubr.c */ -static uint32_t -nandfs_crc32(uint32_t crc, const uint8_t *buf, size_t len) -{ - static const uint32_t crctab[] = { - 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, - 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, - 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, - 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c - }; - size_t i; - - crc = crc ^ ~0U; - for (i = 0; i < len; i++) { - crc ^= buf[i]; - crc = (crc >> 4) ^ crctab[crc & 0xf]; - crc = (crc >> 4) ^ crctab[crc & 0xf]; - } - return (crc ^ ~0U); -} - -static int -nandfs_check_fsdata_crc(struct nandfs_fsdata *fsdata) -{ - uint32_t fsdata_crc, comp_crc; - - if (fsdata->f_magic != NANDFS_FSDATA_MAGIC) - return (0); - - /* Preserve crc */ - fsdata_crc = fsdata->f_sum; - - /* Calculate */ - fsdata->f_sum = (0); - comp_crc = nandfs_crc32(0, (uint8_t *)fsdata, fsdata->f_bytes); - - /* Restore */ - fsdata->f_sum = fsdata_crc; - - /* Check CRC */ - return (fsdata_crc == comp_crc); -} - -static int -nandfs_check_superblock_crc(struct nandfs_fsdata *fsdata, - struct nandfs_super_block *super) -{ - uint32_t super_crc, comp_crc; - - /* Check super block magic */ - if (super->s_magic != NANDFS_SUPER_MAGIC) - return (0); - - /* Preserve CRC */ - super_crc = super->s_sum; - - /* Calculate */ - super->s_sum = (0); - comp_crc = nandfs_crc32(0, (uint8_t *)super, fsdata->f_sbbytes); - - /* Restore */ - super->s_sum = super_crc; - - /* Check CRC */ - return (super_crc == comp_crc); -} - -static int -nandfs_find_super_block(struct nandfs *fs, struct open_file *f) -{ - struct nandfs_super_block *sb; - int i, j, n, s; - int sectors_to_read, error; - - sb = malloc(fs->nf_sectorsize); - if (sb == NULL) - return (ENOMEM); - - memset(fs->nf_sb, 0, sizeof(*fs->nf_sb)); - - sectors_to_read = (NANDFS_NFSAREAS * fs->nf_fsdata->f_erasesize) / - fs->nf_sectorsize; - for (i = 0; i < sectors_to_read; i++) { - NANDFS_DEBUG("reading i %d offset %d\n", i, - i * fs->nf_sectorsize); - error = ioread(f, i * fs->nf_sectorsize, (char *)sb, - fs->nf_sectorsize); - if (error) { - NANDFS_DEBUG("error %d\n", error); - continue; - } - n = fs->nf_sectorsize / sizeof(struct nandfs_super_block); - s = 0; - if ((i * fs->nf_sectorsize) % fs->nf_fsdata->f_erasesize == 0) { - if (fs->nf_sectorsize == sizeof(struct nandfs_fsdata)) - continue; - else { - s += (sizeof(struct nandfs_fsdata) / - sizeof(struct nandfs_super_block)); - } - } - - for (j = s; j < n; j++) { - if (!nandfs_check_superblock_crc(fs->nf_fsdata, &sb[j])) - continue; - NANDFS_DEBUG("magic %x wtime %jd, lastcp 0x%jx\n", - sb[j].s_magic, sb[j].s_wtime, sb[j].s_last_cno); - if (sb[j].s_last_cno > fs->nf_sb->s_last_cno) - memcpy(fs->nf_sb, &sb[j], sizeof(*fs->nf_sb)); - } - } - - free(sb); - - return (fs->nf_sb->s_magic != 0 ? 0 : EINVAL); -} - -static int -nandfs_find_fsdata(struct nandfs *fs, struct open_file *f) -{ - int offset, error, i; - - NANDFS_DEBUG("starting\n"); - - offset = 0; - for (i = 0; i < 64 * NANDFS_NFSAREAS; i++) { - error = ioread(f, offset, (char *)fs->nf_fsdata, - sizeof(struct nandfs_fsdata)); - if (error) - return (error); - if (fs->nf_fsdata->f_magic == NANDFS_FSDATA_MAGIC) { - NANDFS_DEBUG("found at %x, volume %s\n", offset, - fs->nf_fsdata->f_volume_name); - if (nandfs_check_fsdata_crc(fs->nf_fsdata)) - break; - } - offset += fs->nf_sectorsize; - } - - return (error); -} - -static int -nandfs_read_structures(struct nandfs *fs, struct open_file *f) -{ - int error; - - error = nandfs_find_fsdata(fs, f); - if (error) - return (error); - - error = nandfs_find_super_block(fs, f); - - if (error == 0) - NANDFS_DEBUG("selected sb with w_time %jd last_pseg %jx\n", - fs->nf_sb->s_wtime, fs->nf_sb->s_last_pseg); - - return (error); -} - -static int -nandfs_mount(struct nandfs *fs, struct open_file *f) -{ - int err = 0, level; - uint64_t last_pseg; - - fs->nf_fsdata = malloc(sizeof(struct nandfs_fsdata)); - fs->nf_sb = malloc(sizeof(struct nandfs_super_block)); - - err = nandfs_read_structures(fs, f); - if (err) { - free(fs->nf_fsdata); - free(fs->nf_sb); - return (err); - } - - fs->nf_blocksize = 1 << (fs->nf_fsdata->f_log_block_size + 10); - - NANDFS_DEBUG("using superblock with wtime %jd\n", fs->nf_sb->s_wtime); - - fs->nf_cpno = fs->nf_sb->s_last_cno; - last_pseg = fs->nf_sb->s_last_pseg; - - /* - * Calculate indirect block levels. - */ - nandfs_daddr_t mult; - - mult = 1; - for (level = 0; level < NIADDR; level++) { - mult *= NINDIR(fs); - fs->nf_nindir[level] = mult; - } - - nandfs_calc_mdt_consts(fs->nf_blocksize, &fs->nf_datfile_mdt, - fs->nf_fsdata->f_dat_entry_size); - - nandfs_calc_mdt_consts(fs->nf_blocksize, &fs->nf_ifile_mdt, - fs->nf_fsdata->f_inode_size); - - err = ioread(f, last_pseg * fs->nf_blocksize, &fs->nf_segsum, - sizeof(struct nandfs_segment_summary)); - if (err) { - free(fs->nf_sb); - free(fs->nf_fsdata); - return (err); - } - - err = ioread(f, (last_pseg + fs->nf_segsum.ss_nblocks - 1) * - fs->nf_blocksize, &fs->nf_sroot, sizeof(struct nandfs_super_root)); - if (err) { - free(fs->nf_sb); - free(fs->nf_fsdata); - return (err); - } - - fs->nf_datfile.inode = &fs->nf_sroot.sr_dat; - LIST_INIT(&fs->nf_datfile.bmap_bufs); - fs->nf_cpfile.inode = &fs->nf_sroot.sr_cpfile; - LIST_INIT(&fs->nf_cpfile.bmap_bufs); - - err = nandfs_get_checkpoint(fs, fs->nf_cpno, &fs->nf_checkpoint); - if (err) { - free(fs->nf_sb); - free(fs->nf_fsdata); - return (err); - } - - NANDFS_DEBUG("checkpoint cp_cno=%lld\n", fs->nf_checkpoint.cp_cno); - NANDFS_DEBUG("checkpoint cp_inodes_count=%lld\n", - fs->nf_checkpoint.cp_inodes_count); - NANDFS_DEBUG("checkpoint cp_ifile_inode.i_blocks=%lld\n", - fs->nf_checkpoint.cp_ifile_inode.i_blocks); - - fs->nf_ifile.inode = &fs->nf_checkpoint.cp_ifile_inode; - LIST_INIT(&fs->nf_ifile.bmap_bufs); - return (0); -} - -#define NINDIR(fs) ((fs)->nf_blocksize / sizeof(nandfs_daddr_t)) - -static int -nandfs_open(const char *path, struct open_file *f) -{ - struct nandfs *fs; - struct nandfs_node *node; - int err, bsize, level; - - NANDFS_DEBUG("nandfs_open('%s', %p)\n", path, f); - - fs = malloc(sizeof(struct nandfs)); - f->f_fsdata = fs; - fs->nf_file = f; - - bsize = nandfs_probe_sectorsize(f); - if (bsize < 0) { - printf("Cannot probe medium sector size\n"); - return (EINVAL); - } - - fs->nf_sectorsize = bsize; - - /* - * Calculate indirect block levels. - */ - nandfs_daddr_t mult; - - mult = 1; - for (level = 0; level < NIADDR; level++) { - mult *= NINDIR(fs); - fs->nf_nindir[level] = mult; - } - - NANDFS_DEBUG("fs %p nf_sectorsize=%x\n", fs, fs->nf_sectorsize); - - err = nandfs_mount(fs, f); - if (err) { - NANDFS_DEBUG("Cannot mount nandfs: %s\n", strerror(err)); - return (err); - } - - node = nandfs_lookup_path(fs, path); - if (node == NULL) - return (EINVAL); - - fs->nf_offset = 0; - fs->nf_buf = NULL; - fs->nf_buf_blknr = -1; - fs->nf_opened_node = node; - LIST_INIT(&fs->nf_opened_node->bmap_bufs); - return (0); -} - -static void -nandfs_free_node(struct nandfs_node *node) -{ - struct bmap_buf *bmap, *tmp; - - free(node->inode); - LIST_FOREACH_SAFE(bmap, &node->bmap_bufs, list, tmp) { - LIST_REMOVE(bmap, list); - free(bmap->map); - free(bmap); - } - free(node); -} - -static int -nandfs_close(struct open_file *f) -{ - struct nandfs *fs = f->f_fsdata; - - NANDFS_DEBUG("nandfs_close(%p)\n", f); - - if (fs->nf_buf != NULL) - free(fs->nf_buf); - - nandfs_free_node(fs->nf_opened_node); - free(fs->nf_sb); - free(fs); - return (0); -} - -static int -nandfs_read(struct open_file *f, void *addr, size_t size, size_t *resid) -{ - struct nandfs *fs = (struct nandfs *)f->f_fsdata; - size_t csize, buf_size; - void *buf; - int error = 0; - - NANDFS_DEBUG("nandfs_read(file=%p, addr=%p, size=%d)\n", f, addr, size); - - while (size != 0) { - if (fs->nf_offset >= fs->nf_opened_node->inode->i_size) - break; - - error = nandfs_buf_read(fs, &buf, &buf_size); - if (error) - break; - - csize = size; - if (csize > buf_size) - csize = buf_size; - - bcopy(buf, addr, csize); - - fs->nf_offset += csize; - addr = (char *)addr + csize; - size -= csize; - } - - if (resid) - *resid = size; - return (error); -} - -static off_t -nandfs_seek(struct open_file *f, off_t offset, int where) -{ - struct nandfs *fs = f->f_fsdata; - off_t off; - u_int size; - - NANDFS_DEBUG("nandfs_seek(file=%p, offset=%lld, where=%d)\n", f, - offset, where); - - size = fs->nf_opened_node->inode->i_size; - - switch (where) { - case SEEK_SET: - off = 0; - break; - case SEEK_CUR: - off = fs->nf_offset; - break; - case SEEK_END: - off = size; - break; - default: - errno = EINVAL; - return (-1); - } - - off += offset; - if (off < 0 || off > size) { - errno = EINVAL; - return(-1); - } - - fs->nf_offset = (u_int)off; - - return (off); -} - -static int -nandfs_stat(struct open_file *f, struct stat *sb) -{ - struct nandfs *fs = f->f_fsdata; - - NANDFS_DEBUG("nandfs_stat(file=%p, stat=%p)\n", f, sb); - - sb->st_size = fs->nf_opened_node->inode->i_size; - sb->st_mode = fs->nf_opened_node->inode->i_mode; - sb->st_uid = fs->nf_opened_node->inode->i_uid; - sb->st_gid = fs->nf_opened_node->inode->i_gid; - return (0); -} - -static int -nandfs_readdir(struct open_file *f, struct dirent *d) -{ - struct nandfs *fs = f->f_fsdata; - struct nandfs_dir_entry *dirent; - void *buf; - size_t buf_size; - - NANDFS_DEBUG("nandfs_readdir(file=%p, dirent=%p)\n", f, d); - - if (fs->nf_offset >= fs->nf_opened_node->inode->i_size) { - NANDFS_DEBUG("nandfs_readdir(file=%p, dirent=%p) ENOENT\n", - f, d); - return (ENOENT); - } - - if (nandfs_buf_read(fs, &buf, &buf_size)) { - NANDFS_DEBUG("nandfs_readdir(file=%p, dirent=%p)" - "buf_read failed\n", f, d); - return (EIO); - } - - NANDFS_DEBUG("nandfs_readdir(file=%p, dirent=%p) moving forward\n", - f, d); - - dirent = (struct nandfs_dir_entry *)buf; - fs->nf_offset += dirent->rec_len; - strncpy(d->d_name, dirent->name, dirent->name_len); - d->d_name[dirent->name_len] = '\0'; - d->d_type = dirent->file_type; - return (0); -} - -static int -nandfs_buf_read(struct nandfs *fs, void **buf_p, size_t *size_p) -{ - nandfs_daddr_t blknr, blkoff; - - blknr = fs->nf_offset / fs->nf_blocksize; - blkoff = fs->nf_offset % fs->nf_blocksize; - - if (blknr != fs->nf_buf_blknr) { - if (fs->nf_buf == NULL) - fs->nf_buf = malloc(fs->nf_blocksize); - - if (nandfs_read_inode(fs, fs->nf_opened_node, blknr, 1, - fs->nf_buf, 0)) - return (EIO); - - fs->nf_buf_blknr = blknr; - } - - *buf_p = fs->nf_buf + blkoff; - *size_p = fs->nf_blocksize - blkoff; - - NANDFS_DEBUG("nandfs_buf_read buf_p=%p size_p=%d\n", *buf_p, *size_p); - - if (*size_p > fs->nf_opened_node->inode->i_size - fs->nf_offset) - *size_p = fs->nf_opened_node->inode->i_size - fs->nf_offset; - - return (0); -} - -static struct nandfs_node * -nandfs_lookup_node(struct nandfs *fs, uint64_t ino) -{ - uint64_t blocknr; - int entrynr; - struct nandfs_inode *buffer; - struct nandfs_node *node; - struct nandfs_inode *inode; - - NANDFS_DEBUG("nandfs_lookup_node ino=%lld\n", ino); - - if (ino == 0) { - printf("nandfs_lookup_node: invalid inode requested\n"); - return (NULL); - } - - buffer = malloc(fs->nf_blocksize); - inode = malloc(sizeof(struct nandfs_inode)); - node = malloc(sizeof(struct nandfs_node)); - - nandfs_mdt_trans(&fs->nf_ifile_mdt, ino, &blocknr, &entrynr); - - if (nandfs_read_inode(fs, &fs->nf_ifile, blocknr, 1, buffer, 0)) - return (NULL); - - memcpy(inode, &buffer[entrynr], sizeof(struct nandfs_inode)); - node->inode = inode; - free(buffer); - return (node); -} - -static struct nandfs_node * -nandfs_lookup_path(struct nandfs *fs, const char *path) -{ - struct nandfs_node *node; - struct nandfs_dir_entry *dirent; - char *namebuf; - uint64_t i, done, pinode, inode; - int nlinks = 0, counter, len, link_len, nameidx; - uint8_t *buffer, *orig; - char *strp, *lpath; - - buffer = malloc(fs->nf_blocksize); - orig = buffer; - - namebuf = malloc(2 * MAXPATHLEN + 2); - strncpy(namebuf, path, MAXPATHLEN); - namebuf[MAXPATHLEN] = '\0'; - done = nameidx = 0; - lpath = namebuf; - - /* Get the root inode */ - node = nandfs_lookup_node(fs, NANDFS_ROOT_INO); - inode = NANDFS_ROOT_INO; - - while ((strp = strsep(&lpath, "/")) != NULL) { - if (*strp == '\0') - continue; - if ((node->inode->i_mode & IFMT) != IFDIR) { - nandfs_free_node(node); - node = NULL; - goto out; - } - - len = strlen(strp); - NANDFS_DEBUG("%s: looking for %s\n", __func__, strp); - for (i = 0; i < node->inode->i_blocks; i++) { - if (nandfs_read_inode(fs, node, i, 1, orig, 0)) { - node = NULL; - goto out; - } - - buffer = orig; - done = counter = 0; - while (1) { - dirent = - (struct nandfs_dir_entry *)(void *)buffer; - NANDFS_DEBUG("%s: dirent.name = %s\n", - __func__, dirent->name); - NANDFS_DEBUG("%s: dirent.rec_len = %d\n", - __func__, dirent->rec_len); - NANDFS_DEBUG("%s: dirent.inode = %lld\n", - __func__, dirent->inode); - if (len == dirent->name_len && - (strncmp(strp, dirent->name, len) == 0) && - dirent->inode != 0) { - nandfs_free_node(node); - node = nandfs_lookup_node(fs, - dirent->inode); - pinode = inode; - inode = dirent->inode; - done = 1; - break; - } - - counter += dirent->rec_len; - buffer += dirent->rec_len; - - if (counter == fs->nf_blocksize) - break; - } - - if (done) - break; - } - - if (!done) { - node = NULL; - goto out; - } - - NANDFS_DEBUG("%s: %.*s has mode %o\n", __func__, - dirent->name_len, dirent->name, node->inode->i_mode); - - if ((node->inode->i_mode & IFMT) == IFLNK) { - NANDFS_DEBUG("%s: %.*s is symlink\n", - __func__, dirent->name_len, dirent->name); - link_len = node->inode->i_size; - - if (++nlinks > MAXSYMLINKS) { - nandfs_free_node(node); - node = NULL; - goto out; - } - - if (nandfs_read_inode(fs, node, 0, 1, orig, 0)) { - nandfs_free_node(node); - node = NULL; - goto out; - } - - NANDFS_DEBUG("%s: symlink is %.*s\n", - __func__, link_len, (char *)orig); - - nameidx = (nameidx == 0) ? MAXPATHLEN + 1 : 0; - bcopy((char *)orig, namebuf + nameidx, - (unsigned)link_len); - if (lpath != NULL) { - namebuf[nameidx + link_len++] = '/'; - strncpy(namebuf + nameidx + link_len, lpath, - MAXPATHLEN - link_len); - namebuf[nameidx + MAXPATHLEN] = '\0'; - } else - namebuf[nameidx + link_len] = '\0'; - - NANDFS_DEBUG("%s: strp=%s, lpath=%s, namebuf0=%s, " - "namebuf1=%s, idx=%d\n", __func__, strp, lpath, - namebuf + 0, namebuf + MAXPATHLEN + 1, nameidx); - - lpath = namebuf + nameidx; - - nandfs_free_node(node); - - /* - * If absolute pathname, restart at root. Otherwise - * continue with out parent inode. - */ - inode = (orig[0] == '/') ? NANDFS_ROOT_INO : pinode; - node = nandfs_lookup_node(fs, inode); - } - } - -out: - free(namebuf); - free(orig); - return (node); -} - -static int -nandfs_read_inode(struct nandfs *fs, struct nandfs_node *node, - nandfs_daddr_t blknr, u_int nblks, void *buf, int raw) -{ - uint64_t *pblks; - uint64_t *vblks; - u_int i; - int error; - - pblks = malloc(nblks * sizeof(uint64_t)); - vblks = malloc(nblks * sizeof(uint64_t)); - - NANDFS_DEBUG("nandfs_read_inode fs=%p node=%p blknr=%lld nblks=%d\n", - fs, node, blknr, nblks); - for (i = 0; i < nblks; i++) { - error = nandfs_bmap_lookup(fs, node, blknr + i, &vblks[i], raw); - if (error) { - free(pblks); - free(vblks); - return (error); - } - if (raw == 0) - pblks[i] = nandfs_vtop(fs, vblks[i]); - else - pblks[i] = vblks[i]; - } - - for (i = 0; i < nblks; i++) { - if (ioread(fs->nf_file, pblks[i] * fs->nf_blocksize, buf, - fs->nf_blocksize)) { - free(pblks); - free(vblks); - return (EIO); - } - - buf = (void *)((uintptr_t)buf + fs->nf_blocksize); - } - - free(pblks); - free(vblks); - return (0); -} - -static int -nandfs_read_blk(struct nandfs *fs, nandfs_daddr_t blknr, void *buf, int phys) -{ - uint64_t pblknr; - - pblknr = (phys ? blknr : nandfs_vtop(fs, blknr)); - - return (ioread(fs->nf_file, pblknr * fs->nf_blocksize, buf, - fs->nf_blocksize)); -} - -static int -nandfs_get_checkpoint(struct nandfs *fs, uint64_t cpno, - struct nandfs_checkpoint *cp) -{ - uint64_t blocknr; - int blockoff, cp_per_block, dlen; - uint8_t *buf; - - NANDFS_DEBUG("nandfs_get_checkpoint(fs=%p cpno=%lld)\n", fs, cpno); - - buf = malloc(fs->nf_blocksize); - - cpno += NANDFS_CPFILE_FIRST_CHECKPOINT_OFFSET - 1; - dlen = fs->nf_fsdata->f_checkpoint_size; - cp_per_block = fs->nf_blocksize / dlen; - blocknr = cpno / cp_per_block; - blockoff = (cpno % cp_per_block) * dlen; - - if (nandfs_read_inode(fs, &fs->nf_cpfile, blocknr, 1, buf, 0)) { - free(buf); - return (EINVAL); - } - - memcpy(cp, buf + blockoff, sizeof(struct nandfs_checkpoint)); - free(buf); - - return (0); -} - -static uint64_t * -nandfs_get_map(struct nandfs *fs, struct nandfs_node *node, nandfs_daddr_t blknr, - int phys) -{ - struct bmap_buf *bmap; - uint64_t *map; - - LIST_FOREACH(bmap, &node->bmap_bufs, list) { - if (bmap->blknr == blknr) - return (bmap->map); - } - - map = malloc(fs->nf_blocksize); - if (nandfs_read_blk(fs, blknr, map, phys)) { - free(map); - return (NULL); - } - - bmap = malloc(sizeof(struct bmap_buf)); - bmap->blknr = blknr; - bmap->map = map; - - LIST_INSERT_HEAD(&node->bmap_bufs, bmap, list); - - NANDFS_DEBUG("%s:(node=%p, map=%p)\n", __func__, node, map); - return (map); -} - -static int -nandfs_bmap_lookup(struct nandfs *fs, struct nandfs_node *node, - nandfs_lbn_t lblknr, nandfs_daddr_t *vblknr, int phys) -{ - struct nandfs_inode *ino; - nandfs_daddr_t ind_block_num; - uint64_t *map; - int idx; - int level; - - ino = node->inode; - - if (lblknr < NDADDR) { - *vblknr = ino->i_db[lblknr]; - return (0); - } - - lblknr -= NDADDR; - - /* - * nindir[0] = NINDIR - * nindir[1] = NINDIR**2 - * nindir[2] = NINDIR**3 - * etc - */ - for (level = 0; level < NIADDR; level++) { - NANDFS_DEBUG("lblknr=%jx fs->nf_nindir[%d]=%d\n", lblknr, level, fs->nf_nindir[level]); - if (lblknr < fs->nf_nindir[level]) - break; - lblknr -= fs->nf_nindir[level]; - } - - if (level == NIADDR) { - /* Block number too high */ - NANDFS_DEBUG("lblknr %jx too high\n", lblknr); - return (EFBIG); - } - - ind_block_num = ino->i_ib[level]; - - for (; level >= 0; level--) { - if (ind_block_num == 0) { - *vblknr = 0; /* missing */ - return (0); - } - - twiddle(1); - NANDFS_DEBUG("calling get_map with %jx\n", ind_block_num); - map = nandfs_get_map(fs, node, ind_block_num, phys); - if (map == NULL) - return (EIO); - - if (level > 0) { - idx = lblknr / fs->nf_nindir[level - 1]; - lblknr %= fs->nf_nindir[level - 1]; - } else - idx = lblknr; - - ind_block_num = ((nandfs_daddr_t *)map)[idx]; - } - - *vblknr = ind_block_num; - - return (0); -} - -static nandfs_daddr_t -nandfs_vtop(struct nandfs *fs, nandfs_daddr_t vblocknr) -{ - nandfs_lbn_t blocknr; - nandfs_daddr_t pblocknr; - int entrynr; - struct nandfs_dat_entry *dat; - - dat = malloc(fs->nf_blocksize); - nandfs_mdt_trans(&fs->nf_datfile_mdt, vblocknr, &blocknr, &entrynr); - - if (nandfs_read_inode(fs, &fs->nf_datfile, blocknr, 1, dat, 1)) { - free(dat); - return (0); - } - - NANDFS_DEBUG("nandfs_vtop entrynr=%d vblocknr=%lld pblocknr=%lld\n", - entrynr, vblocknr, dat[entrynr].de_blocknr); - - pblocknr = dat[entrynr].de_blocknr; - free(dat); - return (pblocknr); -} - -static void -nandfs_calc_mdt_consts(int blocksize, struct nandfs_mdt *mdt, int entry_size) -{ - - mdt->entries_per_group = blocksize * 8; /* bits in sector */ - mdt->entries_per_block = blocksize / entry_size; - mdt->blocks_per_group = - (mdt->entries_per_group -1) / mdt->entries_per_block + 1 + 1; - mdt->groups_per_desc_block = - blocksize / sizeof(struct nandfs_block_group_desc); - mdt->blocks_per_desc_block = - mdt->groups_per_desc_block * mdt->blocks_per_group + 1; -} - -static void -nandfs_mdt_trans(struct nandfs_mdt *mdt, uint64_t index, - nandfs_daddr_t *blocknr, uint32_t *entry_in_block) -{ - nandfs_daddr_t blknr; - uint64_t group, group_offset, blocknr_in_group; - uint64_t desc_block, desc_offset; - - /* Calculate our offset in the file */ - group = index / mdt->entries_per_group; - group_offset = index % mdt->entries_per_group; - desc_block = group / mdt->groups_per_desc_block; - desc_offset = group % mdt->groups_per_desc_block; - blocknr_in_group = group_offset / mdt->entries_per_block; - - /* To descgroup offset */ - blknr = 1 + desc_block * mdt->blocks_per_desc_block; - - /* To group offset */ - blknr += desc_offset * mdt->blocks_per_group; - - /* To actual file block */ - blknr += 1 + blocknr_in_group; - - *blocknr = blknr; - *entry_in_block = group_offset % mdt->entries_per_block; -} - -static int -ioread(struct open_file *f, off_t pos, void *buf, u_int length) -{ - void *buffer; - int err; - int bsize = ((struct nandfs *)f->f_fsdata)->nf_sectorsize; - u_int off, nsec; - - off = pos % bsize; - pos /= bsize; - nsec = howmany(length, bsize); - - NANDFS_DEBUG("pos=%lld length=%d off=%d nsec=%d\n", pos, length, - off, nsec); - - buffer = malloc(nsec * bsize); - - err = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, pos, - nsec * bsize, buffer, NULL); - - memcpy(buf, (void *)((uintptr_t)buffer + off), length); - free(buffer); - - return (err); -} - -static int -nandfs_probe_sectorsize(struct open_file *f) -{ - void *buffer; - int i, err; - - buffer = malloc(16 * 1024); - - NANDFS_DEBUG("probing for sector size: "); - - for (i = 512; i < (16 * 1024); i <<= 1) { - NANDFS_DEBUG("%d ", i); - err = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, 0, i, - buffer, NULL); - - if (err == 0) { - NANDFS_DEBUG("found"); - free(buffer); - return (i); - } - } - - free(buffer); - NANDFS_DEBUG("not found\n"); - return (-1); -} diff --git a/lib/libstand/net.c b/lib/libstand/net.c deleted file mode 100644 index 175ca5acc099..000000000000 --- a/lib/libstand/net.c +++ /dev/null @@ -1,283 +0,0 @@ -/* $NetBSD: net.c,v 1.20 1997/12/26 22:41:30 scottr Exp $ */ - -/* - * Copyright (c) 1992 Regents of the University of California. - * All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * 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. - * 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. - * - * @(#) Header: net.c,v 1.9 93/08/06 19:32:15 leres Exp (LBL) - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/socket.h> - -#include <string.h> - -#include <net/if.h> -#include <netinet/in.h> -#include <netinet/if_ether.h> -#include <netinet/in_systm.h> - -#include <netinet/in_pcb.h> -#include <netinet/ip.h> -#include <netinet/ip_var.h> -#include <netinet/udp.h> -#include <netinet/udp_var.h> - -#include "stand.h" -#include "net.h" - -/* - * Send a packet and wait for a reply, with exponential backoff. - * - * The send routine must return the actual number of bytes written, - * or -1 on error. - * - * The receive routine can indicate success by returning the number of - * bytes read; it can return 0 to indicate EOF; it can return -1 with a - * non-zero errno to indicate failure; finally, it can return -1 with a - * zero errno to indicate it isn't done yet. - */ -ssize_t -sendrecv(struct iodesc *d, - ssize_t (*sproc)(struct iodesc *, void *, size_t), - void *sbuf, size_t ssize, - ssize_t (*rproc)(struct iodesc *, void **, void **, time_t), - void **pkt, void **payload) -{ - ssize_t cc; - time_t t, tmo, tlast; - long tleft; - -#ifdef NET_DEBUG - if (debug) - printf("sendrecv: called\n"); -#endif - - tmo = MINTMO; - tlast = 0; - tleft = 0; - t = getsecs(); - for (;;) { - if (tleft <= 0) { - if (tmo >= MAXTMO) { - errno = ETIMEDOUT; - return -1; - } - cc = (*sproc)(d, sbuf, ssize); - if (cc != -1 && cc < ssize) - panic("sendrecv: short write! (%zd < %zd)", - cc, ssize); - - tleft = tmo; - tmo += MINTMO; - if (tmo > MAXTMO) - tmo = MAXTMO; - - if (cc == -1) { - /* Error on transmit; wait before retrying */ - while ((getsecs() - t) < tmo) - ; - tleft = 0; - continue; - } - - tlast = t; - } - - /* Try to get a packet and process it. */ - cc = (*rproc)(d, pkt, payload, tleft); - /* Return on data, EOF or real error. */ - if (cc != -1 || errno != 0) - return (cc); - - /* Timed out or didn't get the packet we're waiting for */ - t = getsecs(); - tleft -= t - tlast; - tlast = t; - } -} - -/* - * Like inet_addr() in the C library, but we only accept base-10. - * Return values are in network order. - */ -n_long -inet_addr(char *cp) -{ - u_long val; - int n; - char c; - u_int parts[4]; - u_int *pp = parts; - - for (;;) { - /* - * Collect number up to ``.''. - * Values are specified as for C: - * 0x=hex, 0=octal, other=decimal. - */ - val = 0; - while ((c = *cp) != '\0') { - if (c >= '0' && c <= '9') { - val = (val * 10) + (c - '0'); - cp++; - continue; - } - break; - } - if (*cp == '.') { - /* - * Internet format: - * a.b.c.d - * a.b.c (with c treated as 16-bits) - * a.b (with b treated as 24 bits) - */ - if (pp >= parts + 3 || val > 0xff) - goto bad; - *pp++ = val, cp++; - } else - break; - } - /* - * Check for trailing characters. - */ - if (*cp != '\0') - goto bad; - - /* - * Concoct the address according to - * the number of parts specified. - */ - n = pp - parts + 1; - switch (n) { - - case 1: /* a -- 32 bits */ - break; - - case 2: /* a.b -- 8.24 bits */ - if (val > 0xffffff) - goto bad; - val |= parts[0] << 24; - break; - - case 3: /* a.b.c -- 8.8.16 bits */ - if (val > 0xffff) - goto bad; - val |= (parts[0] << 24) | (parts[1] << 16); - break; - - case 4: /* a.b.c.d -- 8.8.8.8 bits */ - if (val > 0xff) - goto bad; - val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); - break; - } - - return (htonl(val)); - bad: - return (htonl(INADDR_NONE)); -} - -char * -inet_ntoa(struct in_addr ia) -{ - return (intoa(ia.s_addr)); -} - -/* Similar to inet_ntoa() */ -char * -intoa(n_long addr) -{ - char *cp; - u_int byte; - int n; - static char buf[17]; /* strlen(".255.255.255.255") + 1 */ - - addr = ntohl(addr); - cp = &buf[sizeof buf]; - *--cp = '\0'; - - n = 4; - do { - byte = addr & 0xff; - *--cp = byte % 10 + '0'; - byte /= 10; - if (byte > 0) { - *--cp = byte % 10 + '0'; - byte /= 10; - if (byte > 0) - *--cp = byte + '0'; - } - *--cp = '.'; - addr >>= 8; - } while (--n > 0); - - return (cp+1); -} - -static char * -number(char *s, int *n) -{ - for (*n = 0; isdigit(*s); s++) - *n = (*n * 10) + *s - '0'; - return s; -} - -n_long -ip_convertaddr(char *p) -{ -#define IP_ANYADDR 0 - n_long addr = 0, n; - - if (p == (char *)0 || *p == '\0') - return IP_ANYADDR; - p = number(p, &n); - addr |= (n << 24) & 0xff000000; - if (*p == '\0' || *p++ != '.') - return IP_ANYADDR; - p = number(p, &n); - addr |= (n << 16) & 0xff0000; - if (*p == '\0' || *p++ != '.') - return IP_ANYADDR; - p = number(p, &n); - addr |= (n << 8) & 0xff00; - if (*p == '\0' || *p++ != '.') - return IP_ANYADDR; - p = number(p, &n); - addr |= n & 0xff; - if (*p != '\0') - return IP_ANYADDR; - - return htonl(addr); -} diff --git a/lib/libstand/net.h b/lib/libstand/net.h deleted file mode 100644 index f91435c6cdce..000000000000 --- a/lib/libstand/net.h +++ /dev/null @@ -1,133 +0,0 @@ -/* $NetBSD: net.h,v 1.10 1995/10/20 00:46:30 cgd Exp $ */ - -/* - * Copyright (c) 1993 Adam Glass - * Copyright (c) 1992 Regents of the University of California. - * All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * 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. - * 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. - * - * $FreeBSD$ - */ - -#ifndef _STAND_NET_H -#define _STAND_NET_H -#ifndef _KERNEL /* XXX - see <netinet/in.h> */ -#undef __IPADDR -#define __IPADDR(x) htonl((u_int32_t)(x)) -#endif - -#include "iodesc.h" - -#define BA { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } - -enum net_proto { - NET_NONE, - NET_NFS, - NET_TFTP -}; - -/* Returns true if n_long's on the same net */ -#define SAMENET(a1, a2, m) ((a1.s_addr & m) == (a2.s_addr & m)) - -#define MACPY(s, d) bcopy((char *)s, (char *)d, 6) - -#define MAXTMO 120 /* seconds */ -#define MINTMO 2 /* seconds */ - -#define FNAME_SIZE 128 -#define IFNAME_SIZE 16 -#define RECV_SIZE 1536 /* XXX delete this */ - -/* - * How much room to leave for headers: - * 14: struct ether_header - * 20: struct ip - * 8: struct udphdr - * That's 42 but let's pad it out to 48 bytes. - */ -#define ETHER_SIZE 14 -#define HEADER_SIZE 48 - -extern u_char bcea[6]; -extern char rootpath[FNAME_SIZE]; -extern char bootfile[FNAME_SIZE]; -extern char hostname[FNAME_SIZE]; -extern int hostnamelen; -extern char domainname[FNAME_SIZE]; -extern int domainnamelen; -extern int netproto; -extern char ifname[IFNAME_SIZE]; - -/* All of these are in network order. */ -extern struct in_addr myip; -extern struct in_addr rootip; -extern struct in_addr swapip; -extern struct in_addr gateip; -extern struct in_addr nameip; -extern n_long netmask; -extern u_int intf_mtu; - -extern int debug; /* defined in the machdep sources */ - -extern struct iodesc sockets[SOPEN_MAX]; - -/* ARP/RevARP functions: */ -u_char *arpwhohas(struct iodesc *, struct in_addr); -void arp_reply(struct iodesc *, void *); -int rarp_getipaddress(int); - -/* Link functions: */ -ssize_t sendether(struct iodesc *d, void *pkt, size_t len, - u_char *dea, int etype); -ssize_t readether(struct iodesc *, void **, void **, time_t, uint16_t *); - -ssize_t sendip(struct iodesc *, void *, size_t, uint8_t); -ssize_t readip(struct iodesc *, void **, void **, time_t, uint8_t); -ssize_t sendudp(struct iodesc *, void *, size_t); -ssize_t readudp(struct iodesc *, void **, void **, time_t); -ssize_t sendrecv(struct iodesc *, - ssize_t (*)(struct iodesc *, void *, size_t), - void *, size_t, - ssize_t (*)(struct iodesc *, void **, void **, time_t), - void **, void **); - -/* bootp/DHCP */ -void bootp(int); - -/* Utilities: */ -char *ether_sprintf(u_char *); -int in_cksum(void *, int); -char *inet_ntoa(struct in_addr); -char *intoa(n_long); /* similar to inet_ntoa */ -n_long inet_addr(char *); - -/* Machine-dependent functions: */ -time_t getsecs(void); -#endif /* ! _STAND_NET_H */ diff --git a/lib/libstand/netif.c b/lib/libstand/netif.c deleted file mode 100644 index 105f9a31ab5d..000000000000 --- a/lib/libstand/netif.c +++ /dev/null @@ -1,316 +0,0 @@ -/* $NetBSD: netif.c,v 1.10 1997/09/06 13:57:14 drochner Exp $ */ - -/* - * Copyright (c) 1993 Adam Glass - * 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 Adam Glass. - * 4. The name of the Author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY Adam Glass ``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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/types.h> -#include <sys/cdefs.h> -#include <sys/mount.h> -#include <string.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> - -#include "stand.h" -#include "net.h" -#include "netif.h" - -struct iodesc sockets[SOPEN_MAX]; -#ifdef NETIF_DEBUG -int netif_debug = 0; -#endif - -/* - * netif_init: - * - * initialize the generic network interface layer - */ - -void -netif_init(void) -{ - struct netif_driver *drv; - int d, i; - -#ifdef NETIF_DEBUG - if (netif_debug) - printf("netif_init: called\n"); -#endif - for (d = 0; netif_drivers[d]; d++) { - drv = netif_drivers[d]; - for (i = 0; i < drv->netif_nifs; i++) - drv->netif_ifs[i].dif_used = 0; - } -} - -int -netif_match(struct netif *nif, void *machdep_hint) -{ - struct netif_driver *drv = nif->nif_driver; - -#if NETIF_DEBUG - if (netif_debug) - printf("%s%d: netif_match (%d)\n", drv->netif_bname, - nif->nif_unit, nif->nif_sel); -#endif - return drv->netif_match(nif, machdep_hint); -} - -struct netif * -netif_select(void *machdep_hint) -{ - int d, u, unit_done, s; - struct netif_driver *drv; - struct netif cur_if; - static struct netif best_if; - int best_val; - int val; - - best_val = 0; - best_if.nif_driver = NULL; - - for (d = 0; netif_drivers[d] != NULL; d++) { - cur_if.nif_driver = netif_drivers[d]; - drv = cur_if.nif_driver; - - for (u = 0; u < drv->netif_nifs; u++) { - cur_if.nif_unit = u; - unit_done = 0; - -#ifdef NETIF_DEBUG - if (netif_debug) - printf("\t%s%d:", drv->netif_bname, - cur_if.nif_unit); -#endif - - for (s = 0; s < drv->netif_ifs[u].dif_nsel; s++) { - cur_if.nif_sel = s; - - if (drv->netif_ifs[u].dif_used & (1 << s)) { -#ifdef NETIF_DEBUG - if (netif_debug) - printf(" [%d used]", s); -#endif - continue; - } - - val = netif_match(&cur_if, machdep_hint); -#ifdef NETIF_DEBUG - if (netif_debug) - printf(" [%d -> %d]", s, val); -#endif - if (val > best_val) { - best_val = val; - best_if = cur_if; - } - } -#ifdef NETIF_DEBUG - if (netif_debug) - printf("\n"); -#endif - } - } - - if (best_if.nif_driver == NULL) - return NULL; - - best_if.nif_driver-> - netif_ifs[best_if.nif_unit].dif_used |= (1 << best_if.nif_sel); - -#ifdef NETIF_DEBUG - if (netif_debug) - printf("netif_select: %s%d(%d) wins\n", - best_if.nif_driver->netif_bname, - best_if.nif_unit, best_if.nif_sel); -#endif - return &best_if; -} - -int -netif_probe(struct netif *nif, void *machdep_hint) -{ - struct netif_driver *drv = nif->nif_driver; - -#ifdef NETIF_DEBUG - if (netif_debug) - printf("%s%d: netif_probe\n", drv->netif_bname, nif->nif_unit); -#endif - return drv->netif_probe(nif, machdep_hint); -} - -void -netif_attach(struct netif *nif, struct iodesc *desc, void *machdep_hint) -{ - struct netif_driver *drv = nif->nif_driver; - -#ifdef NETIF_DEBUG - if (netif_debug) - printf("%s%d: netif_attach\n", drv->netif_bname, nif->nif_unit); -#endif - desc->io_netif = nif; -#ifdef PARANOID - if (drv->netif_init == NULL) - panic("%s%d: no netif_init support\n", drv->netif_bname, - nif->nif_unit); -#endif - drv->netif_init(desc, machdep_hint); - bzero(drv->netif_ifs[nif->nif_unit].dif_stats, - sizeof(struct netif_stats)); -} - -void -netif_detach(struct netif *nif) -{ - struct netif_driver *drv = nif->nif_driver; - -#ifdef NETIF_DEBUG - if (netif_debug) - printf("%s%d: netif_detach\n", drv->netif_bname, nif->nif_unit); -#endif -#ifdef PARANOID - if (drv->netif_end == NULL) - panic("%s%d: no netif_end support\n", drv->netif_bname, - nif->nif_unit); -#endif - drv->netif_end(nif); -} - -ssize_t -netif_get(struct iodesc *desc, void **pkt, time_t timo) -{ -#ifdef NETIF_DEBUG - struct netif *nif = desc->io_netif; -#endif - struct netif_driver *drv = desc->io_netif->nif_driver; - ssize_t rv; - -#ifdef NETIF_DEBUG - if (netif_debug) - printf("%s%d: netif_get\n", drv->netif_bname, nif->nif_unit); -#endif -#ifdef PARANOID - if (drv->netif_get == NULL) - panic("%s%d: no netif_get support\n", drv->netif_bname, - nif->nif_unit); -#endif - rv = drv->netif_get(desc, pkt, timo); -#ifdef NETIF_DEBUG - if (netif_debug) - printf("%s%d: netif_get returning %d\n", drv->netif_bname, - nif->nif_unit, (int)rv); -#endif - return (rv); -} - -ssize_t -netif_put(struct iodesc *desc, void *pkt, size_t len) -{ -#ifdef NETIF_DEBUG - struct netif *nif = desc->io_netif; -#endif - struct netif_driver *drv = desc->io_netif->nif_driver; - ssize_t rv; - -#ifdef NETIF_DEBUG - if (netif_debug) - printf("%s%d: netif_put\n", drv->netif_bname, nif->nif_unit); -#endif -#ifdef PARANOID - if (drv->netif_put == NULL) - panic("%s%d: no netif_put support\n", drv->netif_bname, - nif->nif_unit); -#endif - rv = drv->netif_put(desc, pkt, len); -#ifdef NETIF_DEBUG - if (netif_debug) - printf("%s%d: netif_put returning %d\n", drv->netif_bname, - nif->nif_unit, (int)rv); -#endif - return (rv); -} - -struct iodesc * -socktodesc(int sock) -{ - if (sock >= SOPEN_MAX) { - errno = EBADF; - return (NULL); - } - return (&sockets[sock]); -} - -int -netif_open(void *machdep_hint) -{ - int fd; - struct iodesc *s; - struct netif *nif; - - /* find a free socket */ - for (fd = 0, s = sockets; fd < SOPEN_MAX; fd++, s++) - if (s->io_netif == (struct netif *)0) - goto fnd; - errno = EMFILE; - return (-1); - -fnd: - bzero(s, sizeof(*s)); - netif_init(); - nif = netif_select(machdep_hint); - if (!nif) - panic("netboot: no interfaces left untried"); - if (netif_probe(nif, machdep_hint)) { - printf("netboot: couldn't probe %s%d\n", - nif->nif_driver->netif_bname, nif->nif_unit); - errno = EINVAL; - return (-1); - } - netif_attach(nif, s, machdep_hint); - - return (fd); -} - -int -netif_close(int sock) -{ - if (sock >= SOPEN_MAX) { - errno = EBADF; - return (-1); - } - netif_detach(sockets[sock].io_netif); - sockets[sock].io_netif = (struct netif *)0; - - return (0); -} diff --git a/lib/libstand/netif.h b/lib/libstand/netif.h deleted file mode 100644 index 44165ab0d88a..000000000000 --- a/lib/libstand/netif.h +++ /dev/null @@ -1,65 +0,0 @@ -/* $NetBSD: netif.h,v 1.4 1995/09/14 23:45:30 pk Exp $ */ - -/* $FreeBSD$ */ - -#ifndef __SYS_LIBNETBOOT_NETIF_H -#define __SYS_LIBNETBOOT_NETIF_H -#include "iodesc.h" - -struct netif_driver { - const char *netif_bname; - int (*netif_match)(struct netif *, void *); - int (*netif_probe)(struct netif *, void *); - void (*netif_init)(struct iodesc *, void *); - ssize_t (*netif_get)(struct iodesc *, void **, time_t); - ssize_t (*netif_put)(struct iodesc *, void *, size_t); - void (*netif_end)(struct netif *); - struct netif_dif *netif_ifs; - int netif_nifs; -}; - -struct netif_dif { - int dif_unit; - int dif_nsel; - struct netif_stats *dif_stats; - void *dif_private; - /* the following fields are used internally by the netif layer */ - u_long dif_used; -}; - -struct netif_stats { - int collisions; - int collision_error; - int missed; - int sent; - int received; - int deferred; - int overflow; -}; - -struct netif { - struct netif_driver *nif_driver; - int nif_unit; - int nif_sel; - void *nif_devdata; -}; - -extern struct netif_driver *netif_drivers[]; /* machdep */ -extern int n_netif_drivers; - -extern int netif_debug; - -void netif_init(void); -struct netif *netif_select(void *); -int netif_probe(struct netif *, void *); -void netif_attach(struct netif *, struct iodesc *, void *); -void netif_detach(struct netif *); -ssize_t netif_get(struct iodesc *, void **, time_t); -ssize_t netif_put(struct iodesc *, void *, size_t); - -int netif_open(void *); -int netif_close(int); - -struct iodesc *socktodesc(int); - -#endif /* __SYS_LIBNETBOOT_NETIF_H */ diff --git a/lib/libstand/nfs.c b/lib/libstand/nfs.c deleted file mode 100644 index 7e2e1ababacc..000000000000 --- a/lib/libstand/nfs.c +++ /dev/null @@ -1,860 +0,0 @@ -/* $NetBSD: nfs.c,v 1.2 1998/01/24 12:43:09 drochner Exp $ */ - -/*- - * Copyright (c) 1993 John Brezak - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/time.h> -#include <sys/socket.h> -#include <sys/stat.h> -#include <string.h> -#include <stddef.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> - -#include "rpcv2.h" -#include "nfsv2.h" - -#include "stand.h" -#include "net.h" -#include "netif.h" -#include "rpc.h" - -#define NFS_DEBUGxx - -#define NFSREAD_MIN_SIZE 1024 -#define NFSREAD_MAX_SIZE 16384 - -/* NFSv3 definitions */ -#define NFS_V3MAXFHSIZE 64 -#define NFS_VER3 3 -#define RPCMNT_VER3 3 -#define NFSPROCV3_LOOKUP 3 -#define NFSPROCV3_READLINK 5 -#define NFSPROCV3_READ 6 -#define NFSPROCV3_READDIR 16 - -typedef struct { - uint32_t val[2]; -} n_quad; - -struct nfsv3_time { - uint32_t nfs_sec; - uint32_t nfs_nsec; -}; - -struct nfsv3_fattrs { - uint32_t fa_type; - uint32_t fa_mode; - uint32_t fa_nlink; - uint32_t fa_uid; - uint32_t fa_gid; - n_quad fa_size; - n_quad fa_used; - n_quad fa_rdev; - n_quad fa_fsid; - n_quad fa_fileid; - struct nfsv3_time fa_atime; - struct nfsv3_time fa_mtime; - struct nfsv3_time fa_ctime; -}; - -/* - * For NFSv3, the file handle is variable in size, so most fixed sized - * structures for arguments won't work. For most cases, a structure - * that starts with any fixed size section is followed by an array - * that covers the maximum size required. - */ -struct nfsv3_readdir_repl { - uint32_t errno; - uint32_t ok; - struct nfsv3_fattrs fa; - uint32_t cookiev0; - uint32_t cookiev1; -}; - -struct nfsv3_readdir_entry { - uint32_t follows; - uint32_t fid0; - uint32_t fid1; - uint32_t len; - uint32_t nameplus[0]; -}; - -struct nfs_iodesc { - struct iodesc *iodesc; - off_t off; - uint32_t fhsize; - u_char fh[NFS_V3MAXFHSIZE]; - struct nfsv3_fattrs fa; /* all in network order */ - uint64_t cookie; -}; - -/* - * XXX interactions with tftp? See nfswrapper.c for a confusing - * issue. - */ -int nfs_open(const char *path, struct open_file *f); -static int nfs_close(struct open_file *f); -static int nfs_read(struct open_file *f, void *buf, size_t size, size_t *resid); -static int nfs_write(struct open_file *f, void *buf, size_t size, size_t *resid); -static off_t nfs_seek(struct open_file *f, off_t offset, int where); -static int nfs_stat(struct open_file *f, struct stat *sb); -static int nfs_readdir(struct open_file *f, struct dirent *d); - -struct nfs_iodesc nfs_root_node; - -struct fs_ops nfs_fsops = { - "nfs", - nfs_open, - nfs_close, - nfs_read, - nfs_write, - nfs_seek, - nfs_stat, - nfs_readdir -}; - -static int nfs_read_size = NFSREAD_MIN_SIZE; - -/* - * Improve boot performance over NFS - */ -static void -set_nfs_read_size(void) -{ - char *env, *end; - char buf[10]; - - if ((env = getenv("nfs.read_size")) != NULL) { - errno = 0; - nfs_read_size = (int)strtol(env, &end, 0); - if (errno != 0 || *env == '\0' || *end != '\0') { - printf("%s: bad value: \"%s\", defaulting to %d\n", - "nfs.read_size", env, NFSREAD_MIN_SIZE); - nfs_read_size = NFSREAD_MIN_SIZE; - } - } - if (nfs_read_size < NFSREAD_MIN_SIZE) { - printf("%s: bad value: \"%d\", defaulting to %d\n", - "nfs.read_size", nfs_read_size, NFSREAD_MIN_SIZE); - nfs_read_size = NFSREAD_MIN_SIZE; - } - if (nfs_read_size > NFSREAD_MAX_SIZE) { - printf("%s: bad value: \"%d\", defaulting to %d\n", - "nfs.read_size", nfs_read_size, NFSREAD_MIN_SIZE); - nfs_read_size = NFSREAD_MAX_SIZE; - } - snprintf(buf, sizeof (buf), "%d", nfs_read_size); - setenv("nfs.read_size", buf, 1); -} - -/* - * Fetch the root file handle (call mount daemon) - * Return zero or error number. - */ -int -nfs_getrootfh(struct iodesc *d, char *path, uint32_t *fhlenp, u_char *fhp) -{ - void *pkt = NULL; - int len; - struct args { - uint32_t len; - char path[FNAME_SIZE]; - } *args; - struct repl { - uint32_t errno; - uint32_t fhsize; - u_char fh[NFS_V3MAXFHSIZE]; - uint32_t authcnt; - uint32_t auth[7]; - } *repl; - struct { - uint32_t h[RPC_HEADER_WORDS]; - struct args d; - } sdata; - size_t cc; - -#ifdef NFS_DEBUG - if (debug) - printf("nfs_getrootfh: %s\n", path); -#endif - - args = &sdata.d; - - bzero(args, sizeof(*args)); - len = strlen(path); - if (len > sizeof(args->path)) - len = sizeof(args->path); - args->len = htonl(len); - bcopy(path, args->path, len); - len = sizeof(uint32_t) + roundup(len, sizeof(uint32_t)); - - cc = rpc_call(d, RPCPROG_MNT, RPCMNT_VER3, RPCMNT_MOUNT, - args, len, (void **)&repl, &pkt); - if (cc == -1) { - free(pkt); - /* errno was set by rpc_call */ - return (errno); - } - if (cc < 2 * sizeof (uint32_t)) { - free(pkt); - return (EBADRPC); - } - if (repl->errno != 0) { - free(pkt); - return (ntohl(repl->errno)); - } - *fhlenp = ntohl(repl->fhsize); - bcopy(repl->fh, fhp, *fhlenp); - - set_nfs_read_size(); - free(pkt); - return (0); -} - -/* - * Lookup a file. Store handle and attributes. - * Return zero or error number. - */ -int -nfs_lookupfh(struct nfs_iodesc *d, const char *name, struct nfs_iodesc *newfd) -{ - void *pkt = NULL; - int len, rlen, pos; - struct args { - uint32_t fhsize; - uint32_t fhplusname[1 + - (NFS_V3MAXFHSIZE + FNAME_SIZE) / sizeof(uint32_t)]; - } *args; - struct repl { - uint32_t errno; - uint32_t fhsize; - uint32_t fhplusattr[(NFS_V3MAXFHSIZE + - 2 * (sizeof(uint32_t) + - sizeof(struct nfsv3_fattrs))) / sizeof(uint32_t)]; - } *repl; - struct { - uint32_t h[RPC_HEADER_WORDS]; - struct args d; - } sdata; - ssize_t cc; - -#ifdef NFS_DEBUG - if (debug) - printf("lookupfh: called\n"); -#endif - - args = &sdata.d; - - bzero(args, sizeof(*args)); - args->fhsize = htonl(d->fhsize); - bcopy(d->fh, args->fhplusname, d->fhsize); - len = strlen(name); - if (len > FNAME_SIZE) - len = FNAME_SIZE; - pos = roundup(d->fhsize, sizeof(uint32_t)) / sizeof(uint32_t); - args->fhplusname[pos++] = htonl(len); - bcopy(name, &args->fhplusname[pos], len); - len = sizeof(uint32_t) + pos * sizeof(uint32_t) + - roundup(len, sizeof(uint32_t)); - - cc = rpc_call(d->iodesc, NFS_PROG, NFS_VER3, NFSPROCV3_LOOKUP, - args, len, (void **)&repl, &pkt); - if (cc == -1) { - free(pkt); - return (errno); /* XXX - from rpc_call */ - } - if (cc < 2 * sizeof(uint32_t)) { - free(pkt); - return (EIO); - } - if (repl->errno != 0) { - free(pkt); - /* saerrno.h now matches NFS error numbers. */ - return (ntohl(repl->errno)); - } - newfd->fhsize = ntohl(repl->fhsize); - bcopy(repl->fhplusattr, &newfd->fh, newfd->fhsize); - pos = roundup(newfd->fhsize, sizeof(uint32_t)) / sizeof(uint32_t); - if (repl->fhplusattr[pos++] == 0) { - free(pkt); - return (EIO); - } - bcopy(&repl->fhplusattr[pos], &newfd->fa, sizeof(newfd->fa)); - free(pkt); - return (0); -} - -#ifndef NFS_NOSYMLINK -/* - * Get the destination of a symbolic link. - */ -int -nfs_readlink(struct nfs_iodesc *d, char *buf) -{ - void *pkt = NULL; - struct args { - uint32_t fhsize; - u_char fh[NFS_V3MAXFHSIZE]; - } *args; - struct repl { - uint32_t errno; - uint32_t ok; - struct nfsv3_fattrs fa; - uint32_t len; - u_char path[NFS_MAXPATHLEN]; - } *repl; - struct { - uint32_t h[RPC_HEADER_WORDS]; - struct args d; - } sdata; - ssize_t cc; - int rc = 0; - -#ifdef NFS_DEBUG - if (debug) - printf("readlink: called\n"); -#endif - - args = &sdata.d; - - bzero(args, sizeof(*args)); - args->fhsize = htonl(d->fhsize); - bcopy(d->fh, args->fh, d->fhsize); - cc = rpc_call(d->iodesc, NFS_PROG, NFS_VER3, NFSPROCV3_READLINK, - args, sizeof(uint32_t) + roundup(d->fhsize, sizeof(uint32_t)), - (void **)&repl, &pkt); - if (cc == -1) - return (errno); - - if (cc < 2 * sizeof(uint32_t)) { - rc = EIO; - goto done; - } - - if (repl->errno != 0) { - rc = ntohl(repl->errno); - goto done; - } - - if (repl->ok == 0) { - rc = EIO; - goto done; - } - - repl->len = ntohl(repl->len); - if (repl->len > NFS_MAXPATHLEN) { - rc = ENAMETOOLONG; - goto done; - } - - bcopy(repl->path, buf, repl->len); - buf[repl->len] = 0; -done: - free(pkt); - return (rc); -} -#endif - -/* - * Read data from a file. - * Return transfer count or -1 (and set errno) - */ -ssize_t -nfs_readdata(struct nfs_iodesc *d, off_t off, void *addr, size_t len) -{ - void *pkt = NULL; - struct args { - uint32_t fhsize; - uint32_t fhoffcnt[NFS_V3MAXFHSIZE / sizeof(uint32_t) + 3]; - } *args; - struct repl { - uint32_t errno; - uint32_t ok; - struct nfsv3_fattrs fa; - uint32_t count; - uint32_t eof; - uint32_t len; - u_char data[NFSREAD_MAX_SIZE]; - } *repl; - struct { - uint32_t h[RPC_HEADER_WORDS]; - struct args d; - } sdata; - size_t cc; - long x; - int hlen, rlen, pos; - - args = &sdata.d; - - bzero(args, sizeof(*args)); - args->fhsize = htonl(d->fhsize); - bcopy(d->fh, args->fhoffcnt, d->fhsize); - pos = roundup(d->fhsize, sizeof(uint32_t)) / sizeof(uint32_t); - args->fhoffcnt[pos++] = 0; - args->fhoffcnt[pos++] = htonl((uint32_t)off); - if (len > nfs_read_size) - len = nfs_read_size; - args->fhoffcnt[pos] = htonl((uint32_t)len); - hlen = offsetof(struct repl, data[0]); - - cc = rpc_call(d->iodesc, NFS_PROG, NFS_VER3, NFSPROCV3_READ, - args, 4 * sizeof(uint32_t) + roundup(d->fhsize, sizeof(uint32_t)), - (void **)&repl, &pkt); - if (cc == -1) { - /* errno was already set by rpc_call */ - return (-1); - } - if (cc < hlen) { - errno = EBADRPC; - free(pkt); - return (-1); - } - if (repl->errno != 0) { - errno = ntohl(repl->errno); - free(pkt); - return (-1); - } - rlen = cc - hlen; - x = ntohl(repl->count); - if (rlen < x) { - printf("nfsread: short packet, %d < %ld\n", rlen, x); - errno = EBADRPC; - free(pkt); - return (-1); - } - bcopy(repl->data, addr, x); - free(pkt); - return (x); -} - -/* - * Open a file. - * return zero or error number - */ -int -nfs_open(const char *upath, struct open_file *f) -{ - struct iodesc *desc; - struct nfs_iodesc *currfd; - char buf[2 * NFS_V3MAXFHSIZE + 3]; - u_char *fh; - char *cp; - int i; -#ifndef NFS_NOSYMLINK - struct nfs_iodesc *newfd; - struct nfsv3_fattrs *fa; - char *ncp; - int c; - char namebuf[NFS_MAXPATHLEN + 1]; - char linkbuf[NFS_MAXPATHLEN + 1]; - int nlinks = 0; -#endif - int error; - char *path; - - if (netproto != NET_NFS) - return (EINVAL); - -#ifdef NFS_DEBUG - if (debug) - printf("nfs_open: %s (rootpath=%s)\n", upath, rootpath); -#endif - if (!rootpath[0]) { - printf("no rootpath, no nfs\n"); - return (ENXIO); - } - - if (f->f_dev->dv_type != DEVT_NET) - return (EINVAL); - - if (!(desc = socktodesc(*(int *)(f->f_devdata)))) - return (EINVAL); - - /* Bind to a reserved port. */ - desc->myport = htons(--rpc_port); - desc->destip = rootip; - if ((error = nfs_getrootfh(desc, rootpath, &nfs_root_node.fhsize, - nfs_root_node.fh))) - return (error); - nfs_root_node.fa.fa_type = htonl(NFDIR); - nfs_root_node.fa.fa_mode = htonl(0755); - nfs_root_node.fa.fa_nlink = htonl(2); - nfs_root_node.iodesc = desc; - - fh = &nfs_root_node.fh[0]; - buf[0] = 'X'; - cp = &buf[1]; - for (i = 0; i < nfs_root_node.fhsize; i++, cp += 2) - sprintf(cp, "%02x", fh[i]); - sprintf(cp, "X"); - setenv("boot.nfsroot.server", inet_ntoa(rootip), 1); - setenv("boot.nfsroot.path", rootpath, 1); - setenv("boot.nfsroot.nfshandle", buf, 1); - sprintf(buf, "%d", nfs_root_node.fhsize); - setenv("boot.nfsroot.nfshandlelen", buf, 1); - - /* Allocate file system specific data structure */ - currfd = malloc(sizeof(*newfd)); - if (currfd == NULL) { - error = ENOMEM; - goto out; - } -#ifndef NFS_NOSYMLINK - bcopy(&nfs_root_node, currfd, sizeof(*currfd)); - newfd = NULL; - - cp = path = strdup(upath); - if (path == NULL) { - error = ENOMEM; - goto out; - } - while (*cp) { - /* - * Remove extra separators - */ - while (*cp == '/') - cp++; - - if (*cp == '\0') - break; - /* - * Check that current node is a directory. - */ - if (currfd->fa.fa_type != htonl(NFDIR)) { - error = ENOTDIR; - goto out; - } - - /* allocate file system specific data structure */ - newfd = malloc(sizeof(*newfd)); - if (newfd == NULL) { - error = ENOMEM; - goto out; - } - newfd->iodesc = currfd->iodesc; - - /* - * Get next component of path name. - */ - { - int len = 0; - - ncp = cp; - while ((c = *cp) != '\0' && c != '/') { - if (++len > NFS_MAXNAMLEN) { - error = ENOENT; - goto out; - } - cp++; - } - *cp = '\0'; - } - - /* lookup a file handle */ - error = nfs_lookupfh(currfd, ncp, newfd); - *cp = c; - if (error) - goto out; - - /* - * Check for symbolic link - */ - if (newfd->fa.fa_type == htonl(NFLNK)) { - int link_len, len; - - error = nfs_readlink(newfd, linkbuf); - if (error) - goto out; - - link_len = strlen(linkbuf); - len = strlen(cp); - - if (link_len + len > MAXPATHLEN - || ++nlinks > MAXSYMLINKS) { - error = ENOENT; - goto out; - } - - bcopy(cp, &namebuf[link_len], len + 1); - bcopy(linkbuf, namebuf, link_len); - - /* - * If absolute pathname, restart at root. - * If relative pathname, restart at parent directory. - */ - cp = namebuf; - if (*cp == '/') - bcopy(&nfs_root_node, currfd, sizeof(*currfd)); - - free(newfd); - newfd = NULL; - - continue; - } - - free(currfd); - currfd = newfd; - newfd = NULL; - } - - error = 0; - -out: - free(newfd); - free(path); -#else - currfd->iodesc = desc; - - error = nfs_lookupfh(&nfs_root_node, upath, currfd); -#endif - if (!error) { - currfd->off = 0; - currfd->cookie = 0; - f->f_fsdata = (void *)currfd; - return (0); - } - -#ifdef NFS_DEBUG - if (debug) - printf("nfs_open: %s lookupfh failed: %s\n", - path, strerror(error)); -#endif - free(currfd); - - return (error); -} - -int -nfs_close(struct open_file *f) -{ - struct nfs_iodesc *fp = (struct nfs_iodesc *)f->f_fsdata; - -#ifdef NFS_DEBUG - if (debug) - printf("nfs_close: fp=0x%lx\n", (u_long)fp); -#endif - - free(fp); - f->f_fsdata = NULL; - - return (0); -} - -/* - * read a portion of a file - */ -int -nfs_read(struct open_file *f, void *buf, size_t size, size_t *resid) -{ - struct nfs_iodesc *fp = (struct nfs_iodesc *)f->f_fsdata; - ssize_t cc; - char *addr = buf; - -#ifdef NFS_DEBUG - if (debug) - printf("nfs_read: size=%lu off=%d\n", (u_long)size, - (int)fp->off); -#endif - while ((int)size > 0) { - twiddle(16); - cc = nfs_readdata(fp, fp->off, (void *)addr, size); - /* XXX maybe should retry on certain errors */ - if (cc == -1) { -#ifdef NFS_DEBUG - if (debug) - printf("nfs_read: read: %s", strerror(errno)); -#endif - return (errno); /* XXX - from nfs_readdata */ - } - if (cc == 0) { -#ifdef NFS_DEBUG - if (debug) - printf("nfs_read: hit EOF unexpectantly"); -#endif - goto ret; - } - fp->off += cc; - addr += cc; - size -= cc; - } -ret: - if (resid) - *resid = size; - - return (0); -} - -/* - * Not implemented. - */ -int -nfs_write(struct open_file *f, void *buf, size_t size, size_t *resid) -{ - return (EROFS); -} - -off_t -nfs_seek(struct open_file *f, off_t offset, int where) -{ - struct nfs_iodesc *d = (struct nfs_iodesc *)f->f_fsdata; - uint32_t size = ntohl(d->fa.fa_size.val[1]); - - switch (where) { - case SEEK_SET: - d->off = offset; - break; - case SEEK_CUR: - d->off += offset; - break; - case SEEK_END: - d->off = size - offset; - break; - default: - errno = EINVAL; - return (-1); - } - - return (d->off); -} - -/* NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5, NFSOCK=6, NFFIFO=7 */ -int nfs_stat_types[9] = { - 0, S_IFREG, S_IFDIR, S_IFBLK, S_IFCHR, S_IFLNK, S_IFSOCK, S_IFIFO, 0 }; - -int -nfs_stat(struct open_file *f, struct stat *sb) -{ - struct nfs_iodesc *fp = (struct nfs_iodesc *)f->f_fsdata; - uint32_t ftype, mode; - - ftype = ntohl(fp->fa.fa_type); - mode = ntohl(fp->fa.fa_mode); - mode |= nfs_stat_types[ftype & 7]; - - sb->st_mode = mode; - sb->st_nlink = ntohl(fp->fa.fa_nlink); - sb->st_uid = ntohl(fp->fa.fa_uid); - sb->st_gid = ntohl(fp->fa.fa_gid); - sb->st_size = ntohl(fp->fa.fa_size.val[1]); - - return (0); -} - -static int -nfs_readdir(struct open_file *f, struct dirent *d) -{ - struct nfs_iodesc *fp = (struct nfs_iodesc *)f->f_fsdata; - struct nfsv3_readdir_repl *repl; - struct nfsv3_readdir_entry *rent; - static void *pkt = NULL; - static char *buf; - static struct nfs_iodesc *pfp = NULL; - static uint64_t cookie = 0; - size_t cc; - int pos, rc; - - struct args { - uint32_t fhsize; - uint32_t fhpluscookie[5 + NFS_V3MAXFHSIZE]; - } *args; - struct { - uint32_t h[RPC_HEADER_WORDS]; - struct args d; - } sdata; - - if (fp != pfp || fp->off != cookie) { - pfp = NULL; - refill: - free(pkt); - pkt = NULL; - args = &sdata.d; - bzero(args, sizeof(*args)); - - args->fhsize = htonl(fp->fhsize); - bcopy(fp->fh, args->fhpluscookie, fp->fhsize); - pos = roundup(fp->fhsize, sizeof(uint32_t)) / sizeof(uint32_t); - args->fhpluscookie[pos++] = htonl(fp->off >> 32); - args->fhpluscookie[pos++] = htonl(fp->off); - args->fhpluscookie[pos++] = htonl(fp->cookie >> 32); - args->fhpluscookie[pos++] = htonl(fp->cookie); - args->fhpluscookie[pos] = htonl(NFS_READDIRSIZE); - - cc = rpc_call(fp->iodesc, NFS_PROG, NFS_VER3, NFSPROCV3_READDIR, - args, 6 * sizeof(uint32_t) + - roundup(fp->fhsize, sizeof(uint32_t)), - (void **)&buf, &pkt); - if (cc == -1) { - rc = errno; - goto err; - } - repl = (struct nfsv3_readdir_repl *)buf; - if (repl->errno != 0) { - rc = ntohl(repl->errno); - goto err; - } - pfp = fp; - cookie = fp->off; - fp->cookie = ((uint64_t)ntohl(repl->cookiev0) << 32) | - ntohl(repl->cookiev1); - buf += sizeof (struct nfsv3_readdir_repl); - } - rent = (struct nfsv3_readdir_entry *)buf; - - if (rent->follows == 0) { - /* fid0 is actually eof */ - if (rent->fid0 != 0) { - rc = ENOENT; - goto err; - } - goto refill; - } - - d->d_namlen = ntohl(rent->len); - bcopy(rent->nameplus, d->d_name, d->d_namlen); - d->d_name[d->d_namlen] = '\0'; - - pos = roundup(d->d_namlen, sizeof(uint32_t)) / sizeof(uint32_t); - fp->off = cookie = ((uint64_t)ntohl(rent->nameplus[pos]) << 32) | - ntohl(rent->nameplus[pos + 1]); - pos += 2; - buf = (u_char *)&rent->nameplus[pos]; - return (0); - -err: - free(pkt); - pkt = NULL; - pfp = NULL; - cookie = 0; - return (rc); -} diff --git a/lib/libstand/nfsv2.h b/lib/libstand/nfsv2.h deleted file mode 100644 index 184a47bd0408..000000000000 --- a/lib/libstand/nfsv2.h +++ /dev/null @@ -1,121 +0,0 @@ -/* $FreeBSD$ */ -/* $NetBSD: nfsv2.h,v 1.2 1996/02/26 23:05:23 gwr Exp $ */ - -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Rick Macklem at The University of Guelph. - * - * 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. - * 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. - * - * @(#)nfsv2.h 8.1 (Berkeley) 6/10/93 - */ - -/* - * nfs definitions as per the version 2 specs - */ - -/* - * Constants as defined in the Sun NFS Version 2 spec. - * "NFS: Network File System Protocol Specification" RFC1094 - */ - -#define NFS_PORT 2049 -#define NFS_PROG 100003 -#define NFS_VER2 2 -#define NFS_MAXDGRAMDATA 8192 -#define NFS_MAXDATA 32768 -#define NFS_MAXPATHLEN 1024 -#define NFS_MAXNAMLEN 255 -#define NFS_FHSIZE 32 -#define NFS_MAXPKTHDR 404 -#define NFS_MAXPACKET (NFS_MAXPKTHDR+NFS_MAXDATA) -#define NFS_MINPACKET 20 -#define NFS_FABLKSIZE 512 /* Size in bytes of a block wrt fa_blocks */ -#define NFS_READDIRSIZE 1024 - -/* Stat numbers for rpc returns */ -#define NFS_OK 0 -#define NFSERR_PERM 1 -#define NFSERR_NOENT 2 -#define NFSERR_IO 5 -#define NFSERR_NXIO 6 -#define NFSERR_ACCES 13 -#define NFSERR_EXIST 17 -#define NFSERR_NODEV 19 -#define NFSERR_NOTDIR 20 -#define NFSERR_ISDIR 21 -#define NFSERR_FBIG 27 -#define NFSERR_NOSPC 28 -#define NFSERR_ROFS 30 -#define NFSERR_NAMETOL 63 -#define NFSERR_NOTEMPTY 66 -#define NFSERR_DQUOT 69 -#define NFSERR_STALE 70 -#define NFSERR_WFLUSH 99 - -/* Sizes in bytes of various nfs rpc components */ -#define NFSX_FH 32 -#define NFSX_UNSIGNED 4 -#define NFSX_FATTR 68 -#define NFSX_SATTR 32 -#define NFSX_STATFS 20 -#define NFSX_COOKIE 4 - -/* nfs rpc procedure numbers */ -#define NFSPROC_NULL 0 -#define NFSPROC_GETATTR 1 -#define NFSPROC_SETATTR 2 -#define NFSPROC_NOOP 3 -#define NFSPROC_ROOT NFSPROC_NOOP /* Obsolete */ -#define NFSPROC_LOOKUP 4 -#define NFSPROC_READLINK 5 -#define NFSPROC_READ 6 -#define NFSPROC_WRITECACHE NFSPROC_NOOP /* Obsolete */ -#define NFSPROC_WRITE 8 -#define NFSPROC_CREATE 9 -#define NFSPROC_REMOVE 10 -#define NFSPROC_RENAME 11 -#define NFSPROC_LINK 12 -#define NFSPROC_SYMLINK 13 -#define NFSPROC_MKDIR 14 -#define NFSPROC_RMDIR 15 -#define NFSPROC_READDIR 16 -#define NFSPROC_STATFS 17 - -#define NFS_NPROCS 18 - - -/* File types */ -typedef enum { - NFNON=0, - NFREG=1, - NFDIR=2, - NFBLK=3, - NFCHR=4, - NFLNK=5 -} nfstype; diff --git a/lib/libstand/nullfs.c b/lib/libstand/nullfs.c deleted file mode 100644 index e4c0b7cbc467..000000000000 --- a/lib/libstand/nullfs.c +++ /dev/null @@ -1,105 +0,0 @@ -/* $NetBSD: nullfs.c,v 1.1 1996/01/13 22:25:39 leo Exp $ */ - -/*- - * Copyright (c) 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * The Mach Operating System project at Carnegie-Mellon University. - * - * 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. - * 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. - * - * @(#)open.c 8.1 (Berkeley) 6/11/93 - * - * - * Copyright (c) 1989, 1990, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Author: Alessandro Forin - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include "stand.h" - -/* - * Null filesystem - */ -int null_open (const char *path, struct open_file *f) -{ - return EINVAL; -} - -int null_close(struct open_file *f) -{ - return 0; -} - -int null_read (struct open_file *f, void *buf, size_t size, size_t *resid) -{ - return EIO; -} - -int null_write (struct open_file *f, void *buf, size_t size, size_t *resid) -{ - return EIO; -} - -off_t null_seek (struct open_file *f, off_t offset, int where) -{ - errno = EIO; - return -1; -} - -int null_stat (struct open_file *f, struct stat *sb) -{ - return EIO; -} - -int null_readdir(struct open_file *f, struct dirent *d) -{ - return EIO; -} diff --git a/lib/libstand/open.c b/lib/libstand/open.c deleted file mode 100644 index 214e51bd7dfa..000000000000 --- a/lib/libstand/open.c +++ /dev/null @@ -1,159 +0,0 @@ -/* $NetBSD: open.c,v 1.16 1997/01/28 09:41:03 pk Exp $ */ - -/*- - * Copyright (c) 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * The Mach Operating System project at Carnegie-Mellon University. - * - * 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. - * 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. - * - * @(#)open.c 8.1 (Berkeley) 6/11/93 - * - * - * Copyright (c) 1989, 1990, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Author: Alessandro Forin - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include "stand.h" - -struct fs_ops *exclusive_file_system; - -struct open_file files[SOPEN_MAX]; - -static int -o_gethandle(void) -{ - int fd; - - for (fd = 0; fd < SOPEN_MAX; fd++) - if (files[fd].f_flags == 0) - return(fd); - return(-1); -} - -static void -o_rainit(struct open_file *f) -{ - f->f_rabuf = malloc(SOPEN_RASIZE); - f->f_ralen = 0; - f->f_raoffset = 0; -} - -int -open(const char *fname, int mode) -{ - struct fs_ops *fs; - struct open_file *f; - int fd, i, error, besterror; - const char *file; - - if ((fd = o_gethandle()) == -1) { - errno = EMFILE; - return(-1); - } - - f = &files[fd]; - f->f_flags = mode + 1; - f->f_dev = (struct devsw *)0; - f->f_ops = (struct fs_ops *)0; - f->f_offset = 0; - f->f_devdata = NULL; - file = (char *)0; - - if (exclusive_file_system != NULL) { - fs = exclusive_file_system; - error = (fs->fo_open)(fname, f); - if (error == 0) - goto ok; - goto err; - } - - error = devopen(f, fname, &file); - if (error || - (((f->f_flags & F_NODEV) == 0) && f->f_dev == (struct devsw *)0)) - goto err; - - /* see if we opened a raw device; otherwise, 'file' is the file name. */ - if (file == (char *)0 || *file == '\0') { - f->f_flags |= F_RAW; - f->f_rabuf = NULL; - return (fd); - } - - /* pass file name to the different filesystem open routines */ - besterror = ENOENT; - for (i = 0; file_system[i] != NULL; i++) { - fs = file_system[i]; - error = (fs->fo_open)(file, f); - if (error == 0) - goto ok; - if (error != EINVAL) - besterror = error; - } - error = besterror; - - fail: - if ((f->f_flags & F_NODEV) == 0 && f->f_dev != NULL) - f->f_dev->dv_close(f); - if (error) - devclose(f); - - err: - f->f_flags = 0; - errno = error; - return (-1); - - ok: - f->f_ops = fs; - o_rainit(f); - return (fd); -} diff --git a/lib/libstand/pager.c b/lib/libstand/pager.c deleted file mode 100644 index a966b0bd7992..000000000000 --- a/lib/libstand/pager.c +++ /dev/null @@ -1,161 +0,0 @@ -/*- - * Copyright (c) 1998 Michael Smith <msmith@freebsd.org> - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - */ -/* - * Simple paged-output and paged-viewing functions - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include "stand.h" -#include <string.h> - -static int p_maxlines = -1; -static int p_freelines; - -static char *pager_prompt1 = " --more-- <space> page down <enter> line down <q> quit "; -static char *pager_blank = " "; - -/* - * 'open' the pager - */ -void -pager_open(void) -{ - int nlines; - char *cp, *lp; - - nlines = 24; /* sensible default */ - if ((cp = getenv("LINES")) != NULL) { - nlines = strtol(cp, &lp, 0); - } - - p_maxlines = nlines - 1; - if (p_maxlines < 1) - p_maxlines = 1; - p_freelines = p_maxlines; -} - -/* - * 'close' the pager - */ -void -pager_close(void) -{ - p_maxlines = -1; -} - -/* - * Emit lines to the pager; may not return until the user - * has responded to the prompt. - * - * Will return nonzero if the user enters 'q' or 'Q' at the prompt. - * - * XXX note that this watches outgoing newlines (and eats them), but - * does not handle wrap detection (req. count of columns). - */ - -int -pager_output(const char *cp) -{ - int action; - - if (cp == NULL) - return(0); - - for (;;) { - if (*cp == 0) - return(0); - - putchar(*cp); /* always emit character */ - - if (*(cp++) == '\n') { /* got a newline? */ - p_freelines--; - if (p_freelines <= 0) { - printf("%s", pager_prompt1); - action = 0; - while (action == 0) { - switch(getchar()) { - case '\r': - case '\n': - p_freelines = 1; - action = 1; - break; - case ' ': - p_freelines = p_maxlines; - action = 1; - break; - case 'q': - case 'Q': - action = 2; - break; - default: - break; - } - } - printf("\r%s\r", pager_blank); - if (action == 2) - return(1); - } - } - } -} - -/* - * Display from (fd). - */ -int -pager_file(const char *fname) -{ - char buf[80]; - size_t hmuch; - int fd; - int result; - - if ((fd = open(fname, O_RDONLY)) == -1) { - printf("can't open '%s': %s\n", fname, strerror(errno)); - return(-1); - } - - for (;;) { - hmuch = read(fd, buf, sizeof(buf) - 1); - if (hmuch == -1) { - result = -1; - break; - } - if (hmuch == 0) { - result = 0; - break; - } - buf[hmuch] = 0; - if (pager_output(buf)) { - result = 1; - break; - } - } - close(fd); - return(result); -} diff --git a/lib/libstand/pkgfs.c b/lib/libstand/pkgfs.c deleted file mode 100644 index fda7f607087d..000000000000 --- a/lib/libstand/pkgfs.c +++ /dev/null @@ -1,791 +0,0 @@ -/*- - * Copyright (c) 2007-2014, Juniper Networks, Inc. - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include "stand.h" - -#include <sys/stat.h> -#include <sys/stdint.h> -#include <string.h> -#include <zlib.h> - -#ifdef PKGFS_DEBUG -#define DBG(x) printf x -#else -#define DBG(x) -#endif - -static int pkg_open(const char *, struct open_file *); -static int pkg_close(struct open_file *); -static int pkg_read(struct open_file *, void *, size_t, size_t *); -static off_t pkg_seek(struct open_file *, off_t, int); -static int pkg_stat(struct open_file *, struct stat *); -static int pkg_readdir(struct open_file *, struct dirent *); - -struct fs_ops pkgfs_fsops = { - "pkg", - pkg_open, - pkg_close, - pkg_read, - null_write, - pkg_seek, - pkg_stat, - pkg_readdir -}; - -#define PKG_BUFSIZE 512 -#define PKG_MAXCACHESZ 4096 - -#define PKG_FILEEXT ".tgz" - -/* - * Layout of POSIX 'ustar' header. - */ -struct ustar_hdr { - char ut_name[100]; - char ut_mode[8]; - char ut_uid[8]; - char ut_gid[8]; - char ut_size[12]; - char ut_mtime[12]; - char ut_checksum[8]; - char ut_typeflag[1]; - char ut_linkname[100]; - char ut_magic[6]; /* For POSIX: "ustar\0" */ - char ut_version[2]; /* For POSIX: "00" */ - char ut_uname[32]; - char ut_gname[32]; - char ut_rdevmajor[8]; - char ut_rdevminor[8]; - union { - struct { - char prefix[155]; - } posix; - struct { - char atime[12]; - char ctime[12]; - char offset[12]; - char longnames[4]; - char unused[1]; - struct gnu_sparse { - char offset[12]; - char numbytes[12]; - } sparse[4]; - char isextended[1]; - char realsize[12]; - } gnu; - } u; - u_char __padding[12]; -}; - -struct package; - -struct tarfile -{ - struct package *tf_pkg; - struct tarfile *tf_next; - struct ustar_hdr tf_hdr; - off_t tf_ofs; - off_t tf_size; - off_t tf_fp; - size_t tf_cachesz; - void *tf_cache; -}; - -struct package -{ - struct package *pkg_chain; - int pkg_fd; - off_t pkg_ofs; - z_stream pkg_zs; - struct tarfile *pkg_first; - struct tarfile *pkg_last; - u_char pkg_buf[PKG_BUFSIZE]; -}; - -static struct package *package = NULL; - -static int new_package(int, struct package **); - -void -pkgfs_cleanup(void) -{ - struct package *chain; - struct tarfile *tf, *tfn; - - while (package != NULL) { - inflateEnd(&package->pkg_zs); - close(package->pkg_fd); - - tf = package->pkg_first; - while (tf != NULL) { - tfn = tf->tf_next; - if (tf->tf_cachesz > 0) - free(tf->tf_cache); - free(tf); - tf = tfn; - } - - chain = package->pkg_chain; - free(package); - package = chain; - } -} - -int -pkgfs_init(const char *pkgname, struct fs_ops *proto) -{ - struct package *pkg; - int error, fd; - - if (proto != &pkgfs_fsops) - pkgfs_cleanup(); - - exclusive_file_system = proto; - - fd = open(pkgname, O_RDONLY); - - exclusive_file_system = NULL; - - if (fd == -1) - return (errno); - - error = new_package(fd, &pkg); - if (error) { - close(fd); - return (error); - } - - if (pkg == NULL) - return (EDOOFUS); - - pkg->pkg_chain = package; - package = pkg; - exclusive_file_system = &pkgfs_fsops; - return (0); -} - -static int get_mode(struct tarfile *); -static int get_zipped(struct package *, void *, size_t); -static int new_package(int, struct package **); -static struct tarfile *scan_tarfile(struct package *, struct tarfile *); - -static int -pkg_open(const char *fn, struct open_file *f) -{ - struct tarfile *tf; - - if (fn == NULL || f == NULL) - return (EINVAL); - - if (package == NULL) - return (ENXIO); - - /* - * We can only read from a package, so reject request to open - * for write-only or read-write. - */ - if (f->f_flags != F_READ) - return (EPERM); - - /* - * Scan the file headers for the named file. We stop scanning - * at the first filename that has the .pkg extension. This is - * a package within a package. We assume we have all the files - * we need up-front and without having to dig within nested - * packages. - * - * Note that we preserve streaming properties as much as possible. - */ - while (*fn == '/') - fn++; - - /* - * Allow opening of the root directory for use by readdir() - * to support listing files in the package. - */ - if (*fn == '\0') { - f->f_fsdata = NULL; - return (0); - } - - tf = scan_tarfile(package, NULL); - while (tf != NULL) { - if (strcmp(fn, tf->tf_hdr.ut_name) == 0) { - f->f_fsdata = tf; - tf->tf_fp = 0; /* Reset the file pointer. */ - return (0); - } - tf = scan_tarfile(package, tf); - } - return (errno); -} - -static int -pkg_close(struct open_file *f) -{ - struct tarfile *tf; - - tf = (struct tarfile *)f->f_fsdata; - if (tf == NULL) - return (0); - - /* - * Free up the cache if we read all of the file. - */ - if (tf->tf_fp == tf->tf_size && tf->tf_cachesz > 0) { - free(tf->tf_cache); - tf->tf_cachesz = 0; - } - return (0); -} - -static int -pkg_read(struct open_file *f, void *buf, size_t size, size_t *res) -{ - struct tarfile *tf; - char *p; - off_t fp; - size_t sz; - - tf = (struct tarfile *)f->f_fsdata; - if (tf == NULL) { - if (res != NULL) - *res = size; - return (EBADF); - } - - fp = tf->tf_fp; - p = buf; - sz = 0; - while (size > 0) { - sz = tf->tf_size - fp; - if (fp < tf->tf_cachesz && tf->tf_cachesz < tf->tf_size) - sz = tf->tf_cachesz - fp; - if (size < sz) - sz = size; - if (sz == 0) - break; - - if (fp < tf->tf_cachesz) { - /* Satisfy the request from cache. */ - memcpy(p, tf->tf_cache + fp, sz); - fp += sz; - p += sz; - size -= sz; - continue; - } - - if (get_zipped(tf->tf_pkg, p, sz) == -1) { - sz = -1; - break; - } - - fp += sz; - p += sz; - size -= sz; - - if (tf->tf_cachesz != 0) - continue; - - tf->tf_cachesz = (sz <= PKG_MAXCACHESZ) ? sz : PKG_MAXCACHESZ; - tf->tf_cache = malloc(tf->tf_cachesz); - if (tf->tf_cache != NULL) - memcpy(tf->tf_cache, buf, tf->tf_cachesz); - else - tf->tf_cachesz = 0; - } - - tf->tf_fp = fp; - if (res != NULL) - *res = size; - return ((sz == -1) ? errno : 0); -} - -static off_t -pkg_seek(struct open_file *f, off_t ofs, int whence) -{ - char buf[512]; - struct tarfile *tf; - off_t delta; - size_t sz, res; - int error; - - tf = (struct tarfile *)f->f_fsdata; - if (tf == NULL) { - errno = EBADF; - return (-1); - } - - switch (whence) { - case SEEK_SET: - delta = ofs - tf->tf_fp; - break; - case SEEK_CUR: - delta = ofs; - break; - case SEEK_END: - delta = tf->tf_size - tf->tf_fp + ofs; - break; - default: - errno = EINVAL; - return (-1); - } - - if (delta < 0) { - DBG(("%s: negative file seek (%jd)\n", __func__, - (intmax_t)delta)); - errno = ESPIPE; - return (-1); - } - - while (delta > 0 && tf->tf_fp < tf->tf_size) { - sz = (delta > sizeof(buf)) ? sizeof(buf) : delta; - error = pkg_read(f, buf, sz, &res); - if (error != 0) { - errno = error; - return (-1); - } - delta -= sz - res; - } - - return (tf->tf_fp); -} - -static int -pkg_stat(struct open_file *f, struct stat *sb) -{ - struct tarfile *tf; - - tf = (struct tarfile *)f->f_fsdata; - if (tf == NULL) - return (EBADF); - memset(sb, 0, sizeof(*sb)); - sb->st_mode = get_mode(tf); - sb->st_size = tf->tf_size; - sb->st_blocks = (tf->tf_size + 511) / 512; - return (0); -} - -static int -pkg_readdir(struct open_file *f, struct dirent *d) -{ - struct tarfile *tf; - - tf = (struct tarfile *)f->f_fsdata; - if (tf != NULL) - return (EBADF); - - tf = scan_tarfile(package, NULL); - if (tf == NULL) - return (ENOENT); - - d->d_fileno = 0; - d->d_reclen = sizeof(*d); - d->d_type = DT_REG; - memcpy(d->d_name, tf->tf_hdr.ut_name, sizeof(d->d_name)); - return (0); -} - -/* - * Low-level support functions. - */ - -static int -get_byte(struct package *pkg, off_t *op) -{ - int c; - - if (pkg->pkg_zs.avail_in == 0) { - c = read(pkg->pkg_fd, pkg->pkg_buf, PKG_BUFSIZE); - if (c <= 0) - return (-1); - pkg->pkg_zs.avail_in = c; - pkg->pkg_zs.next_in = pkg->pkg_buf; - } - - c = *pkg->pkg_zs.next_in; - pkg->pkg_zs.next_in++; - pkg->pkg_zs.avail_in--; - (*op)++; - return (c); -} - -static int -get_zipped(struct package *pkg, void *buf, size_t bufsz) -{ - int c; - - pkg->pkg_zs.next_out = buf; - pkg->pkg_zs.avail_out = bufsz; - - while (pkg->pkg_zs.avail_out) { - if (pkg->pkg_zs.avail_in == 0) { - c = read(pkg->pkg_fd, pkg->pkg_buf, PKG_BUFSIZE); - if (c <= 0) { - errno = EIO; - return (-1); - } - pkg->pkg_zs.avail_in = c; - pkg->pkg_zs.next_in = pkg->pkg_buf; - } - - c = inflate(&pkg->pkg_zs, Z_SYNC_FLUSH); - if (c != Z_OK && c != Z_STREAM_END) { - errno = EIO; - return (-1); - } - } - - pkg->pkg_ofs += bufsz; - return (0); -} - -static int -cache_data(struct tarfile *tf) -{ - struct package *pkg; - size_t sz; - - if (tf == NULL) { - DBG(("%s: no file to cache data for?\n", __func__)); - errno = EINVAL; - return (-1); - } - - pkg = tf->tf_pkg; - if (pkg == NULL) { - DBG(("%s: no package associated with file?\n", __func__)); - errno = EINVAL; - return (-1); - } - - if (tf->tf_ofs != pkg->pkg_ofs) { - DBG(("%s: caching after partial read of file %s?\n", - __func__, tf->tf_hdr.ut_name)); - errno = EINVAL; - return (-1); - } - - /* We don't cache everything... */ - if (tf->tf_size > PKG_MAXCACHESZ) { - errno = ENOMEM; - return (-1); - } - - /* All files are padded to a multiple of 512 bytes. */ - sz = (tf->tf_size + 0x1ff) & ~0x1ff; - - tf->tf_cache = malloc(sz); - if (tf->tf_cache == NULL) { - DBG(("%s: could not allocate %d bytes\n", __func__, (int)sz)); - errno = ENOMEM; - return (-1); - } - - tf->tf_cachesz = sz; - return (get_zipped(pkg, tf->tf_cache, sz)); -} - -/* - * Note that this implementation does not (and should not!) obey - * locale settings; you cannot simply substitute strtol here, since - * it does obey locale. - */ -static off_t -pkg_atol8(const char *p, unsigned char_cnt) -{ - int64_t l, limit, last_digit_limit; - int digit, sign, base; - - base = 8; - limit = INT64_MAX / base; - last_digit_limit = INT64_MAX % base; - - while (*p == ' ' || *p == '\t') - p++; - if (*p == '-') { - sign = -1; - p++; - } else - sign = 1; - - l = 0; - digit = *p - '0'; - while (digit >= 0 && digit < base && char_cnt-- > 0) { - if (l>limit || (l == limit && digit > last_digit_limit)) { - l = UINT64_MAX; /* Truncate on overflow. */ - break; - } - l = (l * base) + digit; - digit = *++p - '0'; - } - return (sign < 0) ? -l : l; -} - -/* - * Parse a base-256 integer. This is just a straight signed binary - * value in big-endian order, except that the high-order bit is - * ignored. Remember that "int64_t" may or may not be exactly 64 - * bits; the implementation here tries to avoid making any assumptions - * about the actual size of an int64_t. It does assume we're using - * twos-complement arithmetic, though. - */ -static int64_t -pkg_atol256(const char *_p, unsigned char_cnt) -{ - int64_t l, upper_limit, lower_limit; - const unsigned char *p = (const unsigned char *)_p; - - upper_limit = INT64_MAX / 256; - lower_limit = INT64_MIN / 256; - - /* Pad with 1 or 0 bits, depending on sign. */ - if ((0x40 & *p) == 0x40) - l = (int64_t)-1; - else - l = 0; - l = (l << 6) | (0x3f & *p++); - while (--char_cnt > 0) { - if (l > upper_limit) { - l = INT64_MAX; /* Truncate on overflow */ - break; - } else if (l < lower_limit) { - l = INT64_MIN; - break; - } - l = (l << 8) | (0xff & (int64_t)*p++); - } - return (l); -} - -static off_t -pkg_atol(const char *p, unsigned char_cnt) -{ - /* - * Technically, GNU pkg considers a field to be in base-256 - * only if the first byte is 0xff or 0x80. - */ - if (*p & 0x80) - return (pkg_atol256(p, char_cnt)); - return (pkg_atol8(p, char_cnt)); -} - -static int -get_mode(struct tarfile *tf) -{ - return (pkg_atol(tf->tf_hdr.ut_mode, sizeof(tf->tf_hdr.ut_mode))); -} - -/* GZip flag byte */ -#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ -#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ -#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ -#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ -#define COMMENT 0x10 /* bit 4 set: file comment present */ -#define RESERVED 0xE0 /* bits 5..7: reserved */ - -static int -new_package(int fd, struct package **pp) -{ - struct package *pkg; - off_t ofs; - int flags, i, error; - - pkg = malloc(sizeof(*pkg)); - if (pkg == NULL) - return (ENOMEM); - - bzero(pkg, sizeof(*pkg)); - pkg->pkg_fd = fd; - - /* - * Parse the header. - */ - error = EFTYPE; - ofs = 0; - - /* Check megic. */ - if (get_byte(pkg, &ofs) != 0x1f || get_byte(pkg, &ofs) != 0x8b) - goto fail; - /* Check method. */ - if (get_byte(pkg, &ofs) != Z_DEFLATED) - goto fail; - /* Check flags. */ - flags = get_byte(pkg, &ofs); - if (flags & RESERVED) - goto fail; - - /* Skip time, xflags and OS code. */ - for (i = 0; i < 6; i++) { - if (get_byte(pkg, &ofs) == -1) - goto fail; - } - - /* Skip extra field. */ - if (flags & EXTRA_FIELD) { - i = (get_byte(pkg, &ofs) & 0xff) | - ((get_byte(pkg, &ofs) << 8) & 0xff); - while (i-- > 0) { - if (get_byte(pkg, &ofs) == -1) - goto fail; - } - } - - /* Skip original file name. */ - if (flags & ORIG_NAME) { - do { - i = get_byte(pkg, &ofs); - } while (i != 0 && i != -1); - if (i == -1) - goto fail; - } - - /* Print the comment if it's there. */ - if (flags & COMMENT) { - while (1) { - i = get_byte(pkg, &ofs); - if (i == -1) - goto fail; - if (i == 0) - break; - putchar(i); - } - } - - /* Skip the CRC. */ - if (flags & HEAD_CRC) { - if (get_byte(pkg, &ofs) == -1) - goto fail; - if (get_byte(pkg, &ofs) == -1) - goto fail; - } - - /* - * Done parsing the ZIP header. Spkgt the inflation engine. - */ - error = inflateInit2(&pkg->pkg_zs, -15); - if (error != Z_OK) - goto fail; - - *pp = pkg; - return (0); - - fail: - free(pkg); - return (error); -} - -static struct tarfile * -scan_tarfile(struct package *pkg, struct tarfile *last) -{ - char buf[512]; - struct tarfile *cur; - off_t ofs; - size_t sz; - - cur = (last != NULL) ? last->tf_next : pkg->pkg_first; - if (cur == NULL) { - ofs = (last != NULL) ? last->tf_ofs + last->tf_size : - pkg->pkg_ofs; - ofs = (ofs + 0x1ff) & ~0x1ff; - - /* Check if we've reached EOF. */ - if (ofs < pkg->pkg_ofs) { - errno = ENOSPC; - return (NULL); - } - - if (ofs != pkg->pkg_ofs) { - if (last != NULL && pkg->pkg_ofs == last->tf_ofs) { - if (cache_data(last) == -1) - return (NULL); - } else { - sz = ofs - pkg->pkg_ofs; - while (sz != 0) { - if (sz > sizeof(buf)) - sz = sizeof(buf); - if (get_zipped(pkg, buf, sz) == -1) - return (NULL); - sz = ofs - pkg->pkg_ofs; - } - } - } - - cur = malloc(sizeof(*cur)); - if (cur == NULL) - return (NULL); - memset(cur, 0, sizeof(*cur)); - cur->tf_pkg = pkg; - - while (1) { - if (get_zipped(pkg, &cur->tf_hdr, - sizeof(cur->tf_hdr)) == -1) { - free(cur); - return (NULL); - } - - /* - * There are always 2 empty blocks appended to - * a PKG. It marks the end of the archive. - */ - if (strncmp(cur->tf_hdr.ut_magic, "ustar", 5) != 0) { - free(cur); - errno = ENOSPC; - return (NULL); - } - - cur->tf_ofs = pkg->pkg_ofs; - cur->tf_size = pkg_atol(cur->tf_hdr.ut_size, - sizeof(cur->tf_hdr.ut_size)); - - if (cur->tf_hdr.ut_name[0] != '+') - break; - - /* - * Skip package meta-files. - */ - ofs = cur->tf_ofs + cur->tf_size; - ofs = (ofs + 0x1ff) & ~0x1ff; - while (pkg->pkg_ofs < ofs) { - if (get_zipped(pkg, buf, sizeof(buf)) == -1) { - free(cur); - return (NULL); - } - } - } - - if (last != NULL) - last->tf_next = cur; - else - pkg->pkg_first = cur; - pkg->pkg_last = cur; - } - - return (cur); -} diff --git a/lib/libstand/powerpc/_setjmp.S b/lib/libstand/powerpc/_setjmp.S deleted file mode 100644 index 7c7c24b1237c..000000000000 --- a/lib/libstand/powerpc/_setjmp.S +++ /dev/null @@ -1,115 +0,0 @@ -/* $FreeBSD$ */ -/* from: NetBSD: setjmp.S,v 1.1 1998/01/27 15:13:12 sakamoto Exp $ */ -/* from: OpenBSD: setjmp.S,v 1.2 1996/12/28 06:22:18 rahnds Exp */ -/* kernel version of this file, does not have signal goop */ -/* int setjmp(jmp_buf env) */ - -#include <machine/asm.h> - -#ifdef __powerpc64__ -#define LD_REG ld -#define ST_REG std -#define REGWIDTH 8 -#else -#define LD_REG lwz -#define ST_REG stw -#define REGWIDTH 4 -#endif - -#define JMP_r1 1*REGWIDTH -#define JMP_r2 2*REGWIDTH -#define JMP_r14 3*REGWIDTH -#define JMP_r15 4*REGWIDTH -#define JMP_r16 5*REGWIDTH -#define JMP_r17 6*REGWIDTH -#define JMP_r18 7*REGWIDTH -#define JMP_r19 8*REGWIDTH -#define JMP_r20 9*REGWIDTH -#define JMP_r21 10*REGWIDTH -#define JMP_r22 11*REGWIDTH -#define JMP_r23 12*REGWIDTH -#define JMP_r24 13*REGWIDTH -#define JMP_r25 14*REGWIDTH -#define JMP_r26 15*REGWIDTH -#define JMP_r27 16*REGWIDTH -#define JMP_r28 17*REGWIDTH -#define JMP_r29 18*REGWIDTH -#define JMP_r30 19*REGWIDTH -#define JMP_r31 20*REGWIDTH -#define JMP_lr 21*REGWIDTH -#define JMP_cr 22*REGWIDTH -#define JMP_ctr 23*REGWIDTH -#define JMP_xer 24*REGWIDTH -#define JMP_sig 25*REGWIDTH - -ASENTRY_NOPROF(_setjmp) - ST_REG 31, JMP_r31(3) - /* r1, r2, r14-r30 */ - ST_REG 1, JMP_r1 (3) - ST_REG 2, JMP_r2 (3) - ST_REG 14, JMP_r14(3) - ST_REG 15, JMP_r15(3) - ST_REG 16, JMP_r16(3) - ST_REG 17, JMP_r17(3) - ST_REG 18, JMP_r18(3) - ST_REG 19, JMP_r19(3) - ST_REG 20, JMP_r20(3) - ST_REG 21, JMP_r21(3) - ST_REG 22, JMP_r22(3) - ST_REG 23, JMP_r23(3) - ST_REG 24, JMP_r24(3) - ST_REG 25, JMP_r25(3) - ST_REG 26, JMP_r26(3) - ST_REG 27, JMP_r27(3) - ST_REG 28, JMP_r28(3) - ST_REG 29, JMP_r29(3) - ST_REG 30, JMP_r30(3) - /* cr, lr, ctr, xer */ - mfcr 0 - ST_REG 0, JMP_cr(3) - mflr 0 - ST_REG 0, JMP_lr(3) - mfctr 0 - ST_REG 0, JMP_ctr(3) - mfxer 0 - ST_REG 0, JMP_xer(3) - /* f14-f31, fpscr */ - li 3, 0 - blr - - -.extern sigsetmask -ASENTRY_NOPROF(_longjmp) - LD_REG 31, JMP_r31(3) - /* r1, r2, r14-r30 */ - LD_REG 1, JMP_r1 (3) - LD_REG 2, JMP_r2 (3) - LD_REG 14, JMP_r14(3) - LD_REG 15, JMP_r15(3) - LD_REG 16, JMP_r16(3) - LD_REG 17, JMP_r17(3) - LD_REG 18, JMP_r18(3) - LD_REG 19, JMP_r19(3) - LD_REG 20, JMP_r20(3) - LD_REG 21, JMP_r21(3) - LD_REG 22, JMP_r22(3) - LD_REG 23, JMP_r23(3) - LD_REG 24, JMP_r24(3) - LD_REG 25, JMP_r25(3) - LD_REG 26, JMP_r26(3) - LD_REG 27, JMP_r27(3) - LD_REG 28, JMP_r28(3) - LD_REG 29, JMP_r29(3) - LD_REG 30, JMP_r30(3) - /* cr, lr, ctr, xer */ - LD_REG 0, JMP_cr(3) - mtcr 0 - LD_REG 0, JMP_lr(3) - mtlr 0 - LD_REG 0, JMP_ctr(3) - mtctr 0 - LD_REG 0, JMP_xer(3) - mtxer 0 - /* f14-f31, fpscr */ - mr 3, 4 - blr diff --git a/lib/libstand/powerpc/syncicache.c b/lib/libstand/powerpc/syncicache.c deleted file mode 100644 index 434dcec63416..000000000000 --- a/lib/libstand/powerpc/syncicache.c +++ /dev/null @@ -1,103 +0,0 @@ -/*- - * Copyright (C) 1995-1997, 1999 Wolfgang Solfrank. - * Copyright (C) 1995-1997, 1999 TooLs GmbH. - * 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 TooLs GmbH. - * 4. The name of TooLs GmbH may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``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 TOOLS GMBH 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. - * - * $NetBSD: syncicache.c,v 1.2 1999/05/05 12:36:40 tsubai Exp $ - */ - -#ifndef lint -static const char rcsid[] = - "$FreeBSD$"; -#endif /* not lint */ - -#include <sys/param.h> -#if defined(_KERNEL) || defined(_STANDALONE) -#include <sys/time.h> -#include <sys/proc.h> -#include <vm/vm.h> -#endif -#include <sys/sysctl.h> - -#include <machine/cpu.h> -#include <machine/md_var.h> - -#ifdef _STANDALONE -int cacheline_size = 32; -#endif - -#if !defined(_KERNEL) && !defined(_STANDALONE) -#include <stdlib.h> - -int cacheline_size = 0; - -static void getcachelinesize(void); - -static void -getcachelinesize() -{ - static int cachemib[] = { CTL_MACHDEP, CPU_CACHELINE }; - int clen; - - clen = sizeof(cacheline_size); - - if (sysctl(cachemib, sizeof(cachemib) / sizeof(cachemib[0]), - &cacheline_size, &clen, NULL, 0) < 0 || !cacheline_size) { - abort(); - } -} -#endif - -void -__syncicache(void *from, int len) -{ - int l, off; - char *p; - -#if !defined(_KERNEL) && !defined(_STANDALONE) - if (!cacheline_size) - getcachelinesize(); -#endif - - off = (u_int)from & (cacheline_size - 1); - l = len += off; - p = (char *)from - off; - - do { - __asm __volatile ("dcbst 0,%0" :: "r"(p)); - p += cacheline_size; - } while ((l -= cacheline_size) > 0); - __asm __volatile ("sync"); - p = (char *)from - off; - do { - __asm __volatile ("icbi 0,%0" :: "r"(p)); - p += cacheline_size; - } while ((len -= cacheline_size) > 0); - __asm __volatile ("sync; isync"); -} - diff --git a/lib/libstand/printf.c b/lib/libstand/printf.c deleted file mode 100644 index 71e313cc55ad..000000000000 --- a/lib/libstand/printf.c +++ /dev/null @@ -1,518 +0,0 @@ -/*- - * Copyright (c) 1986, 1988, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * 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. - * 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. - * - * @(#)subr_prf.c 8.3 (Berkeley) 1/21/94 - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * Standaloneified version of the FreeBSD kernel printf family. - */ - -#include <sys/types.h> -#include <sys/stddef.h> -#include <sys/stdint.h> -#include <limits.h> -#include <string.h> -#include "stand.h" - -/* - * Note that stdarg.h and the ANSI style va_start macro is used for both - * ANSI and traditional C compilers. - */ -#include <machine/stdarg.h> - -#define MAXNBUF (sizeof(intmax_t) * CHAR_BIT + 1) - -typedef void (kvprintf_fn_t)(int, void *); - -static char *ksprintn (char *buf, uintmax_t num, int base, int *len, int upper); -static int kvprintf(char const *fmt, kvprintf_fn_t *func, void *arg, int radix, va_list ap); - -static void -putchar_wrapper(int cc, void *arg) -{ - - putchar(cc); -} - -int -printf(const char *fmt, ...) -{ - va_list ap; - int retval; - - va_start(ap, fmt); - retval = kvprintf(fmt, putchar_wrapper, NULL, 10, ap); - va_end(ap); - return retval; -} - -void -vprintf(const char *fmt, va_list ap) -{ - - kvprintf(fmt, putchar_wrapper, NULL, 10, ap); -} - -int -sprintf(char *buf, const char *cfmt, ...) -{ - int retval; - va_list ap; - - va_start(ap, cfmt); - retval = kvprintf(cfmt, NULL, (void *)buf, 10, ap); - buf[retval] = '\0'; - va_end(ap); - return retval; -} - -struct print_buf { - char *buf; - size_t size; -}; - -static void -snprint_func(int ch, void *arg) -{ - struct print_buf *pbuf = arg; - - if (pbuf->size < 2) { - /* - * Reserve last buffer position for the terminating - * character: - */ - return; - } - *(pbuf->buf)++ = ch; - pbuf->size--; -} - -int -snprintf(char *buf, size_t size, const char *cfmt, ...) -{ - int retval; - va_list ap; - struct print_buf arg; - - arg.buf = buf; - arg.size = size; - - va_start(ap, cfmt); - retval = kvprintf(cfmt, &snprint_func, &arg, 10, ap); - va_end(ap); - - if (arg.size >= 1) - *(arg.buf)++ = 0; - return retval; -} - -void -vsprintf(char *buf, const char *cfmt, va_list ap) -{ - int retval; - - retval = kvprintf(cfmt, NULL, (void *)buf, 10, ap); - buf[retval] = '\0'; -} - -/* - * Put a NUL-terminated ASCII number (base <= 36) in a buffer in reverse - * order; return an optional length and a pointer to the last character - * written in the buffer (i.e., the first character of the string). - * The buffer pointed to by `nbuf' must have length >= MAXNBUF. - */ -static char * -ksprintn(char *nbuf, uintmax_t num, int base, int *lenp, int upper) -{ - char *p, c; - - p = nbuf; - *p = '\0'; - do { - c = hex2ascii(num % base); - *++p = upper ? toupper(c) : c; - } while (num /= base); - if (lenp) - *lenp = p - nbuf; - return (p); -} - -/* - * Scaled down version of printf(3). - * - * Two additional formats: - * - * The format %b is supported to decode error registers. - * Its usage is: - * - * printf("reg=%b\n", regval, "<base><arg>*"); - * - * where <base> is the output base expressed as a control character, e.g. - * \10 gives octal; \20 gives hex. Each arg is a sequence of characters, - * the first of which gives the bit number to be inspected (origin 1), and - * the next characters (up to a control character, i.e. a character <= 32), - * give the name of the register. Thus: - * - * kvprintf("reg=%b\n", 3, "\10\2BITTWO\1BITONE"); - * - * would produce output: - * - * reg=3<BITTWO,BITONE> - * - * XXX: %D -- Hexdump, takes pointer and separator string: - * ("%6D", ptr, ":") -> XX:XX:XX:XX:XX:XX - * ("%*D", len, ptr, " " -> XX XX XX XX ... - */ -static int -kvprintf(char const *fmt, kvprintf_fn_t *func, void *arg, int radix, va_list ap) -{ -#define PCHAR(c) {int cc=(c); if (func) (*func)(cc, arg); else *d++ = cc; retval++; } - char nbuf[MAXNBUF]; - char *d; - const char *p, *percent, *q; - uint16_t *S; - u_char *up; - int ch, n; - uintmax_t num; - int base, lflag, qflag, tmp, width, ladjust, sharpflag, neg, sign, dot; - int cflag, hflag, jflag, tflag, zflag; - int dwidth, upper; - char padc; - int stop = 0, retval = 0; - - num = 0; - if (!func) - d = (char *) arg; - else - d = NULL; - - if (fmt == NULL) - fmt = "(fmt null)\n"; - - if (radix < 2 || radix > 36) - radix = 10; - - for (;;) { - padc = ' '; - width = 0; - while ((ch = (u_char)*fmt++) != '%' || stop) { - if (ch == '\0') - return (retval); - PCHAR(ch); - } - percent = fmt - 1; - qflag = 0; lflag = 0; ladjust = 0; sharpflag = 0; neg = 0; - sign = 0; dot = 0; dwidth = 0; upper = 0; - cflag = 0; hflag = 0; jflag = 0; tflag = 0; zflag = 0; -reswitch: switch (ch = (u_char)*fmt++) { - case '.': - dot = 1; - goto reswitch; - case '#': - sharpflag = 1; - goto reswitch; - case '+': - sign = 1; - goto reswitch; - case '-': - ladjust = 1; - goto reswitch; - case '%': - PCHAR(ch); - break; - case '*': - if (!dot) { - width = va_arg(ap, int); - if (width < 0) { - ladjust = !ladjust; - width = -width; - } - } else { - dwidth = va_arg(ap, int); - } - goto reswitch; - case '0': - if (!dot) { - padc = '0'; - goto reswitch; - } - case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - for (n = 0;; ++fmt) { - n = n * 10 + ch - '0'; - ch = *fmt; - if (ch < '0' || ch > '9') - break; - } - if (dot) - dwidth = n; - else - width = n; - goto reswitch; - case 'b': - num = (u_int)va_arg(ap, int); - p = va_arg(ap, char *); - for (q = ksprintn(nbuf, num, *p++, NULL, 0); *q;) - PCHAR(*q--); - - if (num == 0) - break; - - for (tmp = 0; *p;) { - n = *p++; - if (num & (1 << (n - 1))) { - PCHAR(tmp ? ',' : '<'); - for (; (n = *p) > ' '; ++p) - PCHAR(n); - tmp = 1; - } else - for (; *p > ' '; ++p) - continue; - } - if (tmp) - PCHAR('>'); - break; - case 'c': - PCHAR(va_arg(ap, int)); - break; - case 'D': - up = va_arg(ap, u_char *); - p = va_arg(ap, char *); - if (!width) - width = 16; - while(width--) { - PCHAR(hex2ascii(*up >> 4)); - PCHAR(hex2ascii(*up & 0x0f)); - up++; - if (width) - for (q=p;*q;q++) - PCHAR(*q); - } - break; - case 'd': - case 'i': - base = 10; - sign = 1; - goto handle_sign; - case 'h': - if (hflag) { - hflag = 0; - cflag = 1; - } else - hflag = 1; - goto reswitch; - case 'j': - jflag = 1; - goto reswitch; - case 'l': - if (lflag) { - lflag = 0; - qflag = 1; - } else - lflag = 1; - goto reswitch; - case 'n': - if (jflag) - *(va_arg(ap, intmax_t *)) = retval; - else if (qflag) - *(va_arg(ap, quad_t *)) = retval; - else if (lflag) - *(va_arg(ap, long *)) = retval; - else if (zflag) - *(va_arg(ap, size_t *)) = retval; - else if (hflag) - *(va_arg(ap, short *)) = retval; - else if (cflag) - *(va_arg(ap, char *)) = retval; - else - *(va_arg(ap, int *)) = retval; - break; - case 'o': - base = 8; - goto handle_nosign; - case 'p': - base = 16; - sharpflag = (width == 0); - sign = 0; - num = (uintptr_t)va_arg(ap, void *); - goto number; - case 'q': - qflag = 1; - goto reswitch; - case 'r': - base = radix; - if (sign) - goto handle_sign; - goto handle_nosign; - case 's': - p = va_arg(ap, char *); - if (p == NULL) - p = "(null)"; - if (!dot) - n = strlen (p); - else - for (n = 0; n < dwidth && p[n]; n++) - continue; - - width -= n; - - if (!ladjust && width > 0) - while (width--) - PCHAR(padc); - while (n--) - PCHAR(*p++); - if (ladjust && width > 0) - while (width--) - PCHAR(padc); - break; - case 'S': /* Assume console can cope with wide chars */ - for (S = va_arg(ap, uint16_t *); *S != 0; S++) - PCHAR(*S); - break; - case 't': - tflag = 1; - goto reswitch; - case 'u': - base = 10; - goto handle_nosign; - case 'X': - upper = 1; - case 'x': - base = 16; - goto handle_nosign; - case 'y': - base = 16; - sign = 1; - goto handle_sign; - case 'z': - zflag = 1; - goto reswitch; -handle_nosign: - sign = 0; - if (jflag) - num = va_arg(ap, uintmax_t); - else if (qflag) - num = va_arg(ap, u_quad_t); - else if (tflag) - num = va_arg(ap, ptrdiff_t); - else if (lflag) - num = va_arg(ap, u_long); - else if (zflag) - num = va_arg(ap, size_t); - else if (hflag) - num = (u_short)va_arg(ap, int); - else if (cflag) - num = (u_char)va_arg(ap, int); - else - num = va_arg(ap, u_int); - goto number; -handle_sign: - if (jflag) - num = va_arg(ap, intmax_t); - else if (qflag) - num = va_arg(ap, quad_t); - else if (tflag) - num = va_arg(ap, ptrdiff_t); - else if (lflag) - num = va_arg(ap, long); - else if (zflag) - num = va_arg(ap, ssize_t); - else if (hflag) - num = (short)va_arg(ap, int); - else if (cflag) - num = (char)va_arg(ap, int); - else - num = va_arg(ap, int); -number: - if (sign && (intmax_t)num < 0) { - neg = 1; - num = -(intmax_t)num; - } - p = ksprintn(nbuf, num, base, &n, upper); - tmp = 0; - if (sharpflag && num != 0) { - if (base == 8) - tmp++; - else if (base == 16) - tmp += 2; - } - if (neg) - tmp++; - - if (!ladjust && padc == '0') - dwidth = width - tmp; - width -= tmp + imax(dwidth, n); - dwidth -= n; - if (!ladjust) - while (width-- > 0) - PCHAR(' '); - if (neg) - PCHAR('-'); - if (sharpflag && num != 0) { - if (base == 8) { - PCHAR('0'); - } else if (base == 16) { - PCHAR('0'); - PCHAR('x'); - } - } - while (dwidth-- > 0) - PCHAR('0'); - - while (*p) - PCHAR(*p--); - - if (ladjust) - while (width-- > 0) - PCHAR(' '); - - break; - default: - while (percent < fmt) - PCHAR(*percent++); - /* - * Since we ignore a formatting argument it is no - * longer safe to obey the remaining formatting - * arguments as the arguments will no longer match - * the format specs. - */ - stop = 1; - break; - } - } -#undef PCHAR -} diff --git a/lib/libstand/qdivrem.c b/lib/libstand/qdivrem.c deleted file mode 100644 index bde3b0d56e49..000000000000 --- a/lib/libstand/qdivrem.c +++ /dev/null @@ -1,348 +0,0 @@ -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * 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. - * 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. - * - * From: Id: qdivrem.c,v 1.7 1997/11/07 09:20:40 phk Exp - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * Multiprecision divide. This algorithm is from Knuth vol. 2 (2nd ed), - * section 4.3.1, pp. 257--259. - */ - -#include "quad.h" - -#define B (1 << HALF_BITS) /* digit base */ - -/* Combine two `digits' to make a single two-digit number. */ -#define COMBINE(a, b) (((u_int)(a) << HALF_BITS) | (b)) - -_Static_assert(sizeof(int) / 2 == sizeof(short), - "Bitwise functions in libstand are broken on this architecture\n"); - -/* select a type for digits in base B: use unsigned short if they fit */ -typedef unsigned short digit; - -/* - * Shift p[0]..p[len] left `sh' bits, ignoring any bits that - * `fall out' the left (there never will be any such anyway). - * We may assume len >= 0. NOTE THAT THIS WRITES len+1 DIGITS. - */ -static void -shl(digit *p, int len, int sh) -{ - int i; - - for (i = 0; i < len; i++) - p[i] = LHALF(p[i] << sh) | (p[i + 1] >> (HALF_BITS - sh)); - p[i] = LHALF(p[i] << sh); -} - -/* - * __qdivrem(u, v, rem) returns u/v and, optionally, sets *rem to u%v. - * - * We do this in base 2-sup-HALF_BITS, so that all intermediate products - * fit within u_int. As a consequence, the maximum length dividend and - * divisor are 4 `digits' in this base (they are shorter if they have - * leading zeros). - */ -u_quad_t -__qdivrem(uq, vq, arq) - u_quad_t uq, vq, *arq; -{ - union uu tmp; - digit *u, *v, *q; - digit v1, v2; - u_int qhat, rhat, t; - int m, n, d, j, i; - digit uspace[5], vspace[5], qspace[5]; - - /* - * Take care of special cases: divide by zero, and u < v. - */ - if (vq == 0) { - /* divide by zero. */ - static volatile const unsigned int zero = 0; - - tmp.ul[H] = tmp.ul[L] = 1 / zero; - if (arq) - *arq = uq; - return (tmp.q); - } - if (uq < vq) { - if (arq) - *arq = uq; - return (0); - } - u = &uspace[0]; - v = &vspace[0]; - q = &qspace[0]; - - /* - * Break dividend and divisor into digits in base B, then - * count leading zeros to determine m and n. When done, we - * will have: - * u = (u[1]u[2]...u[m+n]) sub B - * v = (v[1]v[2]...v[n]) sub B - * v[1] != 0 - * 1 < n <= 4 (if n = 1, we use a different division algorithm) - * m >= 0 (otherwise u < v, which we already checked) - * m + n = 4 - * and thus - * m = 4 - n <= 2 - */ - tmp.uq = uq; - u[0] = 0; - u[1] = HHALF(tmp.ul[H]); - u[2] = LHALF(tmp.ul[H]); - u[3] = HHALF(tmp.ul[L]); - u[4] = LHALF(tmp.ul[L]); - tmp.uq = vq; - v[1] = HHALF(tmp.ul[H]); - v[2] = LHALF(tmp.ul[H]); - v[3] = HHALF(tmp.ul[L]); - v[4] = LHALF(tmp.ul[L]); - for (n = 4; v[1] == 0; v++) { - if (--n == 1) { - u_int rbj; /* r*B+u[j] (not root boy jim) */ - digit q1, q2, q3, q4; - - /* - * Change of plan, per exercise 16. - * r = 0; - * for j = 1..4: - * q[j] = floor((r*B + u[j]) / v), - * r = (r*B + u[j]) % v; - * We unroll this completely here. - */ - t = v[2]; /* nonzero, by definition */ - q1 = u[1] / t; - rbj = COMBINE(u[1] % t, u[2]); - q2 = rbj / t; - rbj = COMBINE(rbj % t, u[3]); - q3 = rbj / t; - rbj = COMBINE(rbj % t, u[4]); - q4 = rbj / t; - if (arq) - *arq = rbj % t; - tmp.ul[H] = COMBINE(q1, q2); - tmp.ul[L] = COMBINE(q3, q4); - return (tmp.q); - } - } - - /* - * By adjusting q once we determine m, we can guarantee that - * there is a complete four-digit quotient at &qspace[1] when - * we finally stop. - */ - for (m = 4 - n; u[1] == 0; u++) - m--; - for (i = 4 - m; --i >= 0;) - q[i] = 0; - q += 4 - m; - - /* - * Here we run Program D, translated from MIX to C and acquiring - * a few minor changes. - * - * D1: choose multiplier 1 << d to ensure v[1] >= B/2. - */ - d = 0; - for (t = v[1]; t < B / 2; t <<= 1) - d++; - if (d > 0) { - shl(&u[0], m + n, d); /* u <<= d */ - shl(&v[1], n - 1, d); /* v <<= d */ - } - /* - * D2: j = 0. - */ - j = 0; - v1 = v[1]; /* for D3 -- note that v[1..n] are constant */ - v2 = v[2]; /* for D3 */ - do { - digit uj0, uj1, uj2; - - /* - * D3: Calculate qhat (\^q, in TeX notation). - * Let qhat = min((u[j]*B + u[j+1])/v[1], B-1), and - * let rhat = (u[j]*B + u[j+1]) mod v[1]. - * While rhat < B and v[2]*qhat > rhat*B+u[j+2], - * decrement qhat and increase rhat correspondingly. - * Note that if rhat >= B, v[2]*qhat < rhat*B. - */ - uj0 = u[j + 0]; /* for D3 only -- note that u[j+...] change */ - uj1 = u[j + 1]; /* for D3 only */ - uj2 = u[j + 2]; /* for D3 only */ - if (uj0 == v1) { - qhat = B; - rhat = uj1; - goto qhat_too_big; - } else { - u_int nn = COMBINE(uj0, uj1); - qhat = nn / v1; - rhat = nn % v1; - } - while (v2 * qhat > COMBINE(rhat, uj2)) { - qhat_too_big: - qhat--; - if ((rhat += v1) >= B) - break; - } - /* - * D4: Multiply and subtract. - * The variable `t' holds any borrows across the loop. - * We split this up so that we do not require v[0] = 0, - * and to eliminate a final special case. - */ - for (t = 0, i = n; i > 0; i--) { - t = u[i + j] - v[i] * qhat - t; - u[i + j] = LHALF(t); - t = (B - HHALF(t)) & (B - 1); - } - t = u[j] - t; - u[j] = LHALF(t); - /* - * D5: test remainder. - * There is a borrow if and only if HHALF(t) is nonzero; - * in that (rare) case, qhat was too large (by exactly 1). - * Fix it by adding v[1..n] to u[j..j+n]. - */ - if (HHALF(t)) { - qhat--; - for (t = 0, i = n; i > 0; i--) { /* D6: add back. */ - t += u[i + j] + v[i]; - u[i + j] = LHALF(t); - t = HHALF(t); - } - u[j] = LHALF(u[j] + t); - } - q[j] = qhat; - } while (++j <= m); /* D7: loop on j. */ - - /* - * If caller wants the remainder, we have to calculate it as - * u[m..m+n] >> d (this is at most n digits and thus fits in - * u[m+1..m+n], but we may need more source digits). - */ - if (arq) { - if (d) { - for (i = m + n; i > m; --i) - u[i] = (u[i] >> d) | - LHALF(u[i - 1] << (HALF_BITS - d)); - u[i] = 0; - } - tmp.ul[H] = COMBINE(uspace[1], uspace[2]); - tmp.ul[L] = COMBINE(uspace[3], uspace[4]); - *arq = tmp.q; - } - - tmp.ul[H] = COMBINE(qspace[1], qspace[2]); - tmp.ul[L] = COMBINE(qspace[3], qspace[4]); - return (tmp.q); -} - -/* - * Divide two unsigned quads. - */ - -u_quad_t -__udivdi3(a, b) - u_quad_t a, b; -{ - - return (__qdivrem(a, b, (u_quad_t *)0)); -} - -/* - * Return remainder after dividing two unsigned quads. - */ -u_quad_t -__umoddi3(a, b) - u_quad_t a, b; -{ - u_quad_t r; - - (void)__qdivrem(a, b, &r); - return (r); -} - -/* - * Divide two signed quads. - * ??? if -1/2 should produce -1 on this machine, this code is wrong - */ -quad_t -__divdi3(a, b) - quad_t a, b; -{ - u_quad_t ua, ub, uq; - int neg; - - if (a < 0) - ua = -(u_quad_t)a, neg = 1; - else - ua = a, neg = 0; - if (b < 0) - ub = -(u_quad_t)b, neg ^= 1; - else - ub = b; - uq = __qdivrem(ua, ub, (u_quad_t *)0); - return (neg ? -uq : uq); -} - -/* - * Return remainder after dividing two signed quads. - * - * XXX - * If -1/2 should produce -1 on this machine, this code is wrong. - */ -quad_t -__moddi3(a, b) - quad_t a, b; -{ - u_quad_t ua, ub, ur; - int neg; - - if (a < 0) - ua = -(u_quad_t)a, neg = 1; - else - ua = a, neg = 0; - if (b < 0) - ub = -(u_quad_t)b; - else - ub = b; - (void)__qdivrem(ua, ub, &ur); - return (neg ? -ur : ur); -} diff --git a/lib/libstand/quad.h b/lib/libstand/quad.h deleted file mode 100644 index 349540a1e9fa..000000000000 --- a/lib/libstand/quad.h +++ /dev/null @@ -1,114 +0,0 @@ -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * 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. - * 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. - * - * @(#)quad.h 8.1 (Berkeley) 6/4/93 - * $FreeBSD$ - */ - -/* - * Quad arithmetic. - * - * This library makes the following assumptions: - * - * - The type long long (aka quad_t) exists. - * - * - A quad variable is exactly twice as long as `long'. - * - * - The machine's arithmetic is two's complement. - * - * This library can provide 128-bit arithmetic on a machine with 128-bit - * quads and 64-bit longs, for instance, or 96-bit arithmetic on machines - * with 48-bit longs. - */ - -#include <sys/cdefs.h> -#include <sys/types.h> -#include <limits.h> - -_Static_assert(sizeof(quad_t) == sizeof(int) * 2, - "Bitwise function in libstand are broken on this architecture\n"); - -/* - * Depending on the desired operation, we view a `long long' (aka quad_t) in - * one or more of the following formats. - */ -union uu { - quad_t q; /* as a (signed) quad */ - quad_t uq; /* as an unsigned quad */ - int sl[2]; /* as two signed ints */ - u_int ul[2]; /* as two unsigned ints */ -}; - -/* - * Define high and low longwords. - */ -#define H _QUAD_HIGHWORD -#define L _QUAD_LOWWORD - -/* - * Total number of bits in a quad_t and in the pieces that make it up. - * These are used for shifting, and also below for halfword extraction - * and assembly. - */ -#define QUAD_BITS (sizeof(quad_t) * CHAR_BIT) -#define HALF_BITS (sizeof(int) * CHAR_BIT / 2) - -/* - * Extract high and low shortwords from longword, and move low shortword of - * longword to upper half of long, i.e., produce the upper longword of - * ((quad_t)(x) << (number_of_bits_in_long/2)). (`x' must actually be u_long.) - * - * These are used in the multiply code, to split a longword into upper - * and lower halves, and to reassemble a product as a quad_t, shifted left - * (sizeof(long)*CHAR_BIT/2). - */ -#define HHALF(x) ((x) >> HALF_BITS) -#define LHALF(x) ((x) & ((1 << HALF_BITS) - 1)) -#define LHUP(x) ((x) << HALF_BITS) - -quad_t __divdi3(quad_t a, quad_t b); -quad_t __moddi3(quad_t a, quad_t b); -u_quad_t __qdivrem(u_quad_t u, u_quad_t v, u_quad_t *rem); -u_quad_t __udivdi3(u_quad_t a, u_quad_t b); -u_quad_t __umoddi3(u_quad_t a, u_quad_t b); - -/* - * XXX - * Compensate for gcc 1 vs gcc 2. Gcc 1 defines ?sh?di3's second argument - * as u_quad_t, while gcc 2 correctly uses int. Unfortunately, we still use - * both compilers. - */ -#if __GNUC__ >= 2 -typedef unsigned int qshift_t; -#else -typedef u_quad_t qshift_t; -#endif diff --git a/lib/libstand/random.c b/lib/libstand/random.c deleted file mode 100644 index a5b2ad6770c6..000000000000 --- a/lib/libstand/random.c +++ /dev/null @@ -1,70 +0,0 @@ -/*- - * Copyright (c) 1992, 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. - * 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. - * - * @(#)random.c 8.1 (Berkeley) 6/10/93 - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/types.h> - -static u_long randseed = 1; - -void -srandom(seed) - u_long seed; -{ - randseed = seed; -} - -/* - * Pseudo-random number generator for randomizing the profiling clock, - * and whatever else we might use it for. The result is uniform on - * [0, 2^31 - 1]. - */ -long -random(void) -{ - long x, hi, lo, t; - - /* - * Compute x[n + 1] = (7^5 * x[n]) mod (2^31 - 1). - * From "Random number generators: good ones are hard to find", - * Park and Miller, Communications of the ACM, vol. 31, no. 10, - * October 1988, p. 1195. - */ - x = randseed; - hi = x / 127773; - lo = x % 127773; - t = 16807 * lo - 2836 * hi; - if (t <= 0) - t += 0x7fffffff; - randseed = t; - return (t); -} diff --git a/lib/libstand/rarp.c b/lib/libstand/rarp.c deleted file mode 100644 index 3b8088e5358b..000000000000 --- a/lib/libstand/rarp.c +++ /dev/null @@ -1,218 +0,0 @@ -/* $NetBSD: rarp.c,v 1.16 1997/07/07 15:52:52 drochner Exp $ */ - -/* - * Copyright (c) 1992 Regents of the University of California. - * All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * 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. - * 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. - * - * @(#) Header: arp.c,v 1.5 93/07/15 05:52:26 leres Exp (LBL) - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/socket.h> -#include <net/if.h> -#include <netinet/in.h> -#include <netinet/if_ether.h> - -#include <netinet/in_systm.h> - -#include <string.h> - -#include "stand.h" -#include "net.h" -#include "netif.h" - - -static ssize_t rarpsend(struct iodesc *, void *, size_t); -static ssize_t rarprecv(struct iodesc *, void **, void **, time_t); - -/* - * Ethernet (Reverse) Address Resolution Protocol (see RFC 903, and 826). - */ -int -rarp_getipaddress(int sock) -{ - struct iodesc *d; - struct ether_arp *ap; - void *pkt; - struct { - u_char header[ETHER_SIZE]; - struct { - struct ether_arp arp; - u_char pad[18]; /* 60 - sizeof(arp) */ - } data; - } wbuf; - -#ifdef RARP_DEBUG - if (debug) - printf("rarp: socket=%d\n", sock); -#endif - if (!(d = socktodesc(sock))) { - printf("rarp: bad socket. %d\n", sock); - return (-1); - } -#ifdef RARP_DEBUG - if (debug) - printf("rarp: d=%x\n", (u_int)d); -#endif - - bzero((char*)&wbuf.data, sizeof(wbuf.data)); - ap = &wbuf.data.arp; - ap->arp_hrd = htons(ARPHRD_ETHER); - ap->arp_pro = htons(ETHERTYPE_IP); - ap->arp_hln = sizeof(ap->arp_sha); /* hardware address length */ - ap->arp_pln = sizeof(ap->arp_spa); /* protocol address length */ - ap->arp_op = htons(ARPOP_REVREQUEST); - bcopy(d->myea, ap->arp_sha, 6); - bcopy(d->myea, ap->arp_tha, 6); - pkt = NULL; - - if (sendrecv(d, - rarpsend, &wbuf.data, sizeof(wbuf.data), - rarprecv, &pkt, (void *)&ap) < 0) { - printf("No response for RARP request\n"); - return (-1); - } - - bcopy(ap->arp_tpa, (char *)&myip, sizeof(myip)); -#if 0 - /* XXX - Can NOT assume this is our root server! */ - bcopy(ap->arp_spa, (char *)&rootip, sizeof(rootip)); -#endif - free(pkt); - - /* Compute our "natural" netmask. */ - if (IN_CLASSA(myip.s_addr)) - netmask = IN_CLASSA_NET; - else if (IN_CLASSB(myip.s_addr)) - netmask = IN_CLASSB_NET; - else - netmask = IN_CLASSC_NET; - - d->myip = myip; - return (0); -} - -/* - * Broadcast a RARP request (i.e. who knows who I am) - */ -static ssize_t -rarpsend(struct iodesc *d, void *pkt, size_t len) -{ - -#ifdef RARP_DEBUG - if (debug) - printf("rarpsend: called\n"); -#endif - - return (sendether(d, pkt, len, bcea, ETHERTYPE_REVARP)); -} - -/* - * Returns 0 if this is the packet we're waiting for - * else -1 (and errno == 0) - */ -static ssize_t -rarprecv(struct iodesc *d, void **pkt, void **payload, time_t tleft) -{ - ssize_t n; - struct ether_arp *ap; - void *ptr = NULL; - uint16_t etype; /* host order */ - -#ifdef RARP_DEBUG - if (debug) - printf("rarprecv: "); -#endif - - n = readether(d, &ptr, (void **)&ap, tleft, &etype); - errno = 0; /* XXX */ - if (n == -1 || n < sizeof(struct ether_arp)) { -#ifdef RARP_DEBUG - if (debug) - printf("bad len=%d\n", n); -#endif - free(ptr); - return (-1); - } - - if (etype != ETHERTYPE_REVARP) { -#ifdef RARP_DEBUG - if (debug) - printf("bad type=0x%x\n", etype); -#endif - free(ptr); - return (-1); - } - - if (ap->arp_hrd != htons(ARPHRD_ETHER) || - ap->arp_pro != htons(ETHERTYPE_IP) || - ap->arp_hln != sizeof(ap->arp_sha) || - ap->arp_pln != sizeof(ap->arp_spa) ) - { -#ifdef RARP_DEBUG - if (debug) - printf("bad hrd/pro/hln/pln\n"); -#endif - free(ptr); - return (-1); - } - - if (ap->arp_op != htons(ARPOP_REVREPLY)) { -#ifdef RARP_DEBUG - if (debug) - printf("bad op=0x%x\n", ntohs(ap->arp_op)); -#endif - free(ptr); - return (-1); - } - - /* Is the reply for our Ethernet address? */ - if (bcmp(ap->arp_tha, d->myea, 6)) { -#ifdef RARP_DEBUG - if (debug) - printf("unwanted address\n"); -#endif - free(ptr); - return (-1); - } - - /* We have our answer. */ -#ifdef RARP_DEBUG - if (debug) - printf("got it\n"); -#endif - *pkt = ptr; - *payload = ap; - return (n); -} diff --git a/lib/libstand/read.c b/lib/libstand/read.c deleted file mode 100644 index c165d68400db..000000000000 --- a/lib/libstand/read.c +++ /dev/null @@ -1,127 +0,0 @@ -/* $NetBSD: read.c,v 1.8 1997/01/22 00:38:12 cgd Exp $ */ - -/*- - * Copyright (c) 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * The Mach Operating System project at Carnegie-Mellon University. - * - * 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. - * 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. - * - * @(#)read.c 8.1 (Berkeley) 6/11/93 - * - * - * Copyright (c) 1989, 1990, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Author: Alessandro Forin - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include "stand.h" - -ssize_t -read(int fd, void *dest, size_t bcount) -{ - struct open_file *f = &files[fd]; - size_t resid; - - if ((unsigned)fd >= SOPEN_MAX || !(f->f_flags & F_READ)) { - errno = EBADF; - return (-1); - } - if (f->f_flags & F_RAW) { - twiddle(4); - errno = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, - btodb(f->f_offset), bcount, dest, &resid); - if (errno) - return (-1); - f->f_offset += resid; - return (resid); - } - - /* - * Optimise reads from regular files using a readahead buffer. - * If the request can't be satisfied from the current buffer contents, - * check to see if it should be bypassed, or refill the buffer and complete - * the request. - */ - resid = bcount; - for (;;) { - size_t ccount, cresid; - /* how much can we supply? */ - ccount = imin(f->f_ralen, resid); - if (ccount > 0) { - bcopy(f->f_rabuf + f->f_raoffset, dest, ccount); - f->f_raoffset += ccount; - f->f_ralen -= ccount; - resid -= ccount; - if (resid == 0) - return(bcount); - dest = (char *)dest + ccount; - } - - /* will filling the readahead buffer again not help? */ - if (resid >= SOPEN_RASIZE) { - /* bypass the rest of the request and leave the buffer empty */ - if ((errno = (f->f_ops->fo_read)(f, dest, resid, &cresid))) - return (-1); - return(bcount - cresid); - } - - /* fetch more data */ - if ((errno = (f->f_ops->fo_read)(f, f->f_rabuf, SOPEN_RASIZE, &cresid))) - return (-1); - f->f_raoffset = 0; - f->f_ralen = SOPEN_RASIZE - cresid; - /* no more data, return what we had */ - if (f->f_ralen == 0) - return(bcount - resid); - } -} diff --git a/lib/libstand/readdir.c b/lib/libstand/readdir.c deleted file mode 100644 index e49d93d15ed6..000000000000 --- a/lib/libstand/readdir.c +++ /dev/null @@ -1,51 +0,0 @@ -/*- - * Copyright (c) 1999,2000 Jonathan Lemon <jlemon@freebsd.org> - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include "stand.h" - -struct dirent * -readdirfd(int fd) -{ - static struct dirent dir; /* XXX not thread safe */ - struct open_file *f = &files[fd]; - - if ((unsigned)fd >= SOPEN_MAX || !(f->f_flags & F_READ)) { - errno = EBADF; - return (NULL); - } - if (f->f_flags & F_RAW) { - errno = EIO; - return (NULL); - } - errno = (f->f_ops->fo_readdir)(f, &dir); - if (errno) - return (NULL); - return (&dir); -} diff --git a/lib/libstand/rpc.c b/lib/libstand/rpc.c deleted file mode 100644 index 94e6ce6b7e9a..000000000000 --- a/lib/libstand/rpc.c +++ /dev/null @@ -1,433 +0,0 @@ -/* $NetBSD: rpc.c,v 1.18 1998/01/23 19:27:45 thorpej Exp $ */ - -/* - * Copyright (c) 1992 Regents of the University of California. - * All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * 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. - * 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. - * - * @(#) Header: rpc.c,v 1.12 93/09/28 08:31:56 leres Exp (LBL) - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * RPC functions used by NFS and bootparams. - * Note that bootparams requires the ability to find out the - * address of the server from which its response has come. - * This is supported by keeping the IP/UDP headers in the - * buffer space provided by the caller. (See rpc_fromaddr) - */ - -#include <sys/param.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <netinet/in_systm.h> - -#include <string.h> - -#include "rpcv2.h" - -#include "stand.h" -#include "net.h" -#include "netif.h" -#include "rpc.h" - -struct auth_info { - int32_t authtype; /* auth type */ - u_int32_t authlen; /* auth length */ -}; - -struct auth_unix { - int32_t ua_time; - int32_t ua_hostname; /* null */ - int32_t ua_uid; - int32_t ua_gid; - int32_t ua_gidlist; /* null */ -}; - -struct rpc_call { - u_int32_t rp_xid; /* request transaction id */ - int32_t rp_direction; /* call direction (0) */ - u_int32_t rp_rpcvers; /* rpc version (2) */ - u_int32_t rp_prog; /* program */ - u_int32_t rp_vers; /* version */ - u_int32_t rp_proc; /* procedure */ -}; - -struct rpc_reply { - u_int32_t rp_xid; /* request transaction id */ - int32_t rp_direction; /* call direction (1) */ - int32_t rp_astatus; /* accept status (0: accepted) */ - union { - u_int32_t rpu_errno; - struct { - struct auth_info rok_auth; - u_int32_t rok_status; - } rpu_rok; - } rp_u; -}; - -/* Local forwards */ -static ssize_t recvrpc(struct iodesc *, void **, void **, time_t); -static int rpc_getport(struct iodesc *, n_long, n_long); - -int rpc_xid; -int rpc_port = 0x400; /* predecrement */ - -/* - * Make a rpc call; return length of answer - * Note: Caller must leave room for headers. - */ -ssize_t -rpc_call(struct iodesc *d, n_long prog, n_long vers, n_long proc, - void *sdata, size_t slen, void **rdata, void **pkt) -{ - ssize_t cc, rsize; - struct auth_info *auth; - struct rpc_call *call; - struct rpc_reply *reply; - char *send_head, *send_tail; - void *ptr; - n_long x; - int port; /* host order */ - -#ifdef RPC_DEBUG - if (debug) - printf("rpc_call: prog=0x%x vers=%d proc=%d\n", - prog, vers, proc); -#endif - - port = rpc_getport(d, prog, vers); - if (port == -1) - return (-1); - - d->destport = htons(port); - - /* - * Prepend authorization stuff and headers. - * Note, must prepend things in reverse order. - */ - send_head = sdata; - send_tail = (char *)sdata + slen; - - /* Auth verifier is always auth_null */ - send_head -= sizeof(*auth); - auth = (struct auth_info *)send_head; - auth->authtype = htonl(RPCAUTH_NULL); - auth->authlen = 0; - - /* Auth credentials: always auth unix (as root) */ - send_head -= sizeof(struct auth_unix); - bzero(send_head, sizeof(struct auth_unix)); - send_head -= sizeof(*auth); - auth = (struct auth_info *)send_head; - auth->authtype = htonl(RPCAUTH_UNIX); - auth->authlen = htonl(sizeof(struct auth_unix)); - - /* RPC call structure. */ - send_head -= sizeof(*call); - call = (struct rpc_call *)send_head; - rpc_xid++; - call->rp_xid = htonl(rpc_xid); - call->rp_direction = htonl(RPC_CALL); - call->rp_rpcvers = htonl(RPC_VER2); - call->rp_prog = htonl(prog); - call->rp_vers = htonl(vers); - call->rp_proc = htonl(proc); - - ptr = NULL; - cc = sendrecv(d, - sendudp, send_head, send_tail - send_head, - recvrpc, &ptr, (void **)&reply); - -#ifdef RPC_DEBUG - if (debug) - printf("callrpc: cc=%zd\n", cc); -#endif - if (cc == -1) - return (-1); - - if (cc <= sizeof(*reply)) { - errno = EBADRPC; - free(ptr); - return (-1); - } - - /* - * Check the RPC reply status. - * The xid, dir, astatus were already checked. - */ - auth = &reply->rp_u.rpu_rok.rok_auth; - x = ntohl(auth->authlen); - if (x != 0) { -#ifdef RPC_DEBUG - if (debug) - printf("callrpc: reply auth != NULL\n"); -#endif - errno = EBADRPC; - free(ptr); - return (-1); - } - x = ntohl(reply->rp_u.rpu_rok.rok_status); - if (x != 0) { - printf("callrpc: error = %ld\n", (long)x); - errno = EBADRPC; - free(ptr); - return (-1); - } - - rsize = cc - sizeof(*reply); - *rdata = (void *)((uintptr_t)reply + sizeof(*reply)); - *pkt = ptr; - return (rsize); -} - -/* - * Returns true if packet is the one we're waiting for. - * This just checks the XID, direction, acceptance. - * Remaining checks are done by callrpc - */ -static ssize_t -recvrpc(struct iodesc *d, void **pkt, void **payload, time_t tleft) -{ - void *ptr; - struct rpc_reply *reply; - ssize_t n; - int x; - - errno = 0; -#ifdef RPC_DEBUG - if (debug) - printf("recvrpc: called\n"); -#endif - - ptr = NULL; - n = readudp(d, &ptr, (void **)&reply, tleft); - if (n <= (4 * 4)) { - free(ptr); - return (-1); - } - - x = ntohl(reply->rp_xid); - if (x != rpc_xid) { -#ifdef RPC_DEBUG - if (debug) - printf("recvrpc: rp_xid %d != xid %d\n", x, rpc_xid); -#endif - free(ptr); - return (-1); - } - - x = ntohl(reply->rp_direction); - if (x != RPC_REPLY) { -#ifdef RPC_DEBUG - if (debug) - printf("recvrpc: rp_direction %d != REPLY\n", x); -#endif - free(ptr); - return (-1); - } - - x = ntohl(reply->rp_astatus); - if (x != RPC_MSGACCEPTED) { - errno = ntohl(reply->rp_u.rpu_errno); - printf("recvrpc: reject, astat=%d, errno=%d\n", x, errno); - free(ptr); - return (-1); - } - - *pkt = ptr; - *payload = reply; - /* Return data count (thus indicating success) */ - return (n); -} - -/* - * Given a pointer to a reply just received, - * dig out the IP address/port from the headers. - */ -void -rpc_fromaddr(void *pkt, struct in_addr *addr, u_short *port) -{ - struct hackhdr { - /* Tail of IP header: just IP addresses */ - n_long ip_src; - n_long ip_dst; - /* UDP header: */ - u_int16_t uh_sport; /* source port */ - u_int16_t uh_dport; /* destination port */ - int16_t uh_ulen; /* udp length */ - u_int16_t uh_sum; /* udp checksum */ - /* RPC reply header: */ - struct rpc_reply rpc; - } *hhdr; - - hhdr = ((struct hackhdr *)pkt) - 1; - addr->s_addr = hhdr->ip_src; - *port = hhdr->uh_sport; -} - -/* - * RPC Portmapper cache - */ -#define PMAP_NUM 8 /* need at most 5 pmap entries */ - -int rpc_pmap_num; -struct pmap_list { - struct in_addr addr; /* server, net order */ - u_int prog; /* host order */ - u_int vers; /* host order */ - int port; /* host order */ -} rpc_pmap_list[PMAP_NUM]; - -/* - * return port number in host order, or -1. - * arguments are: - * addr .. server, net order. - * prog .. host order. - * vers .. host order. - */ -int -rpc_pmap_getcache(struct in_addr addr, u_int prog, u_int vers) -{ - struct pmap_list *pl; - - for (pl = rpc_pmap_list; pl < &rpc_pmap_list[rpc_pmap_num]; pl++) { - if (pl->addr.s_addr == addr.s_addr && - pl->prog == prog && pl->vers == vers ) - { - return (pl->port); - } - } - return (-1); -} - -/* - * arguments are: - * addr .. server, net order. - * prog .. host order. - * vers .. host order. - * port .. host order. - */ -void -rpc_pmap_putcache(struct in_addr addr, u_int prog, u_int vers, int port) -{ - struct pmap_list *pl; - - /* Don't overflow cache... */ - if (rpc_pmap_num >= PMAP_NUM) { - /* ... just re-use the last entry. */ - rpc_pmap_num = PMAP_NUM - 1; -#ifdef RPC_DEBUG - printf("rpc_pmap_putcache: cache overflow\n"); -#endif - } - - pl = &rpc_pmap_list[rpc_pmap_num]; - rpc_pmap_num++; - - /* Cache answer */ - pl->addr = addr; - pl->prog = prog; - pl->vers = vers; - pl->port = port; -} - - -/* - * Request a port number from the port mapper. - * Returns the port in host order. - * prog and vers are host order. - */ -int -rpc_getport(struct iodesc *d, n_long prog, n_long vers) -{ - struct args { - n_long prog; /* call program */ - n_long vers; /* call version */ - n_long proto; /* call protocol */ - n_long port; /* call port (unused) */ - } *args; - struct res { - n_long port; - } *res; - struct { - n_long h[RPC_HEADER_WORDS]; - struct args d; - } sdata; - void *pkt; - ssize_t cc; - int port; - -#ifdef RPC_DEBUG - if (debug) - printf("%s: prog=0x%x vers=%d\n", __func__, prog, vers); -#endif - - /* This one is fixed forever. */ - if (prog == PMAPPROG) { - port = PMAPPORT; - goto out; - } - - /* Try for cached answer first */ - port = rpc_pmap_getcache(d->destip, prog, vers); - if (port != -1) - goto out; - - args = &sdata.d; - args->prog = htonl(prog); - args->vers = htonl(vers); - args->proto = htonl(IPPROTO_UDP); - args->port = 0; - pkt = NULL; - - cc = rpc_call(d, PMAPPROG, PMAPVERS, PMAPPROC_GETPORT, - args, sizeof(*args), (void **)&res, &pkt); - if (cc < sizeof(*res)) { - printf("getport: %s", strerror(errno)); - errno = EBADRPC; - free(pkt); - return (-1); - } - port = (int)ntohl(res->port); - free(pkt); - - rpc_pmap_putcache(d->destip, prog, vers, port); - -out: -#ifdef RPC_DEBUG - if (debug) - printf("%s: port=%u\n", __func__, port); -#endif - return (port); -} diff --git a/lib/libstand/rpc.h b/lib/libstand/rpc.h deleted file mode 100644 index 6dda0604828c..000000000000 --- a/lib/libstand/rpc.h +++ /dev/null @@ -1,66 +0,0 @@ -/* $NetBSD: rpc.h,v 1.8 1996/09/26 23:22:03 cgd Exp $ */ - -/* - * Copyright (c) 1992 Regents of the University of California. - * All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * 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. - * 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. - * - * $FreeBSD$ - */ - -/* XXX defines we can't easily get from system includes */ -#define PMAPPORT 111 -#define PMAPPROG 100000 -#define PMAPVERS 2 -#define PMAPPROC_NULL 0 -#define PMAPPROC_SET 1 -#define PMAPPROC_UNSET 2 -#define PMAPPROC_GETPORT 3 -#define PMAPPROC_DUMP 4 -#define PMAPPROC_CALLIT 5 - -/* RPC functions: */ -ssize_t rpc_call(struct iodesc *, n_long, n_long, n_long, - void *, size_t, void **, void **); -void rpc_fromaddr(void *, struct in_addr *, u_short *); -int rpc_pmap_getcache(struct in_addr, u_int, u_int); -void rpc_pmap_putcache(struct in_addr, u_int, u_int, int); - -extern int rpc_port; /* decrement before bind */ - -/* - * How much space to leave in front of RPC requests. - * In 32-bit words (alignment) we have: - * 12: Ether + IP + UDP + padding - * 6: RPC call header - * 7: Auth UNIX - * 2: Auth NULL - */ -#define RPC_HEADER_WORDS 28 diff --git a/lib/libstand/rpcv2.h b/lib/libstand/rpcv2.h deleted file mode 100644 index b59a760198d2..000000000000 --- a/lib/libstand/rpcv2.h +++ /dev/null @@ -1,87 +0,0 @@ -/* $NetBSD: rpcv2.h,v 1.1 1996/02/26 23:05:32 gwr Exp $ */ - -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Rick Macklem at The University of Guelph. - * - * 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. - * 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. - * - * @(#)rpcv2.h 8.1 (Berkeley) 6/10/93 - * - * $FreeBSD$ - */ - -/* - * Definitions for Sun RPC Version 2, from - * "RPC: Remote Procedure Call Protocol Specification" RFC1057 - */ - -/* Version # */ -#define RPC_VER2 2 - -/* Authentication */ -#define RPCAUTH_NULL 0 -#define RPCAUTH_UNIX 1 -#define RPCAUTH_SHORT 2 -#define RPCAUTH_MAXSIZ 400 -#define RPCAUTH_UNIXGIDS 16 - -/* Rpc Constants */ -#define RPC_CALL 0 -#define RPC_REPLY 1 -#define RPC_MSGACCEPTED 0 -#define RPC_MSGDENIED 1 -#define RPC_PROGUNAVAIL 1 -#define RPC_PROGMISMATCH 2 -#define RPC_PROCUNAVAIL 3 -#define RPC_GARBAGE 4 /* I like this one */ -#define RPC_MISMATCH 0 -#define RPC_AUTHERR 1 - -/* Authentication failures */ -#define AUTH_BADCRED 1 -#define AUTH_REJECTCRED 2 -#define AUTH_BADVERF 3 -#define AUTH_REJECTVERF 4 -#define AUTH_TOOWEAK 5 /* Give em wheaties */ - -/* Sizes of rpc header parts */ -#define RPC_SIZ 24 -#define RPC_REPLYSIZ 28 - -/* RPC Prog definitions */ -#define RPCPROG_MNT 100005 -#define RPCMNT_VER1 1 -#define RPCMNT_MOUNT 1 -#define RPCMNT_DUMP 2 -#define RPCMNT_UMOUNT 3 -#define RPCMNT_UMNTALL 4 -#define RPCMNT_EXPORT 5 -#define RPCMNT_NAMELEN 255 -#define RPCMNT_PATHLEN 1024 -#define RPCPROG_NFS 100003 diff --git a/lib/libstand/saioctl.h b/lib/libstand/saioctl.h deleted file mode 100644 index 5f888ff855f2..000000000000 --- a/lib/libstand/saioctl.h +++ /dev/null @@ -1,50 +0,0 @@ -/* $NetBSD: saioctl.h,v 1.2 1994/10/26 05:45:04 cgd Exp $ */ - -/*- - * Copyright (c) 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. - * 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. - * - * @(#)saioctl.h 8.1 (Berkeley) 6/11/93 - * - * $FreeBSD$ - */ - -/* ioctl's -- for disks just now */ -#define SAIOHDR (('d'<<8)|1) /* next i/o includes header */ -#define SAIOCHECK (('d'<<8)|2) /* next i/o checks data */ -#define SAIOHCHECK (('d'<<8)|3) /* next i/o checks header & data */ -#define SAIONOBAD (('d'<<8)|4) /* inhibit bad sector forwarding */ -#define SAIODOBAD (('d'<<8)|5) /* enable bad sector forwarding */ -#define SAIOECCLIM (('d'<<8)|6) /* set limit to ecc correction, bits */ -#define SAIOECCUNL (('d'<<8)|7) /* use standard ecc procedures */ -#define SAIORETRIES (('d'<<8)|8) /* set retry count for unit */ -#define SAIODEVDATA (('d'<<8)|9) /* get pointer to pack label */ -#define SAIOSSI (('d'<<8)|10) /* set skip sector inhibit */ -#define SAIONOSSI (('d'<<8)|11) /* inhibit skip sector handling */ -#define SAIOSSDEV (('d'<<8)|12) /* is device skip sector type? */ -#define SAIODEBUG (('d'<<8)|13) /* enable/disable debugging */ -#define SAIOGBADINFO (('d'<<8)|14) /* get bad-sector table */ diff --git a/lib/libstand/sbrk.c b/lib/libstand/sbrk.c deleted file mode 100644 index 471e78ecf6df..000000000000 --- a/lib/libstand/sbrk.c +++ /dev/null @@ -1,64 +0,0 @@ -/*- - * Copyright (c) 1998 Michael Smith - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * Minimal sbrk() emulation required for malloc support. - */ - -#include <string.h> -#include "stand.h" -#include "zalloc_defs.h" - -static size_t maxheap, heapsize = 0; -static void *heapbase; - -void -setheap(void *base, void *top) -{ - /* Align start address for the malloc code. Sigh. */ - heapbase = (void *)(((uintptr_t)base + MALLOCALIGN_MASK) & - ~MALLOCALIGN_MASK); - maxheap = (char *)top - (char *)heapbase; -} - -char * -sbrk(int incr) -{ - char *ret; - - if ((heapsize + incr) <= maxheap) { - ret = (char *)heapbase + heapsize; - bzero(ret, incr); - heapsize += incr; - return(ret); - } - errno = ENOMEM; - return((char *)-1); -} - diff --git a/lib/libstand/sparc64/_setjmp.S b/lib/libstand/sparc64/_setjmp.S deleted file mode 100644 index 50c924e8424b..000000000000 --- a/lib/libstand/sparc64/_setjmp.S +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * 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. - * 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. - * - * $Header: _setjmp.s,v 1.1 91/07/06 16:45:53 torek Exp - */ - -#if defined(LIBC_SCCS) && !defined(lint) -#if 0 - .asciz "@(#)_setjmp.s 8.1 (Berkeley) 6/4/93" -#else - RCSID("$NetBSD: _setjmp.S,v 1.4 1998/10/08 02:27:59 eeh Exp $") -#endif -#endif /* LIBC_SCCS and not lint */ - -#include <machine/asm.h> -__FBSDID("$FreeBSD$"); - -#define _JB_FP 0x0 -#define _JB_PC 0x8 -#define _JB_SP 0x10 - - .register %g2,#ignore - .register %g3,#ignore - -/* - * C library -- setjmp, longjmp - * - * longjmp(a,v) - * will generate a "return(v?v:1)" from - * the last call to - * setjmp(a) - * by restoring the previous context. - */ - -ENTRY(_setjmp) - stx %sp, [%o0 + _JB_SP] - stx %o7, [%o0 + _JB_PC] - stx %fp, [%o0 + _JB_FP] - retl - clr %o0 -END(_setjmp) - -ENTRY(_longjmp) - mov 1, %g1 - movrnz %o1, %o1, %g1 - mov %o0, %g2 - ldx [%g2 + _JB_FP], %g3 -1: cmp %fp, %g3 - bl,a 1b - restore - be,a 2f - ldx [%g2 + _JB_SP], %o0 - -.Lbotch: - illtrap - -2: cmp %o0, %sp - bge,a 3f - mov %o0, %sp - b,a .Lbotch - nop -3: ldx [%g2 + _JB_PC], %o7 - retl - mov %g1, %o0 -END(_longjmp) diff --git a/lib/libstand/splitfs.c b/lib/libstand/splitfs.c deleted file mode 100644 index af28704bc465..000000000000 --- a/lib/libstand/splitfs.c +++ /dev/null @@ -1,313 +0,0 @@ -/* - * Copyright (c) 2002 Maxim Sobolev - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include "stand.h" - -#define NTRIES (3) -#define CONF_BUF (512) -#define SEEK_BUF (512) - -struct split_file -{ - char **filesv; /* Filenames */ - char **descsv; /* Descriptions */ - int filesc; /* Number of parts */ - int curfile; /* Current file number */ - int curfd; /* Current file descriptor */ - off_t tot_pos; /* Offset from the beginning of the sequence */ - off_t file_pos; /* Offset from the beginning of the slice */ -}; - -static int split_openfile(struct split_file *sf); -static int splitfs_open(const char *path, struct open_file *f); -static int splitfs_close(struct open_file *f); -static int splitfs_read(struct open_file *f, void *buf, size_t size, size_t *resid); -static off_t splitfs_seek(struct open_file *f, off_t offset, int where); -static int splitfs_stat(struct open_file *f, struct stat *sb); - -struct fs_ops splitfs_fsops = { - "split", - splitfs_open, - splitfs_close, - splitfs_read, - null_write, - splitfs_seek, - splitfs_stat, - null_readdir -}; - -static void -split_file_destroy(struct split_file *sf) -{ - int i; - - if (sf->filesc > 0) { - for (i = 0; i < sf->filesc; i++) { - free(sf->filesv[i]); - free(sf->descsv[i]); - } - free(sf->filesv); - free(sf->descsv); - } - free(sf); -} - -static int -split_openfile(struct split_file *sf) -{ - int i; - - for (i = 0;; i++) { - sf->curfd = open(sf->filesv[sf->curfile], O_RDONLY); - if (sf->curfd >= 0) - break; - if ((sf->curfd == -1) && (errno != ENOENT)) - return (errno); - if (i == NTRIES) - return (EIO); - printf("\nInsert disk labelled %s and press any key...", - sf->descsv[sf->curfile]); - getchar(); - putchar('\n'); - } - sf->file_pos = 0; - return (0); -} - -static int -splitfs_open(const char *fname, struct open_file *f) -{ - char *buf, *confname, *cp; - int conffd; - struct split_file *sf; - struct stat sb; - - /* Have to be in "just read it" mode */ - if (f->f_flags != F_READ) - return(EPERM); - - /* If the name already ends in `.split', ignore it */ - if ((cp = strrchr(fname, '.')) && (!strcmp(cp, ".split"))) - return(ENOENT); - - /* Construct new name */ - confname = malloc(strlen(fname) + 7); - sprintf(confname, "%s.split", fname); - - /* Try to open the configuration file */ - conffd = open(confname, O_RDONLY); - free(confname); - if (conffd == -1) - return(ENOENT); - - if (fstat(conffd, &sb) < 0) { - printf("splitfs_open: stat failed\n"); - close(conffd); - return(ENOENT); - } - if (!S_ISREG(sb.st_mode)) { - printf("splitfs_open: not a file\n"); - close(conffd); - return(EISDIR); /* best guess */ - } - - /* Allocate a split_file structure, populate it from the config file */ - sf = malloc(sizeof(struct split_file)); - bzero(sf, sizeof(struct split_file)); - buf = malloc(CONF_BUF); - while (fgetstr(buf, CONF_BUF, conffd) > 0) { - cp = buf; - while ((*cp != '\0') && (isspace(*cp) == 0)) - cp++; - if (*cp != '\0') { - *cp = '\0'; - cp++; - } - while ((*cp != '\0') && (isspace(*cp) != 0)) - cp++; - if (*cp == '\0') - cp = buf; - sf->filesc++; - sf->filesv = realloc(sf->filesv, sizeof(*(sf->filesv)) * sf->filesc); - sf->descsv = realloc(sf->descsv, sizeof(*(sf->descsv)) * sf->filesc); - sf->filesv[sf->filesc - 1] = strdup(buf); - sf->descsv[sf->filesc - 1] = strdup(cp); - } - free(buf); - close(conffd); - - if (sf->filesc == 0) { - split_file_destroy(sf); - return(ENOENT); - } - errno = split_openfile(sf); - if (errno != 0) { - split_file_destroy(sf); - return(ENOENT); - } - - /* Looks OK, we'll take it */ - f->f_fsdata = sf; - return (0); -} - -static int -splitfs_close(struct open_file *f) -{ - int fd; - struct split_file *sf; - - sf = (struct split_file *)f->f_fsdata; - fd = sf->curfd; - split_file_destroy(sf); - return(close(fd)); -} - -static int -splitfs_read(struct open_file *f, void *buf, size_t size, size_t *resid) -{ - ssize_t nread; - size_t totread; - struct split_file *sf; - - sf = (struct split_file *)f->f_fsdata; - totread = 0; - do { - nread = read(sf->curfd, buf, size - totread); - - /* Error? */ - if (nread == -1) - return (errno); - - sf->tot_pos += nread; - sf->file_pos += nread; - totread += nread; - buf = (char *)buf + nread; - - if (totread < size) { /* EOF */ - if (sf->curfile == (sf->filesc - 1)) /* Last slice */ - break; - - /* Close previous slice */ - if (close(sf->curfd) != 0) - return (errno); - - sf->curfile++; - errno = split_openfile(sf); - if (errno) - return (errno); - } - } while (totread < size); - - if (resid != NULL) - *resid = size - totread; - - return (0); -} - -static off_t -splitfs_seek(struct open_file *f, off_t offset, int where) -{ - int nread; - size_t resid; - off_t new_pos, seek_by; - struct split_file *sf; - - sf = (struct split_file *)f->f_fsdata; - - seek_by = offset; - switch (where) { - case SEEK_SET: - seek_by -= sf->tot_pos; - break; - case SEEK_CUR: - break; - case SEEK_END: - panic("splitfs_seek: SEEK_END not supported"); - break; - default: - errno = EINVAL; - return (-1); - } - - if (seek_by > 0) { - /* - * Seek forward - implemented using splitfs_read(), because otherwise we'll be - * unable to detect that we have crossed slice boundary and hence - * unable to do a long seek crossing that boundary. - */ - void *tmp; - - tmp = malloc(SEEK_BUF); - if (tmp == NULL) { - errno = ENOMEM; - return (-1); - } - - nread = 0; - for (; seek_by > 0; seek_by -= nread) { - resid = 0; - errno = splitfs_read(f, tmp, min(seek_by, SEEK_BUF), &resid); - nread = min(seek_by, SEEK_BUF) - resid; - if ((errno != 0) || (nread == 0)) - /* Error or EOF */ - break; - } - free(tmp); - if (errno != 0) - return (-1); - } - - if (seek_by != 0) { - /* Seek backward or seek past the boundary of the last slice */ - if (sf->file_pos + seek_by < 0) - panic("splitfs_seek: can't seek past the beginning of the slice"); - new_pos = lseek(sf->curfd, seek_by, SEEK_CUR); - if (new_pos < 0) { - errno = EINVAL; - return (-1); - } - sf->tot_pos += new_pos - sf->file_pos; - sf->file_pos = new_pos; - } - - return (sf->tot_pos); -} - -static int -splitfs_stat(struct open_file *f, struct stat *sb) -{ - int result; - struct split_file *sf = (struct split_file *)f->f_fsdata; - - /* stat as normal, but indicate that size is unknown */ - if ((result = fstat(sf->curfd, sb)) == 0) - sb->st_size = -1; - return (result); -} diff --git a/lib/libstand/stand.h b/lib/libstand/stand.h deleted file mode 100644 index 62521a13e4ba..000000000000 --- a/lib/libstand/stand.h +++ /dev/null @@ -1,425 +0,0 @@ -/* - * Copyright (c) 1998 Michael Smith. - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - * - * $FreeBSD$ - * From $NetBSD: stand.h,v 1.22 1997/06/26 19:17:40 drochner Exp $ - */ - -/*- - * Copyright (c) 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. - * 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. - * - * @(#)stand.h 8.1 (Berkeley) 6/11/93 - */ - -#ifndef STAND_H -#define STAND_H - -#include <sys/types.h> -#include <sys/cdefs.h> -#include <sys/stat.h> -#include <sys/dirent.h> - -/* this header intentionally exports NULL from <string.h> */ -#include <string.h> - -#define CHK(fmt, args...) printf("%s(%d): " fmt "\n", __func__, __LINE__ , ##args) -#define PCHK(fmt, args...) {printf("%s(%d): " fmt "\n", __func__, __LINE__ , ##args); getchar();} - -/* Avoid unwanted userlandish components */ -#define _KERNEL -#include <sys/errno.h> -#undef _KERNEL - -/* special stand error codes */ -#define EADAPT (ELAST+1) /* bad adaptor */ -#define ECTLR (ELAST+2) /* bad controller */ -#define EUNIT (ELAST+3) /* bad unit */ -#define ESLICE (ELAST+4) /* bad slice */ -#define EPART (ELAST+5) /* bad partition */ -#define ERDLAB (ELAST+6) /* can't read disk label */ -#define EUNLAB (ELAST+7) /* unlabeled disk */ -#define EOFFSET (ELAST+8) /* relative seek not supported */ -#define ESALAST (ELAST+8) /* */ - -struct open_file; - -/* - * This structure is used to define file system operations in a file system - * independent way. - * - * XXX note that filesystem providers should export a pointer to their fs_ops - * struct, so that consumers can reference this and thus include the - * filesystems that they require. - */ -struct fs_ops { - const char *fs_name; - int (*fo_open)(const char *path, struct open_file *f); - int (*fo_close)(struct open_file *f); - int (*fo_read)(struct open_file *f, void *buf, - size_t size, size_t *resid); - int (*fo_write)(struct open_file *f, void *buf, - size_t size, size_t *resid); - off_t (*fo_seek)(struct open_file *f, off_t offset, int where); - int (*fo_stat)(struct open_file *f, struct stat *sb); - int (*fo_readdir)(struct open_file *f, struct dirent *d); -}; - -/* - * libstand-supplied filesystems - */ -extern struct fs_ops ufs_fsops; -extern struct fs_ops tftp_fsops; -extern struct fs_ops nfs_fsops; -extern struct fs_ops cd9660_fsops; -extern struct fs_ops nandfs_fsops; -extern struct fs_ops gzipfs_fsops; -extern struct fs_ops bzipfs_fsops; -extern struct fs_ops dosfs_fsops; -extern struct fs_ops ext2fs_fsops; -extern struct fs_ops splitfs_fsops; -extern struct fs_ops pkgfs_fsops; - -/* where values for lseek(2) */ -#define SEEK_SET 0 /* set file offset to offset */ -#define SEEK_CUR 1 /* set file offset to current plus offset */ -#define SEEK_END 2 /* set file offset to EOF plus offset */ - -/* - * Device switch - */ -struct devsw { - const char dv_name[8]; - int dv_type; /* opaque type constant, arch-dependant */ - int (*dv_init)(void); /* early probe call */ - int (*dv_strategy)(void *devdata, int rw, daddr_t blk, - size_t size, char *buf, size_t *rsize); - int (*dv_open)(struct open_file *f, ...); - int (*dv_close)(struct open_file *f); - int (*dv_ioctl)(struct open_file *f, u_long cmd, void *data); - int (*dv_print)(int verbose); /* print device information */ - void (*dv_cleanup)(void); -}; - -/* - * libstand-supplied device switch - */ -extern struct devsw netdev; - -extern int errno; - -/* - * Generic device specifier; architecture-dependent - * versions may be larger, but should be allowed to - * overlap. - */ -struct devdesc -{ - struct devsw *d_dev; - int d_type; -#define DEVT_NONE 0 -#define DEVT_DISK 1 -#define DEVT_NET 2 -#define DEVT_CD 3 -#define DEVT_ZFS 4 -#define DEVT_FD 5 - int d_unit; - void *d_opendata; -}; - -struct open_file { - int f_flags; /* see F_* below */ - struct devsw *f_dev; /* pointer to device operations */ - void *f_devdata; /* device specific data */ - struct fs_ops *f_ops; /* pointer to file system operations */ - void *f_fsdata; /* file system specific data */ - off_t f_offset; /* current file offset */ - char *f_rabuf; /* readahead buffer pointer */ - size_t f_ralen; /* valid data in readahead buffer */ - off_t f_raoffset; /* consumer offset in readahead buffer */ -#define SOPEN_RASIZE 512 -}; - -#define SOPEN_MAX 64 -extern struct open_file files[]; - -/* f_flags values */ -#define F_READ 0x0001 /* file opened for reading */ -#define F_WRITE 0x0002 /* file opened for writing */ -#define F_RAW 0x0004 /* raw device open - no file system */ -#define F_NODEV 0x0008 /* network open - no device */ -#define F_MASK 0xFFFF -/* Mode modifier for strategy() */ -#define F_NORA (0x01 << 16) /* Disable Read-Ahead */ - -#define isascii(c) (((c) & ~0x7F) == 0) - -static __inline int isupper(int c) -{ - return c >= 'A' && c <= 'Z'; -} - -static __inline int islower(int c) -{ - return c >= 'a' && c <= 'z'; -} - -static __inline int isspace(int c) -{ - return c == ' ' || (c >= 0x9 && c <= 0xd); -} - -static __inline int isdigit(int c) -{ - return c >= '0' && c <= '9'; -} - -static __inline int isxdigit(int c) -{ - return isdigit(c) || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'); -} - -static __inline int isalpha(int c) -{ - return isupper(c) || islower(c); -} - -static __inline int isalnum(int c) -{ - return isalpha(c) || isdigit(c); -} - -static __inline int toupper(int c) -{ - return islower(c) ? c - 'a' + 'A' : c; -} - -static __inline int tolower(int c) -{ - return isupper(c) ? c - 'A' + 'a' : c; -} - -/* sbrk emulation */ -extern void setheap(void *base, void *top); -extern char *sbrk(int incr); - -/* Matt Dillon's zalloc/zmalloc */ -extern void *malloc(size_t bytes); -extern void free(void *ptr); -/*#define free(p) {CHK("free %p", p); free(p);} */ /* use for catching guard violations */ -extern void *calloc(size_t n1, size_t n2); -extern void *realloc(void *ptr, size_t size); -extern void *reallocf(void *ptr, size_t size); -extern void mallocstats(void); - -extern int printf(const char *fmt, ...) __printflike(1, 2); -extern void vprintf(const char *fmt, __va_list); -extern int sprintf(char *buf, const char *cfmt, ...) __printflike(2, 3); -extern int snprintf(char *buf, size_t size, const char *cfmt, ...) __printflike(3, 4); -extern void vsprintf(char *buf, const char *cfmt, __va_list); - -extern void twiddle(u_int callerdiv); -extern void twiddle_divisor(u_int globaldiv); - -extern void ngets(char *, int); -#define gets(x) ngets((x), 0) -extern int fgetstr(char *buf, int size, int fd); - -extern int open(const char *, int); -#define O_RDONLY 0x0 -#define O_WRONLY 0x1 -#define O_RDWR 0x2 -extern int close(int); -extern void closeall(void); -extern ssize_t read(int, void *, size_t); -extern ssize_t write(int, void *, size_t); -extern struct dirent *readdirfd(int); - -extern void srandom(u_long seed); -extern long random(void); - -/* imports from stdlib, locally modified */ -extern long strtol(const char *, char **, int); -extern unsigned long strtoul(const char *, char **, int); -extern char *optarg; /* getopt(3) external variables */ -extern int optind, opterr, optopt, optreset; -extern int getopt(int, char * const [], const char *); - -/* pager.c */ -extern void pager_open(void); -extern void pager_close(void); -extern int pager_output(const char *lines); -extern int pager_file(const char *fname); - -/* No signal state to preserve */ -#define setjmp _setjmp -#define longjmp _longjmp - -/* environment.c */ -#define EV_DYNAMIC (1<<0) /* value was dynamically allocated, free if changed/unset */ -#define EV_VOLATILE (1<<1) /* value is volatile, make a copy of it */ -#define EV_NOHOOK (1<<2) /* don't call hook when setting */ - -struct env_var; -typedef char *(ev_format_t)(struct env_var *ev); -typedef int (ev_sethook_t)(struct env_var *ev, int flags, - const void *value); -typedef int (ev_unsethook_t)(struct env_var *ev); - -struct env_var -{ - char *ev_name; - int ev_flags; - void *ev_value; - ev_sethook_t *ev_sethook; - ev_unsethook_t *ev_unsethook; - struct env_var *ev_next, *ev_prev; -}; -extern struct env_var *environ; - -extern struct env_var *env_getenv(const char *name); -extern int env_setenv(const char *name, int flags, - const void *value, ev_sethook_t sethook, - ev_unsethook_t unsethook); -extern char *getenv(const char *name); -extern int setenv(const char *name, const char *value, - int overwrite); -extern int putenv(char *string); -extern int unsetenv(const char *name); - -extern ev_sethook_t env_noset; /* refuse set operation */ -extern ev_unsethook_t env_nounset; /* refuse unset operation */ - -/* BCD conversions (undocumented) */ -extern u_char const bcd2bin_data[]; -extern u_char const bin2bcd_data[]; -extern char const hex2ascii_data[]; - -#define bcd2bin(bcd) (bcd2bin_data[bcd]) -#define bin2bcd(bin) (bin2bcd_data[bin]) -#define hex2ascii(hex) (hex2ascii_data[hex]) - -/* min/max (undocumented) */ -static __inline int imax(int a, int b) { return (a > b ? a : b); } -static __inline int imin(int a, int b) { return (a < b ? a : b); } -static __inline long lmax(long a, long b) { return (a > b ? a : b); } -static __inline long lmin(long a, long b) { return (a < b ? a : b); } -static __inline u_int max(u_int a, u_int b) { return (a > b ? a : b); } -static __inline u_int min(u_int a, u_int b) { return (a < b ? a : b); } -static __inline quad_t qmax(quad_t a, quad_t b) { return (a > b ? a : b); } -static __inline quad_t qmin(quad_t a, quad_t b) { return (a < b ? a : b); } -static __inline u_long ulmax(u_long a, u_long b) { return (a > b ? a : b); } -static __inline u_long ulmin(u_long a, u_long b) { return (a < b ? a : b); } - - -/* null functions for device/filesystem switches (undocumented) */ -extern int nodev(void); -extern int noioctl(struct open_file *, u_long, void *); -extern void nullsys(void); - -extern int null_open(const char *path, struct open_file *f); -extern int null_close(struct open_file *f); -extern int null_read(struct open_file *f, void *buf, size_t size, size_t *resid); -extern int null_write(struct open_file *f, void *buf, size_t size, size_t *resid); -extern off_t null_seek(struct open_file *f, off_t offset, int where); -extern int null_stat(struct open_file *f, struct stat *sb); -extern int null_readdir(struct open_file *f, struct dirent *d); - - -/* - * Machine dependent functions and data, must be provided or stubbed by - * the consumer - */ -extern int getchar(void); -extern int ischar(void); -extern void putchar(int); -extern int devopen(struct open_file *, const char *, const char **); -extern int devclose(struct open_file *f); -extern void panic(const char *, ...) __dead2 __printflike(1, 2); -extern struct fs_ops *file_system[]; -extern struct fs_ops *exclusive_file_system; -extern struct devsw *devsw[]; - -/* - * Expose byteorder(3) functions. - */ -#ifndef _BYTEORDER_PROTOTYPED -#define _BYTEORDER_PROTOTYPED -extern uint32_t htonl(uint32_t); -extern uint16_t htons(uint16_t); -extern uint32_t ntohl(uint32_t); -extern uint16_t ntohs(uint16_t); -#endif - -#ifndef _BYTEORDER_FUNC_DEFINED -#define _BYTEORDER_FUNC_DEFINED -#define htonl(x) __htonl(x) -#define htons(x) __htons(x) -#define ntohl(x) __ntohl(x) -#define ntohs(x) __ntohs(x) -#endif - -void *Malloc(size_t, const char *, int); -void *Calloc(size_t, size_t, const char *, int); -void *Realloc(void *, size_t, const char *, int); -void Free(void *, const char *, int); - -#if 1 -#define malloc(x) Malloc(x, __FILE__, __LINE__) -#define calloc(x, y) Calloc(x, y, __FILE__, __LINE__) -#define free(x) Free(x, __FILE__, __LINE__) -#define realloc(x, y) Realloc(x, y, __FILE__, __LINE__) -#else -#define malloc(x) Malloc(x, NULL, 0) -#define calloc(x, y) Calloc(x, y, NULL, 0) -#define free(x) Free(x, NULL, 0) -#define realloc(x, y) Realloc(x, y, NULL, 0) -#endif - -#endif /* STAND_H */ diff --git a/lib/libstand/stat.c b/lib/libstand/stat.c deleted file mode 100644 index addee5d2f471..000000000000 --- a/lib/libstand/stat.c +++ /dev/null @@ -1,52 +0,0 @@ -/* $NetBSD: stat.c,v 1.4 1996/01/13 22:25:43 leo Exp $ */ - -/*- - * Copyright (c) 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. - * 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. - * - * @(#)stat.c 8.1 (Berkeley) 6/11/93 - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include "stand.h" - -int -stat(str, sb) - const char *str; - struct stat *sb; -{ - int fd, rv; - - fd = open(str, O_RDONLY); - if (fd < 0) - return (-1); - rv = fstat(fd, sb); - (void)close(fd); - return (rv); -} diff --git a/lib/libstand/strcasecmp.c b/lib/libstand/strcasecmp.c deleted file mode 100644 index 7ef3f59d9d3c..000000000000 --- a/lib/libstand/strcasecmp.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 1987, 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. - * 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/cdefs.h> -#include <string.h> -#include "stand.h" - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)strcasecmp.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -int -strcasecmp(s1, s2) - const char *s1, *s2; -{ - const u_char - *us1 = (const u_char *)s1, - *us2 = (const u_char *)s2; - - while (tolower(*us1) == tolower(*us2++)) - if (*us1++ == '\0') - return (0); - return (tolower(*us1) - tolower(*--us2)); -} - -int -strncasecmp(s1, s2, n) - const char *s1, *s2; - size_t n; -{ - if (n != 0) { - const u_char - *us1 = (const u_char *)s1, - *us2 = (const u_char *)s2; - - do { - if (tolower(*us1) != tolower(*us2++)) - return (tolower(*us1) - tolower(*--us2)); - if (*us1++ == '\0') - break; - } while (--n != 0); - } - return (0); -} diff --git a/lib/libstand/strdup.c b/lib/libstand/strdup.c deleted file mode 100644 index 45a541432cf5..000000000000 --- a/lib/libstand/strdup.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 1988, 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. - * 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)strdup.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include "stand.h" -#include <stddef.h> -#include <string.h> - -char * -strdup(str) - const char *str; -{ - size_t len; - char *copy = NULL; - - if (str != NULL) { - len = strlen(str) + 1; - if ((copy = malloc(len)) == NULL) - return (NULL); - memcpy(copy, str, len); - } - return (copy); -} diff --git a/lib/libstand/strerror.c b/lib/libstand/strerror.c deleted file mode 100644 index 56571efaa0ef..000000000000 --- a/lib/libstand/strerror.c +++ /dev/null @@ -1,87 +0,0 @@ -/* $NetBSD: strerror.c,v 1.12 1997/01/25 00:37:50 cgd Exp $ */ - -/*- - * Copyright (c) 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. - * 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include "stand.h" - -static struct -{ - int err; - char *msg; -} errtab[] = { - {0, "no error"}, - /* standard errors */ - {EPERM, "operation not permitted"}, - {ENOENT, "no such file or directory"}, - {EIO, "input/output error"}, - {ENXIO, "device not configured"}, - {ENOEXEC, "exec format error"}, - {EBADF, "bad file descriptor"}, - {ENOMEM, "cannot allocate memory"}, - {ENODEV, "operation not supported by device"}, - {ENOTDIR, "not a directory"}, - {EISDIR, "is a directory"}, - {EINVAL, "invalid argument"}, - {EMFILE, "too many open files"}, - {EFBIG, "file too large"}, - {EROFS, "read-only filesystem"}, - {EOPNOTSUPP, "operation not supported"}, - {ETIMEDOUT, "operation timed out"}, - {ESTALE, "stale NFS file handle"}, - {EBADRPC, "RPC struct is bad"}, - {EFTYPE, "inappropriate file type or format"}, - - {EADAPT, "bad adaptor number"}, - {ECTLR, "bad controller number"}, - {EUNIT, "bad unit number"}, - {ESLICE, "bad slice number"}, - {EPART, "bad partition"}, - {ERDLAB, "can't read disk label"}, - {EUNLAB, "disk unlabelled"}, - {EOFFSET, "illegal seek"}, - {0, NULL} -}; - - -char * -strerror(int err) -{ - static char msg[32]; - int i; - - for (i = 0; errtab[i].msg != NULL; i++) - if (errtab[i].err == err) - return(errtab[i].msg); - sprintf(msg, "unknown error (%d)", err); - return(msg); -} diff --git a/lib/libstand/strtol.c b/lib/libstand/strtol.c deleted file mode 100644 index be82fb1b6730..000000000000 --- a/lib/libstand/strtol.c +++ /dev/null @@ -1,132 +0,0 @@ -/*- - * Copyright (c) 1990, 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. - * 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)strtol.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include "stand.h" -#include <limits.h> - -/* - * Convert a string to a long integer. - * - * Ignores `locale' stuff. Assumes that the upper and lower case - * alphabets and digits are each contiguous. - */ -long -strtol(nptr, endptr, base) - const char *nptr; - char **endptr; - int base; -{ - const char *s; - unsigned long acc; - unsigned char c; - unsigned long cutoff; - int neg = 0, any, cutlim; - - /* Be sensible about NULL strings */ - if (nptr == NULL) - nptr = ""; - s = nptr; - - /* - * Skip white space and pick up leading +/- sign if any. - * If base is 0, allow 0x for hex and 0 for octal, else - * assume decimal; if base is already 16, allow 0x. - */ - do { - c = *s++; - } while (isspace(c)); - if (c == '-') { - neg = 1; - c = *s++; - } else if (c == '+') - c = *s++; - if ((base == 0 || base == 16) && - c == '0' && (*s == 'x' || *s == 'X')) { - c = s[1]; - s += 2; - base = 16; - } - if (base == 0) - base = c == '0' ? 8 : 10; - - /* - * Compute the cutoff value between legal numbers and illegal - * numbers. That is the largest legal value, divided by the - * base. An input number that is greater than this value, if - * followed by a legal input character, is too big. One that - * is equal to this value may be valid or not; the limit - * between valid and invalid numbers is then based on the last - * digit. For instance, if the range for longs is - * [-2147483648..2147483647] and the input base is 10, - * cutoff will be set to 214748364 and cutlim to either - * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated - * a value > 214748364, or equal but the next digit is > 7 (or 8), - * the number is too big, and we will return a range error. - * - * Set any if any `digits' consumed; make it negative to indicate - * overflow. - */ - cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX; - cutlim = cutoff % (unsigned long)base; - cutoff /= (unsigned long)base; - for (acc = 0, any = 0;; c = *s++) { - if (!isascii(c)) - break; - if (isdigit(c)) - c -= '0'; - else if (isalpha(c)) - c -= isupper(c) ? 'A' - 10 : 'a' - 10; - else - break; - if (c >= base) - break; - if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) - any = -1; - else { - any = 1; - acc *= base; - acc += c; - } - } - if (any < 0) { - acc = neg ? LONG_MIN : LONG_MAX; - errno = ERANGE; - } else if (neg) - acc = -acc; - if (endptr != NULL) - *endptr = (char *)(any ? s - 1 : nptr); - return (acc); -} diff --git a/lib/libstand/strtoul.c b/lib/libstand/strtoul.c deleted file mode 100644 index 5735d20d25ed..000000000000 --- a/lib/libstand/strtoul.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Copyright (c) 2011 The FreeBSD Foundation - * All rights reserved. - * Portions of this software were developed by David Chisnall - * under sponsorship from the FreeBSD Foundation. - * - * 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. - * 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[] = "@(#)strtoul.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include "stand.h" -#include <limits.h> - -/* - * Convert a string to an unsigned long integer. - * - * Assumes that the upper and lower case - * alphabets and digits are each contiguous. - */ -unsigned long -strtoul(const char * __restrict nptr, char ** __restrict endptr, int base) -{ - const char *s; - unsigned long acc; - char c; - unsigned long cutoff; - int neg, any, cutlim; - - /* - * See strtol for comments as to the logic used. - */ - s = nptr; - do { - c = *s++; - } while (isspace((unsigned char)c)); - if (c == '-') { - neg = 1; - c = *s++; - } else { - neg = 0; - if (c == '+') - c = *s++; - } - if ((base == 0 || base == 16) && - c == '0' && (*s == 'x' || *s == 'X') && - ((s[1] >= '0' && s[1] <= '9') || - (s[1] >= 'A' && s[1] <= 'F') || - (s[1] >= 'a' && s[1] <= 'f'))) { - c = s[1]; - s += 2; - base = 16; - } - if (base == 0) - base = c == '0' ? 8 : 10; - acc = any = 0; - if (base < 2 || base > 36) - goto noconv; - - cutoff = ULONG_MAX / base; - cutlim = ULONG_MAX % base; - for ( ; ; c = *s++) { - if (c >= '0' && c <= '9') - c -= '0'; - else if (c >= 'A' && c <= 'Z') - c -= 'A' - 10; - else if (c >= 'a' && c <= 'z') - c -= 'a' - 10; - else - break; - if (c >= base) - break; - if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) - any = -1; - else { - any = 1; - acc *= base; - acc += c; - } - } - if (any < 0) { - acc = ULONG_MAX; - errno = ERANGE; - } else if (!any) { -noconv: - errno = EINVAL; - } else if (neg) - acc = -acc; - if (endptr != NULL) - *endptr = (char *)(any ? s - 1 : nptr); - return (acc); -} diff --git a/lib/libstand/tftp.c b/lib/libstand/tftp.c deleted file mode 100644 index 9bef4643d25f..000000000000 --- a/lib/libstand/tftp.c +++ /dev/null @@ -1,785 +0,0 @@ -/* $NetBSD: tftp.c,v 1.4 1997/09/17 16:57:07 drochner Exp $ */ - -/* - * Copyright (c) 1996 - * Matthias Drochner. 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 for the NetBSD Project - * by Matthias Drochner. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * Simple TFTP implementation for libsa. - * Assumes: - * - socket descriptor (int) at open_file->f_devdata - * - server host IP in global servip - * Restrictions: - * - read only - * - lseek only with SEEK_SET or SEEK_CUR - * - no big time differences between transfers (<tftp timeout) - */ - -#include <sys/types.h> -#include <sys/stat.h> -#include <netinet/in.h> -#include <netinet/udp.h> -#include <netinet/in_systm.h> -#include <arpa/tftp.h> - -#include <string.h> - -#include "stand.h" -#include "net.h" -#include "netif.h" - -#include "tftp.h" - -struct tftp_handle; - -static int tftp_open(const char *path, struct open_file *f); -static int tftp_close(struct open_file *f); -static int tftp_parse_oack(struct tftp_handle *h, char *buf, size_t len); -static int tftp_read(struct open_file *f, void *buf, size_t size, size_t *resid); -static int tftp_write(struct open_file *f, void *buf, size_t size, size_t *resid); -static off_t tftp_seek(struct open_file *f, off_t offset, int where); -static int tftp_set_blksize(struct tftp_handle *h, const char *str); -static int tftp_stat(struct open_file *f, struct stat *sb); -static ssize_t sendrecv_tftp(struct tftp_handle *h, - ssize_t (*sproc)(struct iodesc *, void *, size_t), - void *sbuf, size_t ssize, - ssize_t (*rproc)(struct tftp_handle *h, void **, void **, time_t, unsigned short *), - void **, void **, unsigned short *rtype); - -struct fs_ops tftp_fsops = { - "tftp", - tftp_open, - tftp_close, - tftp_read, - tftp_write, - tftp_seek, - tftp_stat, - null_readdir -}; - -extern struct in_addr servip; - -static int tftpport = 2000; -static int is_open = 0; - -/* - * The legacy TFTP_BLKSIZE value was SEGSIZE(512). - * TFTP_REQUESTED_BLKSIZE of 1428 is (Ethernet MTU, less the TFTP, UDP and - * IP header lengths). - */ -#define TFTP_REQUESTED_BLKSIZE 1428 - -/* - * Choose a blksize big enough so we can test with Ethernet - * Jumbo frames in the future. - */ -#define TFTP_MAX_BLKSIZE 9008 - -struct tftp_handle { - struct iodesc *iodesc; - int currblock; /* contents of lastdata */ - int islastblock; /* flag */ - int validsize; - int off; - char *path; /* saved for re-requests */ - unsigned int tftp_blksize; - unsigned long tftp_tsize; - void *pkt; - struct tftphdr *tftp_hdr; -}; - -#define TFTP_MAX_ERRCODE EOPTNEG -static const int tftperrors[TFTP_MAX_ERRCODE + 1] = { - 0, /* ??? */ - ENOENT, - EPERM, - ENOSPC, - EINVAL, /* ??? */ - EINVAL, /* ??? */ - EEXIST, - EINVAL, /* ??? */ - EINVAL, /* Option negotiation failed. */ -}; - -static int tftp_getnextblock(struct tftp_handle *h); - -/* send error message back. */ -static void -tftp_senderr(struct tftp_handle *h, u_short errcode, const char *msg) -{ - struct { - u_char header[HEADER_SIZE]; - struct tftphdr t; - u_char space[63]; /* +1 from t */ - } __packed __aligned(4) wbuf; - char *wtail; - int len; - - len = strlen(msg); - if (len > sizeof(wbuf.space)) - len = sizeof(wbuf.space); - - wbuf.t.th_opcode = htons((u_short) ERROR); - wbuf.t.th_code = htons(errcode); - - wtail = wbuf.t.th_msg; - bcopy(msg, wtail, len); - wtail[len] = '\0'; - wtail += len + 1; - - sendudp(h->iodesc, &wbuf.t, wtail - (char *) &wbuf.t); -} - -static void -tftp_sendack(struct tftp_handle *h) -{ - struct { - u_char header[HEADER_SIZE]; - struct tftphdr t; - } __packed __aligned(4) wbuf; - char *wtail; - - wbuf.t.th_opcode = htons((u_short) ACK); - wtail = (char *) &wbuf.t.th_block; - wbuf.t.th_block = htons((u_short) h->currblock); - wtail += 2; - - sendudp(h->iodesc, &wbuf.t, wtail - (char *) &wbuf.t); -} - -static ssize_t -recvtftp(struct tftp_handle *h, void **pkt, void **payload, time_t tleft, - unsigned short *rtype) -{ - struct iodesc *d = h->iodesc; - struct tftphdr *t; - void *ptr = NULL; - ssize_t len; - - errno = 0; - - len = readudp(d, &ptr, (void **)&t, tleft); - - if (len < 4) { - free(ptr); - return (-1); - } - - *rtype = ntohs(t->th_opcode); - switch (ntohs(t->th_opcode)) { - case DATA: { - int got; - - if (htons(t->th_block) != (u_short) d->xid) { - /* - * Expected block? - */ - free(ptr); - return (-1); - } - if (d->xid == 1) { - /* - * First data packet from new port. - */ - struct udphdr *uh; - uh = (struct udphdr *) t - 1; - d->destport = uh->uh_sport; - } /* else check uh_sport has not changed??? */ - got = len - (t->th_data - (char *)t); - *pkt = ptr; - *payload = t; - return (got); - } - case ERROR: - if ((unsigned) ntohs(t->th_code) > TFTP_MAX_ERRCODE) { - printf("illegal tftp error %d\n", ntohs(t->th_code)); - errno = EIO; - } else { -#ifdef TFTP_DEBUG - printf("tftp-error %d\n", ntohs(t->th_code)); -#endif - errno = tftperrors[ntohs(t->th_code)]; - } - free(ptr); - return (-1); - case OACK: { - struct udphdr *uh; - int tftp_oack_len; - - /* - * Unexpected OACK. TFTP transfer already in progress. - * Drop the pkt. - */ - if (d->xid != 1) { - free(ptr); - return (-1); - } - - /* - * Remember which port this OACK came from, because we need - * to send the ACK or errors back to it. - */ - uh = (struct udphdr *) t - 1; - d->destport = uh->uh_sport; - - /* Parse options ACK-ed by the server. */ - tftp_oack_len = len - sizeof(t->th_opcode); - if (tftp_parse_oack(h, t->th_u.tu_stuff, tftp_oack_len) != 0) { - tftp_senderr(h, EOPTNEG, "Malformed OACK"); - errno = EIO; - free(ptr); - return (-1); - } - *pkt = ptr; - *payload = t; - return (0); - } - default: -#ifdef TFTP_DEBUG - printf("tftp type %d not handled\n", ntohs(t->th_opcode)); -#endif - free(ptr); - return (-1); - } -} - -/* send request, expect first block (or error) */ -static int -tftp_makereq(struct tftp_handle *h) -{ - struct { - u_char header[HEADER_SIZE]; - struct tftphdr t; - u_char space[FNAME_SIZE + 6]; - } __packed __aligned(4) wbuf; - char *wtail; - int l; - ssize_t res; - void *pkt; - struct tftphdr *t; - char *tftp_blksize = NULL; - int blksize_l; - unsigned short rtype = 0; - - /* - * Allow overriding default TFTP block size by setting - * a tftp.blksize environment variable. - */ - if ((tftp_blksize = getenv("tftp.blksize")) != NULL) { - tftp_set_blksize(h, tftp_blksize); - } - - wbuf.t.th_opcode = htons((u_short) RRQ); - wtail = wbuf.t.th_stuff; - l = strlen(h->path); -#ifdef TFTP_PREPEND_PATH - if (l > FNAME_SIZE - (sizeof(TFTP_PREPEND_PATH) - 1)) - return (ENAMETOOLONG); - bcopy(TFTP_PREPEND_PATH, wtail, sizeof(TFTP_PREPEND_PATH) - 1); - wtail += sizeof(TFTP_PREPEND_PATH) - 1; -#else - if (l > FNAME_SIZE) - return (ENAMETOOLONG); -#endif - bcopy(h->path, wtail, l + 1); - wtail += l + 1; - bcopy("octet", wtail, 6); - wtail += 6; - bcopy("blksize", wtail, 8); - wtail += 8; - blksize_l = sprintf(wtail, "%d", h->tftp_blksize); - wtail += blksize_l + 1; - bcopy("tsize", wtail, 6); - wtail += 6; - bcopy("0", wtail, 2); - wtail += 2; - - /* h->iodesc->myport = htons(--tftpport); */ - h->iodesc->myport = htons(tftpport + (getsecs() & 0x3ff)); - h->iodesc->destport = htons(IPPORT_TFTP); - h->iodesc->xid = 1; /* expected block */ - - h->currblock = 0; - h->islastblock = 0; - h->validsize = 0; - - pkt = NULL; - res = sendrecv_tftp(h, &sendudp, &wbuf.t, wtail - (char *) &wbuf.t, - &recvtftp, &pkt, (void **)&t, &rtype); - if (res == -1) { - free(pkt); - return (errno); - } - - free(h->pkt); - h->pkt = pkt; - h->tftp_hdr = t; - - if (rtype == OACK) - return (tftp_getnextblock(h)); - - /* Server ignored our blksize request, revert to TFTP default. */ - h->tftp_blksize = SEGSIZE; - - switch (rtype) { - case DATA: { - h->currblock = 1; - h->validsize = res; - h->islastblock = 0; - if (res < h->tftp_blksize) { - h->islastblock = 1; /* very short file */ - tftp_sendack(h); - } - return (0); - } - case ERROR: - default: - return (errno); - } - -} - -/* ack block, expect next */ -static int -tftp_getnextblock(struct tftp_handle *h) -{ - struct { - u_char header[HEADER_SIZE]; - struct tftphdr t; - } __packed __aligned(4) wbuf; - char *wtail; - int res; - void *pkt; - struct tftphdr *t; - unsigned short rtype = 0; - wbuf.t.th_opcode = htons((u_short) ACK); - wtail = (char *) &wbuf.t.th_block; - wbuf.t.th_block = htons((u_short) h->currblock); - wtail += 2; - - h->iodesc->xid = h->currblock + 1; /* expected block */ - - pkt = NULL; - res = sendrecv_tftp(h, &sendudp, &wbuf.t, wtail - (char *) &wbuf.t, - &recvtftp, &pkt, (void **)&t, &rtype); - - if (res == -1) { /* 0 is OK! */ - free(pkt); - return (errno); - } - - free(h->pkt); - h->pkt = pkt; - h->tftp_hdr = t; - h->currblock++; - h->validsize = res; - if (res < h->tftp_blksize) - h->islastblock = 1; /* EOF */ - - if (h->islastblock == 1) { - /* Send an ACK for the last block */ - wbuf.t.th_block = htons((u_short) h->currblock); - sendudp(h->iodesc, &wbuf.t, wtail - (char *)&wbuf.t); - } - - return (0); -} - -static int -tftp_open(const char *path, struct open_file *f) -{ - struct tftp_handle *tftpfile; - struct iodesc *io; - int res; - size_t pathsize; - const char *extraslash; - - if (netproto != NET_TFTP) - return (EINVAL); - - if (f->f_dev->dv_type != DEVT_NET) - return (EINVAL); - - if (is_open) - return (EBUSY); - - tftpfile = (struct tftp_handle *) malloc(sizeof(*tftpfile)); - if (!tftpfile) - return (ENOMEM); - - memset(tftpfile, 0, sizeof(*tftpfile)); - tftpfile->tftp_blksize = TFTP_REQUESTED_BLKSIZE; - tftpfile->iodesc = io = socktodesc(*(int *) (f->f_devdata)); - if (io == NULL) - return (EINVAL); - - io->destip = servip; - tftpfile->off = 0; - pathsize = (strlen(rootpath) + 1 + strlen(path) + 1) * sizeof(char); - tftpfile->path = malloc(pathsize); - if (tftpfile->path == NULL) { - free(tftpfile); - return(ENOMEM); - } - if (rootpath[strlen(rootpath) - 1] == '/' || path[0] == '/') - extraslash = ""; - else - extraslash = "/"; - res = snprintf(tftpfile->path, pathsize, "%s%s%s", - rootpath, extraslash, path); - if (res < 0 || res > pathsize) { - free(tftpfile->path); - free(tftpfile); - return(ENOMEM); - } - - res = tftp_makereq(tftpfile); - - if (res) { - free(tftpfile->path); - free(tftpfile->pkt); - free(tftpfile); - return (res); - } - f->f_fsdata = (void *) tftpfile; - is_open = 1; - return (0); -} - -static int -tftp_read(struct open_file *f, void *addr, size_t size, - size_t *resid /* out */) -{ - struct tftp_handle *tftpfile; - tftpfile = (struct tftp_handle *) f->f_fsdata; - - while (size > 0) { - int needblock, count; - - twiddle(32); - - needblock = tftpfile->off / tftpfile->tftp_blksize + 1; - - if (tftpfile->currblock > needblock) { /* seek backwards */ - tftp_senderr(tftpfile, 0, "No error: read aborted"); - tftp_makereq(tftpfile); /* no error check, it worked - * for open */ - } - - while (tftpfile->currblock < needblock) { - int res; - - res = tftp_getnextblock(tftpfile); - if (res) { /* no answer */ -#ifdef TFTP_DEBUG - printf("tftp: read error\n"); -#endif - return (res); - } - if (tftpfile->islastblock) - break; - } - - if (tftpfile->currblock == needblock) { - int offinblock, inbuffer; - - offinblock = tftpfile->off % tftpfile->tftp_blksize; - - inbuffer = tftpfile->validsize - offinblock; - if (inbuffer < 0) { -#ifdef TFTP_DEBUG - printf("tftp: invalid offset %d\n", - tftpfile->off); -#endif - return (EINVAL); - } - count = (size < inbuffer ? size : inbuffer); - bcopy(tftpfile->tftp_hdr->th_data + offinblock, - addr, count); - - addr = (char *)addr + count; - tftpfile->off += count; - size -= count; - - if ((tftpfile->islastblock) && (count == inbuffer)) - break; /* EOF */ - } else { -#ifdef TFTP_DEBUG - printf("tftp: block %d not found\n", needblock); -#endif - return (EINVAL); - } - - } - - if (resid) - *resid = size; - return (0); -} - -static int -tftp_close(struct open_file *f) -{ - struct tftp_handle *tftpfile; - tftpfile = (struct tftp_handle *) f->f_fsdata; - - /* let it time out ... */ - - if (tftpfile) { - free(tftpfile->path); - free(tftpfile->pkt); - free(tftpfile); - } - is_open = 0; - return (0); -} - -static int -tftp_write(struct open_file *f __unused, void *start __unused, size_t size __unused, - size_t *resid __unused /* out */) -{ - return (EROFS); -} - -static int -tftp_stat(struct open_file *f, struct stat *sb) -{ - struct tftp_handle *tftpfile; - tftpfile = (struct tftp_handle *) f->f_fsdata; - - sb->st_mode = 0444 | S_IFREG; - sb->st_nlink = 1; - sb->st_uid = 0; - sb->st_gid = 0; - sb->st_size = (off_t) tftpfile->tftp_tsize; - return (0); -} - -static off_t -tftp_seek(struct open_file *f, off_t offset, int where) -{ - struct tftp_handle *tftpfile; - tftpfile = (struct tftp_handle *) f->f_fsdata; - - switch (where) { - case SEEK_SET: - tftpfile->off = offset; - break; - case SEEK_CUR: - tftpfile->off += offset; - break; - default: - errno = EOFFSET; - return (-1); - } - return (tftpfile->off); -} - -static ssize_t -sendrecv_tftp(struct tftp_handle *h, - ssize_t (*sproc)(struct iodesc *, void *, size_t), - void *sbuf, size_t ssize, - ssize_t (*rproc)(struct tftp_handle *, void **, void **, time_t, - unsigned short *), - void **pkt, void **payload, unsigned short *rtype) -{ - struct iodesc *d = h->iodesc; - ssize_t cc; - time_t t, t1, tleft; - -#ifdef TFTP_DEBUG - if (debug) - printf("sendrecv: called\n"); -#endif - - tleft = MINTMO; - t = t1 = getsecs(); - for (;;) { - if ((getsecs() - t) > MAXTMO) { - errno = ETIMEDOUT; - return -1; - } - - cc = (*sproc)(d, sbuf, ssize); - if (cc != -1 && cc < ssize) - panic("sendrecv: short write! (%zd < %zu)", - cc, ssize); - - if (cc == -1) { - /* Error on transmit; wait before retrying */ - while ((getsecs() - t1) < tleft); - continue; - } - -recvnext: - /* Try to get a packet and process it. */ - cc = (*rproc)(h, pkt, payload, tleft, rtype); - /* Return on data, EOF or real error. */ - if (cc != -1 || errno != 0) - return (cc); - if ((getsecs() - t1) < tleft) { - goto recvnext; - } - - /* Timed out or didn't get the packet we're waiting for */ - tleft += MINTMO; - if (tleft > (2 * MINTMO)) { - tleft = (2 * MINTMO); - } - t1 = getsecs(); - } -} - -static int -tftp_set_blksize(struct tftp_handle *h, const char *str) -{ - char *endptr; - int new_blksize; - int ret = 0; - - if (h == NULL || str == NULL) - return (ret); - - new_blksize = - (unsigned int)strtol(str, &endptr, 0); - - /* - * Only accept blksize value if it is numeric. - * RFC2348 specifies that acceptable values are 8-65464. - * Let's choose a limit less than MAXRSPACE. - */ - if (*endptr == '\0' && new_blksize >= 8 - && new_blksize <= TFTP_MAX_BLKSIZE) { - h->tftp_blksize = new_blksize; - ret = 1; - } - - return (ret); -} - -/* - * In RFC2347, the TFTP Option Acknowledgement package (OACK) - * is used to acknowledge a client's option negotiation request. - * The format of an OACK packet is: - * +-------+---~~---+---+---~~---+---+---~~---+---+---~~---+---+ - * | opc | opt1 | 0 | value1 | 0 | optN | 0 | valueN | 0 | - * +-------+---~~---+---+---~~---+---+---~~---+---+---~~---+---+ - * - * opc - * The opcode field contains a 6, for Option Acknowledgment. - * - * opt1 - * The first option acknowledgment, copied from the original - * request. - * - * value1 - * The acknowledged value associated with the first option. If - * and how this value may differ from the original request is - * detailed in the specification for the option. - * - * optN, valueN - * The final option/value acknowledgment pair. - */ -static int -tftp_parse_oack(struct tftp_handle *h, char *buf, size_t len) -{ - /* - * We parse the OACK strings into an array - * of name-value pairs. - */ - char *tftp_options[128] = { 0 }; - char *val = buf; - int i = 0; - int option_idx = 0; - int blksize_is_set = 0; - int tsize = 0; - - unsigned int orig_blksize; - - while (option_idx < 128 && i < len) { - if (buf[i] == '\0') { - if (&buf[i] > val) { - tftp_options[option_idx] = val; - val = &buf[i] + 1; - ++option_idx; - } - } - ++i; - } - - /* Save the block size we requested for sanity check later. */ - orig_blksize = h->tftp_blksize; - - /* - * Parse individual TFTP options. - * * "blksize" is specified in RFC2348. - * * "tsize" is specified in RFC2349. - */ - for (i = 0; i < option_idx; i += 2) { - if (strcasecmp(tftp_options[i], "blksize") == 0) { - if (i + 1 < option_idx) - blksize_is_set = - tftp_set_blksize(h, tftp_options[i + 1]); - } else if (strcasecmp(tftp_options[i], "tsize") == 0) { - if (i + 1 < option_idx) - tsize = strtol(tftp_options[i + 1], (char **)NULL, 10); - if (tsize != 0) - h->tftp_tsize = tsize; - } else { - /* Do not allow any options we did not expect to be ACKed. */ - printf("unexpected tftp option '%s'\n", tftp_options[i]); - return (-1); - } - } - - if (!blksize_is_set) { - /* - * If TFTP blksize was not set, try defaulting - * to the legacy TFTP blksize of SEGSIZE(512) - */ - h->tftp_blksize = SEGSIZE; - } else if (h->tftp_blksize > orig_blksize) { - /* - * Server should not be proposing block sizes that - * exceed what we said we can handle. - */ - printf("unexpected blksize %u\n", h->tftp_blksize); - return (-1); - } - -#ifdef TFTP_DEBUG - printf("tftp_blksize: %u\n", h->tftp_blksize); - printf("tftp_tsize: %lu\n", h->tftp_tsize); -#endif - return 0; -} diff --git a/lib/libstand/tftp.h b/lib/libstand/tftp.h deleted file mode 100644 index cbbbbd782129..000000000000 --- a/lib/libstand/tftp.h +++ /dev/null @@ -1,36 +0,0 @@ -/* $NetBSD: tftp.h,v 1.1.1.1 1997/03/14 02:40:31 perry Exp $ */ - -/* - * Copyright (c) 1996 - * Matthias Drochner. 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 for the NetBSD Project - * by Matthias Drochner. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - * - */ - - -#define IPPORT_TFTP 69 diff --git a/lib/libstand/twiddle.c b/lib/libstand/twiddle.c deleted file mode 100644 index 96ebbbec43c0..000000000000 --- a/lib/libstand/twiddle.c +++ /dev/null @@ -1,69 +0,0 @@ -/*- - * Copyright (c) 1986, 1988, 1991, 1993 - * The Regents of the University of California. All rights reserved. - * (c) UNIX System Laboratories, Inc. - * All or some portions of this file are derived from material licensed - * to the University of California by American Telephone and Telegraph - * Co. or Unix System Laboratories, Inc. and are reproduced herein with - * the permission of UNIX System Laboratories, Inc. - * - * 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. - * 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. - * - * @(#)subr_prf.c 8.3 (Berkeley) 1/21/94 - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/types.h> -#include "stand.h" - -/* Extra functions from NetBSD standalone printf.c */ - -static u_int globaldiv; - -void -twiddle(u_int callerdiv) -{ - static u_int callercnt, globalcnt, pos; - - callercnt++; - if (callerdiv > 1 && (callercnt % callerdiv) != 0) - return; - - globalcnt++; - if (globaldiv > 1 && (globalcnt % globaldiv) != 0) - return; - - putchar("|/-\\"[pos++ & 3]); - putchar('\b'); -} - -void -twiddle_divisor(u_int gdiv) -{ - - globaldiv = gdiv; -} diff --git a/lib/libstand/udp.c b/lib/libstand/udp.c deleted file mode 100644 index 8e52f29e2962..000000000000 --- a/lib/libstand/udp.c +++ /dev/null @@ -1,180 +0,0 @@ -/* Taken from $NetBSD: net.c,v 1.20 1997/12/26 22:41:30 scottr Exp $ */ - -/* - * Copyright (c) 1992 Regents of the University of California. - * All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * 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. - * 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. - * - * @(#) Header: net.c,v 1.9 93/08/06 19:32:15 leres Exp (LBL) - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/socket.h> - -#include <string.h> - -#include <net/if.h> -#include <netinet/in.h> -#include <netinet/if_ether.h> -#include <netinet/in_systm.h> - -#include <netinet/in_pcb.h> -#include <netinet/ip.h> -#include <netinet/ip_var.h> -#include <netinet/udp.h> -#include <netinet/udp_var.h> - -#include "stand.h" -#include "net.h" - -/* Caller must leave room for ethernet, ip and udp headers in front!! */ -ssize_t -sendudp(struct iodesc *d, void *pkt, size_t len) -{ - ssize_t cc; - struct udpiphdr *ui; - struct udphdr *uh; - -#ifdef NET_DEBUG - if (debug) { - printf("sendudp: d=%lx called.\n", (long)d); - if (d) { - printf("saddr: %s:%d", - inet_ntoa(d->myip), ntohs(d->myport)); - printf(" daddr: %s:%d\n", - inet_ntoa(d->destip), ntohs(d->destport)); - } - } -#endif - - ui = (struct udpiphdr *)pkt - 1; - bzero(ui, sizeof(*ui)); - - uh = (struct udphdr *)pkt - 1; - len += sizeof(*uh); - - uh->uh_sport = d->myport; - uh->uh_dport = d->destport; - uh->uh_ulen = htons(len); - - ui->ui_pr = IPPROTO_UDP; - ui->ui_len = uh->uh_ulen; - ui->ui_src = d->myip; - ui->ui_dst = d->destip; - -#ifndef UDP_NO_CKSUM - uh->uh_sum = in_cksum(ui, len + sizeof (struct ip)); -#endif - - cc = sendip(d, uh, len, IPPROTO_UDP); - if (cc == -1) - return (-1); - if (cc != len) - panic("sendudp: bad write (%zd != %zd)", cc, len); - return (cc - sizeof(*uh)); -} - -/* - * Receive a UDP packet and validate it is for us. - */ -ssize_t -readudp(struct iodesc *d, void **pkt, void **payload, time_t tleft) -{ - ssize_t n; - struct udphdr *uh; - void *ptr; - -#ifdef NET_DEBUG - if (debug) - printf("readudp: called\n"); -#endif - - uh = NULL; - ptr = NULL; - n = readip(d, &ptr, (void **)&uh, tleft, IPPROTO_UDP); - if (n == -1 || n < sizeof(*uh) || n != ntohs(uh->uh_ulen)) { - free(ptr); - return (-1); - } - - if (uh->uh_dport != d->myport) { -#ifdef NET_DEBUG - if (debug) - printf("readudp: bad dport %d != %d\n", - d->myport, ntohs(uh->uh_dport)); -#endif - free(ptr); - return (-1); - } - -#ifndef UDP_NO_CKSUM - if (uh->uh_sum) { - struct udpiphdr *ui; - struct ip *ip; - struct ip tip; - - n = ntohs(uh->uh_ulen) + sizeof(*ip); - - /* Check checksum (must save and restore ip header) */ - ip = (struct ip *)uh - 1; - tip = *ip; - ui = (struct udpiphdr *)ip; - bzero(&ui->ui_x1, sizeof(ui->ui_x1)); - ui->ui_len = uh->uh_ulen; - if (in_cksum(ui, n) != 0) { -#ifdef NET_DEBUG - if (debug) - printf("readudp: bad cksum\n"); -#endif - free(ptr); - return (-1); - } - *ip = tip; - } -#endif - if (ntohs(uh->uh_ulen) < sizeof(*uh)) { -#ifdef NET_DEBUG - if (debug) - printf("readudp: bad udp len %d < %d\n", - ntohs(uh->uh_ulen), (int)sizeof(*uh)); -#endif - free(ptr); - return (-1); - } - - n = (n > (ntohs(uh->uh_ulen) - sizeof(*uh))) ? - ntohs(uh->uh_ulen) - sizeof(*uh) : n; - *pkt = ptr; - *payload = (void *)((uintptr_t)uh + sizeof(*uh)); - return (n); -} diff --git a/lib/libstand/ufs.c b/lib/libstand/ufs.c deleted file mode 100644 index 928a1d1d2a86..000000000000 --- a/lib/libstand/ufs.c +++ /dev/null @@ -1,861 +0,0 @@ -/* $NetBSD: ufs.c,v 1.20 1998/03/01 07:15:39 ross Exp $ */ - -/*- - * Copyright (c) 2002 Networks Associates Technology, Inc. - * All rights reserved. - * - * This software was developed for the FreeBSD Project by Marshall - * Kirk McKusick and Network Associates Laboratories, the Security - * Research Division of Network Associates, Inc. under DARPA/SPAWAR - * contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA CHATS - * research program - * - * Copyright (c) 1982, 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * The Mach Operating System project at Carnegie-Mellon University. - * - * 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. - * 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. - * - * - * Copyright (c) 1990, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Author: David Golub - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * Stand-alone file reading package. - */ - -#include <sys/param.h> -#include <sys/disklabel.h> -#include <sys/time.h> -#include <ufs/ufs/dinode.h> -#include <ufs/ufs/dir.h> -#include <ufs/ffs/fs.h> -#include "stand.h" -#include "string.h" - -static int ufs_open(const char *path, struct open_file *f); -static int ufs_write(struct open_file *f, void *buf, size_t size, size_t *resid); -static int ufs_close(struct open_file *f); -static int ufs_read(struct open_file *f, void *buf, size_t size, size_t *resid); -static off_t ufs_seek(struct open_file *f, off_t offset, int where); -static int ufs_stat(struct open_file *f, struct stat *sb); -static int ufs_readdir(struct open_file *f, struct dirent *d); - -struct fs_ops ufs_fsops = { - "ufs", - ufs_open, - ufs_close, - ufs_read, - ufs_write, - ufs_seek, - ufs_stat, - ufs_readdir -}; - -/* - * In-core open file. - */ -struct file { - off_t f_seekp; /* seek pointer */ - struct fs *f_fs; /* pointer to super-block */ - union dinode { - struct ufs1_dinode di1; - struct ufs2_dinode di2; - } f_di; /* copy of on-disk inode */ - int f_nindir[NIADDR]; - /* number of blocks mapped by - indirect block at level i */ - char *f_blk[NIADDR]; /* buffer for indirect block at - level i */ - size_t f_blksize[NIADDR]; - /* size of buffer */ - ufs2_daddr_t f_blkno[NIADDR];/* disk address of block in buffer */ - ufs2_daddr_t f_buf_blkno; /* block number of data block */ - char *f_buf; /* buffer for data block */ - size_t f_buf_size; /* size of data block */ -}; -#define DIP(fp, field) \ - ((fp)->f_fs->fs_magic == FS_UFS1_MAGIC ? \ - (fp)->f_di.di1.field : (fp)->f_di.di2.field) - -static int read_inode(ino_t, struct open_file *); -static int block_map(struct open_file *, ufs2_daddr_t, ufs2_daddr_t *); -static int buf_read_file(struct open_file *, char **, size_t *); -static int buf_write_file(struct open_file *, char *, size_t *); -static int search_directory(char *, struct open_file *, ino_t *); - -/* - * Read a new inode into a file structure. - */ -static int -read_inode(inumber, f) - ino_t inumber; - struct open_file *f; -{ - struct file *fp = (struct file *)f->f_fsdata; - struct fs *fs = fp->f_fs; - char *buf; - size_t rsize; - int rc; - - if (fs == NULL) - panic("fs == NULL"); - - /* - * Read inode and save it. - */ - buf = malloc(fs->fs_bsize); - twiddle(1); - rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, - fsbtodb(fs, ino_to_fsba(fs, inumber)), fs->fs_bsize, - buf, &rsize); - if (rc) - goto out; - if (rsize != fs->fs_bsize) { - rc = EIO; - goto out; - } - - if (fp->f_fs->fs_magic == FS_UFS1_MAGIC) - fp->f_di.di1 = ((struct ufs1_dinode *)buf) - [ino_to_fsbo(fs, inumber)]; - else - fp->f_di.di2 = ((struct ufs2_dinode *)buf) - [ino_to_fsbo(fs, inumber)]; - - /* - * Clear out the old buffers - */ - { - int level; - - for (level = 0; level < NIADDR; level++) - fp->f_blkno[level] = -1; - fp->f_buf_blkno = -1; - } - fp->f_seekp = 0; -out: - free(buf); - return (rc); -} - -/* - * Given an offset in a file, find the disk block number that - * contains that block. - */ -static int -block_map(f, file_block, disk_block_p) - struct open_file *f; - ufs2_daddr_t file_block; - ufs2_daddr_t *disk_block_p; /* out */ -{ - struct file *fp = (struct file *)f->f_fsdata; - struct fs *fs = fp->f_fs; - int level; - int idx; - ufs2_daddr_t ind_block_num; - int rc; - - /* - * Index structure of an inode: - * - * di_db[0..NDADDR-1] hold block numbers for blocks - * 0..NDADDR-1 - * - * di_ib[0] index block 0 is the single indirect block - * holds block numbers for blocks - * NDADDR .. NDADDR + NINDIR(fs)-1 - * - * di_ib[1] index block 1 is the double indirect block - * holds block numbers for INDEX blocks for blocks - * NDADDR + NINDIR(fs) .. - * NDADDR + NINDIR(fs) + NINDIR(fs)**2 - 1 - * - * di_ib[2] index block 2 is the triple indirect block - * holds block numbers for double-indirect - * blocks for blocks - * NDADDR + NINDIR(fs) + NINDIR(fs)**2 .. - * NDADDR + NINDIR(fs) + NINDIR(fs)**2 - * + NINDIR(fs)**3 - 1 - */ - - if (file_block < NDADDR) { - /* Direct block. */ - *disk_block_p = DIP(fp, di_db[file_block]); - return (0); - } - - file_block -= NDADDR; - - /* - * nindir[0] = NINDIR - * nindir[1] = NINDIR**2 - * nindir[2] = NINDIR**3 - * etc - */ - for (level = 0; level < NIADDR; level++) { - if (file_block < fp->f_nindir[level]) - break; - file_block -= fp->f_nindir[level]; - } - if (level == NIADDR) { - /* Block number too high */ - return (EFBIG); - } - - ind_block_num = DIP(fp, di_ib[level]); - - for (; level >= 0; level--) { - if (ind_block_num == 0) { - *disk_block_p = 0; /* missing */ - return (0); - } - - if (fp->f_blkno[level] != ind_block_num) { - if (fp->f_blk[level] == (char *)0) - fp->f_blk[level] = - malloc(fs->fs_bsize); - twiddle(1); - rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, - fsbtodb(fp->f_fs, ind_block_num), - fs->fs_bsize, - fp->f_blk[level], - &fp->f_blksize[level]); - if (rc) - return (rc); - if (fp->f_blksize[level] != fs->fs_bsize) - return (EIO); - fp->f_blkno[level] = ind_block_num; - } - - if (level > 0) { - idx = file_block / fp->f_nindir[level - 1]; - file_block %= fp->f_nindir[level - 1]; - } else - idx = file_block; - - if (fp->f_fs->fs_magic == FS_UFS1_MAGIC) - ind_block_num = ((ufs1_daddr_t *)fp->f_blk[level])[idx]; - else - ind_block_num = ((ufs2_daddr_t *)fp->f_blk[level])[idx]; - } - - *disk_block_p = ind_block_num; - - return (0); -} - -/* - * Write a portion of a file from an internal buffer. - */ -static int -buf_write_file(f, buf_p, size_p) - struct open_file *f; - char *buf_p; - size_t *size_p; /* out */ -{ - struct file *fp = (struct file *)f->f_fsdata; - struct fs *fs = fp->f_fs; - long off; - ufs_lbn_t file_block; - ufs2_daddr_t disk_block; - size_t block_size; - int rc; - - /* - * Calculate the starting block address and offset. - */ - off = blkoff(fs, fp->f_seekp); - file_block = lblkno(fs, fp->f_seekp); - block_size = sblksize(fs, DIP(fp, di_size), file_block); - - rc = block_map(f, file_block, &disk_block); - if (rc) - return (rc); - - if (disk_block == 0) - /* Because we can't allocate space on the drive */ - return (EFBIG); - - /* - * Truncate buffer at end of file, and at the end of - * this block. - */ - if (*size_p > DIP(fp, di_size) - fp->f_seekp) - *size_p = DIP(fp, di_size) - fp->f_seekp; - if (*size_p > block_size - off) - *size_p = block_size - off; - - /* - * If we don't entirely occlude the block and it's not - * in memory already, read it in first. - */ - if (((off > 0) || (*size_p + off < block_size)) && - (file_block != fp->f_buf_blkno)) { - - if (fp->f_buf == (char *)0) - fp->f_buf = malloc(fs->fs_bsize); - - twiddle(4); - rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, - fsbtodb(fs, disk_block), - block_size, fp->f_buf, &fp->f_buf_size); - if (rc) - return (rc); - - fp->f_buf_blkno = file_block; - } - - /* - * Copy the user data into the cached block. - */ - bcopy(buf_p, fp->f_buf + off, *size_p); - - /* - * Write the block out to storage. - */ - - twiddle(4); - rc = (f->f_dev->dv_strategy)(f->f_devdata, F_WRITE, - fsbtodb(fs, disk_block), - block_size, fp->f_buf, &fp->f_buf_size); - return (rc); -} - -/* - * Read a portion of a file into an internal buffer. Return - * the location in the buffer and the amount in the buffer. - */ -static int -buf_read_file(f, buf_p, size_p) - struct open_file *f; - char **buf_p; /* out */ - size_t *size_p; /* out */ -{ - struct file *fp = (struct file *)f->f_fsdata; - struct fs *fs = fp->f_fs; - long off; - ufs_lbn_t file_block; - ufs2_daddr_t disk_block; - size_t block_size; - int rc; - - off = blkoff(fs, fp->f_seekp); - file_block = lblkno(fs, fp->f_seekp); - block_size = sblksize(fs, DIP(fp, di_size), file_block); - - if (file_block != fp->f_buf_blkno) { - if (fp->f_buf == (char *)0) - fp->f_buf = malloc(fs->fs_bsize); - - rc = block_map(f, file_block, &disk_block); - if (rc) - return (rc); - - if (disk_block == 0) { - bzero(fp->f_buf, block_size); - fp->f_buf_size = block_size; - } else { - twiddle(4); - rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, - fsbtodb(fs, disk_block), - block_size, fp->f_buf, &fp->f_buf_size); - if (rc) - return (rc); - } - - fp->f_buf_blkno = file_block; - } - - /* - * Return address of byte in buffer corresponding to - * offset, and size of remainder of buffer after that - * byte. - */ - *buf_p = fp->f_buf + off; - *size_p = block_size - off; - - /* - * But truncate buffer at end of file. - */ - if (*size_p > DIP(fp, di_size) - fp->f_seekp) - *size_p = DIP(fp, di_size) - fp->f_seekp; - - return (0); -} - -/* - * Search a directory for a name and return its - * i_number. - */ -static int -search_directory(name, f, inumber_p) - char *name; - struct open_file *f; - ino_t *inumber_p; /* out */ -{ - struct file *fp = (struct file *)f->f_fsdata; - struct direct *dp; - struct direct *edp; - char *buf; - size_t buf_size; - int namlen, length; - int rc; - - length = strlen(name); - - fp->f_seekp = 0; - while (fp->f_seekp < DIP(fp, di_size)) { - rc = buf_read_file(f, &buf, &buf_size); - if (rc) - return (rc); - - dp = (struct direct *)buf; - edp = (struct direct *)(buf + buf_size); - while (dp < edp) { - if (dp->d_ino == (ino_t)0) - goto next; -#if BYTE_ORDER == LITTLE_ENDIAN - if (fp->f_fs->fs_maxsymlinklen <= 0) - namlen = dp->d_type; - else -#endif - namlen = dp->d_namlen; - if (namlen == length && - !strcmp(name, dp->d_name)) { - /* found entry */ - *inumber_p = dp->d_ino; - return (0); - } - next: - dp = (struct direct *)((char *)dp + dp->d_reclen); - } - fp->f_seekp += buf_size; - } - return (ENOENT); -} - -static int sblock_try[] = SBLOCKSEARCH; - -/* - * Open a file. - */ -static int -ufs_open(upath, f) - const char *upath; - struct open_file *f; -{ - char *cp, *ncp; - int c; - ino_t inumber, parent_inumber; - struct file *fp; - struct fs *fs; - int i, rc; - size_t buf_size; - int nlinks = 0; - char namebuf[MAXPATHLEN+1]; - char *buf = NULL; - char *path = NULL; - - /* allocate file system specific data structure */ - fp = malloc(sizeof(struct file)); - bzero(fp, sizeof(struct file)); - f->f_fsdata = (void *)fp; - - /* allocate space and read super block */ - fs = malloc(SBLOCKSIZE); - fp->f_fs = fs; - twiddle(1); - /* - * Try reading the superblock in each of its possible locations. - */ - for (i = 0; sblock_try[i] != -1; i++) { - rc = (f->f_dev->dv_strategy)(f->f_devdata, F_READ, - sblock_try[i] / DEV_BSIZE, SBLOCKSIZE, - (char *)fs, &buf_size); - if (rc) - goto out; - if ((fs->fs_magic == FS_UFS1_MAGIC || - (fs->fs_magic == FS_UFS2_MAGIC && - fs->fs_sblockloc == sblock_try[i])) && - buf_size == SBLOCKSIZE && - fs->fs_bsize <= MAXBSIZE && - fs->fs_bsize >= sizeof(struct fs)) - break; - } - if (sblock_try[i] == -1) { - rc = EINVAL; - goto out; - } - /* - * Calculate indirect block levels. - */ - { - ufs2_daddr_t mult; - int level; - - mult = 1; - for (level = 0; level < NIADDR; level++) { - mult *= NINDIR(fs); - fp->f_nindir[level] = mult; - } - } - - inumber = ROOTINO; - if ((rc = read_inode(inumber, f)) != 0) - goto out; - - cp = path = strdup(upath); - if (path == NULL) { - rc = ENOMEM; - goto out; - } - while (*cp) { - - /* - * Remove extra separators - */ - while (*cp == '/') - cp++; - if (*cp == '\0') - break; - - /* - * Check that current node is a directory. - */ - if ((DIP(fp, di_mode) & IFMT) != IFDIR) { - rc = ENOTDIR; - goto out; - } - - /* - * Get next component of path name. - */ - { - int len = 0; - - ncp = cp; - while ((c = *cp) != '\0' && c != '/') { - if (++len > MAXNAMLEN) { - rc = ENOENT; - goto out; - } - cp++; - } - *cp = '\0'; - } - - /* - * Look up component in current directory. - * Save directory inumber in case we find a - * symbolic link. - */ - parent_inumber = inumber; - rc = search_directory(ncp, f, &inumber); - *cp = c; - if (rc) - goto out; - - /* - * Open next component. - */ - if ((rc = read_inode(inumber, f)) != 0) - goto out; - - /* - * Check for symbolic link. - */ - if ((DIP(fp, di_mode) & IFMT) == IFLNK) { - int link_len = DIP(fp, di_size); - int len; - - len = strlen(cp); - - if (link_len + len > MAXPATHLEN || - ++nlinks > MAXSYMLINKS) { - rc = ENOENT; - goto out; - } - - bcopy(cp, &namebuf[link_len], len + 1); - - if (link_len < fs->fs_maxsymlinklen) { - if (fp->f_fs->fs_magic == FS_UFS1_MAGIC) - cp = (caddr_t)(fp->f_di.di1.di_db); - else - cp = (caddr_t)(fp->f_di.di2.di_db); - bcopy(cp, namebuf, (unsigned) link_len); - } else { - /* - * Read file for symbolic link - */ - size_t buf_size; - ufs2_daddr_t disk_block; - struct fs *fs = fp->f_fs; - - if (!buf) - buf = malloc(fs->fs_bsize); - rc = block_map(f, (ufs2_daddr_t)0, &disk_block); - if (rc) - goto out; - - twiddle(1); - rc = (f->f_dev->dv_strategy)(f->f_devdata, - F_READ, fsbtodb(fs, disk_block), - fs->fs_bsize, buf, &buf_size); - if (rc) - goto out; - - bcopy((char *)buf, namebuf, (unsigned)link_len); - } - - /* - * If relative pathname, restart at parent directory. - * If absolute pathname, restart at root. - */ - cp = namebuf; - if (*cp != '/') - inumber = parent_inumber; - else - inumber = (ino_t)ROOTINO; - - if ((rc = read_inode(inumber, f)) != 0) - goto out; - } - } - - /* - * Found terminal component. - */ - rc = 0; - fp->f_seekp = 0; -out: - if (buf) - free(buf); - if (path) - free(path); - if (rc) { - if (fp->f_buf) - free(fp->f_buf); - free(fp->f_fs); - free(fp); - } - return (rc); -} - -static int -ufs_close(f) - struct open_file *f; -{ - struct file *fp = (struct file *)f->f_fsdata; - int level; - - f->f_fsdata = (void *)0; - if (fp == (struct file *)0) - return (0); - - for (level = 0; level < NIADDR; level++) { - if (fp->f_blk[level]) - free(fp->f_blk[level]); - } - if (fp->f_buf) - free(fp->f_buf); - free(fp->f_fs); - free(fp); - return (0); -} - -/* - * Copy a portion of a file into kernel memory. - * Cross block boundaries when necessary. - */ -static int -ufs_read(f, start, size, resid) - struct open_file *f; - void *start; - size_t size; - size_t *resid; /* out */ -{ - struct file *fp = (struct file *)f->f_fsdata; - size_t csize; - char *buf; - size_t buf_size; - int rc = 0; - char *addr = start; - - while (size != 0) { - if (fp->f_seekp >= DIP(fp, di_size)) - break; - - rc = buf_read_file(f, &buf, &buf_size); - if (rc) - break; - - csize = size; - if (csize > buf_size) - csize = buf_size; - - bcopy(buf, addr, csize); - - fp->f_seekp += csize; - addr += csize; - size -= csize; - } - if (resid) - *resid = size; - return (rc); -} - -/* - * Write to a portion of an already allocated file. - * Cross block boundaries when necessary. Can not - * extend the file. - */ -static int -ufs_write(f, start, size, resid) - struct open_file *f; - void *start; - size_t size; - size_t *resid; /* out */ -{ - struct file *fp = (struct file *)f->f_fsdata; - size_t csize; - int rc = 0; - char *addr = start; - - csize = size; - while ((size != 0) && (csize != 0)) { - if (fp->f_seekp >= DIP(fp, di_size)) - break; - - if (csize >= 512) csize = 512; /* XXX */ - - rc = buf_write_file(f, addr, &csize); - if (rc) - break; - - fp->f_seekp += csize; - addr += csize; - size -= csize; - } - if (resid) - *resid = size; - return (rc); -} - -static off_t -ufs_seek(f, offset, where) - struct open_file *f; - off_t offset; - int where; -{ - struct file *fp = (struct file *)f->f_fsdata; - - switch (where) { - case SEEK_SET: - fp->f_seekp = offset; - break; - case SEEK_CUR: - fp->f_seekp += offset; - break; - case SEEK_END: - fp->f_seekp = DIP(fp, di_size) - offset; - break; - default: - errno = EINVAL; - return (-1); - } - return (fp->f_seekp); -} - -static int -ufs_stat(f, sb) - struct open_file *f; - struct stat *sb; -{ - struct file *fp = (struct file *)f->f_fsdata; - - /* only important stuff */ - sb->st_mode = DIP(fp, di_mode); - sb->st_uid = DIP(fp, di_uid); - sb->st_gid = DIP(fp, di_gid); - sb->st_size = DIP(fp, di_size); - return (0); -} - -static int -ufs_readdir(struct open_file *f, struct dirent *d) -{ - struct file *fp = (struct file *)f->f_fsdata; - struct direct *dp; - char *buf; - size_t buf_size; - int error; - - /* - * assume that a directory entry will not be split across blocks - */ -again: - if (fp->f_seekp >= DIP(fp, di_size)) - return (ENOENT); - error = buf_read_file(f, &buf, &buf_size); - if (error) - return (error); - dp = (struct direct *)buf; - fp->f_seekp += dp->d_reclen; - if (dp->d_ino == (ino_t)0) - goto again; - d->d_type = dp->d_type; - strcpy(d->d_name, dp->d_name); - return (0); -} diff --git a/lib/libstand/uuid_from_string.c b/lib/libstand/uuid_from_string.c deleted file mode 100644 index 7a59b4189ead..000000000000 --- a/lib/libstand/uuid_from_string.c +++ /dev/null @@ -1,132 +0,0 @@ -/*- - * Copyright (c) 2015 M. Warner Losh - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - * - * $FreeBSD$ - */ - -/* - * Note: some comments taken from lib/libc/uuid/uuid_from_string.c - * Copyright (c) 2002 Marcel Moolenaar - * Copyright (c) 2002 Hiten Mahesh Pandya - */ - - -#include <stand.h> -#include <uuid.h> - -static int -hex2int(int ch) -{ - if (ch >= '0' && ch <= '9') - return ch - '0'; - if (ch >= 'a' && ch <= 'f') - return 10 + ch - 'a'; - if (ch >= 'A' && ch <= 'F') - return 10 + ch - 'A'; - return 16; -} - -static uint32_t -fromhex(const char *s, int len, int *ok) -{ - uint32_t v; - int i, h; - - if (!*ok) - return 0; - v = 0; - for (i = 0; i < len; i++) { - h = hex2int(s[i]); - if (h == 16) { - *ok = 0; - return v; - } - v = (v << 4) | h; - } - return v; -} - -/* - * uuid_from_string() - convert a string representation of an UUID into - * a binary representation. - * See also: - * http://www.opengroup.org/onlinepubs/009629399/uuid_from_string.htm - * - * NOTE: The sequence field is in big-endian, while the time fields are in - * native byte order. - * - * 01234567-89ab-cdef-0123-456789abcdef - * 000000000011111111112222222222333333 - * 012345678901234567890123456789012345 - * - - - - - * hhhhhhhh-hhhh-hhhh-bbbb-bbbbbbbbbbbb - * - */ -void -uuid_from_string(const char *s, uuid_t *u, uint32_t *status) -{ - int ok = 1; - int n; - - if (s == NULL || *s == '\0') { - uuid_create_nil(u, status); - return; - } - - if (status != NULL) - *status = uuid_s_invalid_string_uuid; - if (strlen(s) != 36) - return; - /* Only support new format, check for all the right dashes */ - if (s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-') - return; - /* native byte order */ - u->time_low = fromhex(s , 8, &ok); - u->time_mid = fromhex(s + 9, 4, &ok); - u->time_hi_and_version = fromhex(s + 14, 4, &ok); - /* Big endian, but presented as a whole number so decode as such */ - u->clock_seq_hi_and_reserved = fromhex(s + 19, 2, &ok); - u->clock_seq_low = fromhex(s + 21, 2, &ok); - u->node[0] = fromhex(s + 24, 2, &ok); - u->node[1] = fromhex(s + 26, 2, &ok); - u->node[2] = fromhex(s + 28, 2, &ok); - u->node[3] = fromhex(s + 30, 2, &ok); - u->node[4] = fromhex(s + 32, 2, &ok); - u->node[5] = fromhex(s + 34, 2, &ok); - if (!ok) - return; - - /* We have a successful scan. Check semantics... */ - n = u->clock_seq_hi_and_reserved; - if ((n & 0x80) != 0x00 && /* variant 0? */ - (n & 0xc0) != 0x80 && /* variant 1? */ - (n & 0xe0) != 0xc0) { /* variant 2? */ - if (status != NULL) - *status = uuid_s_bad_version; - } else { - if (status != NULL) - *status = uuid_s_ok; - } -} diff --git a/lib/libstand/uuid_to_string.c b/lib/libstand/uuid_to_string.c deleted file mode 100644 index d878af495aca..000000000000 --- a/lib/libstand/uuid_to_string.c +++ /dev/null @@ -1,111 +0,0 @@ -/*- - * Copyright (c) 2015 M. Warner Losh - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - * - * $FreeBSD$ - */ - - -/* - * Note: some comments taken from lib/libc/uuid/uuid_to_string.c - * Copyright (c) 2002,2005 Marcel Moolenaar - * Copyright (c) 2002 Hiten Mahesh Pandya - */ - -#include <stand.h> -#include <uuid.h> - -/* - * Dump len characters into *buf from val as hex and update *buf - */ -static void -tohex(char **buf, int len, uint32_t val) -{ - static const char *hexstr = "0123456789abcdef"; - char *walker = *buf; - int i; - - for (i = len - 1; i >= 0; i--) { - walker[i] = hexstr[val & 0xf]; - val >>= 4; - } - *buf = walker + len; -} - -/* - * uuid_to_string() - Convert a binary UUID into a string representation. - * See also: - * http://www.opengroup.org/onlinepubs/009629399/uuid_to_string.htm - * - * NOTE: The references given above do not have a status code for when - * the string could not be allocated. The status code has been - * taken from the Hewlett-Packard implementation. - * - * NOTE: we don't support u == NULL for a nil UUID, sorry. - * - * NOTE: The sequence field is in big-endian, while the time fields are in - * native byte order. - * - * hhhhhhhh-hhhh-hhhh-bbbb-bbbbbbbbbbbb - * 01234567-89ab-cdef-0123-456789abcdef - */ -void -uuid_to_string(const uuid_t *u, char **s, uint32_t *status) -{ - uuid_t nil; - char *w; - - if (status != NULL) - *status = uuid_s_ok; - if (s == NULL) /* Regular version does this odd-ball behavior too */ - return; - w = *s = malloc(37); - if (*s == NULL) { - if (status != NULL) - *status = uuid_s_no_memory; - return; - } - if (u == NULL) { - u = &nil; - uuid_create_nil(&nil, NULL); - } - /* native */ - tohex(&w, 8, u->time_low); - *w++ = '-'; - tohex(&w, 4, u->time_mid); - *w++ = '-'; - tohex(&w, 4, u->time_hi_and_version); - *w++ = '-'; - /* Big endian, so do a byte at a time */ - tohex(&w, 2, u->clock_seq_hi_and_reserved); - tohex(&w, 2, u->clock_seq_low); - *w++ = '-'; - tohex(&w, 2, u->node[0]); - tohex(&w, 2, u->node[1]); - tohex(&w, 2, u->node[2]); - tohex(&w, 2, u->node[3]); - tohex(&w, 2, u->node[4]); - tohex(&w, 2, u->node[5]); - *w++ = '\0'; -} diff --git a/lib/libstand/write.c b/lib/libstand/write.c deleted file mode 100644 index 9e02f083f243..000000000000 --- a/lib/libstand/write.c +++ /dev/null @@ -1,95 +0,0 @@ -/* $NetBSD: write.c,v 1.7 1996/06/21 20:29:30 pk Exp $ */ - -/*- - * Copyright (c) 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * The Mach Operating System project at Carnegie-Mellon University. - * - * 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. - * 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. - * - * @(#)write.c 8.1 (Berkeley) 6/11/93 - * - * - * Copyright (c) 1989, 1990, 1991 Carnegie Mellon University - * All Rights Reserved. - * - * Author: Alessandro Forin - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include "stand.h" - -ssize_t -write(fd, dest, bcount) - int fd; - void *dest; - size_t bcount; -{ - struct open_file *f = &files[fd]; - size_t resid; - - if ((unsigned)fd >= SOPEN_MAX || !(f->f_flags & F_WRITE)) { - errno = EBADF; - return (-1); - } - if (f->f_flags & F_RAW) { - twiddle(4); - errno = (f->f_dev->dv_strategy)(f->f_devdata, F_WRITE, - btodb(f->f_offset), bcount, dest, &resid); - if (errno) - return (-1); - f->f_offset += resid; - return (resid); - } - resid = bcount; - if ((errno = (f->f_ops->fo_write)(f, dest, bcount, &resid))) - return (-1); - return (bcount - resid); -} diff --git a/lib/libstand/zalloc.c b/lib/libstand/zalloc.c deleted file mode 100644 index 4d1ec6291210..000000000000 --- a/lib/libstand/zalloc.c +++ /dev/null @@ -1,316 +0,0 @@ -/* - * This module derived from code donated to the FreeBSD Project by - * Matthew Dillon <dillon@backplane.com> - * - * Copyright (c) 1998 The FreeBSD Project - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * LIB/MEMORY/ZALLOC.C - self contained low-overhead memory pool/allocation - * subsystem - * - * This subsystem implements memory pools and memory allocation - * routines. - * - * Pools are managed via a linked list of 'free' areas. Allocating - * memory creates holes in the freelist, freeing memory fills them. - * Since the freelist consists only of free memory areas, it is possible - * to allocate the entire pool without incuring any structural overhead. - * - * The system works best when allocating similarly-sized chunks of - * memory. Care must be taken to avoid fragmentation when - * allocating/deallocating dissimilar chunks. - * - * When a memory pool is first allocated, the entire pool is marked as - * allocated. This is done mainly because we do not want to modify any - * portion of a pool's data area until we are given permission. The - * caller must explicitly deallocate portions of the pool to make them - * available. - * - * z[n]xalloc() works like z[n]alloc() but the allocation is made from - * within the specified address range. If the segment could not be - * allocated, NULL is returned. WARNING! The address range will be - * aligned to an 8 or 16 byte boundry depending on the cpu so if you - * give an unaligned address range, unexpected results may occur. - * - * If a standard allocation fails, the reclaim function will be called - * to recover some space. This usually causes other portions of the - * same pool to be released. Memory allocations at this low level - * should not block but you can do that too in your reclaim function - * if you want. Reclaim does not function when z[n]xalloc() is used, - * only for z[n]alloc(). - * - * Allocation and frees of 0 bytes are valid operations. - */ - -#include "zalloc_defs.h" - -/* - * Objects in the pool must be aligned to at least the size of struct MemNode. - * They must also be aligned to MALLOCALIGN, which should normally be larger - * than the struct, so assert that to be so at compile time. - */ -typedef char assert_align[(sizeof(struct MemNode) <= MALLOCALIGN) ? 1 : -1]; - -#define MEMNODE_SIZE_MASK MALLOCALIGN_MASK - -/* - * znalloc() - allocate memory (without zeroing) from pool. Call reclaim - * and retry if appropriate, return NULL if unable to allocate - * memory. - */ - -void * -znalloc(MemPool *mp, uintptr_t bytes) -{ - /* - * align according to pool object size (can be 0). This is - * inclusive of the MEMNODE_SIZE_MASK minimum alignment. - * - */ - bytes = (bytes + MEMNODE_SIZE_MASK) & ~MEMNODE_SIZE_MASK; - - if (bytes == 0) - return((void *)-1); - - /* - * locate freelist entry big enough to hold the object. If all objects - * are the same size, this is a constant-time function. - */ - - if (bytes <= mp->mp_Size - mp->mp_Used) { - MemNode **pmn; - MemNode *mn; - - for (pmn = &mp->mp_First; (mn=*pmn) != NULL; pmn = &mn->mr_Next) { - if (bytes > mn->mr_Bytes) - continue; - - /* - * Cut a chunk of memory out of the beginning of this - * block and fixup the link appropriately. - */ - - { - char *ptr = (char *)mn; - - if (mn->mr_Bytes == bytes) { - *pmn = mn->mr_Next; - } else { - mn = (MemNode *)((char *)mn + bytes); - mn->mr_Next = ((MemNode *)ptr)->mr_Next; - mn->mr_Bytes = ((MemNode *)ptr)->mr_Bytes - bytes; - *pmn = mn; - } - mp->mp_Used += bytes; - return(ptr); - } - } - } - - /* - * Memory pool is full, return NULL. - */ - - return(NULL); -} - -/* - * zfree() - free previously allocated memory - */ - -void -zfree(MemPool *mp, void *ptr, uintptr_t bytes) -{ - /* - * align according to pool object size (can be 0). This is - * inclusive of the MEMNODE_SIZE_MASK minimum alignment. - */ - bytes = (bytes + MEMNODE_SIZE_MASK) & ~MEMNODE_SIZE_MASK; - - if (bytes == 0) - return; - - /* - * panic if illegal pointer - */ - - if ((char *)ptr < (char *)mp->mp_Base || - (char *)ptr + bytes > (char *)mp->mp_End || - ((uintptr_t)ptr & MEMNODE_SIZE_MASK) != 0) - panic("zfree(%p,%ju): wild pointer", ptr, (uintmax_t)bytes); - - /* - * free the segment - */ - - { - MemNode **pmn; - MemNode *mn; - - mp->mp_Used -= bytes; - - for (pmn = &mp->mp_First; (mn = *pmn) != NULL; pmn = &mn->mr_Next) { - /* - * If area between last node and current node - * - check range - * - check merge with next area - * - check merge with previous area - */ - if ((char *)ptr <= (char *)mn) { - /* - * range check - */ - if ((char *)ptr + bytes > (char *)mn) { - panic("zfree(%p,%ju): corrupt memlist1", ptr, - (uintmax_t)bytes); - } - - /* - * merge against next area or create independant area - */ - - if ((char *)ptr + bytes == (char *)mn) { - ((MemNode *)ptr)->mr_Next = mn->mr_Next; - ((MemNode *)ptr)->mr_Bytes= bytes + mn->mr_Bytes; - } else { - ((MemNode *)ptr)->mr_Next = mn; - ((MemNode *)ptr)->mr_Bytes= bytes; - } - *pmn = mn = (MemNode *)ptr; - - /* - * merge against previous area (if there is a previous - * area). - */ - - if (pmn != &mp->mp_First) { - if ((char*)pmn + ((MemNode*)pmn)->mr_Bytes == (char*)ptr) { - ((MemNode *)pmn)->mr_Next = mn->mr_Next; - ((MemNode *)pmn)->mr_Bytes += mn->mr_Bytes; - mn = (MemNode *)pmn; - } - } - return; - /* NOT REACHED */ - } - if ((char *)ptr < (char *)mn + mn->mr_Bytes) { - panic("zfree(%p,%ju): corrupt memlist2", ptr, - (uintmax_t)bytes); - } - } - /* - * We are beyond the last MemNode, append new MemNode. Merge against - * previous area if possible. - */ - if (pmn == &mp->mp_First || - (char *)pmn + ((MemNode *)pmn)->mr_Bytes != (char *)ptr - ) { - ((MemNode *)ptr)->mr_Next = NULL; - ((MemNode *)ptr)->mr_Bytes = bytes; - *pmn = (MemNode *)ptr; - mn = (MemNode *)ptr; - } else { - ((MemNode *)pmn)->mr_Bytes += bytes; - mn = (MemNode *)pmn; - } - } -} - -/* - * zextendPool() - extend memory pool to cover additional space. - * - * Note: the added memory starts out as allocated, you - * must free it to make it available to the memory subsystem. - * - * Note: mp_Size may not reflect (mp_End - mp_Base) range - * due to other parts of the system doing their own sbrk() - * calls. - */ - -void -zextendPool(MemPool *mp, void *base, uintptr_t bytes) -{ - if (mp->mp_Size == 0) { - mp->mp_Base = base; - mp->mp_Used = bytes; - mp->mp_End = (char *)base + bytes; - mp->mp_Size = bytes; - } else { - void *pend = (char *)mp->mp_Base + mp->mp_Size; - - if (base < mp->mp_Base) { - mp->mp_Size += (char *)mp->mp_Base - (char *)base; - mp->mp_Used += (char *)mp->mp_Base - (char *)base; - mp->mp_Base = base; - } - base = (char *)base + bytes; - if (base > pend) { - mp->mp_Size += (char *)base - (char *)pend; - mp->mp_Used += (char *)base - (char *)pend; - mp->mp_End = (char *)base; - } - } -} - -#ifdef ZALLOCDEBUG - -void -zallocstats(MemPool *mp) -{ - int abytes = 0; - int hbytes = 0; - int fcount = 0; - MemNode *mn; - - printf("%d bytes reserved", (int) mp->mp_Size); - - mn = mp->mp_First; - - if ((void *)mn != (void *)mp->mp_Base) { - abytes += (char *)mn - (char *)mp->mp_Base; - } - - while (mn) { - if ((char *)mn + mn->mr_Bytes != mp->mp_End) { - hbytes += mn->mr_Bytes; - ++fcount; - } - if (mn->mr_Next) - abytes += (char *)mn->mr_Next - ((char *)mn + mn->mr_Bytes); - mn = mn->mr_Next; - } - printf(" %d bytes allocated\n%d fragments (%d bytes fragmented)\n", - abytes, - fcount, - hbytes - ); -} - -#endif - diff --git a/lib/libstand/zalloc_defs.h b/lib/libstand/zalloc_defs.h deleted file mode 100644 index 7f2cc1202c9b..000000000000 --- a/lib/libstand/zalloc_defs.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * This module derived from code donated to the FreeBSD Project by - * Matthew Dillon <dillon@backplane.com> - * - * Copyright (c) 1998 The FreeBSD Project - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - * - * $FreeBSD$ - */ - -/* - * DEFS.H - */ - -#define USEGUARD /* use stard/end guard bytes */ -#define USEENDGUARD -#define DMALLOCDEBUG /* add debugging code to gather stats */ -#define ZALLOCDEBUG - -#include <sys/stdint.h> -#include "stand.h" -#include "zalloc_mem.h" - -#define Library extern - -/* - * block extension for sbrk() - */ - -#define BLKEXTEND (4 * 1024) -#define BLKEXTENDMASK (BLKEXTEND - 1) - -/* - * Required malloc alignment. - * - * Embedded platforms using the u-boot API drivers require that all I/O buffers - * be on a cache line sized boundary. The worst case size for that is 64 bytes. - * For other platforms, 16 bytes works fine. The alignment also must be at - * least sizeof(struct MemNode); this is asserted in zalloc.c. - */ - -#if defined(__arm__) || defined(__mips__) || defined(__powerpc__) -#define MALLOCALIGN 64 -#else -#define MALLOCALIGN 16 -#endif -#define MALLOCALIGN_MASK (MALLOCALIGN - 1) - -typedef struct Guard { - size_t ga_Bytes; - size_t ga_Magic; /* must be at least 32 bits */ -} Guard; - -#define GAMAGIC 0x55FF44FD -#define GAFREE 0x5F54F4DF - -#include "zalloc_protos.h" diff --git a/lib/libstand/zalloc_malloc.c b/lib/libstand/zalloc_malloc.c deleted file mode 100644 index b9a295fb3850..000000000000 --- a/lib/libstand/zalloc_malloc.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - * This module derived from code donated to the FreeBSD Project by - * Matthew Dillon <dillon@backplane.com> - * - * Copyright (c) 1998 The FreeBSD Project - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* - * MALLOC.C - malloc equivalent, runs on top of zalloc and uses sbrk - */ - -#include "zalloc_defs.h" - -static MemPool MallocPool; - -#ifdef DMALLOCDEBUG -static int MallocMax; -static int MallocCount; - -void mallocstats(void); -#endif - -#ifdef malloc -#undef malloc -#undef free -#endif - -void * -Malloc(size_t bytes, const char *file, int line) -{ - Guard *res; - -#ifdef USEENDGUARD - bytes += MALLOCALIGN + 1; -#else - bytes += MALLOCALIGN; -#endif - - while ((res = znalloc(&MallocPool, bytes)) == NULL) { - int incr = (bytes + BLKEXTENDMASK) & ~BLKEXTENDMASK; - char *base; - - if ((base = sbrk(incr)) == (char *)-1) - return(NULL); - zextendPool(&MallocPool, base, incr); - zfree(&MallocPool, base, incr); - } -#ifdef DMALLOCDEBUG - if (++MallocCount > MallocMax) - MallocMax = MallocCount; -#endif -#ifdef USEGUARD - res->ga_Magic = GAMAGIC; -#endif - res->ga_Bytes = bytes; -#ifdef USEENDGUARD - *((signed char *)res + bytes - 1) = -2; -#endif - - return((char *)res + MALLOCALIGN); -} - -void -Free(void *ptr, const char *file, int line) -{ - size_t bytes; - - if (ptr != NULL) { - Guard *res = (void *)((char *)ptr - MALLOCALIGN); - - if (file == NULL) - file = "unknown"; -#ifdef USEGUARD - if (res->ga_Magic == GAFREE) { - printf("free: duplicate free @ %p from %s:%d\n", ptr, file, line); - return; - } - if (res->ga_Magic != GAMAGIC) - panic("free: guard1 fail @ %p from %s:%d", ptr, file, line); - res->ga_Magic = GAFREE; -#endif -#ifdef USEENDGUARD - if (*((signed char *)res + res->ga_Bytes - 1) == -1) { - printf("free: duplicate2 free @ %p from %s:%d\n", ptr, file, line); - return; - } - if (*((signed char *)res + res->ga_Bytes - 1) != -2) - panic("free: guard2 fail @ %p + %zu from %s:%d", ptr, res->ga_Bytes - MALLOCALIGN, file, line); - *((signed char *)res + res->ga_Bytes - 1) = -1; -#endif - - bytes = res->ga_Bytes; - zfree(&MallocPool, res, bytes); -#ifdef DMALLOCDEBUG - --MallocCount; -#endif - } -} - - -void * -Calloc(size_t n1, size_t n2, const char *file, int line) -{ - uintptr_t bytes = (uintptr_t)n1 * (uintptr_t)n2; - void *res; - - if ((res = Malloc(bytes, file, line)) != NULL) { - bzero(res, bytes); -#ifdef DMALLOCDEBUG - if (++MallocCount > MallocMax) - MallocMax = MallocCount; -#endif - } - return(res); -} - -/* - * realloc() - I could be fancier here and free the old buffer before - * allocating the new one (saving potential fragmentation - * and potential buffer copies). But I don't bother. - */ - -void * -Realloc(void *ptr, size_t size, const char *file, int line) -{ - void *res; - size_t old; - - if ((res = Malloc(size, file, line)) != NULL) { - if (ptr) { - old = *(size_t *)((char *)ptr - MALLOCALIGN) - MALLOCALIGN; - if (old < size) - bcopy(ptr, res, old); - else - bcopy(ptr, res, size); - Free(ptr, file, line); - } else { -#ifdef DMALLOCDEBUG - if (++MallocCount > MallocMax) - MallocMax = MallocCount; -#ifdef EXITSTATS - if (DidAtExit == 0) { - DidAtExit = 1; - atexit(mallocstats); - } -#endif -#endif - } - } - return(res); -} - -void * -Reallocf(void *ptr, size_t size, const char *file, int line) -{ - void *res; - - if ((res = Realloc(ptr, size, file, line)) == NULL) - Free(ptr, file, line); - return(res); -} - -#ifdef DMALLOCDEBUG - -void -mallocstats(void) -{ - printf("Active Allocations: %d/%d\n", MallocCount, MallocMax); -#ifdef ZALLOCDEBUG - zallocstats(&MallocPool); -#endif -} - -#endif - diff --git a/lib/libstand/zalloc_mem.h b/lib/libstand/zalloc_mem.h deleted file mode 100644 index 26d388dfc75e..000000000000 --- a/lib/libstand/zalloc_mem.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * This module derived from code donated to the FreeBSD Project by - * Matthew Dillon <dillon@backplane.com> - * - * Copyright (c) 1998 The FreeBSD Project - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - * - * $FreeBSD$ - */ - -/* - * H/MEM.H - * - * Basic memory pool / memory node structures. - */ - -typedef struct MemNode { - struct MemNode *mr_Next; - uintptr_t mr_Bytes; -} MemNode; - -typedef struct MemPool { - void *mp_Base; - void *mp_End; - MemNode *mp_First; - uintptr_t mp_Size; - uintptr_t mp_Used; -} MemPool; - -#define ZNOTE_FREE 0 -#define ZNOTE_REUSE 1 - diff --git a/lib/libstand/zalloc_protos.h b/lib/libstand/zalloc_protos.h deleted file mode 100644 index 53a40e400dcd..000000000000 --- a/lib/libstand/zalloc_protos.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * This module derived from code donated to the FreeBSD Project by - * Matthew Dillon <dillon@backplane.com> - * - * Copyright (c) 1998 The FreeBSD Project - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. - * - * $FreeBSD$ - */ - -Library void *znalloc(struct MemPool *mpool, uintptr_t bytes); -Library void zfree(struct MemPool *mpool, void *ptr, uintptr_t bytes); -Library void zextendPool(MemPool *mp, void *base, uintptr_t bytes); -Library void zallocstats(struct MemPool *mp); |
