123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- //
- // file_utils.c
- // electra
- //
- // Created by Jamie on 27/01/2018.
- // Copyright © 2018 Electra Team. All rights reserved.
- //
- #include "file_utils.h"
- #include <sys/stat.h>
- #include <sys/fcntl.h>
- #include <unistd.h>
- #include <errno.h>
- int file_exists_electra(const char *filename) {
- struct stat buffer;
- int r = stat(filename, &buffer);
- return (r == 0);
- }
- int cp_electra(const char *to, const char *from) {
- int fd_to, fd_from;
- char buf[4096];
- ssize_t nread;
- int saved_errno;
-
- fd_from = open(from, O_RDONLY);
- if (fd_from < 0)
- return -1;
-
- fd_to = open(to, O_WRONLY | O_CREAT | O_EXCL, 0666);
- if (fd_to < 0)
- goto out_error;
-
- while ((nread = read(fd_from, buf, sizeof buf)) > 0) {
- char *out_ptr = buf;
- ssize_t nwritten;
-
- do {
- nwritten = write(fd_to, out_ptr, nread);
-
- if (nwritten >= 0) {
- nread -= nwritten;
- out_ptr += nwritten;
- }
- else if (errno != EINTR) {
- goto out_error;
- }
- } while (nread > 0);
- }
-
- if (nread == 0)
- {
- if (close(fd_to) < 0)
- {
- fd_to = -1;
- goto out_error;
- }
- close(fd_from);
-
- /* Success! */
- return 0;
- }
-
- out_error:
- saved_errno = errno;
-
- close(fd_from);
- if (fd_to >= 0)
- close(fd_to);
-
- errno = saved_errno;
- return -1;
- }
|