]> git.lizzy.rs Git - plan9front.git/blob - sys/src/ape/cmd/pax/pass.c
ape: bring strtod() in line with plan9's libc version
[plan9front.git] / sys / src / ape / cmd / pax / pass.c
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     
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
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 }