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