Mercurial > libjeffpc
annotate include/jeffpc/io.h @ 814:be934c5f8a42
io: add write_file_at
Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Sat, 29 Aug 2020 12:00:28 -0400 |
parents | 1b1a7ac50c23 |
children | a445315f2016 |
rev | line source |
---|---|
14
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
1 /* |
814
be934c5f8a42
io: add write_file_at
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
495
diff
changeset
|
2 * Copyright (c) 2011-2020 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
14
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
3 * |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
4 * Permission is hereby granted, free of charge, to any person obtaining a copy |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
5 * of this software and associated documentation files (the "Software"), to deal |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
6 * in the Software without restriction, including without limitation the rights |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
8 * copies of the Software, and to permit persons to whom the Software is |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
9 * furnished to do so, subject to the following conditions: |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
10 * |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
11 * The above copyright notice and this permission notice shall be included in |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
12 * all copies or substantial portions of the Software. |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
13 * |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
20 * SOFTWARE. |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
21 */ |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
22 |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
23 #ifndef __JEFFPC_IO_H |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
24 #define __JEFFPC_IO_H |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
25 |
20
67fa7606b340
io: x{open,close} wrappers for open & close syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
26 #include <sys/types.h> |
14
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
27 #include <sys/stat.h> |
20
67fa7606b340
io: x{open,close} wrappers for open & close syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
28 #include <unistd.h> |
67fa7606b340
io: x{open,close} wrappers for open & close syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
29 #include <fcntl.h> |
14
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
30 #include <string.h> |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
31 |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
32 #include <jeffpc/error.h> |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
33 |
92
8814b9de6cb9
io: add xp{read,write} as p{read,write} wrappers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
66
diff
changeset
|
34 /* |
8814b9de6cb9
io: add xp{read,write} as p{read,write} wrappers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
66
diff
changeset
|
35 * An incomplete read/write is considered an error. |
8814b9de6cb9
io: add xp{read,write} as p{read,write} wrappers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
66
diff
changeset
|
36 */ |
14
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
37 extern int xread(int fd, void *buf, size_t nbyte); |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
38 extern int xwrite(int fd, const void *buf, size_t nbyte); |
92
8814b9de6cb9
io: add xp{read,write} as p{read,write} wrappers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
66
diff
changeset
|
39 extern int xpread(int fd, void *buf, size_t nbyte, off_t off); |
8814b9de6cb9
io: add xp{read,write} as p{read,write} wrappers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
66
diff
changeset
|
40 extern int xpwrite(int fd, const void *buf, size_t nbyte, off_t off); |
8814b9de6cb9
io: add xp{read,write} as p{read,write} wrappers
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
66
diff
changeset
|
41 |
116
60def2979fad
io: add read_file_at helper
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
102
diff
changeset
|
42 extern char *read_file_common(int dirfd, const char *fname, struct stat *sb); |
814
be934c5f8a42
io: add write_file_at
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
495
diff
changeset
|
43 extern int write_file_at(int dirfd, const char *fname, const char *data, |
be934c5f8a42
io: add write_file_at
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
495
diff
changeset
|
44 size_t len); |
14
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
45 |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
46 static inline int xwrite_str(int fd, const char *s) |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
47 { |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
48 return xwrite(fd, s, strlen(s)); |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
49 } |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
50 |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
51 static inline char *read_file(const char *fname) |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
52 { |
116
60def2979fad
io: add read_file_at helper
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
102
diff
changeset
|
53 return read_file_common(AT_FDCWD, fname, NULL); |
60def2979fad
io: add read_file_at helper
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
102
diff
changeset
|
54 } |
60def2979fad
io: add read_file_at helper
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
102
diff
changeset
|
55 |
60def2979fad
io: add read_file_at helper
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
102
diff
changeset
|
56 static inline char *read_file_at(int dirfd, const char *fname) |
60def2979fad
io: add read_file_at helper
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
102
diff
changeset
|
57 { |
60def2979fad
io: add read_file_at helper
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
102
diff
changeset
|
58 return read_file_common(dirfd, fname, NULL); |
14
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
59 } |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
60 |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
61 static inline char *read_file_len(const char *fname, size_t *len) |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
62 { |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
63 struct stat sb; |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
64 char *ret; |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
65 |
116
60def2979fad
io: add read_file_at helper
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
102
diff
changeset
|
66 ret = read_file_common(AT_FDCWD, fname, &sb); |
14
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
67 if (!IS_ERR(ret)) |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
68 *len = sb.st_size; |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
69 |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
70 return ret; |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
71 } |
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
72 |
814
be934c5f8a42
io: add write_file_at
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
495
diff
changeset
|
73 static inline int write_file(const char *fname, const void *data, size_t len) |
be934c5f8a42
io: add write_file_at
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
495
diff
changeset
|
74 { |
be934c5f8a42
io: add write_file_at
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
495
diff
changeset
|
75 return write_file_at(AT_FDCWD, fname, data, len); |
be934c5f8a42
io: add write_file_at
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
495
diff
changeset
|
76 } |
be934c5f8a42
io: add write_file_at
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
495
diff
changeset
|
77 |
20
67fa7606b340
io: x{open,close} wrappers for open & close syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
78 static inline int xopen(const char *fname, int flags, mode_t mode) |
67fa7606b340
io: x{open,close} wrappers for open & close syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
79 { |
67fa7606b340
io: x{open,close} wrappers for open & close syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
80 int fd; |
67fa7606b340
io: x{open,close} wrappers for open & close syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
81 |
67fa7606b340
io: x{open,close} wrappers for open & close syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
82 fd = open(fname, flags, mode); |
21
081ae1401681
Use negated errnos throughout the library.
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
20
diff
changeset
|
83 return (fd == -1) ? -errno : fd; |
20
67fa7606b340
io: x{open,close} wrappers for open & close syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
84 } |
67fa7606b340
io: x{open,close} wrappers for open & close syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
85 |
100 | 86 static inline int xopenat(int dirfd, const char *fname, int flags, mode_t mode) |
87 { | |
88 int fd; | |
89 | |
90 fd = openat(dirfd, fname, flags, mode); | |
91 return (fd == -1) ? -errno : fd; | |
92 } | |
93 | |
20
67fa7606b340
io: x{open,close} wrappers for open & close syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
94 static inline int xclose(int fd) |
67fa7606b340
io: x{open,close} wrappers for open & close syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
95 { |
67fa7606b340
io: x{open,close} wrappers for open & close syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
96 if (close(fd) == -1) |
21
081ae1401681
Use negated errnos throughout the library.
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
20
diff
changeset
|
97 return -errno; |
20
67fa7606b340
io: x{open,close} wrappers for open & close syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
98 return 0; |
67fa7606b340
io: x{open,close} wrappers for open & close syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
99 } |
67fa7606b340
io: x{open,close} wrappers for open & close syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
14
diff
changeset
|
100 |
66
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
101 static inline int xstat(const char *restrict path, struct stat *restrict buf) |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
102 { |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
103 if (stat(path, buf) == -1) |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
104 return -errno; |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
105 return 0; |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
106 } |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
107 |
495 | 108 static inline int xfstat(int fd, struct stat *restrict buf) |
109 { | |
110 if (fstat(fd, buf) == -1) | |
111 return -errno; | |
112 return 0; | |
113 } | |
114 | |
66
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
115 static inline int xlstat(const char *restrict path, struct stat *restrict buf) |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
116 { |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
117 if (lstat(path, buf) == -1) |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
118 return -errno; |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
119 return 0; |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
120 } |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
121 |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
122 static inline int xmkdir(const char *path, mode_t mode) |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
123 { |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
124 if (mkdir(path, mode) == -1) |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
125 return -errno; |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
126 return 0; |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
127 } |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
128 |
216
c7dbc3196ba5
io: add xmkdirat
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
116
diff
changeset
|
129 static inline int xmkdirat(int dirfd, const char *path, mode_t mode) |
c7dbc3196ba5
io: add xmkdirat
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
116
diff
changeset
|
130 { |
c7dbc3196ba5
io: add xmkdirat
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
116
diff
changeset
|
131 if (mkdirat(dirfd, path, mode) == -1) |
c7dbc3196ba5
io: add xmkdirat
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
116
diff
changeset
|
132 return -errno; |
c7dbc3196ba5
io: add xmkdirat
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
116
diff
changeset
|
133 return 0; |
c7dbc3196ba5
io: add xmkdirat
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
116
diff
changeset
|
134 } |
c7dbc3196ba5
io: add xmkdirat
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
116
diff
changeset
|
135 |
66
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
136 static inline int xrename(const char *old, const char *new) |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
137 { |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
138 if (rename(old, new) == -1) |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
139 return -errno; |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
140 return 0; |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
141 } |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
142 |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
143 static inline int xunlink(const char *path) |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
144 { |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
145 if (unlink(path) == -1) |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
146 return -errno; |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
147 return 0; |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
148 } |
ccf2206c4b35
io: wrap {stat,lstat,mkdir,rename,unlink} syscalls
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
21
diff
changeset
|
149 |
102
f9c7df13deda
io: add xunlinkat
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
101
diff
changeset
|
150 static inline int xunlinkat(int dirfd, const char *path, int flag) |
f9c7df13deda
io: add xunlinkat
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
101
diff
changeset
|
151 { |
f9c7df13deda
io: add xunlinkat
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
101
diff
changeset
|
152 if (unlinkat(dirfd, path, flag) == -1) |
f9c7df13deda
io: add xunlinkat
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
101
diff
changeset
|
153 return -errno; |
f9c7df13deda
io: add xunlinkat
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
101
diff
changeset
|
154 return 0; |
f9c7df13deda
io: add xunlinkat
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
101
diff
changeset
|
155 } |
f9c7df13deda
io: add xunlinkat
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
101
diff
changeset
|
156 |
101
8139e2a17ef2
io: add xftruncate
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
100
diff
changeset
|
157 static inline int xftruncate(int fd, off_t len) |
8139e2a17ef2
io: add xftruncate
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
100
diff
changeset
|
158 { |
8139e2a17ef2
io: add xftruncate
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
100
diff
changeset
|
159 if (ftruncate(fd, len) == -1) |
8139e2a17ef2
io: add xftruncate
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
100
diff
changeset
|
160 return -errno; |
8139e2a17ef2
io: add xftruncate
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
100
diff
changeset
|
161 return 0; |
8139e2a17ef2
io: add xftruncate
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
100
diff
changeset
|
162 } |
8139e2a17ef2
io: add xftruncate
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
100
diff
changeset
|
163 |
411 | 164 static inline int xfsync(int fd) |
165 { | |
166 if (fsync(fd) == -1) | |
167 return -errno; | |
168 return 0; | |
169 } | |
170 | |
14
33b45c955db2
io: safe file reading & writing functions
Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
parents:
diff
changeset
|
171 #endif |