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