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 } 164