X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=buf_subs.c;h=aff311aa6f28d5bf52d911ffdff57c70944b8ff5;hb=a547751988577b94d9cefd260173ec7e69b8669c;hp=ad5f78eb7b53a11c07923854c91acc347bebbaa7;hpb=def03712042d935b1238542b15d62f5121b9d5d2;p=debian%2Fpax diff --git a/buf_subs.c b/buf_subs.c index ad5f78e..aff311a 100644 --- a/buf_subs.c +++ b/buf_subs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: buf_subs.c,v 1.7 1997/09/01 18:29:46 deraadt Exp $ */ +/* $OpenBSD: buf_subs.c,v 1.21 2005/11/09 19:59:06 otto Exp $ */ /* $NetBSD: buf_subs.c,v 1.5 1995/03/21 09:07:08 cgd Exp $ */ /*- @@ -17,11 +17,7 @@ * 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 + * 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. * @@ -40,9 +36,9 @@ #ifndef lint #if 0 -static char sccsid[] = "@(#)buf_subs.c 8.2 (Berkeley) 4/18/94"; +static const char sccsid[] = "@(#)buf_subs.c 8.2 (Berkeley) 4/18/94"; #else -static char rcsid[] = "$OpenBSD: buf_subs.c,v 1.7 1997/09/01 18:29:46 deraadt Exp $"; +static const char rcsid[] = "$OpenBSD: buf_subs.c,v 1.21 2005/11/09 19:59:06 otto Exp $"; #endif #endif /* not lint */ @@ -89,13 +85,8 @@ off_t rdcnt; /* # of bytes read on current vol */ * 0 if ok, -1 if the user specified write block size violates pax spec */ -#ifdef __STDC__ int wr_start(void) -#else -int -wr_start() -#endif { buf = &(bufmem[BLKMULT]); /* @@ -124,7 +115,7 @@ wr_start() } /* - * we only allow wrblksz to be used with all archive operations + * we only allow wrblksz to be used with all archive operations */ blksz = rdblksz = wrblksz; if ((ar_open(arcname) < 0) && (ar_next() < 0)) @@ -142,13 +133,8 @@ wr_start() * 0 if ok, -1 otherwise */ -#ifdef __STDC__ int rd_start(void) -#else -int -rd_start() -#endif { /* * leave space for the header pushback (see get_arc()). If we are @@ -164,7 +150,7 @@ rd_start() } if (wrblksz % BLKMULT) { paxwarn(1, "Write block size %d is not a %d byte multiple", - wrblksz, BLKMULT); + wrblksz, BLKMULT); return(-1); } } @@ -185,13 +171,8 @@ rd_start() * set up buffer system for copying within the file system */ -#ifdef __STDC__ void cp_start(void) -#else -void -cp_start() -#endif { buf = &(bufmem[BLKMULT]); rdblksz = blksz = MAXBLK; @@ -206,13 +187,13 @@ cp_start() * the start of the header of the first file added to the archive. The * format specific end read function tells us how many bytes to move * backwards in the archive to be positioned BEFORE the trailer. Two - * different postions have to be adjusted, the O.S. file offset (e.g. the + * different position have to be adjusted, the O.S. file offset (e.g. the * position of the tape head) and the write point within the data we have * stored in the read (soon to become write) buffer. We may have to move * back several records (the number depends on the size of the archive * record and the size of the format trailer) to read up the record where * the first byte of the trailer is recorded. Trailers may span (and - * overlap) record boundries. + * overlap) record boundaries. * We first calculate which record has the first byte of the trailer. We * move the OS file offset back to the start of this record and read it * up. We set the buffer write pointer to be at this byte (the byte where @@ -220,25 +201,19 @@ cp_start() * start of this record so a flush of this buffer will replace the record * in the archive. * A major problem is rewriting this last record. For archives stored - * on disk files, this is trival. However, many devices are really picky + * on disk files, this is trivial. However, many devices are really picky * about the conditions under which they will allow a write to occur. - * Often devices restrict the conditions where writes can be made writes, - * so it may not be feasable to append archives stored on all types of - * devices. + * Often devices restrict the conditions where writes can be made, + * so it may not be feasible to append archives stored on all types of + * devices. * Return: * 0 for success, -1 for failure */ -#ifdef __STDC__ int appnd_start(off_t skcnt) -#else -int -appnd_start(skcnt) - off_t skcnt; -#endif { - register int res; + int res; off_t cnt; if (exit_val != 0) { @@ -322,7 +297,7 @@ appnd_start(skcnt) paxwarn(1, "Unable to rewrite archive trailer, cannot append."); return(-1); } - + /* * rd_sync() * A read error occurred on this archive volume. Resync the buffer and @@ -334,16 +309,11 @@ appnd_start(skcnt) * 0 on success, and -1 on failure */ -#ifdef __STDC__ int rd_sync(void) -#else -int -rd_sync() -#endif { - register int errcnt = 0; - register int res; + int errcnt = 0; + int res; /* * if the user says bail out on first fault, we are out of here... @@ -400,22 +370,15 @@ rd_sync() * pback() * push the data used during the archive id phase back into the I/O * buffer. This is required as we cannot be sure that the header does NOT - * overlap a block boundry (as in the case we are trying to recover a + * overlap a block boundary (as in the case we are trying to recover a * flawed archived). This was not designed to be used for any other * purpose. (What software engineering, HA!) * WARNING: do not even THINK of pback greater than BLKMULT, unless the * pback space is increased. */ -#ifdef __STDC__ void pback(char *pt, int cnt) -#else -void -pback(pt, cnt) - char *pt; - int cnt; -#endif { bufpt -= cnt; memcpy(bufpt, pt, cnt); @@ -424,27 +387,21 @@ pback(pt, cnt) /* * rd_skip() - * skip foward in the archive during a archive read. Used to get quickly + * skip forward in the archive during a archive read. Used to get quickly * past file data and padding for files the user did NOT select. * Return: * 0 if ok, -1 failure, and 1 when EOF on the archive volume was detected. */ -#ifdef __STDC__ int rd_skip(off_t skcnt) -#else -int -rd_skip(skcnt) - off_t skcnt; -#endif { off_t res; off_t cnt; off_t skipped = 0; /* - * consume what data we have in the buffer. If we have to move foward + * consume what data we have in the buffer. If we have to move forward * whole records, we call the low level skip function to see if we can * move within the archive without doing the expensive reads on data we * do not want. @@ -497,21 +454,16 @@ rd_skip(skcnt) return(0); } -/* +/* * wr_fin() * flush out any data (and pad if required) the last block. We always pad * with zero (even though we do not have to). Padding with 0 makes it a - * lot easier to recover if the archive is damaged. zero paddding SHOULD + * lot easier to recover if the archive is damaged. zero padding SHOULD * BE a requirement.... */ -#ifdef __STDC__ void wr_fin(void) -#else -void -wr_fin() -#endif { if (bufpt > buf) { memset(bufpt, 0, bufend - bufpt); @@ -526,22 +478,15 @@ wr_fin() * by format specific write routines to pass a file header). On failure we * punt. We do not allow the user to continue to write flawed archives. * We assume these headers are not very large (the memory copy we use is - * a bit expensive). + * a bit expensive). * Return: * 0 if buffer was filled ok, -1 o.w. (buffer flush failure) */ -#ifdef __STDC__ int -wr_rdbuf(register char *out, register int outcnt) -#else -int -wr_rdbuf(out, outcnt) - register char *out; - register int outcnt; -#endif +wr_rdbuf(char *out, int outcnt) { - register int cnt; + int cnt; /* * while there is data to copy copy into the write buffer. when the @@ -574,19 +519,12 @@ wr_rdbuf(out, outcnt) * -1 is a read error */ -#ifdef __STDC__ int -rd_wrbuf(register char *in, register int cpcnt) -#else -int -rd_wrbuf(in, cpcnt) - register char *in; - register int cpcnt; -#endif +rd_wrbuf(char *in, int cpcnt) { - register int res; - register int cnt; - register int incnt = cpcnt; + int res; + int cnt; + int incnt = cpcnt; /* * loop until we fill the buffer with the requested number of bytes @@ -597,7 +535,7 @@ rd_wrbuf(in, cpcnt) /* * read error, return what we got (or the error if * no data was copied). The caller must know that an - * error occured and has the best knowledge what to + * error occurred and has the best knowledge what to * do with it */ if ((res = cpcnt - incnt) > 0) @@ -620,7 +558,7 @@ rd_wrbuf(in, cpcnt) /* * wr_skip() - * skip foward during a write. In other words add padding to the file. + * skip forward during a write. In other words add padding to the file. * we add zero filled padding as it makes flawed archives much easier to * recover from. the caller tells us how many bytes of padding to add * This routine was not designed to add HUGE amount of padding, just small @@ -629,16 +567,10 @@ rd_wrbuf(in, cpcnt) * 0 if ok, -1 if there was a buf_flush failure */ -#ifdef __STDC__ int wr_skip(off_t skcnt) -#else -int -wr_skip(skcnt) - off_t skcnt; -#endif { - register int cnt; + int cnt; /* * loop while there is more padding to add @@ -673,20 +605,12 @@ wr_skip(skcnt) * 0, but "left" is set to be greater than zero. */ -#ifdef __STDC__ int wr_rdfile(ARCHD *arcn, int ifd, off_t *left) -#else -int -wr_rdfile(arcn, ifd, left) - ARCHD *arcn; - int ifd; - off_t *left; -#endif { - register int cnt; - register int res = 0; - register off_t size = arcn->sb.st_size; + int cnt; + int res = 0; + off_t size = arcn->sb.st_size; struct stat sb; /* @@ -742,32 +666,26 @@ wr_rdfile(arcn, ifd, left) * we return a 0 but "left" is set to be the amount unwritten */ -#ifdef __STDC__ int rd_wrfile(ARCHD *arcn, int ofd, off_t *left) -#else -int -rd_wrfile(arcn, ofd, left) - ARCHD *arcn; - int ofd; - off_t *left; -#endif { - register int cnt = 0; - register off_t size = arcn->sb.st_size; - register int res = 0; - register char *fnm = arcn->name; + int cnt = 0; + off_t size = arcn->sb.st_size; + int res = 0; + char *fnm = arcn->name; int isem = 1; int rem; int sz = MINFBSZ; - struct stat sb; - u_long crc = 0L; + struct stat sb; + u_int32_t crc = 0; /* * pass the blocksize of the file being written to the write routine, * if the size is zero, use the default MINFBSZ */ - if (fstat(ofd, &sb) == 0) { + if (ofd < 0) + sz = PAXPATHLEN + 1; /* GNU tar long link/file */ + else if (fstat(ofd, &sb) == 0) { if (sb.st_blksize > 0) sz = (int)sb.st_blksize; } else @@ -810,7 +728,7 @@ rd_wrfile(arcn, ofd, left) /* * if the last block has a file hole (all zero), we must make sure this * gets updated in the file. We force the last block of zeros to be - * written. just closing with the file offset moved foward may not put + * written. just closing with the file offset moved forward may not put * a hole at the end of the file. */ if (isem && (arcn->sb.st_size > 0L)) @@ -838,22 +756,14 @@ rd_wrfile(arcn, ofd, left) * destination file so we can properly copy files with holes. */ -#ifdef __STDC__ void cp_file(ARCHD *arcn, int fd1, int fd2) -#else -void -cp_file(arcn, fd1, fd2) - ARCHD *arcn; - int fd1; - int fd2; -#endif { - register int cnt; - register off_t cpcnt = 0L; - register int res = 0; - register char *fnm = arcn->name; - register int no_hole = 0; + int cnt; + off_t cpcnt = 0L; + int res = 0; + char *fnm = arcn->name; + int no_hole = 0; int isem = 1; int rem; int sz = MINFBSZ; @@ -880,7 +790,7 @@ cp_file(arcn, fd1, fd2) /* * read the source file and copy to destination file until EOF */ - for(;;) { + for (;;) { if ((cnt = read(fd1, buf, blksz)) <= 0) break; if (no_hole) @@ -910,7 +820,7 @@ cp_file(arcn, fd1, fd2) /* * if the last block has a file hole (all zero), we must make sure this * gets updated in the file. We force the last block of zeros to be - * written. just closing with the file offset moved foward may not put + * written. just closing with the file offset moved forward may not put * a hole at the end of the file. */ if (!no_hole && isem && (arcn->sb.st_size > 0L)) @@ -927,21 +837,16 @@ cp_file(arcn, fd1, fd2) * 0 when finished (user specified termination in ar_next()). */ -#ifdef __STDC__ int buf_fill(void) -#else -int -buf_fill() -#endif { - register int cnt; + int cnt; static int fini = 0; if (fini) return(0); - for(;;) { + for (;;) { /* * try to fill the buffer. on error the next archive volume is * opened and we try again. @@ -977,22 +882,16 @@ buf_fill() * 0 if all is ok, -1 when a write error occurs. */ -#ifdef __STDC__ int -buf_flush(register int bufcnt) -#else -int -buf_flush(bufcnt) - register int bufcnt; -#endif +buf_flush(int bufcnt) { - register int cnt; - register int push = 0; - register int totcnt = 0; + int cnt; + int push = 0; + int totcnt = 0; /* * if we have reached the user specified byte count for each archive - * volume, prompt for the next volume. (The non-standrad -R flag). + * volume, prompt for the next volume. (The non-standard -R flag). * NOTE: If the wrlimit is smaller than wrcnt, we will always write * at least one record. We always round limit UP to next blocksize. */