mv.c (22988) | mv.c (23525) |
---|---|
1/* 2 * Copyright (c) 1989, 1993, 1994 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Ken Smith of The State University of New York at Buffalo. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 19 unchanged lines hidden (view full) --- 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * | 1/* 2 * Copyright (c) 1989, 1993, 1994 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Ken Smith of The State University of New York at Buffalo. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 19 unchanged lines hidden (view full) --- 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * |
36 * $Id$ | 36 * $Id: mv.c,v 1.11 1997/02/22 14:04:12 peter Exp $ |
37 */ 38 39#ifndef lint 40static char const copyright[] = 41"@(#) Copyright (c) 1989, 1993, 1994\n\ 42 The Regents of the University of California. All rights reserved.\n"; 43#endif /* not lint */ 44 --- 156 unchanged lines hidden (view full) --- 201int 202fastcopy(from, to, sbp) 203 char *from, *to; 204 struct stat *sbp; 205{ 206 struct timeval tval[2]; 207 static u_int blen; 208 static char *bp; | 37 */ 38 39#ifndef lint 40static char const copyright[] = 41"@(#) Copyright (c) 1989, 1993, 1994\n\ 42 The Regents of the University of California. All rights reserved.\n"; 43#endif /* not lint */ 44 --- 156 unchanged lines hidden (view full) --- 201int 202fastcopy(from, to, sbp) 203 char *from, *to; 204 struct stat *sbp; 205{ 206 struct timeval tval[2]; 207 static u_int blen; 208 static char *bp; |
209 mode_t oldmode; |
|
209 register int nread, from_fd, to_fd; 210 211 if ((from_fd = open(from, O_RDONLY, 0)) < 0) { 212 warn("%s", from); 213 return (1); 214 } | 210 register int nread, from_fd, to_fd; 211 212 if ((from_fd = open(from, O_RDONLY, 0)) < 0) { 213 warn("%s", from); 214 return (1); 215 } |
215 if ((to_fd = 216 open(to, O_CREAT | O_TRUNC | O_WRONLY, sbp->st_mode)) < 0) { | 216 if (blen < sbp->st_blksize) { 217 if (bp != NULL) 218 free(bp); 219 if ((bp = malloc(sbp->st_blksize)) == NULL) { 220 blen = 0; 221 warnx("malloc failed"); 222 return (1); 223 } 224 blen = sbp->st_blksize; 225 } 226 while ((to_fd = 227 open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)) < 0) { 228 if (errno == EEXIST && unlink(to) == 0) 229 continue; |
217 warn("%s", to); 218 (void)close(from_fd); 219 return (1); 220 } | 230 warn("%s", to); 231 (void)close(from_fd); 232 return (1); 233 } |
221 if (!blen && !(bp = malloc(blen = sbp->st_blksize))) { 222 warn(NULL); 223 return (1); 224 } | |
225 while ((nread = read(from_fd, bp, blen)) > 0) 226 if (write(to_fd, bp, nread) != nread) { 227 warn("%s", to); 228 goto err; 229 } 230 if (nread < 0) { 231 warn("%s", from); 232err: if (unlink(to)) 233 warn("%s: remove", to); 234 (void)close(from_fd); 235 (void)close(to_fd); 236 return (1); 237 } 238 (void)close(from_fd); 239 | 234 while ((nread = read(from_fd, bp, blen)) > 0) 235 if (write(to_fd, bp, nread) != nread) { 236 warn("%s", to); 237 goto err; 238 } 239 if (nread < 0) { 240 warn("%s", from); 241err: if (unlink(to)) 242 warn("%s: remove", to); 243 (void)close(from_fd); 244 (void)close(to_fd); 245 return (1); 246 } 247 (void)close(from_fd); 248 |
240 if (fchown(to_fd, sbp->st_uid, sbp->st_gid)) 241 warn("%s: set owner/group", to); | 249 oldmode = sbp->st_mode & ALLPERMS; 250 if (fchown(to_fd, sbp->st_uid, sbp->st_gid)) { 251 warn("%s: set owner/group (was: %u/%u)", to, sbp->st_uid, 252 sbp->st_gid); 253 if (oldmode & (S_ISUID | S_ISGID)) { 254 warnx( 255"%s: owner/group changed; clearing suid/sgid (mode was 0%03o)", 256 to, oldmode); 257 sbp->st_mode &= ~(S_ISUID | S_ISGID); 258 } 259 } |
242 if (fchmod(to_fd, sbp->st_mode)) | 260 if (fchmod(to_fd, sbp->st_mode)) |
243 warn("%s: set mode", to); | 261 warn("%s: set mode (was: 0%03o)", to, oldmode); |
244 245 tval[0].tv_sec = sbp->st_atime; 246 tval[1].tv_sec = sbp->st_mtime; 247 tval[0].tv_usec = tval[1].tv_usec = 0; 248 if (utimes(to, tval)) 249 warn("%s: set times", to); 250 251 if (close(to_fd)) { --- 64 unchanged lines hidden --- | 262 263 tval[0].tv_sec = sbp->st_atime; 264 tval[1].tv_sec = sbp->st_mtime; 265 tval[0].tv_usec = tval[1].tv_usec = 0; 266 if (utimes(to, tval)) 267 warn("%s: set times", to); 268 269 if (close(to_fd)) { --- 64 unchanged lines hidden --- |