diff options
Diffstat (limited to 'contrib/opie/libopie/open.c')
| -rw-r--r-- | contrib/opie/libopie/open.c | 61 |
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; +} |
