Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libc/stdio/flags.c
39476 views
1
/*-
2
* SPDX-License-Identifier: BSD-3-Clause
3
*
4
* Copyright (c) 1990, 1993
5
* The Regents of the University of California. All rights reserved.
6
*
7
* This code is derived from software contributed to Berkeley by
8
* Chris Torek.
9
*
10
* Redistribution and use in source and binary forms, with or without
11
* modification, are permitted provided that the following conditions
12
* are met:
13
* 1. Redistributions of source code must retain the above copyright
14
* notice, this list of conditions and the following disclaimer.
15
* 2. Redistributions in binary form must reproduce the above copyright
16
* notice, this list of conditions and the following disclaimer in the
17
* documentation and/or other materials provided with the distribution.
18
* 3. Neither the name of the University nor the names of its contributors
19
* may be used to endorse or promote products derived from this software
20
* without specific prior written permission.
21
*
22
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32
* SUCH DAMAGE.
33
*/
34
35
#include <sys/types.h>
36
#include <sys/file.h>
37
#include <stdio.h>
38
#include <errno.h>
39
40
#include "local.h"
41
42
/*
43
* Return the (stdio) flags for a given mode. Store the flags
44
* to be passed to an _open() syscall through *optr.
45
* Return 0 on error.
46
*/
47
int
48
__sflags(const char *mode, int *optr)
49
{
50
int ret, m, o, known;
51
52
switch (*mode++) {
53
54
case 'r': /* open for reading */
55
ret = __SRD;
56
m = O_RDONLY;
57
o = 0;
58
break;
59
60
case 'w': /* open for writing */
61
ret = __SWR;
62
m = O_WRONLY;
63
o = O_CREAT | O_TRUNC;
64
break;
65
66
case 'a': /* open for appending */
67
ret = __SWR;
68
m = O_WRONLY;
69
o = O_CREAT | O_APPEND;
70
break;
71
72
default: /* illegal mode */
73
errno = EINVAL;
74
return (0);
75
}
76
77
do {
78
known = 1;
79
switch (*mode++) {
80
case 'b':
81
/* 'b' (binary) is ignored */
82
break;
83
case '+':
84
/* [rwa][b]\+ means read and write */
85
ret = __SRW;
86
m = O_RDWR;
87
break;
88
case 'x':
89
/* 'x' means exclusive (fail if the file exists) */
90
o |= O_EXCL;
91
break;
92
case 'e':
93
/* set close-on-exec */
94
o |= O_CLOEXEC;
95
break;
96
case 'v':
97
/* verify */
98
o |= O_VERIFY;
99
break;
100
default:
101
known = 0;
102
break;
103
}
104
} while (known);
105
106
if ((o & O_EXCL) != 0 && m == O_RDONLY) {
107
errno = EINVAL;
108
return (0);
109
}
110
111
*optr = m | o;
112
return (ret);
113
}
114
115