summaryrefslogtreecommitdiff
path: root/contrib/opie/libopie/open.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/opie/libopie/open.c')
-rw-r--r--contrib/opie/libopie/open.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/contrib/opie/libopie/open.c b/contrib/opie/libopie/open.c
new file mode 100644
index 000000000000..0082c3446876
--- /dev/null
+++ b/contrib/opie/libopie/open.c
@@ -0,0 +1,61 @@
+/* open.c: The __opieopen() library function.
+
+%%% copyright-cmetz
+This software is Copyright 1996 by Craig Metz, All Rights Reserved.
+The Inner Net License Version 2 applies to this software.
+You should have received a copy of the license with this software. If
+you didn't get a copy, you may request one from <license@inner.net>.
+
+ History:
+
+ Created by cmetz for OPIE 2.3.
+*/
+#include "opie_cfg.h"
+
+#include <stdio.h>
+#include <sys/types.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+#include <sys/stat.h>
+#include <errno.h>
+
+#include "opie.h"
+
+#if !HAVE_LSTAT
+#define lstat(x, y) stat(x, y)
+#endif /* !HAVE_LSTAT */
+
+FILE *__opieopen FUNCTION((file, rw, mode), char *file AND int rw AND int mode)
+{
+ FILE *f;
+ struct stat st;
+
+ if (lstat(file, &st)) {
+ if (errno != ENOENT)
+ return NULL;
+
+ if (!(f = fopen(file, "w")))
+ return NULL;
+
+ fclose(f);
+
+ if (chmod(file, mode))
+ return NULL;
+
+ if (lstat(file, &st))
+ return NULL;
+ }
+
+ if (!S_ISREG(st.st_mode))
+ return NULL;
+
+ {
+ char *fmodes[] = { "r", "r+", "a" };
+
+ if (!(f = fopen(file, fmodes[rw])))
+ return NULL;
+ }
+
+ return f;
+}