Home | History | Annotate | Download | only in common
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /*
     23  * Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     28 
     29 #include <sys/types.h>
     30 #include <sys/systeminfo.h>
     31 #include <bsm/audit.h>
     32 #include <bsm/libbsm.h>
     33 #include <bsm/audit_uevents.h>
     34 #include <bsm/audit_private.h>
     35 #include <unistd.h>
     36 #include <stdlib.h>
     37 #include <string.h>
     38 
     39 #include <locale.h>
     40 #include "generic.h"
     41 
     42 #define	AUDIT_AT_TEXTBUF	256
     43 static char textbuf[AUDIT_AT_TEXTBUF];
     44 
     45 int
     46 audit_at_create(char *path, int sorf)
     47 {
     48 	int r = 0;
     49 
     50 	if (cannot_audit(0)) {
     51 		return (0);
     52 	} else {
     53 		char *anc_name;
     54 		auditinfo_addr_t ai;
     55 
     56 		if (getaudit_addr(&ai, sizeof (ai))) {
     57 			return (-1);
     58 		}
     59 
     60 		/*
     61 		 * create an ancilary file if audit characteristics exist
     62 		 */
     63 
     64 		anc_name = audit_cron_make_anc_name(path);
     65 		if (anc_name == NULL)
     66 			r = -1;
     67 		else if (audit_crontab_process_not_audited())
     68 			free(anc_name);
     69 		else {
     70 			r = audit_cron_setinfo(anc_name, &ai);
     71 			free(anc_name);
     72 		}
     73 
     74 		aug_init();
     75 		aug_save_auid(ai.ai_auid);
     76 		aug_save_euid(geteuid());
     77 		aug_save_egid(getegid());
     78 		aug_save_uid(getuid());
     79 		aug_save_gid(getgid());
     80 		aug_save_pid(getpid());
     81 		aug_save_asid(ai.ai_asid);
     82 		aug_save_tid_ex(ai.ai_termid.at_port, ai.ai_termid.at_addr,
     83 			ai.ai_termid.at_type);
     84 
     85 		aug_save_path(path);
     86 		aug_save_event(AUE_at_create);
     87 		aug_save_sorf(sorf);
     88 
     89 		if (aug_audit() != 0)
     90 			return (-1);
     91 
     92 		return (r);
     93 	}
     94 }
     95 
     96 int
     97 audit_at_delete(char *name, char *path, int sorf)
     98 {
     99 	int r = 0, err = 0;
    100 	char full_path[PATH_MAX];
    101 
    102 	if (cannot_audit(0))
    103 		return (0);
    104 
    105 	if (path != NULL) {
    106 		if (strlen(path) + strlen(name) + 2 > PATH_MAX)
    107 			r = -2;		/* bad at-job name */
    108 		else {
    109 			(void) strcat(strcat(strcpy(full_path, path), "/"),
    110 			    name);
    111 			name = full_path;
    112 		}
    113 	}
    114 
    115 	if (sorf == 0) {
    116 		char *anc_name;
    117 		anc_name = audit_cron_make_anc_name(name);
    118 		r = unlink(anc_name);
    119 		if (r == -1)
    120 			err = errno;
    121 		free(anc_name);
    122 	}
    123 
    124 	aug_init();
    125 	(void) aug_save_me();
    126 	if (r == -1) {
    127 		(void) snprintf(textbuf, sizeof (textbuf),
    128 			dgettext(bsm_dom, "ancillary file: %s"),
    129 			strerror(err));
    130 		aug_save_text(textbuf);
    131 	} else if (r == -2) {
    132 		aug_save_text(
    133 			dgettext(bsm_dom, "bad format of at-job name"));
    134 	}
    135 
    136 	aug_save_path(name);
    137 	aug_save_event(AUE_at_delete);
    138 	aug_save_sorf(sorf);
    139 
    140 	if (aug_audit() != 0)
    141 		return (-1);
    142 	return (r);
    143 }
    144