• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "stdio_impl.h"
2 #include <fcntl.h>
3 #include <string.h>
4 #include <errno.h>
5 
__fmodeflags(const char * mode,int * flags)6 int __fmodeflags(const char *mode, int *flags)
7 {
8 	int mode_flags = 0;
9 	int options = 0;
10 
11 	switch (*mode) {
12 		case 'r':
13 			mode_flags = O_RDONLY;
14 			*flags = F_NOWR;
15 			break;
16 		case 'w':
17 			mode_flags = O_WRONLY;
18 			options = O_TRUNC | O_CREAT;
19 			*flags = F_NORD;
20 			break;
21 		case 'a':
22 			mode_flags = O_WRONLY;
23 			options = O_APPEND | O_CREAT;
24 			*flags = F_NORD | F_APP;
25 			break;
26 		default:
27 			errno = EINVAL;
28 			return -EINVAL;
29 	}
30 
31 	mode++;
32 	while (*mode != '\0') {
33 		switch (*mode) {
34 			case '+':
35 				mode_flags = O_RDWR;
36 				*flags &= ~(F_NORD | F_NOWR);
37 				break;
38 			case 'x':
39 				/* need O_CREAT check */
40 				options |= O_EXCL;
41 				break;
42 			case 'e':
43 				options |= O_CLOEXEC;
44 				break;
45 			case 'b':
46 				break;
47 			default:
48 				/* only accept "+xeb" */
49 				break;
50 		}
51 		mode++;
52 	}
53 
54 	return mode_flags | options;
55 }
56