chiark / gitweb /
tree-wide: make ++/-- usage consistent WRT spacing
[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 _pure_ static bool fd_in_set(int fd, const int fdset[], unsigned n_fdset) {
190         unsigned i;
191
192         assert(n_fdset == 0 || fdset);
193
194         for (i = 0; i < n_fdset; i++)
195                 if (fdset[i] == fd)
196                         return true;
197
198         return false;
199 }
200
201 int close_all_fds(const int except[], unsigned n_except) {
202         _cleanup_closedir_ DIR *d = NULL;
203         struct dirent *de;
204         int r = 0;
205
206         assert(n_except == 0 || except);
207
208         d = opendir("/proc/self/fd");
209         if (!d) {
210                 int fd;
211                 struct rlimit rl;
212
213                 /* When /proc isn't available (for example in chroots)
214                  * the fallback is brute forcing through the fd
215                  * table */
216
217                 assert_se(getrlimit(RLIMIT_NOFILE, &rl) >= 0);
218                 for (fd = 3; fd < (int) rl.rlim_max; fd ++) {
219
220                         if (fd_in_set(fd, except, n_except))
221                                 continue;
222
223                         if (close_nointr(fd) < 0)
224                                 if (errno != EBADF && r == 0)
225                                         r = -errno;
226                 }
227
228                 return r;
229         }
230
231         while ((de = readdir(d))) {
232                 int fd = -1;
233
234                 if (hidden_file(de->d_name))
235                         continue;
236
237                 if (safe_atoi(de->d_name, &fd) < 0)
238                         /* Let's better ignore this, just in case */
239                         continue;
240
241                 if (fd < 3)
242                         continue;
243
244                 if (fd == dirfd(d))
245                         continue;
246
247                 if (fd_in_set(fd, except, n_except))
248                         continue;
249
250                 if (close_nointr(fd) < 0) {
251                         /* Valgrind has its own FD and doesn't want to have it closed */
252                         if (errno != EBADF && r == 0)
253                                 r = -errno;
254                 }
255         }
256
257         return r;
258 }
259
260 #if 0 /// UNNEEDED by elogind
261 int same_fd(int a, int b) {
262         struct stat sta, stb;
263         pid_t pid;
264         int r, fa, fb;
265
266         assert(a >= 0);
267         assert(b >= 0);
268
269         /* Compares two file descriptors. Note that semantics are
270          * quite different depending on whether we have kcmp() or we
271          * don't. If we have kcmp() this will only return true for
272          * dup()ed file descriptors, but not otherwise. If we don't
273          * have kcmp() this will also return true for two fds of the same
274          * file, created by separate open() calls. Since we use this
275          * call mostly for filtering out duplicates in the fd store
276          * this difference hopefully doesn't matter too much. */
277
278         if (a == b)
279                 return true;
280
281         /* Try to use kcmp() if we have it. */
282         pid = getpid();
283         r = kcmp(pid, pid, KCMP_FILE, a, b);
284         if (r == 0)
285                 return true;
286         if (r > 0)
287                 return false;
288         if (errno != ENOSYS)
289                 return -errno;
290
291         /* We don't have kcmp(), use fstat() instead. */
292         if (fstat(a, &sta) < 0)
293                 return -errno;
294
295         if (fstat(b, &stb) < 0)
296                 return -errno;
297
298         if ((sta.st_mode & S_IFMT) != (stb.st_mode & S_IFMT))
299                 return false;
300
301         /* We consider all device fds different, since two device fds
302          * might refer to quite different device contexts even though
303          * they share the same inode and backing dev_t. */
304
305         if (S_ISCHR(sta.st_mode) || S_ISBLK(sta.st_mode))
306                 return false;
307
308         if (sta.st_dev != stb.st_dev || sta.st_ino != stb.st_ino)
309                 return false;
310
311         /* The fds refer to the same inode on disk, let's also check
312          * if they have the same fd flags. This is useful to
313          * distinguish the read and write side of a pipe created with
314          * pipe(). */
315         fa = fcntl(a, F_GETFL);
316         if (fa < 0)
317                 return -errno;
318
319         fb = fcntl(b, F_GETFL);
320         if (fb < 0)
321                 return -errno;
322
323         return fa == fb;
324 }
325
326 void cmsg_close_all(struct msghdr *mh) {
327         struct cmsghdr *cmsg;
328
329         assert(mh);
330
331         CMSG_FOREACH(cmsg, mh)
332                 if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS)
333                         close_many((int*) CMSG_DATA(cmsg), (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int));
334 }
335
336 bool fdname_is_valid(const char *s) {
337         const char *p;
338
339         /* Validates a name for $LISTEN_FDNAMES. We basically allow
340          * everything ASCII that's not a control character. Also, as
341          * special exception the ":" character is not allowed, as we
342          * use that as field separator in $LISTEN_FDNAMES.
343          *
344          * Note that the empty string is explicitly allowed
345          * here. However, we limit the length of the names to 255
346          * characters. */
347
348         if (!s)
349                 return false;
350
351         for (p = s; *p; p++) {
352                 if (*p < ' ')
353                         return false;
354                 if (*p >= 127)
355                         return false;
356                 if (*p == ':')
357                         return false;
358         }
359
360         return p - s < 256;
361 }
362 #endif // 0