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