xref: /illumos-gate/usr/src/lib/libbsm/common/audit_at.c (revision a5f69788de7ac07553de47f7fec8c05a9a94c105)
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