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 #include <sys/types.h>
28 #include <sys/systeminfo.h>
29 #include <bsm/audit.h>
30 #include <bsm/libbsm.h>
31 #include <bsm/audit_uevents.h>
32 #include <bsm/audit_private.h>
33 #include <unistd.h>
34 #include <stdlib.h>
35 #include <string.h>
36
37 #include <locale.h>
38 #include "generic.h"
39
40 #define AUDIT_AT_TEXTBUF 256
41 static char textbuf[AUDIT_AT_TEXTBUF];
42
43 int
audit_at_create(char * path,int sorf)44 audit_at_create(char *path, int sorf)
45 {
46 int r = 0;
47
48 if (cannot_audit(0)) {
49 return (0);
50 } else {
51 char *anc_name;
52 auditinfo_addr_t ai;
53
54 if (getaudit_addr(&ai, sizeof (ai))) {
55 return (-1);
56 }
57
58 /*
59 * create an ancilary file if audit characteristics exist
60 */
61
62 anc_name = audit_cron_make_anc_name(path);
63 if (anc_name == NULL)
64 r = -1;
65 else if (audit_crontab_process_not_audited())
66 free(anc_name);
67 else {
68 r = audit_cron_setinfo(anc_name, &ai);
69 free(anc_name);
70 }
71
72 aug_init();
73 aug_save_auid(ai.ai_auid);
74 aug_save_euid(geteuid());
75 aug_save_egid(getegid());
76 aug_save_uid(getuid());
77 aug_save_gid(getgid());
78 aug_save_pid(getpid());
79 aug_save_asid(ai.ai_asid);
80 aug_save_tid_ex(ai.ai_termid.at_port, ai.ai_termid.at_addr,
81 ai.ai_termid.at_type);
82
83 aug_save_path(path);
84 aug_save_event(AUE_at_create);
85 aug_save_sorf(sorf);
86
87 if (aug_audit() != 0)
88 return (-1);
89
90 return (r);
91 }
92 }
93
94 int
audit_at_delete(char * name,char * path,int sorf)95 audit_at_delete(char *name, char *path, int sorf)
96 {
97 int r = 0, err = 0;
98 char full_path[PATH_MAX];
99
100 if (cannot_audit(0))
101 return (0);
102
103 if (path != NULL) {
104 if (strlen(path) + strlen(name) + 2 > PATH_MAX)
105 r = -2; /* bad at-job name */
106 else {
107 (void) strcat(strcat(strcpy(full_path, path), "/"),
108 name);
109 name = full_path;
110 }
111 }
112
113 if (sorf == 0) {
114 char *anc_name;
115 anc_name = audit_cron_make_anc_name(name);
116 r = unlink(anc_name);
117 if (r == -1)
118 err = errno;
119 free(anc_name);
120 }
121
122 aug_init();
123 (void) aug_save_me();
124 if (r == -1) {
125 (void) snprintf(textbuf, sizeof (textbuf),
126 dgettext(bsm_dom, "ancillary file: %s"),
127 strerror(err));
128 aug_save_text(textbuf);
129 } else if (r == -2) {
130 aug_save_text(
131 dgettext(bsm_dom, "bad format of at-job name"));
132 }
133
134 aug_save_path(name);
135 aug_save_event(AUE_at_delete);
136 aug_save_sorf(sorf);
137
138 if (aug_audit() != 0)
139 return (-1);
140 return (r);
141 }
142