]>
git.proxmox.com Git - mirror_lxc.git/blob - src/lxc/file_utils.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 #ifndef __LXC_FILE_UTILS_H
4 #define __LXC_FILE_UTILS_H
12 #include <sys/types.h>
18 #include "memory_utils.h"
19 #include "syscall_wrappers.h"
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);
25 __hidden
extern int lxc_readat(int dirfd
, const char *filename
, void *buf
, size_t count
)
28 __hidden
extern int lxc_writeat(int dirfd
, const char *filename
, const void *buf
, size_t count
)
31 __hidden
extern int lxc_write_openat(const char *dir
, const char *filename
, const void *buf
,
32 size_t count
) __access_r(3, 4);
34 __hidden
extern int lxc_read_from_file(const char *filename
, void *buf
, size_t count
)
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);
40 __hidden
extern ssize_t
lxc_pwrite_nointr(int fd
, const void *buf
, size_t count
, off_t offset
)
43 __hidden
extern ssize_t
lxc_send_nointr(int sockfd
, void *buf
, size_t len
, int flags
)
46 __hidden
extern ssize_t
lxc_read_nointr(int fd
, void *buf
, size_t count
) __access_w(2, 3);
48 __access_w(2, 3) static inline int lxc_read_string_nointr(int fd
, char *buf
,
53 ret
= lxc_read_nointr(fd
, buf
, STRARRAYLEN(buf
));
57 return ret_errno(ENODATA
);
58 if ((size_t)ret
>= sizeof(buf
))
59 return ret_errno(E2BIG
);
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);
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);
70 __hidden
extern ssize_t
lxc_recv_nointr(int sockfd
, void *buf
, size_t len
, int flags
)
73 __hidden
extern ssize_t
lxc_recvmsg_nointr_iov(int sockfd
, struct iovec
*iov
, size_t iovlen
,
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
);
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
)
94 return __fd_to_fd(from
, to
) >= 0;
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
);
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
125 __hidden
extern bool same_file_lax(int fda
, int fdb
);
127 static inline int dup_cloexec(int fd
)
129 __do_close
int fd_dup
= -EBADF
;
135 if (fd_cloexec(fd_dup
, true))
138 return move_fd(fd_dup
);
141 __hidden
extern bool same_device(int fda
, const char *patha
, int fdb
,
144 #endif /* __LXC_FILE_UTILS_H */