+#define BUFSIZE 1024
+int copyfile(const char *oldpath, const char *newpath) {
+ FILE *f_old;
+ FILE *f_new;
+ int e;
+ ssize_t s;
+ char buf[BUFSIZE];
+
+#ifdef SYMLINKS
+ if (copy == 0) {
+ return symlink(oldpath, newpath);
+ } else {
+#endif
+ f_old = fopen(oldpath, "rb");
+ if (f_old == NULL) {
+ return -1;
+ }
+ f_new = 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;
+#ifdef SYMLINKS
+ }
+#endif
+}