chiark / gitweb /
tree-wide: replace all readdir cycles with FOREACH_DIRENT{,_ALL} (#4853)
[elogind.git] / src / basic / fd-util.c
1 /***
2   This file is part of systemd.
3
4   Copyright 2010 Lennart Poettering
5
6   systemd is free software; you can redistribute it and/or modify it
7   under the terms of the GNU Lesser General Public License as published by
8   the Free Software Foundation; either version 2.1 of the License, or
9   (at your option) any later version.
10
11   systemd is distributed in the hope that it will be useful, but
12   WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14   Lesser General Public License for more details.
15
16   You should have received a copy of the GNU Lesser General Public License
17   along with systemd; If not, see <http://www.gnu.org/licenses/>.
18 ***/
19
20 #include <errno.h>
21 #include <fcntl.h>
22 #include <sys/resource.h>
23 #include <sys/socket.h>
24 #include <sys/stat.h>
25 #include <unistd.h>
26
27 #include "fd-util.h"
28 #include "macro.h"
29 #include "missing.h"
30 #include "parse-util.h"
31 #include "path-util.h"
32 #include "socket-util.h"
33 #include "util.h"
34
35 int close_nointr(int fd) {
36         assert(fd >= 0);
37
38         if (close(fd) >= 0)
39                 return 0;
40
41         /*
42          * Just ignore EINTR; a retry loop is the wrong thing to do on
43          * Linux.
44          *
45          * http://lkml.indiana.edu/hypermail/linux/kernel/0509.1/0877.html
46          * https://bugzilla.gnome.org/show_bug.cgi?id=682819
47          * http://utcc.utoronto.ca/~cks/space/blog/unix/CloseEINTR
48          * https://sites.google.com/site/michaelsafyan/software-engineering/checkforeintrwheninvokingclosethinkagain
49          */
50         if (errno == EINTR)
51                 return 0;
52
53         return -errno;
54 }
55
56 int safe_close(int fd) {
57
58         /*
59          * Like close_nointr() but cannot fail. Guarantees errno is
60          * unchanged. Is a NOP with negative fds passed, and returns
61          * -1, so that it can be used in this syntax:
62          *
63          * fd = safe_close(fd);
64          */
65
66         if (fd >= 0) {
67                 PROTECT_ERRNO;
68
69                 /* The kernel might return pretty much any error code
70                  * via close(), but the fd will be closed anyway. The
71                  * only condition we want to check for here is whether
72                  * the fd was invalid at all... */
73
74                 assert_se(close_nointr(fd) != -EBADF);
75         }
76
77         return -1;
78 }
79
80 void safe_close_pair(int p[]) {
81         assert(p);
82
83         if (p[0] == p[1]) {
84                 /* Special case pairs which use the same fd in both
85                  * directions... */
86                 p[0] = p[1] = safe_close(p[0]);
87                 return;
88         }
89
90         p[0] = safe_close(p[0]);
91         p[1] = safe_close(p[1]);
92 }
93
94 void close_many(const int fds[], unsigned n_fd) {
95         unsigned i;
96
97         assert(fds || n_fd <= 0);
98
99         for (i = 0; i < n_fd; i++)
100                 safe_close(fds[i]);
101 }
102
103 int fclose_nointr(FILE *f) {
104         assert(f);
105
106         /* Same as close_nointr(), but for fclose() */
107
108         if (fclose(f) == 0)
109                 return 0;
110
111         if (errno == EINTR)
112                 return 0;
113
114         return -errno;
115 }
116
117 FILE* safe_fclose(FILE *f) {
118
119         /* Same as safe_close(), but for fclose() */
120
121         if (f) {
122                 PROTECT_ERRNO;
123
124                 assert_se(fclose_nointr(f) != EBADF);
125         }
126
127         return NULL;
128 }
129
130 #if 0 /// UNNEEDED by elogind
131 DIR* safe_closedir(DIR *d) {
132
133         if (d) {
134                 PROTECT_ERRNO;
135
136                 assert_se(closedir(d) >= 0 || errno != EBADF);
137         }
138
139         return NULL;
140 }
141 #endif // 0
142
143 int fd_nonblock(int fd, bool nonblock) {
144         int flags, nflags;
145
146         assert(fd >= 0);
147
148         flags = fcntl(fd, F_GETFL, 0);
149         if (flags < 0)
150                 return -errno;
151
152         if (nonblock)
153                 nflags = flags | O_NONBLOCK;
154         else
155                 nflags = flags & ~O_NONBLOCK;
156
157         if (nflags == flags)
158                 return 0;
159
160         if (fcntl(fd, F_SETFL, nflags) < 0)
161                 return -errno;
162
163         return 0;
164 }
165
166 int fd_cloexec(int fd, bool cloexec) {
167         int flags, nflags;
168
169         assert(fd >= 0);
170
171         flags = fcntl(fd, F_GETFD, 0);
172         if (flags < 0)
173                 return -errno;
174
175         if (cloexec)
176                 nflags = flags | FD_CLOEXEC;
177         else
178                 nflags = flags & ~FD_CLOEXEC;
179
180         if (nflags == flags)
181                 return 0;
182
183         if (fcntl(fd, F_SETFD, nflags) < 0)
184                 return -errno;
185
186         return 0;
187 }
188
189 void stdio_unset_cloexec(void) {
190         fd_cloexec(STDIN_FILENO, false);
191         fd_cloexec(STDOUT_FILENO, false);
192         fd_cloexec(STDERR_FILENO, false);
193 }
194
195 _pure_ static bool fd_in_set(int fd, const int fdset[], unsigned n_fdset) {
196         unsigned i;
197
198         assert(n_fdset == 0 || fdset);
199
200         for (i = 0; i < n_fdset; i++)
201                 if (fdset[i] == fd)
202                         return true;
203
204         return false;
205 }
206
207 int close_all_fds(const int except[], unsigned n_except) {
208         _cleanup_closedir_ DIR *d = NULL;
209         struct dirent *de;
210         int r = 0;
211
212         assert(n_except == 0 || except);
213
214         d = opendir("/proc/self/fd");
215         if (!d) {
216                 int fd;
217                 struct rlimit rl;
218
219                 /* When /proc isn't available (for example in chroots)
220                  * the fallback is brute forcing through the fd
221                  * table */
222
223                 assert_se(getrlimit(RLIMIT_NOFILE, &rl) >= 0);
224                 for (fd = 3; fd < (int) rl.rlim_max; fd ++) {
225
226                         if (fd_in_set(fd, except, n_except))
227                                 continue;
228
229                         if (close_nointr(fd) < 0)
230                                 if (errno != EBADF && r == 0)
231                                         r = -errno;
232                 }
233
234                 return r;
235         }
236
237         FOREACH_DIRENT(de, d, return -errno) {
238                 int fd = -1;
239
240                 if (safe_atoi(de->d_name, &fd) < 0)
241                         /* Let's better ignore this, just in case */
242                         continue;
243
244                 if (fd < 3)
245                         continue;
246
247                 if (fd == dirfd(d))
248                         continue;
249
250                 if (fd_in_set(fd, except, n_except))
251                         continue;
252
253                 if (close_nointr(fd) < 0) {
254                         /* Valgrind has its own FD and doesn't want to have it closed */
255                         if (errno != EBADF && r == 0)
256                                 r = -errno;
257                 }
258         }
259
260         return r;
261 }
262
263 #if 0 /// UNNEEDED by elogind
264 int same_fd(int a, int b) {
265         struct stat sta, stb;
266         pid_t pid;
267         int r, fa, fb;
268
269         assert(a >= 0);
270         assert(b >= 0);
271
272         /* Compares two file descriptors. Note that semantics are
273          * quite different depending on whether we have kcmp() or we
274          * don't. If we have kcmp() this will only return true for
275          * dup()ed file descriptors, but not otherwise. If we don't
276          * have kcmp() this will also return true for two fds of the same
277          * file, created by separate open() calls. Since we use this
278          * call mostly for filtering out duplicates in the fd store
279          * this difference hopefully doesn't matter too much. */
280
281         if (a == b)
282                 return true;
283
284         /* Try to use kcmp() if we have it. */
285         pid = getpid();
286         r = kcmp(pid, pid, KCMP_FILE, a, b);
287         if (r == 0)
288                 return true;
289         if (r > 0)
290                 return false;
291         if (errno != ENOSYS)
292                 return -errno;
293
294         /* We don't have kcmp(), use fstat() instead. */
295         if (fstat(a, &sta) < 0)
296                 return -errno;
297
298         if (fstat(b, &stb) < 0)
299                 return -errno;
300
301         if ((sta.st_mode & S_IFMT) != (stb.st_mode & S_IFMT))
302                 return false;
303
304         /* We consider all device fds different, since two device fds
305          * might refer to quite different device contexts even though
306          * they share the same inode and backing dev_t. */
307
308         if (S_ISCHR(sta.st_mode) || S_ISBLK(sta.st_mode))
309                 return false;
310
311         if (sta.st_dev != stb.st_dev || sta.st_ino != stb.st_ino)
312                 return false;
313
314         /* The fds refer to the same inode on disk, let's also check
315          * if they have the same fd flags. This is useful to
316          * distinguish the read and write side of a pipe created with
317          * pipe(). */
318         fa = fcntl(a, F_GETFL);
319         if (fa < 0)
320                 return -errno;
321
322         fb = fcntl(b, F_GETFL);
323         if (fb < 0)
324                 return -errno;
325
326         return fa == fb;
327 }
328
329 void cmsg_close_all(struct msghdr *mh) {
330         struct cmsghdr *cmsg;
331
332         assert(mh);
333
334         CMSG_FOREACH(cmsg, mh)
335                 if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS)
336                         close_many((int*) CMSG_DATA(cmsg), (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int));
337 }
338
339 bool fdname_is_valid(const char *s) {
340         const char *p;
341
342         /* Validates a name for $LISTEN_FDNAMES. We basically allow
343          * everything ASCII that's not a control character. Also, as
344          * special exception the ":" character is not allowed, as we
345          * use that as field separator in $LISTEN_FDNAMES.
346          *
347          * Note that the empty string is explicitly allowed
348          * here. However, we limit the length of the names to 255
349          * characters. */
350
351         if (!s)
352                 return false;
353
354         for (p = s; *p; p++) {
355                 if (*p < ' ')
356                         return false;
357                 if (*p >= 127)
358                         return false;
359                 if (*p == ':')
360                         return false;
361         }
362
363         return p - s < 256;
364 }
365
366 int fd_get_path(int fd, char **ret) {
367         char procfs_path[strlen("/proc/self/fd/") + DECIMAL_STR_MAX(int)];
368         int r;
369
370         xsprintf(procfs_path, "/proc/self/fd/%i", fd);
371
372         r = readlink_malloc(procfs_path, ret);
373
374         if (r == -ENOENT) /* If the file doesn't exist the fd is invalid */
375                 return -EBADF;
376
377         return r;
378 }
379 #endif // 0