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