Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}