]> git.proxmox.com Git - mirror_lxc.git/blob - src/lxc/file_utils.h
Merge pull request #4236 from mihalicyn/github_check_fixes
[mirror_lxc.git] / src / lxc / file_utils.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2
3 #ifndef __LXC_FILE_UTILS_H
4 #define __LXC_FILE_UTILS_H
5
6 #include "config.h"
7
8 #include <fcntl.h>
9 #include <stdbool.h>
10 #include <stdio.h>
11 #include <sys/stat.h>
12 #include <sys/types.h>
13 #include <sys/uio.h>
14 #include <sys/vfs.h>
15 #include <unistd.h>
16
17 #include "compiler.h"
18 #include "memory_utils.h"
19 #include "syscall_wrappers.h"
20
21 /* read and write whole files */
22 __hidden extern int lxc_write_to_file(const char *filename, const void *buf, size_t count,
23 bool add_newline, mode_t mode) __access_r(2, 3);
24
25 __hidden extern int lxc_readat(int dirfd, const char *filename, void *buf, size_t count)
26 __access_w(3, 4);
27
28 __hidden extern int lxc_writeat(int dirfd, const char *filename, const void *buf, size_t count)
29 __access_r(3, 4);
30
31 __hidden extern int lxc_write_openat(const char *dir, const char *filename, const void *buf,
32 size_t count) __access_r(3, 4);
33
34 __hidden extern int lxc_read_from_file(const char *filename, void *buf, size_t count)
35 __access_w(2, 3);
36
37 /* send and receive buffers completely */
38 __hidden extern ssize_t lxc_write_nointr(int fd, const void *buf, size_t count) __access_r(2, 3);
39
40 __hidden extern ssize_t lxc_pwrite_nointr(int fd, const void *buf, size_t count, off_t offset)
41 __access_r(2, 3);
42
43 __hidden extern ssize_t lxc_send_nointr(int sockfd, void *buf, size_t len, int flags)
44 __access_r(2, 3);
45
46 __hidden extern ssize_t lxc_read_nointr(int fd, void *buf, size_t count) __access_w(2, 3);
47
48 __access_w(2, 3) static inline int lxc_read_string_nointr(int fd, char *buf,
49 size_t count)
50 {
51 ssize_t ret;
52
53 ret = lxc_read_nointr(fd, buf, STRARRAYLEN(buf));
54 if (ret < 0)
55 return -errno;
56 if (ret == 0)
57 return ret_errno(ENODATA);
58 if ((size_t)ret >= sizeof(buf))
59 return ret_errno(E2BIG);
60 buf[ret] = '\0';
61 return 0;
62 }
63
64 __hidden extern ssize_t lxc_read_nointr_expect(int fd, void *buf, size_t count,
65 const void *expected_buf) __access_w(2, 3);
66
67 __hidden extern ssize_t lxc_read_file_expect(const char *path, void *buf, size_t count,
68 const void *expected_buf) __access_w(2, 3);
69
70 __hidden extern ssize_t lxc_recv_nointr(int sockfd, void *buf, size_t len, int flags)
71 __access_w(2, 3);
72
73 __hidden extern ssize_t lxc_recvmsg_nointr_iov(int sockfd, struct iovec *iov, size_t iovlen,
74 int flags);
75
76 __hidden extern bool file_exists(const char *f);
77 __hidden extern int print_to_file(const char *file, const char *content);
78 __hidden extern int is_dir(const char *path);
79 __hidden extern int lxc_count_file_lines(const char *fn);
80 __hidden extern int lxc_make_tmpfile(char *template, bool rm);
81
82 /* __typeof__ should be safe to use with all compilers. */
83 typedef __typeof__(((struct statfs *)NULL)->f_type) fs_type_magic;
84 __hidden extern bool has_fs_type(const char *path, fs_type_magic magic_val);
85 __hidden extern bool fhas_fs_type(int fd, fs_type_magic magic_val);
86 __hidden extern bool is_fs_type(const struct statfs *fs, fs_type_magic magic_val);
87 __hidden extern FILE *fopen_cloexec(const char *path, const char *mode);
88 __hidden extern ssize_t lxc_sendfile_nointr(int out_fd, int in_fd, off_t *offset, size_t count);
89 __hidden extern char *file_to_buf(const char *path, size_t *length);
90 __hidden extern int fd_to_buf(int fd, char **buf, size_t *length);
91 __hidden extern ssize_t __fd_to_fd(int from, int to);
92 static inline int fd_to_fd(int from, int to)
93 {
94 return __fd_to_fd(from, to) >= 0;
95 }
96 __hidden extern int fd_cloexec(int fd, bool cloexec);
97 __hidden extern int lxc_open_dirfd(const char *dir);
98 __hidden extern FILE *fdopen_cached(int fd, const char *mode, void **caller_freed_buffer);
99 __hidden extern FILE *fdopen_at(int dfd, const char *path, const char *mode,
100 unsigned int o_flags,
101 unsigned int resolve_flags);
102 __hidden extern FILE *fopen_cached(const char *path, const char *mode, void **caller_freed_buffer);
103 __hidden extern int timens_offset_write(clockid_t clk_id, int64_t s_offset, int64_t ns_offset);
104 __hidden extern bool exists_dir_at(int dir_fd, const char *path);
105 __hidden extern bool exists_file_at(int dir_fd, const char *path);
106 __hidden extern int open_at(int dfd, const char *path, unsigned int o_flags,
107 unsigned int resolve_flags, mode_t mode);
108 __hidden extern int open_at_same(int fd_same, int dfd, const char *path,
109 unsigned int o_flags,
110 unsigned int resolve_flags, mode_t mode);
111 __hidden extern int open_beneath(int dfd, const char *path, unsigned int flags);
112 __hidden int fd_make_nonblocking(int fd);
113 __hidden extern char *read_file_at(int dfd, const char *fnam,
114 unsigned int o_flags,
115 unsigned resolve_flags);
116 __hidden extern ssize_t lxc_read_try_buf_at(int dfd, const char *path,
117 void *buf, size_t count);
118
119 /*
120 * Check if two fds refer to the same file.
121 * The function is "lax" in so far, as it doesn't care whether fda and fdb have
122 * the same flags or whether they share the same device context when they refer
123 * to devices.
124 */
125 __hidden extern bool same_file_lax(int fda, int fdb);
126
127 static inline int dup_cloexec(int fd)
128 {
129 __do_close int fd_dup = -EBADF;
130
131 fd_dup = dup(fd);
132 if (fd_dup < 0)
133 return -errno;
134
135 if (fd_cloexec(fd_dup, true))
136 return -errno;
137
138 return move_fd(fd_dup);
139 }
140
141 __hidden extern bool same_device(int fda, const char *patha, int fdb,
142 const char *pathb);
143
144 #endif /* __LXC_FILE_UTILS_H */