|
|
1.1 ! root 1: /* efopen.c ! 2: Open a stdio file with appropriate permissions. */ ! 3: ! 4: #include "uucp.h" ! 5: ! 6: #include "uudefs.h" ! 7: #include "sysdep.h" ! 8: #include "system.h" ! 9: ! 10: #include <errno.h> ! 11: ! 12: #if HAVE_FCNTL_H ! 13: #include <fcntl.h> ! 14: #else ! 15: #if HAVE_SYS_FILE_H ! 16: #include <sys/file.h> ! 17: #endif ! 18: #endif ! 19: ! 20: #ifndef O_RDONLY ! 21: #define O_RDONLY 0 ! 22: #define O_WRONLY 1 ! 23: #define O_RDWR 2 ! 24: #endif ! 25: ! 26: #ifndef O_APPEND ! 27: #ifdef FAPPEND ! 28: #define O_APPEND FAPPEND ! 29: #endif ! 30: #endif ! 31: ! 32: #ifndef O_NOCTTY ! 33: #define O_NOCTTY 0 ! 34: #endif ! 35: ! 36: #ifndef FD_CLOEXEC ! 37: #define FD_CLOEXEC 1 ! 38: #endif ! 39: ! 40: FILE * ! 41: esysdep_fopen (zfile, fpublic, fappend, fmkdirs) ! 42: const char *zfile; ! 43: boolean fpublic; ! 44: boolean fappend; ! 45: boolean fmkdirs; ! 46: { ! 47: int imode; ! 48: int o; ! 49: FILE *e; ! 50: ! 51: if (fpublic) ! 52: imode = IPUBLIC_FILE_MODE; ! 53: else ! 54: imode = IPRIVATE_FILE_MODE; ! 55: ! 56: if (! fappend) ! 57: o = creat ((char *) zfile, imode); ! 58: else ! 59: { ! 60: #ifdef O_CREAT ! 61: o = open ((char *) zfile, ! 62: O_WRONLY | O_APPEND | O_CREAT | O_NOCTTY, ! 63: imode); ! 64: #else ! 65: o = open ((char *) zfile, O_WRONLY | O_NOCTTY); ! 66: if (o < 0 && errno == ENOENT) ! 67: o = creat ((char *) zfile, imode); ! 68: #endif /* ! defined (O_CREAT) */ ! 69: } ! 70: ! 71: if (o < 0) ! 72: { ! 73: if (errno == ENOENT && fmkdirs) ! 74: { ! 75: if (! fsysdep_make_dirs (zfile, fpublic)) ! 76: return NULL; ! 77: if (! fappend) ! 78: o = creat ((char *) zfile, imode); ! 79: else ! 80: { ! 81: #ifdef O_CREAT ! 82: o = open ((char *) zfile, ! 83: O_WRONLY | O_APPEND | O_CREAT | O_NOCTTY, ! 84: imode); ! 85: #else ! 86: o = creat ((char *) zfile, imode); ! 87: #endif ! 88: } ! 89: } ! 90: if (o < 0) ! 91: { ! 92: ulog (LOG_ERROR, "open (%s): %s", zfile, strerror (errno)); ! 93: return NULL; ! 94: } ! 95: } ! 96: ! 97: #ifndef O_CREAT ! 98: #ifdef O_APPEND ! 99: if (fappend) ! 100: { ! 101: if (fcntl (o, F_SETFL, O_APPEND) < 0) ! 102: { ! 103: ulog (LOG_ERROR, "fcntl (%s, O_APPEND): %s", zfile, ! 104: strerror (errno)); ! 105: (void) close (o); ! 106: return NULL; ! 107: } ! 108: } ! 109: #endif /* defined (O_APPEND) */ ! 110: #endif /* ! defined (O_CREAT) */ ! 111: ! 112: if (fcntl (o, F_SETFD, fcntl (o, F_GETFD, 0) | FD_CLOEXEC) < 0) ! 113: { ! 114: ulog (LOG_ERROR, "fcntl (%s, FD_CLOEXEC): %s", zfile, ! 115: strerror (errno)); ! 116: (void) close (o); ! 117: return NULL; ! 118: } ! 119: ! 120: if (fappend) ! 121: e = fdopen (o, (char *) "a"); ! 122: else ! 123: e = fdopen (o, (char *) "w"); ! 124: ! 125: if (e == NULL) ! 126: { ! 127: ulog (LOG_ERROR, "fdopen: %s", strerror (errno)); ! 128: (void) close (o); ! 129: } ! 130: ! 131: return e; ! 132: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.