annotate usr/src/lib/libc/port/stdio/_endopen.c @ 14015:e5fc7d0d7c24

3687 fopen() O_CLOEXEC support via the "e" flag Reviewed by Robert Mustacchi <rm@joyent.com> Reviewed by Richard Lowe <richlowe@richlowe.net> Approved by Dan McDonald <danmcd@nexenta.com>
author Theo Schlossnagle <jesus@omniti.com>
date Wed, 17 Apr 2013 10:28:26 -0400
parents febeba71273d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
1846
376b8b33ed65 PSARC 2006/162 Extended FILE space for 32-bit Solaris processes
craigm
parents: 0
diff changeset
5 * Common Development and Distribution License (the "License").
376b8b33ed65 PSARC 2006/162 Extended FILE space for 32-bit Solaris processes
craigm
parents: 0
diff changeset
6 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
7 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
10 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
11 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
12 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
18 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
19 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
20 */
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 1846
diff changeset
21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
22 /*
6812
febeba71273d PSARC 2008/309 expunge synonyms.h
raf
parents: 1846
diff changeset
23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
24 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
25 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
27 /* Copyright (c) 1988 AT&T */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
28 /* All Rights Reserved */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
29
14015
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
30 /* Copyright (c) 2013 OmniTI Computer Consulting, Inc. All rights reserved. */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
32 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
33 * This routine is a special case, in that it is aware of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
34 * both small and large file interfaces. It must be built
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
35 * in the small compilation environment.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
36 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
37
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
38 #include "lint.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
39 #include "file64.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
40 #include <mtlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
41 #include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
42 #include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
43 #include <fcntl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
44 #include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
45 #include <limits.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
46 #include <thread.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
47 #include <synch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
48 #include "stdiom.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
49 #include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
50
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
51 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
52 * open UNIX file name, associate with iop
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
53 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
54
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
55 FILE *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
56 _endopen(const char *name, const char *type, FILE *iop, int largefile)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
57 {
14015
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
58 int oflag, fd, fflag, eflag, plusflag;
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
59 const char *echr;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
60
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
61 if (iop == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
62 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
63 switch (type[0]) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
64 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
65 errno = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
66 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
67 case 'r':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
68 oflag = O_RDONLY;
1846
376b8b33ed65 PSARC 2006/162 Extended FILE space for 32-bit Solaris processes
craigm
parents: 0
diff changeset
69 fflag = _IOREAD;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
70 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
71 case 'w':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
72 oflag = O_WRONLY | O_TRUNC | O_CREAT;
1846
376b8b33ed65 PSARC 2006/162 Extended FILE space for 32-bit Solaris processes
craigm
parents: 0
diff changeset
73 fflag = _IOWRT;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
74 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
75 case 'a':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
76 oflag = O_WRONLY | O_APPEND | O_CREAT;
1846
376b8b33ed65 PSARC 2006/162 Extended FILE space for 32-bit Solaris processes
craigm
parents: 0
diff changeset
77 fflag = _IOWRT;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
78 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
79 }
14015
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
80
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
81 plusflag = 0;
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
82 eflag = 0;
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
83 for (echr = type + 1; *echr != '\0'; echr++) {
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
84 switch (*echr) {
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
85 /* UNIX ignores 'b' and treats text and binary the same */
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
86 default:
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
87 break;
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
88 case '+':
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
89 plusflag = 1;
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
90 break;
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
91 case 'e':
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
92 eflag = 1;
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
93 break;
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
94 }
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
95 }
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
96 if (eflag) {
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
97 /* Subsequent to a mode flag, 'e' indicates O_CLOEXEC */
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
98 oflag = oflag | O_CLOEXEC;
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
99 }
e5fc7d0d7c24 3687 fopen() O_CLOEXEC support via the "e" flag
Theo Schlossnagle <jesus@omniti.com>
parents: 6812
diff changeset
100 if (plusflag) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
101 oflag = (oflag & ~(O_RDONLY | O_WRONLY)) | O_RDWR;
1846
376b8b33ed65 PSARC 2006/162 Extended FILE space for 32-bit Solaris processes
craigm
parents: 0
diff changeset
102 fflag = _IORW;
376b8b33ed65 PSARC 2006/162 Extended FILE space for 32-bit Solaris processes
craigm
parents: 0
diff changeset
103 }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
105 /* select small or large file open based on flag */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
106 if (largefile) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
107 fd = open64(name, oflag, 0666);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
108 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
109 fd = open(name, oflag, 0666);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
110 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
111 if (fd < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
112 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
113
1846
376b8b33ed65 PSARC 2006/162 Extended FILE space for 32-bit Solaris processes
craigm
parents: 0
diff changeset
114 /* As long as we make sure _flag stays != 0, we don't need to lock */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
115 #ifdef _LP64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
116 iop->_file = fd;
1846
376b8b33ed65 PSARC 2006/162 Extended FILE space for 32-bit Solaris processes
craigm
parents: 0
diff changeset
117 iop->_flag = (iop->_flag & ~0377) | fflag;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
118 #else
1846
376b8b33ed65 PSARC 2006/162 Extended FILE space for 32-bit Solaris processes
craigm
parents: 0
diff changeset
119 if (fd <= _FILE_FD_MAX) {
376b8b33ed65 PSARC 2006/162 Extended FILE space for 32-bit Solaris processes
craigm
parents: 0
diff changeset
120 SET_FILE(iop, fd);
376b8b33ed65 PSARC 2006/162 Extended FILE space for 32-bit Solaris processes
craigm
parents: 0
diff changeset
121 } else if (_file_set(iop, fd, type) != 0) {
376b8b33ed65 PSARC 2006/162 Extended FILE space for 32-bit Solaris processes
craigm
parents: 0
diff changeset
122 /* errno set in _file_set() */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
123 (void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
124 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
125 }
1846
376b8b33ed65 PSARC 2006/162 Extended FILE space for 32-bit Solaris processes
craigm
parents: 0
diff changeset
126 iop->_flag = fflag;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
127 #endif /* _LP64 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
129 if (oflag == (O_WRONLY | O_APPEND | O_CREAT)) { /* type == "a" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
130 if (lseek64(fd, (off64_t)0, SEEK_END) < (off64_t)0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
131 (void) close(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
132 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
133 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
134 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
136 return (iop);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
137 }