1*cd62a92dSRobert Mustacchi /*
2*cd62a92dSRobert Mustacchi * CDDL HEADER START
3*cd62a92dSRobert Mustacchi *
4*cd62a92dSRobert Mustacchi * The contents of this file are subject to the terms of the
5*cd62a92dSRobert Mustacchi * Common Development and Distribution License (the "License").
6*cd62a92dSRobert Mustacchi * You may not use this file except in compliance with the License.
7*cd62a92dSRobert Mustacchi *
8*cd62a92dSRobert Mustacchi * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*cd62a92dSRobert Mustacchi * or http://www.opensolaris.org/os/licensing.
10*cd62a92dSRobert Mustacchi * See the License for the specific language governing permissions
11*cd62a92dSRobert Mustacchi * and limitations under the License.
12*cd62a92dSRobert Mustacchi *
13*cd62a92dSRobert Mustacchi * When distributing Covered Code, include this CDDL HEADER in each
14*cd62a92dSRobert Mustacchi * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*cd62a92dSRobert Mustacchi * If applicable, add the following below this CDDL HEADER, with the
16*cd62a92dSRobert Mustacchi * fields enclosed by brackets "[]" replaced with your own identifying
17*cd62a92dSRobert Mustacchi * information: Portions Copyright [yyyy] [name of copyright owner]
18*cd62a92dSRobert Mustacchi *
19*cd62a92dSRobert Mustacchi * CDDL HEADER END
20*cd62a92dSRobert Mustacchi */
21*cd62a92dSRobert Mustacchi
22*cd62a92dSRobert Mustacchi /*
23*cd62a92dSRobert Mustacchi * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24*cd62a92dSRobert Mustacchi * Use is subject to license terms.
25*cd62a92dSRobert Mustacchi */
26*cd62a92dSRobert Mustacchi
27*cd62a92dSRobert Mustacchi /* Copyright (c) 1988 AT&T */
28*cd62a92dSRobert Mustacchi /* All Rights Reserved */
29*cd62a92dSRobert Mustacchi
30*cd62a92dSRobert Mustacchi /* Copyright (c) 2013 OmniTI Computer Consulting, Inc. All rights reserved. */
31*cd62a92dSRobert Mustacchi /*
32*cd62a92dSRobert Mustacchi * Copyright 2020 Robert Mustacchi
33*cd62a92dSRobert Mustacchi */
34*cd62a92dSRobert Mustacchi
35*cd62a92dSRobert Mustacchi /*
36*cd62a92dSRobert Mustacchi * Commonized processing of the 'mode' string for stdio.
37*cd62a92dSRobert Mustacchi */
38*cd62a92dSRobert Mustacchi
39*cd62a92dSRobert Mustacchi #include "mtlib.h"
40*cd62a92dSRobert Mustacchi #include "file64.h"
41*cd62a92dSRobert Mustacchi #include <stdio.h>
42*cd62a92dSRobert Mustacchi #include <errno.h>
43*cd62a92dSRobert Mustacchi #include <sys/types.h>
44*cd62a92dSRobert Mustacchi #include <fcntl.h>
45*cd62a92dSRobert Mustacchi
46*cd62a92dSRobert Mustacchi int
_stdio_flags(const char * type,int * oflagsp,int * fflagsp)47*cd62a92dSRobert Mustacchi _stdio_flags(const char *type, int *oflagsp, int *fflagsp)
48*cd62a92dSRobert Mustacchi {
49*cd62a92dSRobert Mustacchi int oflag, fflag, plusflag, eflag, xflag;
50*cd62a92dSRobert Mustacchi const char *echr;
51*cd62a92dSRobert Mustacchi
52*cd62a92dSRobert Mustacchi oflag = fflag = 0;
53*cd62a92dSRobert Mustacchi switch (type[0]) {
54*cd62a92dSRobert Mustacchi default:
55*cd62a92dSRobert Mustacchi errno = EINVAL;
56*cd62a92dSRobert Mustacchi return (-1);
57*cd62a92dSRobert Mustacchi case 'r':
58*cd62a92dSRobert Mustacchi oflag = O_RDONLY;
59*cd62a92dSRobert Mustacchi fflag = _IOREAD;
60*cd62a92dSRobert Mustacchi break;
61*cd62a92dSRobert Mustacchi case 'w':
62*cd62a92dSRobert Mustacchi oflag = O_WRONLY | O_TRUNC | O_CREAT;
63*cd62a92dSRobert Mustacchi fflag = _IOWRT;
64*cd62a92dSRobert Mustacchi break;
65*cd62a92dSRobert Mustacchi case 'a':
66*cd62a92dSRobert Mustacchi oflag = O_WRONLY | O_APPEND | O_CREAT;
67*cd62a92dSRobert Mustacchi fflag = _IOWRT;
68*cd62a92dSRobert Mustacchi break;
69*cd62a92dSRobert Mustacchi }
70*cd62a92dSRobert Mustacchi
71*cd62a92dSRobert Mustacchi plusflag = 0;
72*cd62a92dSRobert Mustacchi eflag = 0;
73*cd62a92dSRobert Mustacchi xflag = 0;
74*cd62a92dSRobert Mustacchi for (echr = type + 1; *echr != '\0'; echr++) {
75*cd62a92dSRobert Mustacchi switch (*echr) {
76*cd62a92dSRobert Mustacchi /* UNIX ignores 'b' and treats text and binary the same */
77*cd62a92dSRobert Mustacchi default:
78*cd62a92dSRobert Mustacchi break;
79*cd62a92dSRobert Mustacchi case '+':
80*cd62a92dSRobert Mustacchi plusflag = 1;
81*cd62a92dSRobert Mustacchi break;
82*cd62a92dSRobert Mustacchi case 'e':
83*cd62a92dSRobert Mustacchi eflag = 1;
84*cd62a92dSRobert Mustacchi break;
85*cd62a92dSRobert Mustacchi case 'x':
86*cd62a92dSRobert Mustacchi xflag = 1;
87*cd62a92dSRobert Mustacchi break;
88*cd62a92dSRobert Mustacchi }
89*cd62a92dSRobert Mustacchi }
90*cd62a92dSRobert Mustacchi
91*cd62a92dSRobert Mustacchi if (eflag) {
92*cd62a92dSRobert Mustacchi /* Subsequent to a mode flag, 'e' indicates O_CLOEXEC */
93*cd62a92dSRobert Mustacchi oflag = oflag | O_CLOEXEC;
94*cd62a92dSRobert Mustacchi }
95*cd62a92dSRobert Mustacchi
96*cd62a92dSRobert Mustacchi if (plusflag) {
97*cd62a92dSRobert Mustacchi oflag = (oflag & ~(O_RDONLY | O_WRONLY)) | O_RDWR;
98*cd62a92dSRobert Mustacchi fflag = _IORW;
99*cd62a92dSRobert Mustacchi }
100*cd62a92dSRobert Mustacchi
101*cd62a92dSRobert Mustacchi if (xflag) {
102*cd62a92dSRobert Mustacchi oflag |= O_EXCL;
103*cd62a92dSRobert Mustacchi }
104*cd62a92dSRobert Mustacchi
105*cd62a92dSRobert Mustacchi *oflagsp = oflag;
106*cd62a92dSRobert Mustacchi *fflagsp = fflag;
107*cd62a92dSRobert Mustacchi
108*cd62a92dSRobert Mustacchi return (0);
109*cd62a92dSRobert Mustacchi }
110