summaryrefslogtreecommitdiffstats
path: root/contrib/opie/libopie/readrec.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/opie/libopie/readrec.c')
-rw-r--r--contrib/opie/libopie/readrec.c218
1 files changed, 218 insertions, 0 deletions
diff --git a/contrib/opie/libopie/readrec.c b/contrib/opie/libopie/readrec.c
new file mode 100644
index 0000000..c98daaa
--- /dev/null
+++ b/contrib/opie/libopie/readrec.c
@@ -0,0 +1,218 @@
+/* readrec.c: The __opiereadrec() 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 */
+#if HAVE_STRING_H
+#include <string.h>
+#endif /* HAVE_STRING_H */
+#if HAVE_STDLIB_H
+#include <stdlib.h>
+#endif /* HAVE_STDLIB_H */
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#endif /* HAVE_FCNTL_H */
+#include <ctype.h>
+#include <errno.h>
+#if DEBUG
+#include <syslog.h>
+#endif /* DEBUG */
+#include "opie.h"
+
+static int parserec FUNCTION((opie), struct opie *opie)
+{
+ char *c, *c2;
+
+ if (!(c2 = strchr(opie->opie_principal = opie->opie_buf, ' ')))
+ return -1;
+
+ while(*c2 == ' ') c2++;
+ *(c2 - 1) = 0;
+
+ if (!(c2 = strchr(c = c2, ' ')))
+ return -1;
+
+ *(c2++) = 0;
+
+ if (!(opie->opie_n = atoi(c)))
+ return -1;
+
+ if (!(c2 = strchr(opie->opie_seed = c2, ' ')))
+ return -1;
+
+ *(c2++) = 0;
+
+ while(*c2 == ' ') c2++;
+
+ if (!(c2 = strchr(opie->opie_val = c2, ' ')))
+ return -1;
+
+ *(c2++) = 0;
+
+ return 0;
+}
+
+static int parseextrec FUNCTION((opie), struct opie *opie)
+{
+ char *c;
+
+ if (!(c = strchr(opie->opie_extbuf, ' ')))
+ return -1;
+
+ *(c++) = 0;
+ while(*c == ' ') c++;
+
+ if (!(c = strchr(opie->opie_reinitkey = c, ' ')))
+ return -1;
+
+ *(c++) = 0;
+
+ return 0;
+}
+
+int __opiereadrec FUNCTION((opie), struct opie *opie)
+{
+ FILE *f = NULL, *f2 = NULL;
+ int rval = -1;
+
+ if (!(f = __opieopen(STD_KEY_FILE, 0, 0644))) {
+#if DEBUG
+ syslog(LOG_DEBUG, "__opiereadrec: __opieopen(STD_KEY_FILE..) failed!");
+#endif /* DEBUG */
+ goto ret;
+ }
+
+ if (!(f2 = __opieopen(EXT_KEY_FILE, 0, 0600))) {
+#if DEBUG
+ syslog(LOG_DEBUG, "__opiereadrec: __opieopen(EXT_KEY_FILE..) failed!");
+#endif /* DEBUG */
+ }
+
+ {
+ int i;
+
+ if ((i = open(STD_KEY_FILE, O_RDWR)) < 0) {
+ opie->opie_flags &= ~__OPIE_FLAGS_RW;
+#if DEBUG
+ syslog(LOG_DEBUG, "__opiereadrec: open(STD_KEY_FILE, O_RDWR) failed: %s", strerror(errno));
+#endif /* DEBUG */
+ } else {
+ close(i);
+ if ((i = open(EXT_KEY_FILE, O_RDWR)) < 0) {
+ opie->opie_flags &= ~__OPIE_FLAGS_RW;
+#if DEBUG
+ syslog(LOG_DEBUG, "__opiereadrec: open(STD_KEY_FILE, O_RDWR) failed: %s", strerror(errno));
+#endif /* DEBUG */
+ } else {
+ close(i);
+ opie->opie_flags |= __OPIE_FLAGS_RW;
+ }
+ }
+ }
+
+ if (opie->opie_buf[0]) {
+ if (fseek(f, opie->opie_recstart, SEEK_SET))
+ goto ret;
+
+ if (fgets(opie->opie_buf, sizeof(opie->opie_buf), f))
+ goto ret;
+
+ if (parserec(opie))
+ goto ret;
+
+ if (opie->opie_extbuf[0]) {
+ if (!f2) {
+#if DEBUG
+ syslog(LOG_DEBUG, "__opiereadrec: can't read ext file, but could before?");
+#endif /* DEBUG */
+ goto ret;
+ }
+
+ if (fseek(f2, opie->opie_extrecstart, SEEK_SET))
+ goto ret;
+
+ if (fgets(opie->opie_extbuf, sizeof(opie->opie_extbuf), f2))
+ goto ret;
+
+ if (parseextrec(opie))
+ goto ret;
+ }
+
+ rval = 0;
+ goto ret;
+ }
+
+ if (!opie->opie_principal)
+ return -1;
+
+ {
+ char *c, principal[OPIE_PRINCIPAL_MAX];
+ int i;
+
+ if (c = strchr(opie->opie_principal, ':'))
+ *c = 0;
+ if (strlen(opie->opie_principal) > OPIE_PRINCIPAL_MAX)
+ (opie->opie_principal)[OPIE_PRINCIPAL_MAX] = 0;
+
+ strcpy(principal, opie->opie_principal);
+
+ do {
+ if ((opie->opie_recstart = ftell(f)) < 0)
+ goto ret;
+
+ if (!fgets(opie->opie_buf, sizeof(opie->opie_buf), f)) {
+ rval = 1;
+ goto ret;
+ }
+
+ if (parserec(opie))
+ goto ret;
+ } while (strcmp(principal, opie->opie_principal));
+
+ if (!f2) {
+ opie->opie_extbuf[0] = rval = 0;
+ goto ret;
+ }
+
+ do {
+ if ((opie->opie_extrecstart = ftell(f2)) < 0)
+ goto ret;
+
+ if (!fgets(opie->opie_extbuf, sizeof(opie->opie_extbuf), f2)) {
+ if (feof(f2)) {
+ opie->opie_reinitkey = NULL;
+ rval = 0;
+ } else
+ rval = 1;
+ goto ret;
+ }
+
+ if (parseextrec(opie))
+ goto ret;
+ } while (strcmp(principal, opie->opie_extbuf));
+
+ rval = 0;
+ }
+
+ret:
+ if (f)
+ fclose(f);
+ if (f2)
+ fclose(f2);
+ return rval;
+}
+
OpenPOWER on IntegriCloud