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