int copyfile()

in utils/lndir/lndir.c [174:224]


int copyfile(const char *oldpath, const char *newpath) {
    FILE *f_old;
    FILE *f_new;
    int e;
    ssize_t s;
    char buf[BUFSIZE];

#if defined(SYMLINKS)
    if (copy == 0) {
        return symlink(oldpath, newpath);
    } else {
#endif
        f_old = __hs_fopen(oldpath, "rb");
        if (f_old == NULL) {
            return -1;
        }
        f_new = __hs_fopen(newpath, "wbx");
        if (f_new == NULL) {
            e = errno;
            fclose(f_old);
            errno = e;
            return -1;
        }
        while ((s = fread(buf, 1, BUFSIZE, f_old)) > 0) {
            if (fwrite(buf, 1, s, f_new) < s) {
                e = errno;
                fclose(f_old);
                fclose(f_new);
                errno = e;
                return -1;
            }
        }
        if (!feof(f_old)) {
            e = errno;
            fclose(f_old);
            fclose(f_new);
            errno = e;
            return -1;
        }
        if (fclose(f_new) == EOF) {
            e = errno;
            fclose(f_old);
            errno = e;
            return -1;
        }
        fclose(f_old);
        return 0;
#if defined(SYMLINKS)
    }
#endif
}