From 9734dc69e1a92b5862e7e7d3410dad1432024046 Mon Sep 17 00:00:00 2001 From: jkh Date: Wed, 7 Oct 1998 17:32:49 +0000 Subject: Add a simple mechanism for reading property lists from files (which I'll convert sysinstall to use shortly) and a simple call which uses this mechanism to implement an /etc/auth.conf file. I'll let Mark Murray handle the format and checkin of the sample auth.conf file. Reviewed by: markm --- lib/libutil/Makefile | 2 +- lib/libutil/auth.c | 68 ++++++++++++++++ lib/libutil/libutil.h | 17 +++- lib/libutil/property.c | 215 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 300 insertions(+), 2 deletions(-) create mode 100644 lib/libutil/auth.c create mode 100644 lib/libutil/property.c (limited to 'lib/libutil') diff --git a/lib/libutil/Makefile b/lib/libutil/Makefile index 001faf0..47b728a 100644 --- a/lib/libutil/Makefile +++ b/lib/libutil/Makefile @@ -7,7 +7,7 @@ CFLAGS+=-Wall -DLIBC_SCCS -I${.CURDIR} -I${.CURDIR}/../../sys #CFLAGS+=LOGIN_CAP_AUTH SRCS= login.c login_tty.c logout.c logwtmp.c pty.c setproctitle.c \ login_cap.c login_class.c login_auth.c login_times.c login_ok.c \ - _secure_path.c uucplock.c + _secure_path.c uucplock.c property.c auth.c MAN3+= login.3 login_auth.3 login_tty.3 logout.3 logwtmp.3 pty.3 \ setproctitle.3 login_cap.3 login_class.3 login_times.3 login_ok.3 \ _secure_path.3 uucplock.3 diff --git a/lib/libutil/auth.c b/lib/libutil/auth.c new file mode 100644 index 0000000..db6246e --- /dev/null +++ b/lib/libutil/auth.c @@ -0,0 +1,68 @@ +/* + * + * Simple authentication database handling code. + * + * Copyright (c) 1998 + * Jordan Hubbard. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * verbatim and that no modifications are made prior to this + * point in the file. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR HIS PETS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id* + * + */ + +#include +#include +#include + +static properties P; + +static int +initauthconf(const char *path) +{ + FILE *fp; + + if (!P) { + if ((fp = fopen(path, "r")) == NULL) { + syslog(LOG_ERR, "initauthconf: unable to open file: %s", path); + return 1; + } + P = properties_read(fp); + fclose(fp); + if (!P) { + syslog(LOG_ERR, "initauthconf: unable to parse file: %s", path); + return 1; + } + } + return 0; +} + +char * +auth_getval(const char *name) +{ + if (!P && initauthconf(_PATH_AUTHCONF)) + return NULL; + else + return property_find(P, name); +} diff --git a/lib/libutil/libutil.h b/lib/libutil/libutil.h index da128d9..f21cbb4 100644 --- a/lib/libutil/libutil.h +++ b/lib/libutil/libutil.h @@ -18,14 +18,25 @@ * 5. Modifications may be freely made to this file providing the above * conditions are met. * - * $Id: libutil.h,v 1.15 1998/06/01 08:46:52 amurai Exp $ + * $Id: libutil.h,v 1.16 1998/06/05 08:21:33 ache Exp $ */ #ifndef _LIBUTIL_H_ #define _LIBUTIL_H_ +#include #include +/* for properties.c */ +typedef struct _property { + struct _property *next; + char *name; + char *value; +} *properties; + +/* for auth.c */ +#define _PATH_AUTHCONF "/etc/auth.conf" + /* Avoid pulling in all the include files for no need */ struct termios; struct winsize; @@ -47,6 +58,10 @@ int uu_lock __P((const char *_ttyname)); int uu_unlock __P((const char *_ttyname)); int uu_lock_txfr __P((const char *_ttyname, pid_t _pid)); int _secure_path __P((const char *_path, uid_t _uid, gid_t _gid)); +properties properties_read __P((FILE *fp)); +void properties_free __P((properties list)); +char *property_find __P((properties list, const char *name)); +char *auth_getval __P((const char *name)); __END_DECLS #define UU_LOCK_INUSE (1) diff --git a/lib/libutil/property.c b/lib/libutil/property.c new file mode 100644 index 0000000..3a1b991 --- /dev/null +++ b/lib/libutil/property.c @@ -0,0 +1,215 @@ +/* + * + * Simple property list handling code. + * + * Copyright (c) 1998 + * Jordan Hubbard. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * verbatim and that no modifications are made prior to this + * point in the file. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR HIS PETS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#include +#include +#include +#include + +#define MAX_NAME 64 +#define MAX_VALUE 512 + +static properties +property_alloc(char *name, char *value) +{ + properties n; + + n = (properties)malloc(sizeof(struct _property)); + n->next = NULL; + n->name = name ? strdup(name) : NULL; + n->value = value ? strdup(value) : NULL; + return n; +} + +properties +properties_read(FILE *fp) +{ + properties head, ptr; + char hold_n[MAX_NAME + 1]; + char hold_v[MAX_VALUE + 1]; + char buf[BUFSIZ * 4]; + int bp, n, v, max; + enum { LOOK, COMMENT, NAME, VALUE, MVALUE, COMMIT, FILL, STOP } state; + int ch = 0; + + n = v = bp = max = 0; + head = ptr = NULL; + state = LOOK; + while (state != STOP) { + if (state != COMMIT) { + if (bp == max) + state = FILL; + else + ch = buf[bp++]; + } + switch(state) { + case FILL: + if ((max = fread(buf, 1, sizeof buf, fp)) <= 0) { + state = STOP; + break; + } + else { + state = LOOK; + ch = buf[0]; + bp = 1; + } + /* Fall through deliberately since we already have a character and state == LOOK */ + + case LOOK: + if (isspace(ch)) + continue; + /* Allow shell or lisp style comments */ + else if (ch == '#' || ch == ';') { + state = COMMENT; + continue; + } + else if (isalnum(ch) || ch == '_') { + if (n >= MAX_NAME) { + n = 0; + state = COMMENT; + } + else { + hold_n[n++] = ch; + state = NAME; + } + } + else + state = COMMENT; /* Ignore the rest of the line */ + break; + + case COMMENT: + if (ch == '\n') + state = LOOK; + break; + + case NAME: + if (ch == '\n' || !ch) { + hold_n[n] = '\0'; + hold_v[0] = '\0'; + v = n = 0; + state = COMMIT; + } + else if (isspace(ch)) + continue; + else if (ch == '=') { + hold_n[n] = '\0'; + v = n = 0; + state = VALUE; + } + else + hold_n[n++] = ch; + break; + + case VALUE: + if (v == 0 && isspace(ch)) + continue; + else if (ch == '{') + state = MVALUE; + else if (ch == '\n' || !ch) { + hold_v[v] = '\0'; + v = n = 0; + state = COMMIT; + } + else { + if (v >= MAX_VALUE) { + state = COMMENT; + v = n = 0; + break; + } + else + hold_v[v++] = ch; + } + break; + + case MVALUE: + /* multiline value */ + if (v >= MAX_VALUE) { + state = COMMENT; + n = v = 0; + } + else if (ch == '}') { + hold_v[v] = '\0'; + v = n = 0; + state = COMMIT; + } + else + hold_v[v++] = ch; + break; + + case COMMIT: + if (!head) + head = ptr = property_alloc(hold_n, hold_v); + else { + ptr->next = property_alloc(hold_n, hold_v); + ptr = ptr->next; + } + state = LOOK; + v = n = 0; + break; + + case STOP: + /* we don't handle this here, but this prevents warnings */ + break; + } + } + return head; +} + +char * +property_find(properties list, const char *name) +{ + if (!list || !name || !name[0]) + return NULL; + while (list) { + if (!strcmp(list->name, name)) + return list->value; + list = list->next; + } + return NULL; +} + +void +properties_free(properties list) +{ + properties tmp; + + while (list) { + tmp = list->next; + if (list->name) + free(list->name); + if (list->value) + free(list->value); + free(list); + list = tmp; + } +} + -- cgit v1.1