xref: /plan9/sys/src/ape/cmd/pax/append.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier /* $Source: /u/mark/src/pax/RCS/append.c,v $
2*9a747e4fSDavid du Colombier  *
3*9a747e4fSDavid du Colombier  * $Revision: 1.2 $
4*9a747e4fSDavid du Colombier  *
5*9a747e4fSDavid du Colombier  * append.c - append to a tape archive.
6*9a747e4fSDavid du Colombier  *
7*9a747e4fSDavid du Colombier  * DESCRIPTION
8*9a747e4fSDavid du Colombier  *
9*9a747e4fSDavid du Colombier  *	Routines to allow appending of archives
10*9a747e4fSDavid du Colombier  *
11*9a747e4fSDavid du Colombier  * AUTHORS
12*9a747e4fSDavid du Colombier  *
13*9a747e4fSDavid du Colombier  *     	Mark H. Colburn, NAPS International (mark@jhereg.mn.org)
14*9a747e4fSDavid du Colombier  *
15*9a747e4fSDavid du Colombier  *
16*9a747e4fSDavid du Colombier  * Sponsored by The USENIX Association for public distribution.
17*9a747e4fSDavid du Colombier  *
18*9a747e4fSDavid du Colombier  * Copyright (c) 1989 Mark H. Colburn.
19*9a747e4fSDavid du Colombier  * All rights reserved.
20*9a747e4fSDavid du Colombier  *
21*9a747e4fSDavid du Colombier  * Redistribution and use in source and binary forms are permitted
22*9a747e4fSDavid du Colombier  * provided that the above copyright notice is duplicated in all such
23*9a747e4fSDavid du Colombier  * forms and that any documentation, advertising materials, and other
24*9a747e4fSDavid du Colombier  * materials related to such distribution and use acknowledge that the
25*9a747e4fSDavid du Colombier  * software was developed * by Mark H. Colburn and sponsored by The
26*9a747e4fSDavid du Colombier  * USENIX Association.
27*9a747e4fSDavid du Colombier  *
28*9a747e4fSDavid du Colombier  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
29*9a747e4fSDavid du Colombier  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
30*9a747e4fSDavid du Colombier  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
31*9a747e4fSDavid du Colombier  *
32*9a747e4fSDavid du Colombier  * $Log:	append.c,v $
33*9a747e4fSDavid du Colombier  * Revision 1.2  89/02/12  10:03:58  mark
34*9a747e4fSDavid du Colombier  * 1.2 release fixes
35*9a747e4fSDavid du Colombier  *
36*9a747e4fSDavid du Colombier  * Revision 1.1  88/12/23  18:02:00  mark
37*9a747e4fSDavid du Colombier  * Initial revision
38*9a747e4fSDavid du Colombier  *
39*9a747e4fSDavid du Colombier  */
40*9a747e4fSDavid du Colombier 
41*9a747e4fSDavid du Colombier #ifndef lint
42*9a747e4fSDavid du Colombier static char *ident = "$Id: append.c,v 1.2 89/02/12 10:03:58 mark Exp $";
43*9a747e4fSDavid du Colombier static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
44*9a747e4fSDavid du Colombier #endif /* ! lint */
45*9a747e4fSDavid du Colombier 
46*9a747e4fSDavid du Colombier 
47*9a747e4fSDavid du Colombier /* Headers */
48*9a747e4fSDavid du Colombier 
49*9a747e4fSDavid du Colombier #include "pax.h"
50*9a747e4fSDavid du Colombier 
51*9a747e4fSDavid du Colombier 
52*9a747e4fSDavid du Colombier /* append_archive - main loop for appending to a tar archive
53*9a747e4fSDavid du Colombier  *
54*9a747e4fSDavid du Colombier  * DESCRIPTION
55*9a747e4fSDavid du Colombier  *
56*9a747e4fSDavid du Colombier  *	Append_archive reads an archive until the end of the archive is
57*9a747e4fSDavid du Colombier  *	reached once the archive is reached, the buffers are reset and the
58*9a747e4fSDavid du Colombier  *	create_archive function is called to handle the actual writing of
59*9a747e4fSDavid du Colombier  *	the appended archive data.  This is quite similar to the
60*9a747e4fSDavid du Colombier  *	read_archive function, however, it does not do all the processing.
61*9a747e4fSDavid du Colombier  */
62*9a747e4fSDavid du Colombier 
63*9a747e4fSDavid du Colombier #ifdef __STDC__
64*9a747e4fSDavid du Colombier 
append_archive(void)65*9a747e4fSDavid du Colombier void append_archive(void)
66*9a747e4fSDavid du Colombier 
67*9a747e4fSDavid du Colombier #else
68*9a747e4fSDavid du Colombier 
69*9a747e4fSDavid du Colombier void append_archive()
70*9a747e4fSDavid du Colombier 
71*9a747e4fSDavid du Colombier #endif
72*9a747e4fSDavid du Colombier {
73*9a747e4fSDavid du Colombier     Stat            sb;
74*9a747e4fSDavid du Colombier     char            name[PATH_MAX + 1];
75*9a747e4fSDavid du Colombier 
76*9a747e4fSDavid du Colombier     name[0] = '\0';
77*9a747e4fSDavid du Colombier     while (get_header(name, &sb) == 0) {
78*9a747e4fSDavid du Colombier 	if (((ar_format == TAR)
79*9a747e4fSDavid du Colombier 	     ? buf_skip(ROUNDUP((OFFSET) sb.sb_size, BLOCKSIZE))
80*9a747e4fSDavid du Colombier 	     : buf_skip((OFFSET) sb.sb_size)) < 0) {
81*9a747e4fSDavid du Colombier 	    warn(name, "File data is corrupt");
82*9a747e4fSDavid du Colombier 	}
83*9a747e4fSDavid du Colombier     }
84*9a747e4fSDavid du Colombier     /* we have now gotten to the end of the archive... */
85*9a747e4fSDavid du Colombier 
86*9a747e4fSDavid du Colombier     /* reset the buffer now that we have read the entire archive */
87*9a747e4fSDavid du Colombier     bufend = bufidx = bufstart;
88*9a747e4fSDavid du Colombier     create_archive();
89*9a747e4fSDavid du Colombier }
90