Print this page
3687 fopen() O_CLOEXEC support via the "e" flag

*** 25,35 **** */ /* Copyright (c) 1988 AT&T */ /* All Rights Reserved */ ! #pragma ident "%Z%%M% %I% %E% SMI" /* * This routine is a special case, in that it is aware of * both small and large file interfaces. It must be built * in the small compilation environment. --- 25,35 ---- */ /* Copyright (c) 1988 AT&T */ /* All Rights Reserved */ ! /* Copyright (c) 2013 OmniTI Computer Consulting, Inc. All rights reserved. */ /* * This routine is a special case, in that it is aware of * both small and large file interfaces. It must be built * in the small compilation environment.
*** 53,64 **** */ FILE * _endopen(const char *name, const char *type, FILE *iop, int largefile) { ! int oflag, fd, fflag; ! char plus; if (iop == NULL) return (NULL); switch (type[0]) { default: --- 53,64 ---- */ FILE * _endopen(const char *name, const char *type, FILE *iop, int largefile) { ! int oflag, fd, fflag, eflag, plusflag; ! const char *echr; if (iop == NULL) return (NULL); switch (type[0]) { default:
*** 75,88 **** case 'a': oflag = O_WRONLY | O_APPEND | O_CREAT; fflag = _IOWRT; break; } /* UNIX ignores 'b' and treats text and binary the same */ ! if ((plus = type[1]) == 'b') ! plus = type[2]; ! if (plus == '+') { oflag = (oflag & ~(O_RDONLY | O_WRONLY)) | O_RDWR; fflag = _IORW; } /* select small or large file open based on flag */ --- 75,105 ---- case 'a': oflag = O_WRONLY | O_APPEND | O_CREAT; fflag = _IOWRT; break; } + + plusflag = 0; + eflag = 0; + for (echr = type + 1; *echr != '\0'; echr++) { + switch (*echr) { /* UNIX ignores 'b' and treats text and binary the same */ ! default: ! break; ! case '+': ! plusflag = 1; ! break; ! case 'e': ! eflag = 1; ! break; ! } ! } ! if (eflag) { ! /* Subsequent to a mode flag, 'e' indicates O_CLOEXEC */ ! oflag = oflag | O_CLOEXEC; ! } ! if (plusflag) { oflag = (oflag & ~(O_RDONLY | O_WRONLY)) | O_RDWR; fflag = _IORW; } /* select small or large file open based on flag */