diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2003-11-21 14:58:17 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2003-11-21 14:58:17 +0000 |
commit | c855f03150358ae41b3493e3e2f0844fadf74b51 (patch) | |
tree | fcc4fe0a928a0cd1a9dd3a55c9859b4854da75ff | |
parent | cabcd48afa08e892f8628c98a5558af136b21ade (diff) | |
download | cpio-c855f03150358ae41b3493e3e2f0844fadf74b51.tar.gz cpio-c855f03150358ae41b3493e3e2f0844fadf74b51.tar.bz2 |
Added to the repository
-rw-r--r-- | .cvsignore | 13 | ||||
-rw-r--r-- | AUTHORS | 6 | ||||
-rw-r--r-- | NEWS | 69 | ||||
-rw-r--r-- | README | 71 | ||||
-rw-r--r-- | THANKS | 0 | ||||
-rw-r--r-- | alloca.c | 495 | ||||
-rw-r--r-- | argmatch.c | 87 | ||||
-rw-r--r-- | bcopy.c | 19 | ||||
-rw-r--r-- | configure.ac | 119 | ||||
-rw-r--r-- | cpio.h | 69 | ||||
-rw-r--r-- | cpiohdr.h | 90 | ||||
-rw-r--r-- | defer.c | 46 | ||||
-rw-r--r-- | defer.h | 25 | ||||
-rw-r--r-- | dirname.c | 70 | ||||
-rw-r--r-- | dstring.c | 118 | ||||
-rw-r--r-- | dstring.h | 49 | ||||
-rw-r--r-- | error.c | 130 | ||||
-rw-r--r-- | filemode.c | 255 | ||||
-rw-r--r-- | filetypes.h | 84 | ||||
-rw-r--r-- | fnmatch.c | 200 | ||||
-rw-r--r-- | fnmatch.h | 67 | ||||
-rw-r--r-- | getopt.c | 765 | ||||
-rw-r--r-- | getopt.h | 129 | ||||
-rw-r--r-- | getopt1.c | 180 | ||||
-rw-r--r-- | idcache.c | 210 | ||||
-rw-r--r-- | mkdir.c | 99 | ||||
-rw-r--r-- | rmt.h | 98 | ||||
-rw-r--r-- | rtapelib.c | 601 | ||||
-rw-r--r-- | safe-stat.h | 1 | ||||
-rw-r--r-- | strdup.c | 43 | ||||
-rw-r--r-- | stripslash.c | 43 | ||||
-rw-r--r-- | tar.c | 529 | ||||
-rw-r--r-- | tar.h | 112 | ||||
-rw-r--r-- | tarhdr.h | 62 | ||||
-rw-r--r-- | userspec.c | 286 | ||||
-rw-r--r-- | xmalloc.c | 103 | ||||
-rw-r--r-- | xstrdup.c | 36 |
37 files changed, 5379 insertions, 0 deletions
diff --git a/.cvsignore b/.cvsignore new file mode 100644 index 0000000..ed525d5 --- /dev/null +++ b/.cvsignore @@ -0,0 +1,13 @@ +Makefile.in +Makefile +.deps +.libs +cpio +mt +rmt +.gdbinit +config.h.in +autom4te.cache +aclocal.m4 +*.tar.gz +*.tar.bz2
\ No newline at end of file @@ -0,0 +1,6 @@ +Authors of GNU cpio + +Phil Nelson <phil@cs.wwu.edu> +David MacKenzie <djm@gnu.ai.mit.edu> +John Oleynick <juo@klinzhai.rutgers.edu> +Sergey Poznyakoff <gray@mirddin.farlep.net>
\ No newline at end of file @@ -0,0 +1,69 @@ + +Major changes in version 2.5: + +* bug fixes from Debian, Red Hat, and SuSE GNU/Linux Distribution patches +* --rsh-command option + +Major changes in version 2.4: + +* new texinfo documentation +* --sparse option to write sparse files +* --only-verify-crc option to verify a CRC format archive +* --no-absolute-paths option to ignore absolute paths +* --quiet option to supress printing number of blocks copied +* handle disk input errors more gracefully + +Major changes in version 2.3: + +* in newc and crc format archives, only store 1 copy of multiply linked files +* handle multiply linked devices properly +* handle multiply linked files with cpio -pl even when the source and + destination are on different file systems +* support HPUX Context Dependent Files +* read and write HPUX cpio archives +* read System V.4 POSIX tar archives and HPUX POSIX tar archives +* use rmdir, instead of unlink, to delete existing directories + +Major changes in version 2.2: + +* handle link counts correctly when reading binary cpio archives +* configure checks for some libraries that SVR4 needs + +Major changes in version 2.1: + +* cpio can access remote non-device files as well as remote devices +* fix bugs in the MS-DOS port +* add --swap equivalent to -b option + +Version 2.0 adds the following features: + +Support for the SVR4 cpio formats, which can store inodes >65535, and +for traditional and POSIX tar archives. Also adds these options: + +-A --append append to instead of replacing the archive +-V --dot print a dot for each file processed +-H --format select archive format +-C --io-size select I/O block size in bytes +-M --message print a message at end of media volumes +--no-preserve-owner don't change files' owners when extracting +-R --owner set files' owners when extracting +-E --pattern-file list of shell filename patterns to process +-s --swap-bytes handle byte-order differences when extracting files +-S --swap-halfwords ditto +-b like -sS +-I input archive filename +-k recognize corrupted archives (we alawys do it, though) +-O output archive filename + +Some options of previous versions have been renamed in 2.0: + +--binary was replaced by --format=bin +--portability was replaced by --format=odc + +Some options have changed meaning in 2.0, for SVR4 compatibility: + +-O used to select the binary archive format, now selects the output file +-V used to print the version number, now prints a dot for each file + +Version 2.0 also fixes several bugs in the handling of files with +multiple links and of multi-volume archives on floppy disks. @@ -0,0 +1,71 @@ +This is GNU cpio, a program to manage archives of files. +As of version 2.0, it supports the features of the System V release 4 +cpio, including support for tar archives. + +This package also includes rmt, the remote tape server, and mt, a tape +drive control program; these two programs will only be compiled if +your system supports remote command execution, and tape drive control +operations, respectively. + +See the file INSTALL for compilation and installation instructions for Unix. + +For non-Unix systems [ Note: The non-Unix makefiles have not been tested + for this release ] + +makefile.pc is a makefile for Turbo C or C++ or Borland C++ on MS-DOS. + +makefile.os2 is a makefile for MS C and GNU C (emx/gcc) on OS/2. +cpio.def is a linker definition file for the MS C OS/2 version. + + +The main advantages of GNU cpio over Unix versions are: + +* It can access tape drives on other hosts using TCP/IP. + +* `-o' and `-p' can copy symbolic links either as symbolic links or, +with `-L', as the files they point to. + +* `-i' automatically recognizes the archive format and tries to +recover from corrupted archives. + +* The output of '-itv' looks like 'ls -l'. + +* It accepts long-named options as well as traditional +single-character options. + +A few features of other versions of cpio are missing from GNU cpio, including: + +* The `-6' option to support Sixth Edition Unix cpio archives with `-i'. + +* An option to limit volume size, like afio -s. + + +GNU cpio supports the POSIX.1 "ustar" tar format. GNU tar supports a +somewhat different, early draft of that format. That draft format has +a slightly different magic number in the tar header and doesn't +include the path prefix part of the header, which allows storing file +names that are longer than 100 characters. GNU cpio knows to +recognize the nonstandard GNU tar "ustar" archives. + +The following patch to GNU tar 1.11.1 makes GNU tar recognize standard +"ustar" archives, such as GNU cpio produces, except that it won't use +the path prefix. Without this patch, GNU tar thinks that standard +"ustar" archives are old-format tar archives and can not use the extra +information that "ustar" format contains. If you use this patch, +remember that you will lose the beginnings of paths that are longer +than 100 characters. That's why it's not an official part of GNU tar. +(Adding support for the path prefix to GNU tar is not trivial.) + +--- list.c.orig Mon Sep 14 17:04:03 1992 ++++ list.c Wed Oct 14 14:02:28 1992 +@@ -439,7 +439,7 @@ + st->st_ctime = from_oct(1+12, header->header.ctime); + } + +- if (0==strcmp(header->header.magic, TMAGIC)) { ++ if (0==strncmp(header->header.magic, TMAGIC, 5)) { + /* Unix Standard tar archive */ + *stdp = 1; + if (wantug) { + +Mail suggestions and bug reports for GNU cpio to bug-cpio@gnu.org. diff --git a/alloca.c b/alloca.c new file mode 100644 index 0000000..7061cec --- /dev/null +++ b/alloca.c @@ -0,0 +1,495 @@ +/* alloca.c -- allocate automatically reclaimed memory + (Mostly) portable public-domain implementation -- D A Gwyn + + This implementation of the PWB library alloca function, + which is used to allocate space off the run-time stack so + that it is automatically reclaimed upon procedure exit, + was inspired by discussions with J. Q. Johnson of Cornell. + J.Otto Tennant <jot@cray.com> contributed the Cray support. + + There are some preprocessor constants that can + be defined when compiling for your specific system, for + improved efficiency; however, the defaults should be okay. + + The general concept of this implementation is to keep + track of all alloca-allocated blocks, and reclaim any + that are found to be deeper in the stack than the current + invocation. This heuristic does not reclaim storage as + soon as it becomes invalid, but it will do so eventually. + + As a special case, alloca(0) reclaims storage without + allocating any. It is a good idea to use alloca(0) in + your main control loop, etc. to force garbage collection. */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef emacs +#include "blockinput.h" +#endif + +/* If compiling with GCC 2, this file's not needed. */ +#if !defined (__GNUC__) || __GNUC__ < 2 + +/* If someone has defined alloca as a macro, + there must be some other way alloca is supposed to work. */ +#ifndef alloca + +#ifdef emacs +#ifdef static +/* actually, only want this if static is defined as "" + -- this is for usg, in which emacs must undefine static + in order to make unexec workable + */ +#ifndef STACK_DIRECTION +you +lose +-- must know STACK_DIRECTION at compile-time +#endif /* STACK_DIRECTION undefined */ +#endif /* static */ +#endif /* emacs */ + +/* If your stack is a linked list of frames, you have to + provide an "address metric" ADDRESS_FUNCTION macro. */ + +#if defined (CRAY) && defined (CRAY_STACKSEG_END) +long i00afunc (); +#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) +#else +#define ADDRESS_FUNCTION(arg) &(arg) +#endif + +#if __STDC__ +typedef void *pointer; +#else +typedef char *pointer; +#endif + +#define NULL 0 + +/* Different portions of Emacs need to call different versions of + malloc. The Emacs executable needs alloca to call xmalloc, because + ordinary malloc isn't protected from input signals. On the other + hand, the utilities in lib-src need alloca to call malloc; some of + them are very simple, and don't have an xmalloc routine. + + Non-Emacs programs expect this to call use xmalloc. + + Callers below should use malloc. */ + +#ifndef emacs +#define malloc xmalloc +#endif +extern pointer malloc (); + +/* Define STACK_DIRECTION if you know the direction of stack + growth for your system; otherwise it will be automatically + deduced at run-time. + + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ + +#ifndef STACK_DIRECTION +#define STACK_DIRECTION 0 /* Direction unknown. */ +#endif + +#if STACK_DIRECTION != 0 + +#define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ + +#else /* STACK_DIRECTION == 0; need run-time code. */ + +static int stack_dir; /* 1 or -1 once known. */ +#define STACK_DIR stack_dir + +static void +find_stack_direction () +{ + static char *addr = NULL; /* Address of first `dummy', once known. */ + auto char dummy; /* To get stack address. */ + + if (addr == NULL) + { /* Initial entry. */ + addr = ADDRESS_FUNCTION (dummy); + + find_stack_direction (); /* Recurse once. */ + } + else + { + /* Second entry. */ + if (ADDRESS_FUNCTION (dummy) > addr) + stack_dir = 1; /* Stack grew upward. */ + else + stack_dir = -1; /* Stack grew downward. */ + } +} + +#endif /* STACK_DIRECTION == 0 */ + +/* An "alloca header" is used to: + (a) chain together all alloca'ed blocks; + (b) keep track of stack depth. + + It is very important that sizeof(header) agree with malloc + alignment chunk size. The following default should work okay. */ + +#ifndef ALIGN_SIZE +#define ALIGN_SIZE sizeof(double) +#endif + +typedef union hdr +{ + char align[ALIGN_SIZE]; /* To force sizeof(header). */ + struct + { + union hdr *next; /* For chaining headers. */ + char *deep; /* For stack depth measure. */ + } h; +} header; + +static header *last_alloca_header = NULL; /* -> last alloca header. */ + +/* Return a pointer to at least SIZE bytes of storage, + which will be automatically reclaimed upon exit from + the procedure that called alloca. Originally, this space + was supposed to be taken from the current stack frame of the + caller, but that method cannot be made to work for some + implementations of C, for example under Gould's UTX/32. */ + +pointer +alloca (size) + unsigned size; +{ + auto char probe; /* Probes stack depth: */ + register char *depth = ADDRESS_FUNCTION (probe); + +#if STACK_DIRECTION == 0 + if (STACK_DIR == 0) /* Unknown growth direction. */ + find_stack_direction (); +#endif + + /* Reclaim garbage, defined as all alloca'd storage that + was allocated from deeper in the stack than currently. */ + + { + register header *hp; /* Traverses linked list. */ + +#ifdef emacs + BLOCK_INPUT; +#endif + + for (hp = last_alloca_header; hp != NULL;) + if ((STACK_DIR > 0 && hp->h.deep > depth) + || (STACK_DIR < 0 && hp->h.deep < depth)) + { + register header *np = hp->h.next; + + free ((pointer) hp); /* Collect garbage. */ + + hp = np; /* -> next header. */ + } + else + break; /* Rest are not deeper. */ + + last_alloca_header = hp; /* -> last valid storage. */ + +#ifdef emacs + UNBLOCK_INPUT; +#endif + } + + if (size == 0) + return NULL; /* No allocation required. */ + + /* Allocate combined header + user data storage. */ + + { + register pointer new = malloc (sizeof (header) + size); + /* Address of header. */ + + if (new == 0) + abort(); + + ((header *) new)->h.next = last_alloca_header; + ((header *) new)->h.deep = depth; + + last_alloca_header = (header *) new; + + /* User storage begins just after header. */ + + return (pointer) ((char *) new + sizeof (header)); + } +} + +#if defined (CRAY) && defined (CRAY_STACKSEG_END) + +#ifdef DEBUG_I00AFUNC +#include <stdio.h> +#endif + +#ifndef CRAY_STACK +#define CRAY_STACK +#ifndef CRAY2 +/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ +struct stack_control_header + { + long shgrow:32; /* Number of times stack has grown. */ + long shaseg:32; /* Size of increments to stack. */ + long shhwm:32; /* High water mark of stack. */ + long shsize:32; /* Current size of stack (all segments). */ + }; + +/* The stack segment linkage control information occurs at + the high-address end of a stack segment. (The stack + grows from low addresses to high addresses.) The initial + part of the stack segment linkage control information is + 0200 (octal) words. This provides for register storage + for the routine which overflows the stack. */ + +struct stack_segment_linkage + { + long ss[0200]; /* 0200 overflow words. */ + long sssize:32; /* Number of words in this segment. */ + long ssbase:32; /* Offset to stack base. */ + long:32; + long sspseg:32; /* Offset to linkage control of previous + segment of stack. */ + long:32; + long sstcpt:32; /* Pointer to task common address block. */ + long sscsnm; /* Private control structure number for + microtasking. */ + long ssusr1; /* Reserved for user. */ + long ssusr2; /* Reserved for user. */ + long sstpid; /* Process ID for pid based multi-tasking. */ + long ssgvup; /* Pointer to multitasking thread giveup. */ + long sscray[7]; /* Reserved for Cray Research. */ + long ssa0; + long ssa1; + long ssa2; + long ssa3; + long ssa4; + long ssa5; + long ssa6; + long ssa7; + long sss0; + long sss1; + long sss2; + long sss3; + long sss4; + long sss5; + long sss6; + long sss7; + }; + +#else /* CRAY2 */ +/* The following structure defines the vector of words + returned by the STKSTAT library routine. */ +struct stk_stat + { + long now; /* Current total stack size. */ + long maxc; /* Amount of contiguous space which would + be required to satisfy the maximum + stack demand to date. */ + long high_water; /* Stack high-water mark. */ + long overflows; /* Number of stack overflow ($STKOFEN) calls. */ + long hits; /* Number of internal buffer hits. */ + long extends; /* Number of block extensions. */ + long stko_mallocs; /* Block allocations by $STKOFEN. */ + long underflows; /* Number of stack underflow calls ($STKRETN). */ + long stko_free; /* Number of deallocations by $STKRETN. */ + long stkm_free; /* Number of deallocations by $STKMRET. */ + long segments; /* Current number of stack segments. */ + long maxs; /* Maximum number of stack segments so far. */ + long pad_size; /* Stack pad size. */ + long current_address; /* Current stack segment address. */ + long current_size; /* Current stack segment size. This + number is actually corrupted by STKSTAT to + include the fifteen word trailer area. */ + long initial_address; /* Address of initial segment. */ + long initial_size; /* Size of initial segment. */ + }; + +/* The following structure describes the data structure which trails + any stack segment. I think that the description in 'asdef' is + out of date. I only describe the parts that I am sure about. */ + +struct stk_trailer + { + long this_address; /* Address of this block. */ + long this_size; /* Size of this block (does not include + this trailer). */ + long unknown2; + long unknown3; + long link; /* Address of trailer block of previous + segment. */ + long unknown5; + long unknown6; + long unknown7; + long unknown8; + long unknown9; + long unknown10; + long unknown11; + long unknown12; + long unknown13; + long unknown14; + }; + +#endif /* CRAY2 */ +#endif /* not CRAY_STACK */ + +#ifdef CRAY2 +/* Determine a "stack measure" for an arbitrary ADDRESS. + I doubt that "lint" will like this much. */ + +static long +i00afunc (long *address) +{ + struct stk_stat status; + struct stk_trailer *trailer; + long *block, size; + long result = 0; + + /* We want to iterate through all of the segments. The first + step is to get the stack status structure. We could do this + more quickly and more directly, perhaps, by referencing the + $LM00 common block, but I know that this works. */ + + STKSTAT (&status); + + /* Set up the iteration. */ + + trailer = (struct stk_trailer *) (status.current_address + + status.current_size + - 15); + + /* There must be at least one stack segment. Therefore it is + a fatal error if "trailer" is null. */ + + if (trailer == 0) + abort (); + + /* Discard segments that do not contain our argument address. */ + + while (trailer != 0) + { + block = (long *) trailer->this_address; + size = trailer->this_size; + if (block == 0 || size == 0) + abort (); + trailer = (struct stk_trailer *) trailer->link; + if ((block <= address) && (address < (block + size))) + break; + } + + /* Set the result to the offset in this segment and add the sizes + of all predecessor segments. */ + + result = address - block; + + if (trailer == 0) + { + return result; + } + + do + { + if (trailer->this_size <= 0) + abort (); + result += trailer->this_size; + trailer = (struct stk_trailer *) trailer->link; + } + while (trailer != 0); + + /* We are done. Note that if you present a bogus address (one + not in any segment), you will get a different number back, formed + from subtracting the address of the first block. This is probably + not what you want. */ + + return (result); +} + +#else /* not CRAY2 */ +/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. + Determine the number of the cell within the stack, + given the address of the cell. The purpose of this + routine is to linearize, in some sense, stack addresses + for alloca. */ + +static long +i00afunc (long address) +{ + long stkl = 0; + + long size, pseg, this_segment, stack; + long result = 0; + + struct stack_segment_linkage *ssptr; + + /* Register B67 contains the address of the end of the + current stack segment. If you (as a subprogram) store + your registers on the stack and find that you are past + the contents of B67, you have overflowed the segment. + + B67 also points to the stack segment linkage control + area, which is what we are really interested in. */ + + stkl = CRAY_STACKSEG_END (); + ssptr = (struct stack_segment_linkage *) stkl; + + /* If one subtracts 'size' from the end of the segment, + one has the address of the first word of the segment. + + If this is not the first segment, 'pseg' will be + nonzero. */ + + pseg = ssptr->sspseg; + size = ssptr->sssize; + + this_segment = stkl - size; + + /* It is possible that calling this routine itself caused + a stack overflow. Discard stack segments which do not + contain the target address. */ + + while (!(this_segment <= address && address <= stkl)) + { +#ifdef DEBUG_I00AFUNC + fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); +#endif + if (pseg == 0) + break; + stkl = stkl - pseg; + ssptr = (struct stack_segment_linkage *) stkl; + size = ssptr->sssize; + pseg = ssptr->sspseg; + this_segment = stkl - size; + } + + result = address - this_segment; + + /* If you subtract pseg from the current end of the stack, + you get the address of the previous stack segment's end. + This seems a little convoluted to me, but I'll bet you save + a cycle somewhere. */ + + while (pseg != 0) + { +#ifdef DEBUG_I00AFUNC + fprintf (stderr, "%011o %011o\n", pseg, size); +#endif + stkl = stkl - pseg; + ssptr = (struct stack_segment_linkage *) stkl; + size = ssptr->sssize; + pseg = ssptr->sspseg; + result += size; + } + return (result); +} + +#endif /* not CRAY2 */ +#endif /* CRAY */ + +#endif /* no alloca */ +#endif /* not GCC version 2 */ diff --git a/argmatch.c b/argmatch.c new file mode 100644 index 0000000..d89699b --- /dev/null +++ b/argmatch.c @@ -0,0 +1,87 @@ +/* argmatch.c -- find a match for a string in an array + Copyright (C) 1990 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by David MacKenzie <djm@ai.mit.edu> */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#ifdef STDC_HEADERS +#include <string.h> +#endif + +extern char *program_name; + +/* If ARG is an unambiguous match for an element of the + null-terminated array OPTLIST, return the index in OPTLIST + of the matched element, else -1 if it does not match any element + or -2 if it is ambiguous (is a prefix of more than one element). */ + +int +argmatch (arg, optlist) + char *arg; + char **optlist; +{ + int i; /* Temporary index in OPTLIST. */ + int arglen; /* Length of ARG. */ + int matchind = -1; /* Index of first nonexact match. */ + int ambiguous = 0; /* If nonzero, multiple nonexact match(es). */ + + arglen = strlen (arg); + + /* Test all elements for either exact match or abbreviated matches. */ + for (i = 0; optlist[i]; i++) + { + if (!strncmp (optlist[i], arg, arglen)) + { + if (strlen (optlist[i]) == arglen) + /* Exact match found. */ + return i; + else if (matchind == -1) + /* First nonexact match found. */ + matchind = i; + else + /* Second nonexact match found. */ + ambiguous = 1; + } + } + if (ambiguous) + return -2; + else + return matchind; +} + +/* Error reporting for argmatch. + KIND is a description of the type of entity that was being matched. + VALUE is the invalid value that was given. + PROBLEM is the return value from argmatch. */ + +void +invalid_arg (kind, value, problem) + char *kind; + char *value; + int problem; +{ + fprintf (stderr, "%s: ", program_name); + if (problem == -1) + fprintf (stderr, "invalid"); + else /* Assume -2. */ + fprintf (stderr, "ambiguous"); + fprintf (stderr, " %s `%s'\n", kind, value); +} @@ -0,0 +1,19 @@ +/* bcopy.c -- copy memory. + Copy LENGTH bytes from SOURCE to DEST. Does not null-terminate. + In the public domain. + By David MacKenzie <djm@gnu.ai.mit.edu>. */ + +void +bcopy (source, dest, length) + char *source, *dest; + unsigned length; +{ + if (source < dest) + /* Moving from low mem to hi mem; start at end. */ + for (source += length, dest += length; length; --length) + *--dest = *--source; + else if (source != dest) + /* Moving from hi mem to low mem; start at beginning. */ + for (; length; --length) + *dest++ = *source++; +} diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..9b8f8ae --- /dev/null +++ b/configure.ac @@ -0,0 +1,119 @@ +dnl Process this file with autoconf to produce a configure script. +dnl This file is part of GNU cpio +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2, or (at your option) +dnl any later version. +dnl +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License along +dnl with this program; if not, write to the Free Software Foundation, Inc., +dnl 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +AC_INIT([GNU cpio], [2.5.90], [bug-cpio@gnu.org], [cpio]) +AC_CONFIG_SRCDIR(cpio.h) +AM_INIT_AUTOMAKE +AC_CONFIG_HEADERS([config.h]) + |