diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-14 19:10:49 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-14 19:10:49 +0000 |
commit | cfe5e3905201349e9cf3f95d52ff4bd100bde37d (patch) | |
tree | d0baf160cbee3195249d095f85e52d20c21acf02 /include/fileutils.h | |
parent | Initial commit. (diff) | |
download | util-linux-cfe5e3905201349e9cf3f95d52ff4bd100bde37d.tar.xz util-linux-cfe5e3905201349e9cf3f95d52ff4bd100bde37d.zip |
Adding upstream version 2.39.3.upstream/2.39.3
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'include/fileutils.h')
-rw-r--r-- | include/fileutils.h | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/include/fileutils.h b/include/fileutils.h new file mode 100644 index 0000000..538eab0 --- /dev/null +++ b/include/fileutils.h @@ -0,0 +1,118 @@ +/* + * No copyright is claimed. This code is in the public domain; do with + * it what you wish. + **/ +#ifndef UTIL_LINUX_FILEUTILS +#define UTIL_LINUX_FILEUTILS + +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <dirent.h> +#include <sys/stat.h> + +#include "c.h" + +extern int mkstemp_cloexec(char *template); + +extern int xmkstemp(char **tmpname, const char *dir, const char *prefix); + +static inline FILE *xfmkstemp(char **tmpname, const char *dir, const char *prefix) +{ + int fd; + FILE *ret; + + fd = xmkstemp(tmpname, dir, prefix); + if (fd == -1) + return NULL; + + if (!(ret = fdopen(fd, "w+" UL_CLOEXECSTR))) { + close(fd); + return NULL; + } + return ret; +} + +#ifdef HAVE_OPENAT +static inline FILE *fopen_at(int dir, const char *filename, + int flags, const char *mode) +{ + int fd = openat(dir, filename, flags); + FILE *ret; + + if (fd < 0) + return NULL; + + ret = fdopen(fd, mode); + if (!ret) + close(fd); + return ret; +} +#endif + +static inline int is_same_inode(const int fd, const struct stat *st) +{ + struct stat f; + + if (fstat(fd, &f) < 0) + return 0; + else if (f.st_dev != st->st_dev || f.st_ino != st->st_ino) + return 0; + return 1; +} + +extern int dup_fd_cloexec(int oldfd, int lowfd); +extern unsigned int get_fd_tabsize(void); + +extern int ul_mkdir_p(const char *path, mode_t mode); +extern char *stripoff_last_component(char *path); + +/* This is readdir()-like function, but skips "." and ".." directory entries */ +static inline struct dirent *xreaddir(DIR *dp) +{ + struct dirent *d; + + while ((d = readdir(dp))) { + if (!strcmp(d->d_name, ".") || + !strcmp(d->d_name, "..")) + continue; + break; + } + return d; +} + + +#ifdef HAVE_SYS_SYSCALL_H +# include <sys/syscall.h> + +# if !defined(HAVE_CLOSE_RANGE) && defined(SYS_close_range) +# include <sys/types.h> +static inline int close_range(unsigned int first, unsigned int last, int flags) +{ + return syscall(SYS_close_range, first, last, flags); +} +# define HAVE_CLOSE_RANGE 1 +# endif /* SYS_close_range */ + +# if !defined(HAVE_STATX) && defined(HAVE_STRUCT_STATX) && defined(SYS_statx) +static inline int statx(int fd, const char *restrict path, int flags, + unsigned int mask, struct statx *stx) +{ + return syscall(SYS_statx, fd, path, flags, mask, stx); +} +# define HAVE_STATX 1 +# endif /* SYS_statx */ + +#endif /* HAVE_SYS_SYSCALL_H */ + + +extern void ul_close_all_fds(unsigned int first, unsigned int last); + +#define UL_COPY_READ_ERROR (-1) +#define UL_COPY_WRITE_ERROR (-2) +int ul_copy_file(int from, int to); + + +extern int ul_reopen(int fd, int flags); + +#endif /* UTIL_LINUX_FILEUTILS */ |