Mercurial > gnulib
annotate lib/open.c @ 10202:4d972085fd3a
Add a comment.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Thu, 12 Jun 2008 13:47:37 +0200 |
parents | 270b7afb8fb7 |
children | 008f289e34ef |
rev | line source |
---|---|
9299 | 1 /* Open a descriptor to a file. |
10201
270b7afb8fb7
Work around open() bug on HP-UX 11 and Solaris 9.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
2 Copyright (C) 2007-2008 Free Software Foundation, Inc. |
9299 | 3 |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
9299
diff
changeset
|
4 This program is free software: you can redistribute it and/or modify |
9299 | 5 it under the terms of the GNU General Public License as published by |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
9299
diff
changeset
|
6 the Free Software Foundation; either version 3 of the License, or |
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
9299
diff
changeset
|
7 (at your option) any later version. |
9299 | 8 |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
9299
diff
changeset
|
14 You should have received a copy of the GNU General Public License |
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
9299
diff
changeset
|
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
9299 | 16 |
17 /* Written by Bruno Haible <bruno@clisp.org>, 2007. */ | |
18 | |
19 #include <config.h> | |
20 | |
21 /* Specification. */ | |
22 #include <fcntl.h> | |
23 | |
24 /* If the fchdir replacement is used, open() is defined in fchdir.c. */ | |
25 #ifndef FCHDIR_REPLACEMENT | |
26 | |
10201
270b7afb8fb7
Work around open() bug on HP-UX 11 and Solaris 9.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
27 # include <errno.h> |
9299 | 28 # include <stdarg.h> |
29 # include <string.h> | |
30 # include <sys/types.h> | |
31 # include <sys/stat.h> | |
32 | |
33 int | |
34 open (const char *filename, int flags, ...) | |
35 # undef open | |
36 { | |
37 mode_t mode; | |
38 | |
39 mode = 0; | |
40 if (flags & O_CREAT) | |
41 { | |
42 va_list arg; | |
43 va_start (arg, flags); | |
44 | |
45 /* If mode_t is narrower than int, use the promoted type (int), | |
46 not mode_t. Use sizeof to guess whether mode_t is narrower; | |
47 we don't know of any practical counterexamples. */ | |
48 mode = (sizeof (mode_t) < sizeof (int) | |
49 ? va_arg (arg, int) | |
50 : va_arg (arg, mode_t)); | |
51 | |
52 va_end (arg); | |
53 } | |
54 | |
10201
270b7afb8fb7
Work around open() bug on HP-UX 11 and Solaris 9.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
55 # if OPEN_TRAILING_SLASH_BUG |
10202 | 56 /* If the filename ends in a slash and one of O_CREAT, O_WRONLY, O_RDWR |
57 is specified, then fail. | |
58 Rationale: POSIX <http://www.opengroup.org/susv3/basedefs/xbd_chap04.html> | |
59 says that | |
60 "A pathname that contains at least one non-slash character and that | |
61 ends withone or more trailing slashes shall be resolved as if a | |
62 single dot character ( '.' ) were appended to the pathname." | |
63 and | |
64 "The special filename dot shall refer to the directory specified by | |
65 its predecessor." | |
66 If the named file already exists as a directory, then | |
67 - if O_CREAT is specified, open() must fail because of the semantics | |
68 of O_CREAT, | |
69 - if O_WRONLY or O_RDWR is specified, open() must fail because POSIX | |
70 <http://www.opengroup.org/susv3/functions/open.html> says that it | |
71 fails with errno = EISDIR in this case. | |
72 If the named file does not exist or does not name a directory, then | |
73 - if O_CREAT is specified, open() must fail since open() cannot create | |
74 directories, | |
75 - if O_WRONLY or O_RDWR is specified, open() must fail because the | |
76 file does not contain a '.' directory. */ | |
10201
270b7afb8fb7
Work around open() bug on HP-UX 11 and Solaris 9.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
77 if (flags & (O_CREAT | O_WRONLY | O_RDWR)) |
270b7afb8fb7
Work around open() bug on HP-UX 11 and Solaris 9.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
78 { |
270b7afb8fb7
Work around open() bug on HP-UX 11 and Solaris 9.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
79 size_t len = strlen (filename); |
270b7afb8fb7
Work around open() bug on HP-UX 11 and Solaris 9.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
80 if (len > 0 && filename[len - 1] == '/') |
270b7afb8fb7
Work around open() bug on HP-UX 11 and Solaris 9.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
81 { |
270b7afb8fb7
Work around open() bug on HP-UX 11 and Solaris 9.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
82 errno = EISDIR; |
270b7afb8fb7
Work around open() bug on HP-UX 11 and Solaris 9.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
83 return -1; |
270b7afb8fb7
Work around open() bug on HP-UX 11 and Solaris 9.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
84 } |
270b7afb8fb7
Work around open() bug on HP-UX 11 and Solaris 9.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
85 } |
270b7afb8fb7
Work around open() bug on HP-UX 11 and Solaris 9.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
86 # endif |
270b7afb8fb7
Work around open() bug on HP-UX 11 and Solaris 9.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
87 |
9299 | 88 # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ |
89 if (strcmp (filename, "/dev/null") == 0) | |
90 filename = "NUL"; | |
91 # endif | |
92 | |
93 return open (filename, flags, mode); | |
94 } | |
95 #endif |