1 #include "stdio_impl.h" 2 #include <fcntl.h> 3 #include <string.h> 4 #include <errno.h> 5 __fmodeflags(const char * mode,int * flags)6int __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