summaryrefslogtreecommitdiff
path: root/usr/src/lib/libbsm/common/getacval.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libbsm/common/getacval.c')
-rw-r--r--usr/src/lib/libbsm/common/getacval.c511
1 files changed, 0 insertions, 511 deletions
diff --git a/usr/src/lib/libbsm/common/getacval.c b/usr/src/lib/libbsm/common/getacval.c
deleted file mode 100644
index 993b08257f..0000000000
--- a/usr/src/lib/libbsm/common/getacval.c
+++ /dev/null
@@ -1,511 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-#pragma ident "%Z%%M% %I% %E% SMI"
-/*
- * get audit control info (replaces getacinfo.c)
- */
-
-#include <secdb.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <bsm/audit.h>
-#include <bsm/libbsm.h>
-#include <stdlib.h>
-#include <string.h>
-#include <synch.h>
-
-#define REALLY_LONG_LINE 8192
-
-#define FILE_AT_START 0 /* file pointer is at file start or file is closed */
-#define FILE_MIDDLE 1 /* file pointer is not at file start */
-
-#define LEN 360 /* arbitrary audit control entry length */
-
-#define SUCCESS 0
-#define EOF_WARN 1
-#define REW_WARN 2
-#define EOF_ERR -1
-#define ERROR -2
-#define FORMAT_ERR -3
-#define NO_CONTEXT -4
-
-/*
- * libbsm.h has opaque typedef: typedef struct au_acinfo au_acinfo_t
- */
-struct au_acinfo {
- char *file;
- FILE *fp;
- int file_pointer;
- int once_read;
-};
-
-static char *MINLABEL = "minfree:";
-static char *DIRLABEL = "dir:";
-static char *DEFFLGLABEL = "flags:";
-static char *NAFLGLABEL = "naflags:";
-static char *lib_label = "plugin:";
-
-/*
- * get extended line, i.e., interpret trailing "\" and join to make
- * a single line. Returns NULL on error or EOF, else returns its
- * input pointer. A line containing only "\" and some blanks is valid.
- *
- * doesn't handle a comment line embedded in a series of continued lines.
- */
-
-static char *
-getlongline(char *line, int length, FILE *fp)
-{
- int keepgoing = 1;
- int partcount = 0;
- char *l, *b;
- int end = 0;
-
- l = line;
- while (keepgoing) {
- if (fgets(l, length, fp) != NULL) {
- partcount++;
- end = strlen(l);
- b = l + end - 2; /* last char before \n */
- *(b + 1) = '\0'; /* chop the \n */
- keepgoing = 0;
- while (b >= l) {
- if (*b == '\\') {
- keepgoing = 1;
- l = b;
- length -= (end - 1);
- break;
- } else if (*b != ' ')
- break;
- end--;
- b--;
- }
- } else
- keepgoing = 0;
- }
- if (partcount > 0)
- return (line);
- else
- return (NULL);
-}
-
-/*
- * input a string of the form attr: xxxxx{\n}
- * and return xxxxx with leading, internal, and trailing blanks removed
- */
-
-static int
-getvalue(char *out_buf, char *line, char *attr_name, int out_len)
-{
- int attr_length, value_length;
- char *bp, *cp;
- int retstat = SUCCESS;
-
- attr_length = (int)strlen(attr_name);
- value_length = (int)strlen(line);
-
- if (strncmp(line, attr_name, attr_length) == 0) {
- /*
- * allow zero or more blanks
- * between colon and rest of line
- */
- value_length -= attr_length;
-
- bp = line + attr_length;
- while (*bp == ' ') {
- value_length--;
- attr_length++; /* offset to first non-blank */
- bp++;
- }
- cp = bp;
- while (*bp != '\0') {
- if (*bp == ' ') {
- bp++;
- value_length--;
- } else {
- *cp++ = *bp++;
- }
- }
- *cp = '\0';
-
- if (value_length < 1) {
- *out_buf = '\0';
- return (retstat);
- }
- if ((retstat == SUCCESS) &&
- (strlcpy(out_buf, line + attr_length, out_len) >=
- out_len))
- retstat = FORMAT_ERR;
- } else
- retstat = FORMAT_ERR;
-
- return (retstat);
-}
-
-/*
- * getacval.c - get audit control info
- *
- * _getacdir() - get audit control directories, one at a time
- * _getacflg() - get audit control default audit flags
- * _getacmin() - get audit control directory min. fill value
- * _getacna() - get audit control non-attrib audit flags
- * _getacplug() - get audit control remote host and associated data
- * _openac() - open the audit control file
- * _endac() - close the audit control file
- */
-
-/*
- * _getacdir() - get audit control directories, one at a time
- *
- * input: len - size of dir buffer
- *
- * output: dir - directory string
- *
- * returns: 0 - entry read ok
- * -1 - end of file
- * -2 - error - can't open audit control file for read
- * -3 - error - directory entry format error
- * 2 - directory search started from beginning again
- *
- * notes: It is the responsibility of the calling function to
- * check the status of the directory entry.
- */
-
-int
-_getacdir(au_acinfo_t *context, char *dir, int len)
-{
- int retstat = SUCCESS, gotone = 0;
- char *entry;
-
- if (context == NULL)
- return (NO_CONTEXT);
-
- entry = malloc(REALLY_LONG_LINE);
- if (entry == NULL)
- return (ERROR);
-
- if ((context->file_pointer != FILE_AT_START) &&
- (context->once_read == 1)) {
- retstat = REW_WARN;
- _rewindac(context);
- } else {
- context->once_read = 1;
- context->file_pointer = FILE_AT_START;
- }
- if (retstat >= SUCCESS) do {
- if (getlongline(entry, REALLY_LONG_LINE, context->fp) != NULL) {
- if (*entry == 'd') {
- retstat = getvalue(dir, entry, DIRLABEL, len);
- if (retstat == SUCCESS) {
- if (strlen(dir) == 0) {
- retstat = FORMAT_ERR;
- } else {
- gotone = 1;
- }
- }
- }
- } else if ((feof(context->fp)) == 0) {
- retstat = ERROR;
- } else {
- retstat = EOF_ERR;
- }
- } while (gotone == 0 && retstat >= SUCCESS);
-
- free(entry);
- return (retstat);
-}
-
-
-/*
- * _getacmin() - get audit control directory min. fill value
- *
- * output: min_val - percentage of directory fill allowed
- *
- * returns: 0 - entry read ok
- * 1 - end of file
- * -2 - error; errno contains error number
- * -3 - error - directory entry format error
- */
-
-int
-_getacmin(au_acinfo_t *context, int *min_val)
-{
- int retstat = SUCCESS, gotone = 0;
-
- char entry[LEN];
- char value[LEN];
-
- if (context == NULL)
- return (NO_CONTEXT);
-
- _rewindac(context);
-
- if (retstat == SUCCESS) do {
- if (getlongline(entry, LEN, context->fp) != NULL) {
- if (*entry == 'm') {
- retstat = getvalue(value, entry, MINLABEL,
- 5); /* sb 2 digits, allow more */
- if (retstat == SUCCESS) {
- gotone = 1;
- *min_val = (int)strtol(value, NULL, 10);
- if ((*min_val == 0) && (errno != 0))
- retstat = FORMAT_ERR;
- }
- }
- } else if ((feof(context->fp)) == 0)
- retstat = ERROR;
- else
- retstat = EOF_WARN;
-
- } while (gotone == 0 && retstat == SUCCESS);
-
- if (context->file_pointer == FILE_AT_START)
- context->file_pointer = FILE_MIDDLE;
- else
- _rewindac(context);
-
- return (retstat);
-}
-
-
-/*
- * _getacflg() - get audit control flags
- *
- * output: auditstring - character representation of system audit flags
- *
- * returns: 0 - entry read ok
- * 1 - end of file
- * -2 - error - errno contains error number
- * -3 - error - directory entry format error
- */
-
-int
-_getacflg(au_acinfo_t *context, char *auditstring, int len)
-{
- int retstat = SUCCESS, gotone = 0;
- char *entry;
-
- if (context == NULL)
- return (NO_CONTEXT);
-
- entry = malloc(REALLY_LONG_LINE);
- if (entry == NULL)
- return (ERROR);
-
- _rewindac(context);
-
- if (retstat == SUCCESS) do {
- if (getlongline(entry, REALLY_LONG_LINE, context->fp) != NULL) {
- if (*entry == 'f') {
- retstat = getvalue(auditstring, entry,
- DEFFLGLABEL, len);
- if (retstat == SUCCESS)
- gotone = 1;
- }
- } else if ((feof(context->fp)) == 0) {
- retstat = ERROR;
- } else {
- retstat = EOF_WARN;
- }
- } while (gotone == 0 && retstat == SUCCESS);
-
- if (context->file_pointer == FILE_AT_START)
- context->file_pointer = FILE_MIDDLE;
- else
- _rewindac(context);
-
- free(entry);
- return (retstat);
-}
-
-
-/*
- * _getacna() - get audit flags for non-attributable (server) events
- *
- * output: auditstring - character representation of system audit flags
- *
- * returns: 0 - entry read ok
- * 1 - end of file
- * -2 - error - errno contains error number
- * -3 - error - directory entry format error
- */
-
-int
-_getacna(au_acinfo_t *context, char *auditstring, int len)
-{
- int retstat = SUCCESS, gotone = 0;
- char *entry;
-
- entry = malloc(REALLY_LONG_LINE);
- if (entry == NULL)
- return (ERROR);
-
- _rewindac(context);
-
- if (retstat == SUCCESS) do {
- if (getlongline(entry, REALLY_LONG_LINE, context->fp) != NULL) {
- if (*entry == 'n') {
- retstat = getvalue(auditstring, entry,
- NAFLGLABEL, len);
- if (retstat == SUCCESS)
- gotone = 1;
- }
- } else if ((feof(context->fp)) == 0) {
- retstat = ERROR;
- } else {
- retstat = EOF_WARN;
- }
- /* end of if-do */
- } while (gotone == 0 && retstat == SUCCESS);
-
- if (context->file_pointer == FILE_AT_START)
- context->file_pointer = FILE_MIDDLE;
- else
- _rewindac(context);
-
- free(entry);
- return (retstat);
-}
-
-/*
- * _getacplug() - get plugin parameter line
- *
- * As with _getacdir, the caller is responsible for checking the
- * validity of what's returned.
- *
- * outputs: keyvalue list (call _kva_free(list_ptr) when you're done with
- * it.)
- *
- * returns: SUCCESS - entry read ok
- * EOF_WARN - end of file
- * REW_WARN - started over at the start of file
- * ERROR - error - errno contains error number
- * FORMAT_ERROR - fat finger failure
- */
-#define MAX_ARG 256
-
-int
-_getacplug(au_acinfo_t *context, kva_t **kv_list)
-{
- int retstat = SUCCESS, got_one = 0;
- char entry[REALLY_LONG_LINE];
- char value[REALLY_LONG_LINE];
-
- if (context == NULL)
- return (NO_CONTEXT);
-
- if (context->file_pointer != FILE_AT_START && context->once_read == 1) {
- retstat = REW_WARN;
- _rewindac(context);
- } else {
- context->once_read = 1;
- context->file_pointer = FILE_AT_START;
- }
-
- if (retstat == SUCCESS) do {
- if (getlongline(entry, REALLY_LONG_LINE, context->fp) != NULL) {
- if (*entry == 'p') {
- retstat = getvalue(value, entry, lib_label,
- REALLY_LONG_LINE);
- if (retstat == SUCCESS)
- got_one = 1;
- }
- } else if ((feof(context->fp)) == 0) {
- retstat = ERROR;
- } else {
- retstat = EOF_WARN;
- }
- /* end of if-do */
- } while ((got_one == 0) && (retstat == SUCCESS));
-
- /* value contains a list of attribute/value pairs */
- if (got_one) {
- *kv_list = _str2kva(value, "=", ";");
- if (*kv_list == NULL)
- retstat = FORMAT_ERR;
- } else {
- retstat = EOF_WARN;
- *kv_list = NULL;
- }
-lib_exit:
-
- return (retstat);
-}
-
-/* rewind the audit control file */
-void
-_rewindac(au_acinfo_t *context)
-{
- rewind(context->fp);
- context->file_pointer = FILE_AT_START;
- context->once_read = 0;
-}
-
-/*
- * _openac() open either the audit_control file or an alternate.
- * A NULL input means use the real audit_control.
- */
-
-au_acinfo_t *
-_openac(char *filepath)
-{
- au_acinfo_t *context;
-
- if (filepath == NULL)
- filepath = AUDITCONTROLFILE;
-
- context = malloc(sizeof (au_acinfo_t));
- if (context == NULL)
- return (NULL);
-
- context->file = strdup(filepath);
- if (filepath == NULL) {
- free(context);
- return (NULL);
- }
- context->fp = fopen(filepath, "rF");
- if (context->fp == NULL) {
- free(context->file);
- free(context);
- return (NULL);
- }
- context->file_pointer = FILE_AT_START;
- context->once_read = 0;
- return (context);
-}
-
-/* close the audit control file */
-void
-_endac(au_acinfo_t *context)
-{
- if (context == NULL)
- return;
-
- if (context->fp != NULL)
- (void) fclose(context->fp);
-
- free(context->file);
- free(context);
-}