1cf28ed85SJohn Marino /* Invoke openat, but avoid some glitches.
2cf28ed85SJohn Marino
3*09d4459fSDaniel Fojt Copyright (C) 2005-2006, 2008-2020 Free Software Foundation, Inc.
4cf28ed85SJohn Marino
5cf28ed85SJohn Marino This program is free software: you can redistribute it and/or modify
6cf28ed85SJohn Marino it under the terms of the GNU General Public License as published by
7cf28ed85SJohn Marino the Free Software Foundation; either version 3 of the License, or
8cf28ed85SJohn Marino (at your option) any later version.
9cf28ed85SJohn Marino
10cf28ed85SJohn Marino This program is distributed in the hope that it will be useful,
11cf28ed85SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of
12cf28ed85SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13cf28ed85SJohn Marino GNU General Public License for more details.
14cf28ed85SJohn Marino
15cf28ed85SJohn Marino You should have received a copy of the GNU General Public License
16*09d4459fSDaniel Fojt along with this program. If not, see <https://www.gnu.org/licenses/>. */
17cf28ed85SJohn Marino
18cf28ed85SJohn Marino /* Written by Paul Eggert for open, ported by Eric Blake for openat. */
19cf28ed85SJohn Marino
20cf28ed85SJohn Marino #include <config.h>
21cf28ed85SJohn Marino
22cf28ed85SJohn Marino #include "fcntl-safer.h"
23cf28ed85SJohn Marino
24cf28ed85SJohn Marino #include <fcntl.h>
25cf28ed85SJohn Marino #include <stdarg.h>
26cf28ed85SJohn Marino #include "unistd-safer.h"
27cf28ed85SJohn Marino
28cf28ed85SJohn Marino int
openat_safer(int fd,char const * file,int flags,...)29cf28ed85SJohn Marino openat_safer (int fd, char const *file, int flags, ...)
30cf28ed85SJohn Marino {
31cf28ed85SJohn Marino mode_t mode = 0;
32cf28ed85SJohn Marino
33cf28ed85SJohn Marino if (flags & O_CREAT)
34cf28ed85SJohn Marino {
35cf28ed85SJohn Marino va_list ap;
36cf28ed85SJohn Marino va_start (ap, flags);
37cf28ed85SJohn Marino
38cf28ed85SJohn Marino /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
39cf28ed85SJohn Marino creates crashing code when 'mode_t' is smaller than 'int'. */
40cf28ed85SJohn Marino mode = va_arg (ap, PROMOTED_MODE_T);
41cf28ed85SJohn Marino
42cf28ed85SJohn Marino va_end (ap);
43cf28ed85SJohn Marino }
44cf28ed85SJohn Marino
45cf28ed85SJohn Marino return fd_safer (openat (fd, file, flags, mode));
46cf28ed85SJohn Marino }
47