aboutsummaryrefslogtreecommitdiff
path: root/gnu/libexec/uucp/libunix/efopen.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/libexec/uucp/libunix/efopen.c')
-rw-r--r--gnu/libexec/uucp/libunix/efopen.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/gnu/libexec/uucp/libunix/efopen.c b/gnu/libexec/uucp/libunix/efopen.c
new file mode 100644
index 000000000000..7e360b616876
--- /dev/null
+++ b/gnu/libexec/uucp/libunix/efopen.c
@@ -0,0 +1,132 @@
+/* efopen.c
+ Open a stdio file with appropriate permissions. */
+
+#include "uucp.h"
+
+#include "uudefs.h"
+#include "sysdep.h"
+#include "system.h"
+
+#include <errno.h>
+
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#else
+#if HAVE_SYS_FILE_H
+#include <sys/file.h>
+#endif
+#endif
+
+#ifndef O_RDONLY
+#define O_RDONLY 0
+#define O_WRONLY 1
+#define O_RDWR 2
+#endif
+
+#ifndef O_APPEND
+#ifdef FAPPEND
+#define O_APPEND FAPPEND
+#endif
+#endif
+
+#ifndef O_NOCTTY
+#define O_NOCTTY 0
+#endif
+
+#ifndef FD_CLOEXEC
+#define FD_CLOEXEC 1
+#endif
+
+FILE *
+esysdep_fopen (zfile, fpublic, fappend, fmkdirs)
+ const char *zfile;
+ boolean fpublic;
+ boolean fappend;
+ boolean fmkdirs;
+{
+ int imode;
+ int o;
+ FILE *e;
+
+ if (fpublic)
+ imode = IPUBLIC_FILE_MODE;
+ else
+ imode = IPRIVATE_FILE_MODE;
+
+ if (! fappend)
+ o = creat ((char *) zfile, imode);
+ else
+ {
+#ifdef O_CREAT
+ o = open ((char *) zfile,
+ O_WRONLY | O_APPEND | O_CREAT | O_NOCTTY,
+ imode);
+#else
+ o = open ((char *) zfile, O_WRONLY | O_NOCTTY);
+ if (o < 0 && errno == ENOENT)
+ o = creat ((char *) zfile, imode);
+#endif /* ! defined (O_CREAT) */
+ }
+
+ if (o < 0)
+ {
+ if (errno == ENOENT && fmkdirs)
+ {
+ if (! fsysdep_make_dirs (zfile, fpublic))
+ return NULL;
+ if (! fappend)
+ o = creat ((char *) zfile, imode);
+ else
+ {
+#ifdef O_CREAT
+ o = open ((char *) zfile,
+ O_WRONLY | O_APPEND | O_CREAT | O_NOCTTY,
+ imode);
+#else
+ o = creat ((char *) zfile, imode);
+#endif
+ }
+ }
+ if (o < 0)
+ {
+ ulog (LOG_ERROR, "open (%s): %s", zfile, strerror (errno));
+ return NULL;
+ }
+ }
+
+#ifndef O_CREAT
+#ifdef O_APPEND
+ if (fappend)
+ {
+ if (fcntl (o, F_SETFL, O_APPEND) < 0)
+ {
+ ulog (LOG_ERROR, "fcntl (%s, O_APPEND): %s", zfile,
+ strerror (errno));
+ (void) close (o);
+ return NULL;
+ }
+ }
+#endif /* defined (O_APPEND) */
+#endif /* ! defined (O_CREAT) */
+
+ if (fcntl (o, F_SETFD, fcntl (o, F_GETFD, 0) | FD_CLOEXEC) < 0)
+ {
+ ulog (LOG_ERROR, "fcntl (%s, FD_CLOEXEC): %s", zfile,
+ strerror (errno));
+ (void) close (o);
+ return NULL;
+ }
+
+ if (fappend)
+ e = fdopen (o, (char *) "a");
+ else
+ e = fdopen (o, (char *) "w");
+
+ if (e == NULL)
+ {
+ ulog (LOG_ERROR, "fdopen: %s", strerror (errno));
+ (void) close (o);
+ }
+
+ return e;
+}