xref: /plan9/sys/src/ape/cmd/pax/pass.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier /* $Source: /u/mark/src/pax/RCS/pass.c,v $
2*9a747e4fSDavid du Colombier  *
3*9a747e4fSDavid du Colombier  * $Revision: 1.3 $
4*9a747e4fSDavid du Colombier  *
5*9a747e4fSDavid du Colombier  * pass.c - handle the pass option of cpio
6*9a747e4fSDavid du Colombier  *
7*9a747e4fSDavid du Colombier  * DESCRIPTION
8*9a747e4fSDavid du Colombier  *
9*9a747e4fSDavid du Colombier  *	These functions implement the pass options in PAX.  The pass option
10*9a747e4fSDavid du Colombier  *	copies files from one directory hierarchy to another.
11*9a747e4fSDavid du Colombier  *
12*9a747e4fSDavid du Colombier  * AUTHOR
13*9a747e4fSDavid du Colombier  *
14*9a747e4fSDavid du Colombier  *	Mark H. Colburn, NAPS International (mark@jhereg.mn.org)
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:	pass.c,v $
33*9a747e4fSDavid du Colombier  * Revision 1.3  89/02/12  10:29:51  mark
34*9a747e4fSDavid du Colombier  * Fixed misspelling of Replstr
35*9a747e4fSDavid du Colombier  *
36*9a747e4fSDavid du Colombier  * Revision 1.2  89/02/12  10:05:09  mark
37*9a747e4fSDavid du Colombier  * 1.2 release fixes
38*9a747e4fSDavid du Colombier  *
39*9a747e4fSDavid du Colombier  * Revision 1.1  88/12/23  18:02:20  mark
40*9a747e4fSDavid du Colombier  * Initial revision
41*9a747e4fSDavid du Colombier  *
42*9a747e4fSDavid du Colombier  */
43*9a747e4fSDavid du Colombier 
44*9a747e4fSDavid du Colombier #ifndef lint
45*9a747e4fSDavid du Colombier static char *ident = "$Id: pass.c,v 1.3 89/02/12 10:29:51 mark Exp $";
46*9a747e4fSDavid du Colombier static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
47*9a747e4fSDavid du Colombier #endif /* ! lint */
48*9a747e4fSDavid du Colombier 
49*9a747e4fSDavid du Colombier 
50*9a747e4fSDavid du Colombier /* Headers */
51*9a747e4fSDavid du Colombier 
52*9a747e4fSDavid du Colombier #include "pax.h"
53*9a747e4fSDavid du Colombier 
54*9a747e4fSDavid du Colombier 
55*9a747e4fSDavid du Colombier /* pass - copy within the filesystem
56*9a747e4fSDavid du Colombier  *
57*9a747e4fSDavid du Colombier  * DESCRIPTION
58*9a747e4fSDavid du Colombier  *
59*9a747e4fSDavid du Colombier  *	Pass copies the named files from the current directory hierarchy to
60*9a747e4fSDavid du Colombier  *	the directory pointed to by dirname.
61*9a747e4fSDavid du Colombier  *
62*9a747e4fSDavid du Colombier  * PARAMETERS
63*9a747e4fSDavid du Colombier  *
64*9a747e4fSDavid du Colombier  *	char	*dirname	- name of directory to copy named files to.
65*9a747e4fSDavid du Colombier  *
66*9a747e4fSDavid du Colombier  */
67*9a747e4fSDavid du Colombier 
68*9a747e4fSDavid du Colombier #ifdef __STDC__
69*9a747e4fSDavid du Colombier 
pass(char * dirname)70*9a747e4fSDavid du Colombier int pass(char *dirname)
71*9a747e4fSDavid du Colombier 
72*9a747e4fSDavid du Colombier #else
73*9a747e4fSDavid du Colombier 
74*9a747e4fSDavid du Colombier int pass(dirname)
75*9a747e4fSDavid du Colombier char	*dirname;
76*9a747e4fSDavid du Colombier 
77*9a747e4fSDavid du Colombier #endif
78*9a747e4fSDavid du Colombier {
79*9a747e4fSDavid du Colombier     char            name[PATH_MAX + 1];
80*9a747e4fSDavid du Colombier     int             fd;
81*9a747e4fSDavid du Colombier     Stat            sb;
82*9a747e4fSDavid du Colombier 
83*9a747e4fSDavid du Colombier     while (name_next(name, &sb) >= 0 && (fd = openin(name, &sb)) >= 0) {
84*9a747e4fSDavid du Colombier 
85*9a747e4fSDavid du Colombier 	if (rplhead != (Replstr *)NULL) {
86*9a747e4fSDavid du Colombier 	    rpl_name(name);
87*9a747e4fSDavid du Colombier 	}
88*9a747e4fSDavid du Colombier 	if (get_disposition("pass", name) || get_newname(name, sizeof(name))) {
89*9a747e4fSDavid du Colombier 	    /* skip file... */
90*9a747e4fSDavid du Colombier 	    if (fd) {
91*9a747e4fSDavid du Colombier 		close(fd);
92*9a747e4fSDavid du Colombier 	    }
93*9a747e4fSDavid du Colombier 	    continue;
94*9a747e4fSDavid du Colombier 	}
95*9a747e4fSDavid du Colombier 
96*9a747e4fSDavid du Colombier 	if (passitem(name, &sb, fd, dirname)) {
97*9a747e4fSDavid du Colombier 	    close(fd);
98*9a747e4fSDavid du Colombier 	}
99*9a747e4fSDavid du Colombier 	if (f_verbose) {
100*9a747e4fSDavid du Colombier 	    fprintf(stderr, "%s/%s\n", dirname, name);
101*9a747e4fSDavid du Colombier 	}
102*9a747e4fSDavid du Colombier     }
103*9a747e4fSDavid du Colombier }
104*9a747e4fSDavid du Colombier 
105*9a747e4fSDavid du Colombier 
106*9a747e4fSDavid du Colombier /* passitem - copy one file
107*9a747e4fSDavid du Colombier  *
108*9a747e4fSDavid du Colombier  * DESCRIPTION
109*9a747e4fSDavid du Colombier  *
110*9a747e4fSDavid du Colombier  *	Passitem copies a specific file to the named directory
111*9a747e4fSDavid du Colombier  *
112*9a747e4fSDavid du Colombier  * PARAMETERS
113*9a747e4fSDavid du Colombier  *
114*9a747e4fSDavid du Colombier  *	char   *from	- the name of the file to open
115*9a747e4fSDavid du Colombier  *	Stat   *asb	- the stat block associated with the file to copy
116*9a747e4fSDavid du Colombier  *	int	ifd	- the input file descriptor for the file to copy
117*9a747e4fSDavid du Colombier  *	char   *dir	- the directory to copy it to
118*9a747e4fSDavid du Colombier  *
119*9a747e4fSDavid du Colombier  * RETURNS
120*9a747e4fSDavid du Colombier  *
121*9a747e4fSDavid du Colombier  * 	Returns given input file descriptor or -1 if an error occurs.
122*9a747e4fSDavid du Colombier  *
123*9a747e4fSDavid du Colombier  * ERRORS
124*9a747e4fSDavid du Colombier  */
125*9a747e4fSDavid du Colombier 
126*9a747e4fSDavid du Colombier #ifdef __STDC__
127*9a747e4fSDavid du Colombier 
passitem(char * from,Stat * asb,int ifd,char * dir)128*9a747e4fSDavid du Colombier int passitem(char *from, Stat *asb, int ifd, char *dir)
129*9a747e4fSDavid du Colombier 
130*9a747e4fSDavid du Colombier #else
131*9a747e4fSDavid du Colombier 
132*9a747e4fSDavid du Colombier int passitem(from, asb, ifd, dir)
133*9a747e4fSDavid du Colombier char           *from;
134*9a747e4fSDavid du Colombier Stat           *asb;
135*9a747e4fSDavid du Colombier int             ifd;
136*9a747e4fSDavid du Colombier char           *dir;
137*9a747e4fSDavid du Colombier 
138*9a747e4fSDavid du Colombier #endif
139*9a747e4fSDavid du Colombier {
140*9a747e4fSDavid du Colombier     int             ofd;
141*9a747e4fSDavid du Colombier     time_t          tstamp[2];
142*9a747e4fSDavid du Colombier     char            to[PATH_MAX + 1];
143*9a747e4fSDavid du Colombier 
144*9a747e4fSDavid du Colombier     if (nameopt(strcat(strcat(strcpy(to, dir), "/"), from)) < 0) {
145*9a747e4fSDavid du Colombier 	return (-1);
146*9a747e4fSDavid du Colombier     }
147*9a747e4fSDavid du Colombier     if (asb->sb_nlink > 1) {
148*9a747e4fSDavid du Colombier 	linkto(to, asb);
149*9a747e4fSDavid du Colombier     }
150*9a747e4fSDavid du Colombier     if (f_link && islink(from, asb) == (Link *)NULL) {
151*9a747e4fSDavid du Colombier 	linkto(from, asb);
152*9a747e4fSDavid du Colombier     }
153*9a747e4fSDavid du Colombier     if ((ofd = openout(to, asb, islink(to, asb), 1)) < 0) {
154*9a747e4fSDavid du Colombier 	return (-1);
155*9a747e4fSDavid du Colombier     }
156*9a747e4fSDavid du Colombier     if (ofd > 0) {
157*9a747e4fSDavid du Colombier 	passdata(from, ifd, to, ofd);
158*9a747e4fSDavid du Colombier     }
159*9a747e4fSDavid du Colombier     tstamp[0] = asb->sb_atime;
160*9a747e4fSDavid du Colombier     tstamp[1] = f_mtime ? asb->sb_mtime : time((time_t *) 0);
161*9a747e4fSDavid du Colombier     utime(to, tstamp);
162*9a747e4fSDavid du Colombier     return (ifd);
163*9a747e4fSDavid du Colombier }
164