X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=copy.c;h=e54d15aced7595ccb11423b0de121db9051ad1f3;hb=77ce907786d2c4a7789e81c83a28e829c36fab30;hp=08a3d388a4c312fca18558b2b8e5dcf027c7afaf;hpb=03f99c03f806ca13b5974450409426c04af220f2;p=git.git diff --git a/copy.c b/copy.c index 08a3d388a..e54d15ace 100644 --- a/copy.c +++ b/copy.c @@ -3,15 +3,13 @@ int copy_fd(int ifd, int ofd) { while (1) { - int len; char buffer[8192]; char *buf = buffer; - len = xread(ifd, buffer, sizeof(buffer)); + ssize_t len = xread(ifd, buffer, sizeof(buffer)); if (!len) break; if (len < 0) { - int read_error; - read_error = errno; + int read_error = errno; close(ifd); return error("copy-fd: read returned %s", strerror(read_error)); @@ -26,9 +24,10 @@ int copy_fd(int ifd, int ofd) close(ifd); return error("copy-fd: write returned 0"); } else { + int write_error = errno; close(ifd); return error("copy-fd: write returned %s", - strerror(errno)); + strerror(write_error)); } } } @@ -36,3 +35,23 @@ int copy_fd(int ifd, int ofd) return 0; } +int copy_file(const char *dst, const char *src, int mode) +{ + int fdi, fdo, status; + + mode = (mode & 0111) ? 0777 : 0666; + if ((fdi = open(src, O_RDONLY)) < 0) + return fdi; + if ((fdo = open(dst, O_WRONLY | O_CREAT | O_EXCL, mode)) < 0) { + close(fdi); + return fdo; + } + status = copy_fd(fdi, fdo); + if (close(fdo) != 0) + return error("%s: close error: %s", dst, strerror(errno)); + + if (!status && adjust_shared_perm(dst)) + return -1; + + return status; +}