diff --git a/HISTORY b/HISTORY index ed3fe86..1f541ba 100644 --- a/HISTORY +++ b/HISTORY @@ -1,6 +1,7 @@ -Version 1.57 2022-03-14 +Version 1.57 2022-03-16 * add function fc_format_path + * add functions: fc_get_path_child_count and fc_copy_file Version 1.56 2022-03-09 * add function fc_gettid diff --git a/src/shared_func.c b/src/shared_func.c index ee4974e..0962382 100644 --- a/src/shared_func.c +++ b/src/shared_func.c @@ -318,9 +318,9 @@ int getUserProcIds(const char *progName, const bool bAllOwners, \ strcpy(pTargetProg, ptr + 1); } - while( (dirp = readdir(dp)) != NULL ) + while ((dirp=readdir(dp)) != NULL) { - if (strcmp(dirp->d_name, ".")==0 || strcmp(dirp->d_name, "..")==0 ) + if (strcmp(dirp->d_name, ".")==0 || strcmp(dirp->d_name, "..")==0) { continue; } @@ -412,6 +412,34 @@ int getExecResult(const char *command, char *output, const int buff_size) #endif +int fc_get_path_child_count(const char *path) +{ + int count; + struct dirent *ent; + DIR *dir; + + if ((dir=opendir(path)) == NULL) + { + logError("file: "__FILE__", line: %d, " + "open dir %s fail, errno: %d, error info: %s", + __LINE__, path, errno, STRERROR(errno)); + return -1; + } + + count = 0; + while ((ent=readdir(dir)) != NULL) + { + if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) + { + continue; + } + ++count; + } + + closedir(dir); + return count; +} + char *toLowercase(char *src) { char *p; @@ -1442,6 +1470,94 @@ int safeWriteToFile(const char *filename, const char *buff, \ return 0; } +int fc_copy_file(const char *src_filename, const char *dest_filename) +{ + int result; + int src_fd; + int dest_fd; + int bytes; + char buff[16 * 1024]; + + src_fd = open(src_filename, O_RDONLY); + if (src_fd < 0) + { + result = errno != 0 ? errno : ENOENT; + logError("file: "__FILE__", line: %d, " + "open file %s fail, errno: %d, error info: %s", + __LINE__, src_filename, result, STRERROR(result)); + return result; + } + + dest_fd = open(dest_filename, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (dest_fd < 0) + { + result = errno != 0 ? errno : EIO; + logError("file: "__FILE__", line: %d, " + "open file %s fail, errno: %d, error info: %s", + __LINE__, dest_filename, result, STRERROR(result)); + close(src_fd); + return result; + } + + result = 0; + while (1) { + bytes = fc_safe_read(src_fd, buff, sizeof(buff)); + if (bytes < 0) + { + result = errno != 0 ? errno : EIO; + logError("file: "__FILE__", line: %d, " + "read file %s fail, errno: %d, error info: %s", + __LINE__, src_filename, result, STRERROR(result)); + break; + } + else if (bytes == 0) + { + break; + } + + if (fc_safe_write(dest_fd, buff, bytes) != bytes) + { + result = errno != 0 ? errno : EIO; + logError("file: "__FILE__", line: %d, " + "write file %s fail, errno: %d, error info: %s", + __LINE__, dest_filename, result, STRERROR(result)); + break; + } + } + + if (result == 0 && fsync(dest_fd) != 0) + { + result = errno != 0 ? errno : EIO; + logError("file: "__FILE__", line: %d, " + "fsync file %s fail, errno: %d, error info: %s", + __LINE__, dest_filename, result, STRERROR(result)); + } + + close(src_fd); + close(dest_fd); + return result; +} + +int fc_copy_to_path(const char *src_filename, const char *dest_path) +{ + char dest_filename[PATH_MAX]; + const char *fname; + + fname = strrchr(src_filename, '/'); + if (fname == NULL) + { + snprintf(dest_filename, sizeof(dest_filename), + "%s/%s", dest_path, src_filename); + } + else + { + snprintf(dest_filename, sizeof(dest_filename), + "%s%s", dest_path, fname); + } + + return fc_copy_file(src_filename, dest_filename); +} + void short2buff(const short n, char *buff) { unsigned char *p; diff --git a/src/shared_func.h b/src/shared_func.h index c61dfbc..19c0e01 100644 --- a/src/shared_func.h +++ b/src/shared_func.h @@ -1128,6 +1128,12 @@ static inline int fc_check_rename(const char *oldpath, const char *newpath) return fc_check_rename_ex(oldpath, newpath, overwritten); } +int fc_get_path_child_count(const char *path); + +int fc_copy_file(const char *src_filename, const char *dest_filename); + +int fc_copy_to_path(const char *src_filename, const char *dest_path); + int fc_get_first_line(const char *filename, char *buff, const int buff_size, string_t *line);