diff --git a/file.c b/file.c new file mode 100644 index 0000000..cabab79 --- /dev/null +++ b/file.c @@ -0,0 +1,85 @@ +/****************************************************************************** + * + * Copyright (c) 2017-2019 by Löwenware Ltd + * Please, refer LICENSE file for legal information + * + ******************************************************************************/ + +/** + * @file file.c + * @author Ilja Kartašov + * @brief + * + * @see https://lowenware.com/ + */ +#include +#include +#include +#include +#include +#include +#include + +#include +#include "file.h" + + +bool +cstuff_file_exists(const char *file) +{ + return ( access( file, F_OK ) != -1 ) ? true : false; +} + + +CStuffRetcode +cstuff_file_copy(const char *src, const char *dest) +{ + CStuffRetcode rc = CSTUFF_SYSCALL_ERROR; + int fd_src = open(src, O_RDWR), fd_dest, len; + struct stat src_stat; + + if (!(fd_src < 0)) { + if (lockf(fd_src, F_LOCK, 0) != -1) { + if (!stat(src, &src_stat)) { + fd_dest = open(dest, O_CREAT | O_WRONLY | O_TRUNC); + if (!(fd_dest < 0)) { + len = sendfile(fd_dest, fd_src, NULL, src_stat.st_size); + if (len == src_stat.st_size) { + rc = CSTUFF_SUCCESS; + } else { + fprintf(stderr, "sendfile error (%d != %d): %s\n", len, + (int)src_stat.st_size, strerror(errno)); + } + close(fd_dest); + } else { + fprintf(stderr, "dest open() error\n"); + } + } else { + fprintf(stderr, "src stat() error\n"); + } + if (lockf(fd_src, F_TEST, 0) == 0){ + lockf(fd_src, F_ULOCK, 0); + } + } else { + fprintf(stderr, "src lockf() error\n"); + } + close(fd_src); + } else { + fprintf(stderr, "src open() error\n"); + } + return rc; +} + + +CStuffRetcode +cstuff_file_move(const char *src, const char *dest) +{ + CStuffRetcode rc; + + if (!(rc = cstuff_file_copy(src, dest))) { + if (unlink(src) != 0) + return CSTUFF_SYSCALL_ERROR; + } + + return rc; +} diff --git a/file.h b/file.h new file mode 100644 index 0000000..28d39fb --- /dev/null +++ b/file.h @@ -0,0 +1,35 @@ +/****************************************************************************** + * + * Copyright (c) 2017-2019 by Löwenware Ltd + * Please, refer LICENSE file for legal information + * + ******************************************************************************/ + +/** + * @file file.h + * @author Ilja Kartašov + * @brief + * + * @see https://lowenware.com/ + */ + +#ifndef CSTUFF_FILE_H_3C3D5EDC_A624_4550_98A4_29AD5A41301D +#define CSTUFF_FILE_H_3C3D5EDC_A624_4550_98A4_29AD5A41301D + +#include +#include "retcode.h" + + +bool +cstuff_file_exists(const char *file); + + +CStuffRetcode +cstuff_file_copy(const char *src, const char *dest); + + +CStuffRetcode +cstuff_file_move(const char *src, const char *dest); + + +#endif /* !FILE_H */