2 * Copyright (c) 2003-2004 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
20 * @APPLE_LICENSE_HEADER_END@
23 #include <sys/types.h>
25 #include <sys/event.h>
26 #include <sys/ucred.h>
29 #include <bsm/audit.h>
30 #include <bsm/audit_record.h>
31 #include <bsm/audit_klib.h>
32 #include <bsm/audit_kernel.h>
34 #include <kern/clock.h>
35 #include <kern/kalloc.h>
39 #define GET_TOKEN_AREA(tok, dptr, length) \
41 tok = (token_t *)kalloc(sizeof(*tok) + length); \
45 dptr = tok->t_data = (u_char *)&tok[1];\
46 memset(dptr, 0, length);\
55 * argument value 4 bytes/8 bytes (32-bit/64-bit value)
57 * text N bytes + 1 terminating NULL byte
59 token_t
*au_to_arg32(char n
, char *text
, u_int32_t v
)
69 /* Make sure that text is null terminated */
70 textlen
= strlen(text
);
71 if(text
[textlen
] != '\0') {
75 GET_TOKEN_AREA(t
, dptr
, 9 + textlen
);
82 ADD_U_CHAR(dptr
, AU_ARG32_TOKEN
);
85 ADD_U_INT16(dptr
, textlen
);
86 ADD_STRING(dptr
, text
, textlen
);
92 token_t
*au_to_arg64(char n
, char *text
, u_int64_t v
)
102 /* Make sure that text is null terminated */
103 textlen
= strlen(text
);
104 if(text
[textlen
] != '\0') {
108 GET_TOKEN_AREA(t
, dptr
, 13 + textlen
);
115 ADD_U_CHAR(dptr
, AU_ARG64_TOKEN
);
117 ADD_U_INT64(dptr
, v
);
118 ADD_U_INT16(dptr
, textlen
);
119 ADD_STRING(dptr
, text
, textlen
);
125 token_t
*au_to_arg(char n
, char *text
, u_int32_t v
)
127 return au_to_arg32(n
, text
, v
);
132 * file access mode 4 bytes
133 * owner user ID 4 bytes
134 * owner group ID 4 bytes
135 * file system ID 4 bytes
137 * device 4 bytes/8 bytes (32-bit/64-bit)
139 token_t
*au_to_attr32(__unused
struct vnode_attr
*attr
)
144 /* Kernel-specific version of the above function */
145 token_t
*kau_to_attr32(struct vnode_au_info
*vni
)
150 u_int16_t pad0_16
= 0;
151 u_int32_t pad0_32
= 0;
157 GET_TOKEN_AREA(t
, dptr
, 29);
162 ADD_U_CHAR(dptr
, AU_ATTR32_TOKEN
);
165 * Darwin defines the size for the file mode as 2 bytes;
166 * BSM defines 4. So we copy in a 0 first.
168 ADD_U_INT16(dptr
, pad0_16
);
169 ADD_U_INT16(dptr
, vni
->vn_mode
);
171 ADD_U_INT32(dptr
, vni
->vn_uid
);
172 ADD_U_INT32(dptr
, vni
->vn_gid
);
173 ADD_U_INT32(dptr
, vni
->vn_fsid
);
176 * Darwin defines the size for fileid as 4 bytes;
177 * BSM defines 8. So we copy in a 0 first.
179 fileid
= vni
->vn_fileid
;
180 ADD_U_INT32(dptr
, pad0_32
);
181 ADD_U_INT32(dptr
, fileid
);
183 ADD_U_INT32(dptr
, vni
->vn_dev
);
188 token_t
*au_to_attr64(__unused
struct vnode_attr
*attr
)
193 token_t
*kau_to_attr64(__unused
struct vnode_au_info
*vni
)
198 token_t
*au_to_attr(struct vnode_attr
*attr
)
200 return au_to_attr32(attr
);
207 * how to print 1 byte
210 * data items (depends on basic unit)
212 token_t
*au_to_data(char unit_print
, char unit_type
,
213 char unit_count
, char *p
)
217 size_t datasize
, totdata
;
223 /* Determine the size of the basic unit */
225 case AUR_BYTE
: datasize
= AUR_BYTE_SIZE
;
228 case AUR_SHORT
: datasize
= AUR_SHORT_SIZE
;
231 case AUR_LONG
: datasize
= AUR_LONG_SIZE
;
234 default: return NULL
;
237 totdata
= datasize
* unit_count
;
239 GET_TOKEN_AREA(t
, dptr
, totdata
+ 4);
244 ADD_U_CHAR(dptr
, AU_ARB_TOKEN
);
245 ADD_U_CHAR(dptr
, unit_print
);
246 ADD_U_CHAR(dptr
, unit_type
);
247 ADD_U_CHAR(dptr
, unit_count
);
248 ADD_MEM(dptr
, p
, totdata
);
256 * return value 4 bytes
258 token_t
*au_to_exit(int retval
, int err
)
263 GET_TOKEN_AREA(t
, dptr
, 9);
268 ADD_U_CHAR(dptr
, AU_EXIT_TOKEN
);
269 ADD_U_INT32(dptr
, err
);
270 ADD_U_INT32(dptr
, retval
);
277 token_t
*au_to_groups(int *groups
)
279 return au_to_newgroups(MAX_GROUPS
, groups
);
284 * number groups 2 bytes
285 * group list count * 4 bytes
287 token_t
*au_to_newgroups(u_int16_t n
, gid_t
*groups
)
297 GET_TOKEN_AREA(t
, dptr
, n
* 4 + 3);
302 ADD_U_CHAR(dptr
, AU_NEWGROUPS_TOKEN
);
303 ADD_U_INT16(dptr
, n
);
304 for(i
= 0; i
< n
; i
++) {
305 ADD_U_INT32(dptr
, groups
[i
]);
316 * internet address 4 bytes
318 token_t
*au_to_in_addr(struct in_addr
*internet_addr
)
323 if(internet_addr
== NULL
) {
327 GET_TOKEN_AREA(t
, dptr
, 5);
332 ADD_U_CHAR(dptr
, AU_IN_ADDR_TOKEN
);
333 ADD_U_INT32(dptr
, internet_addr
->s_addr
);
340 * address type/length 4 bytes
343 token_t
*au_to_in_addr_ex(struct in6_addr
*internet_addr
)
347 u_int32_t type
= AF_INET6
;
349 if(internet_addr
== NULL
) {
353 GET_TOKEN_AREA(t
, dptr
, 21);
358 ADD_U_CHAR(dptr
, AU_IN_ADDR_EX_TOKEN
);
359 ADD_U_INT32(dptr
, type
);
360 ADD_U_INT32(dptr
, internet_addr
->__u6_addr
.__u6_addr32
[0]);
361 ADD_U_INT32(dptr
, internet_addr
->__u6_addr
.__u6_addr32
[1]);
362 ADD_U_INT32(dptr
, internet_addr
->__u6_addr
.__u6_addr32
[2]);
363 ADD_U_INT32(dptr
, internet_addr
->__u6_addr
.__u6_addr32
[3]);
372 token_t
*au_to_ip(struct ip
*ip
)
381 GET_TOKEN_AREA(t
, dptr
, 21);
386 ADD_U_CHAR(dptr
, AU_IP_TOKEN
);
387 ADD_MEM(dptr
, ip
, sizeof(struct ip
));
394 * object ID type 1 byte
397 token_t
*au_to_ipc(char type
, int id
)
403 GET_TOKEN_AREA(t
, dptr
, 6);
408 ADD_U_CHAR(dptr
, AU_IPC_TOKEN
);
409 ADD_U_CHAR(dptr
, type
);
410 ADD_U_INT32(dptr
, id
);
417 * owner user ID 4 bytes
418 * owner group ID 4 bytes
419 * creator user ID 4 bytes
420 * creator group ID 4 bytes
421 * access mode 4 bytes
422 * slot sequence # 4 bytes
425 token_t
*au_to_ipc_perm(struct ipc_perm
*perm
)
435 GET_TOKEN_AREA(t
, dptr
, 29);
441 * Darwin defines the sizes for ipc_perm members
442 * as 2 bytes; BSM defines 4. So we copy in a 0 first.
444 ADD_U_CHAR(dptr
, AU_IPCPERM_TOKEN
);
446 ADD_U_INT16(dptr
, pad0
);
447 ADD_U_INT16(dptr
, perm
->uid
);
449 ADD_U_INT16(dptr
, pad0
);
450 ADD_U_INT16(dptr
, perm
->gid
);
452 ADD_U_INT16(dptr
, pad0
);
453 ADD_U_INT16(dptr
, perm
->cuid
);
455 ADD_U_INT16(dptr
, pad0
);
456 ADD_U_INT16(dptr
, perm
->cgid
);
458 ADD_U_INT16(dptr
, pad0
);
459 ADD_U_INT16(dptr
, perm
->mode
);
461 ADD_U_INT16(dptr
, pad0
);
462 ADD_U_INT16(dptr
, perm
->seq
);
464 ADD_U_INT16(dptr
, pad0
);
465 ADD_U_INT16(dptr
, perm
->key
);
473 * port IP address 2 bytes
475 token_t
*au_to_iport(u_int16_t iport
)
481 GET_TOKEN_AREA(t
, dptr
, 3);
486 ADD_U_CHAR(dptr
, AU_IPORT_TOKEN
);
487 ADD_U_INT16(dptr
, iport
);
498 token_t
*au_to_opaque(char *data
, u_int16_t bytes
)
503 if((data
== NULL
) || (bytes
<= 0)) {
507 GET_TOKEN_AREA(t
, dptr
, bytes
+ 3);
512 ADD_U_CHAR(dptr
, AU_OPAQUE_TOKEN
);
513 ADD_U_INT16(dptr
, bytes
);
514 ADD_MEM(dptr
, data
, bytes
);
520 * Kernel version of the add file token function, where the time value
521 * is passed in as an additional parameter.
523 * seconds of time 4 bytes
524 * milliseconds of time 4 bytes
525 * file name len 2 bytes
526 * file pathname N bytes + 1 terminating NULL byte
528 token_t
*kau_to_file(const char *file
, const struct timeval
*tv
)
533 u_int32_t timems
= tv
->tv_usec
/1000; /* We need time in ms */
538 /* Make sure that text is null terminated */
539 filelen
= strlen(file
);
540 if(file
[filelen
] != '\0') {
544 GET_TOKEN_AREA(t
, dptr
, filelen
+ 12);
551 ADD_U_CHAR(dptr
, AU_FILE_TOKEN
);
553 /* Add the timestamp */
554 ADD_U_INT32(dptr
, tv
->tv_sec
);
555 ADD_U_INT32(dptr
, timems
);
557 ADD_U_INT16(dptr
, filelen
);
558 ADD_STRING(dptr
, file
, filelen
);
566 * text length 2 bytes
567 * text N bytes + 1 terminating NULL byte
569 token_t
*au_to_text(char *text
)
578 /* Make sure that text is null terminated */
579 textlen
= strlen(text
);
580 if(text
[textlen
] != '\0') {
584 GET_TOKEN_AREA(t
, dptr
, textlen
+ 4);
591 ADD_U_CHAR(dptr
, AU_TEXT_TOKEN
);
592 ADD_U_INT16(dptr
, textlen
);
593 ADD_STRING(dptr
, text
, textlen
);
600 * path length 2 bytes
601 * path N bytes + 1 terminating NULL byte
603 token_t
*au_to_path(char *text
)
612 /* Make sure that text is null terminated */
613 textlen
= strlen(text
);
614 if(text
[textlen
] != '\0') {
618 GET_TOKEN_AREA(t
, dptr
, textlen
+ 4);
625 ADD_U_CHAR(dptr
, AU_PATH_TOKEN
);
626 ADD_U_INT16(dptr
, textlen
);
627 ADD_STRING(dptr
, text
, textlen
);
635 * effective user ID 4 bytes
636 * effective group ID 4 bytes
637 * real user ID 4 bytes
638 * real group ID 4 bytes
642 * port ID 4 bytes/8 bytes (32-bit/64-bit value)
643 * machine address 4 bytes
645 token_t
*au_to_process32(au_id_t auid
, uid_t euid
, gid_t egid
,
646 uid_t ruid
, gid_t rgid
, pid_t pid
,
647 au_asid_t sid
, au_tid_t
*tid
)
656 GET_TOKEN_AREA(t
, dptr
, 37);
661 ADD_U_CHAR(dptr
, AU_PROCESS_32_TOKEN
);
662 ADD_U_INT32(dptr
, auid
);
663 ADD_U_INT32(dptr
, euid
);
664 ADD_U_INT32(dptr
, egid
);
665 ADD_U_INT32(dptr
, ruid
);
666 ADD_U_INT32(dptr
, rgid
);
667 ADD_U_INT32(dptr
, pid
);
668 ADD_U_INT32(dptr
, sid
);
669 ADD_U_INT32(dptr
, tid
->port
);
670 ADD_U_INT32(dptr
, tid
->machine
);
675 token_t
*au_to_process64(__unused au_id_t auid
,
681 __unused au_asid_t sid
,
682 __unused au_tid_t
*tid
)
687 token_t
*au_to_process(au_id_t auid
, uid_t euid
, gid_t egid
,
688 uid_t ruid
, gid_t rgid
, pid_t pid
,
689 au_asid_t sid
, au_tid_t
*tid
)
691 return au_to_process32(auid
, euid
, egid
, ruid
, rgid
, pid
,
699 * effective user ID 4 bytes
700 * effective group ID 4 bytes
701 * real user ID 4 bytes
702 * real group ID 4 bytes
706 * port ID 4 bytes/8 bytes (32-bit/64-bit value)
707 * address type-len 4 bytes
708 * machine address 16 bytes
710 token_t
*au_to_process32_ex(au_id_t auid
, uid_t euid
, gid_t egid
,
711 uid_t ruid
, gid_t rgid
, pid_t pid
,
712 au_asid_t sid
, au_tid_addr_t
*tid
)
721 GET_TOKEN_AREA(t
, dptr
, 53);
726 ADD_U_CHAR(dptr
, AU_PROCESS_32_EX_TOKEN
);
727 ADD_U_INT32(dptr
, auid
);
728 ADD_U_INT32(dptr
, euid
);
729 ADD_U_INT32(dptr
, egid
);
730 ADD_U_INT32(dptr
, ruid
);
731 ADD_U_INT32(dptr
, rgid
);
732 ADD_U_INT32(dptr
, pid
);
733 ADD_U_INT32(dptr
, sid
);
734 ADD_U_INT32(dptr
, tid
->at_port
);
735 ADD_U_INT32(dptr
, tid
->at_type
);
736 ADD_U_INT32(dptr
, tid
->at_addr
[0]);
737 ADD_U_INT32(dptr
, tid
->at_addr
[1]);
738 ADD_U_INT32(dptr
, tid
->at_addr
[2]);
739 ADD_U_INT32(dptr
, tid
->at_addr
[3]);
744 token_t
*au_to_process64_ex(
745 __unused au_id_t auid
,
751 __unused au_asid_t sid
,
752 __unused au_tid_addr_t
*tid
)
757 token_t
*au_to_process_ex(au_id_t auid
, uid_t euid
, gid_t egid
,
758 uid_t ruid
, gid_t rgid
, pid_t pid
,
759 au_asid_t sid
, au_tid_addr_t
*tid
)
761 return au_to_process32_ex(auid
, euid
, egid
, ruid
, rgid
,
767 * error status 1 byte
768 * return value 4 bytes/8 bytes (32-bit/64-bit value)
770 token_t
*au_to_return32(char status
, u_int32_t ret
)
776 GET_TOKEN_AREA(t
, dptr
, 6);
781 ADD_U_CHAR(dptr
, AU_RETURN_32_TOKEN
);
782 ADD_U_CHAR(dptr
, status
);
783 ADD_U_INT32(dptr
, ret
);
788 token_t
*au_to_return64(char status
, u_int64_t ret
)
794 GET_TOKEN_AREA(t
, dptr
, 10);
799 ADD_U_CHAR(dptr
, AU_RETURN_64_TOKEN
);
800 ADD_U_CHAR(dptr
, status
);
801 ADD_U_INT64(dptr
, ret
);
806 token_t
*au_to_return(char status
, u_int32_t ret
)
808 return au_to_return32(status
, ret
);
813 * sequence number 4 bytes
815 token_t
*au_to_seq(long audit_count
)
821 GET_TOKEN_AREA(t
, dptr
, 5);
826 ADD_U_CHAR(dptr
, AU_SEQ_TOKEN
);
827 ADD_U_INT32(dptr
, audit_count
);
834 * socket type 2 bytes
836 * local Internet address 4 bytes
837 * remote port 2 bytes
838 * remote Internet address 4 bytes
840 token_t
*au_to_socket(__unused
struct socket
*so
)
846 * Kernel-specific version of the above function.
848 token_t
*kau_to_socket(struct socket_au_info
*soi
)
858 GET_TOKEN_AREA(t
, dptr
, 15);
863 ADD_U_CHAR(dptr
, AU_SOCK_TOKEN
);
864 /* Coerce the socket type into a short value */
865 so_type
= soi
->so_type
;
866 ADD_U_INT16(dptr
, so_type
);
867 ADD_U_INT16(dptr
, soi
->so_lport
);
868 ADD_U_INT32(dptr
, soi
->so_laddr
);
869 ADD_U_INT16(dptr
, soi
->so_rport
);
870 ADD_U_INT32(dptr
, soi
->so_raddr
);
877 * socket type 2 bytes
879 * address type/length 4 bytes
880 * local Internet address 4 bytes/16 bytes (IPv4/IPv6 address)
881 * remote port 4 bytes
882 * address type/length 4 bytes
883 * remote Internet address 4 bytes/16 bytes (IPv4/IPv6 address)
885 token_t
*au_to_socket_ex_32(
886 __unused u_int16_t lp
,
887 __unused u_int16_t rp
,
888 __unused
struct sockaddr
*la
,
889 __unused
struct sockaddr
*ra
)
894 token_t
*au_to_socket_ex_128(
895 __unused u_int16_t lp
,
896 __unused u_int16_t rp
,
897 __unused
struct sockaddr
*la
,
898 __unused
struct sockaddr
*ra
)
905 * socket family 2 bytes
907 * socket address 4 bytes
909 token_t
*au_to_sock_inet32(struct sockaddr_in
*so
)
918 GET_TOKEN_AREA(t
, dptr
, 9);
923 ADD_U_CHAR(dptr
, AU_SOCK_INET_32_TOKEN
);
924 /* In Darwin, sin_family is one octet, but BSM defines the token
925 * to store two. So we copy in a 0 first.
928 ADD_U_CHAR(dptr
, so
->sin_family
);
929 ADD_U_INT16(dptr
, so
->sin_port
);
930 ADD_U_INT32(dptr
, so
->sin_addr
.s_addr
);
936 token_t
*au_to_sock_inet128(struct sockaddr_in6
*so
)
945 GET_TOKEN_AREA(t
, dptr
, 21);
950 ADD_U_CHAR(dptr
, AU_SOCK_INET_128_TOKEN
);
951 /* In Darwin, sin_family is one octet, but BSM defines the token
952 * to store two. So we copy in a 0 first.
955 ADD_U_CHAR(dptr
, so
->sin6_family
);
956 ADD_U_INT16(dptr
, so
->sin6_port
);
957 ADD_U_INT32(dptr
, so
->sin6_addr
.__u6_addr
.__u6_addr32
[0]);
958 ADD_U_INT32(dptr
, so
->sin6_addr
.__u6_addr
.__u6_addr32
[1]);
959 ADD_U_INT32(dptr
, so
->sin6_addr
.__u6_addr
.__u6_addr32
[2]);
960 ADD_U_INT32(dptr
, so
->sin6_addr
.__u6_addr
.__u6_addr32
[3]);
970 * socket family 2 bytes
973 token_t
*au_to_sock_unix(struct sockaddr_un
*so
)
982 GET_TOKEN_AREA(t
, dptr
, 107);
987 ADD_U_CHAR(dptr
, AU_SOCK_UNIX_TOKEN
);
988 /* BSM token has two bytes for family */
990 ADD_U_CHAR(dptr
, so
->sun_family
);
991 ADD_STRING(dptr
, so
->sun_path
, strlen(so
->sun_path
));
997 token_t
*au_to_sock_inet(struct sockaddr_in
*so
)
999 return au_to_sock_inet32(so
);
1005 * effective user ID 4 bytes
1006 * effective group ID 4 bytes
1007 * real user ID 4 bytes
1008 * real group ID 4 bytes
1009 * process ID 4 bytes
1010 * session ID 4 bytes
1012 * port ID 4 bytes/8 bytes (32-bit/64-bit value)
1013 * machine address 4 bytes
1015 token_t
*au_to_subject32(au_id_t auid
, uid_t euid
, gid_t egid
,
1016 uid_t ruid
, gid_t rgid
, pid_t pid
,
1017 au_asid_t sid
, au_tid_t
*tid
)
1026 GET_TOKEN_AREA(t
, dptr
, 37);
1031 ADD_U_CHAR(dptr
, AU_SUBJECT_32_TOKEN
);
1032 ADD_U_INT32(dptr
, auid
);
1033 ADD_U_INT32(dptr
, euid
);
1034 ADD_U_INT32(dptr
, egid
);
1035 ADD_U_INT32(dptr
, ruid
);
1036 ADD_U_INT32(dptr
, rgid
);
1037 ADD_U_INT32(dptr
, pid
);
1038 ADD_U_INT32(dptr
, sid
);
1039 ADD_U_INT32(dptr
, tid
->port
);
1040 ADD_U_INT32(dptr
, tid
->machine
);
1045 token_t
*au_to_subject64(
1046 __unused au_id_t auid
,
1047 __unused uid_t euid
,
1048 __unused gid_t egid
,
1049 __unused uid_t ruid
,
1050 __unused gid_t rgid
,
1052 __unused au_asid_t sid
,
1053 __unused au_tid_t
*tid
)
1058 token_t
*au_to_subject(au_id_t auid
, uid_t euid
, gid_t egid
,
1059 uid_t ruid
, gid_t rgid
, pid_t pid
,
1060 au_asid_t sid
, au_tid_t
*tid
)
1062 return au_to_subject32(auid
, euid
, egid
, ruid
, rgid
,
1070 * effective user ID 4 bytes
1071 * effective group ID 4 bytes
1072 * real user ID 4 bytes
1073 * real group ID 4 bytes
1074 * process ID 4 bytes
1075 * session ID 4 bytes
1077 * port ID 4 bytes/8 bytes (32-bit/64-bit value)
1078 * address type/length 4 bytes
1079 * machine address 16 bytes
1081 token_t
*au_to_subject32_ex(au_id_t auid
, uid_t euid
,
1082 gid_t egid
, uid_t ruid
, gid_t rgid
, pid_t pid
,
1083 au_asid_t sid
, au_tid_addr_t
*tid
)
1092 GET_TOKEN_AREA(t
, dptr
, 53);
1097 ADD_U_CHAR(dptr
, AU_SUBJECT_32_EX_TOKEN
);
1098 ADD_U_INT32(dptr
, auid
);
1099 ADD_U_INT32(dptr
, euid
);
1100 ADD_U_INT32(dptr
, egid
);
1101 ADD_U_INT32(dptr
, ruid
);
1102 ADD_U_INT32(dptr
, rgid
);
1103 ADD_U_INT32(dptr
, pid
);
1104 ADD_U_INT32(dptr
, sid
);
1105 ADD_U_INT32(dptr
, tid
->at_port
);
1106 ADD_U_INT32(dptr
, tid
->at_type
);
1107 ADD_U_INT32(dptr
, tid
->at_addr
[0]);
1108 ADD_U_INT32(dptr
, tid
->at_addr
[1]);
1109 ADD_U_INT32(dptr
, tid
->at_addr
[2]);
1110 ADD_U_INT32(dptr
, tid
->at_addr
[3]);
1115 token_t
*au_to_subject64_ex(
1116 __unused au_id_t auid
,
1117 __unused uid_t euid
,
1118 __unused gid_t egid
,
1119 __unused uid_t ruid
,
1120 __unused gid_t rgid
,
1122 __unused au_asid_t sid
,
1123 __unused au_tid_addr_t
*tid
)
1128 token_t
*au_to_subject_ex(au_id_t auid
, uid_t euid
,
1129 gid_t egid
, uid_t ruid
, gid_t rgid
, pid_t pid
,
1130 au_asid_t sid
, au_tid_addr_t
*tid
)
1132 return au_to_subject32_ex(auid
, euid
, egid
, ruid
, rgid
,
1140 * text count null-terminated strings
1142 token_t
*au_to_exec_args(const char **args
)
1146 const char *nextarg
;
1156 while(nextarg
!= NULL
) {
1159 nextlen
= strlen(nextarg
);
1160 if(nextarg
[nextlen
] != '\0') {
1164 totlen
+= nextlen
+ 1;
1166 nextarg
= *(args
+ count
);
1170 GET_TOKEN_AREA(t
, dptr
, 5 + totlen
);
1175 ADD_U_CHAR(dptr
, AU_EXEC_ARG_TOKEN
);
1176 ADD_U_INT32(dptr
, count
);
1178 for(i
=0; i
< count
; i
++) {
1179 nextarg
= *(args
+ i
);
1180 ADD_MEM(dptr
, nextarg
, strlen(nextarg
) + 1);
1190 * text count null-terminated strings
1192 token_t
*au_to_exec_env(const char **env
)
1198 const char *nextenv
;
1206 while(nextenv
!= NULL
) {
1209 nextlen
= strlen(nextenv
);
1210 if(nextenv
[nextlen
] != '\0') {
1214 totlen
+= nextlen
+ 1;
1216 nextenv
= *(env
+ count
);
1220 GET_TOKEN_AREA(t
, dptr
, 5 + totlen
);
1225 ADD_U_CHAR(dptr
, AU_EXEC_ENV_TOKEN
);
1226 ADD_U_INT32(dptr
, count
);
1228 for(i
=0; i
< count
; i
++) {
1229 nextenv
= *(env
+ i
);
1230 ADD_MEM(dptr
, nextenv
, strlen(nextenv
) + 1);
1238 * Kernel version of the BSM header token functions. These versions take
1239 * a timespec struct as an additional parameter in order to obtain the
1240 * create time value for the BSM audit record.
1242 * record byte count 4 bytes
1243 * version # 1 byte [2]
1244 * event type 2 bytes
1245 * event modifier 2 bytes
1246 * seconds of time 4 bytes/8 bytes (32-bit/64-bit value)
1247 * milliseconds of time 4 bytes/8 bytes (32-bit/64-bit value)
1249 token_t
*kau_to_header32(const struct timespec
*ctime
, int rec_size
,
1250 au_event_t e_type
, au_emod_t e_mod
)
1254 u_int32_t timems
= ctime
->tv_nsec
/1000000; /* We need time in ms */
1256 GET_TOKEN_AREA(t
, dptr
, 18);
1261 ADD_U_CHAR(dptr
, AU_HEADER_32_TOKEN
);
1262 ADD_U_INT32(dptr
, rec_size
);
1263 ADD_U_CHAR(dptr
, HEADER_VERSION
);
1264 ADD_U_INT16(dptr
, e_type
);
1265 ADD_U_INT16(dptr
, e_mod
);
1267 /* Add the timestamp */
1268 ADD_U_INT32(dptr
, ctime
->tv_sec
);
1269 ADD_U_INT32(dptr
, timems
);
1274 token_t
*kau_to_header64(
1275 __unused
const struct timespec
*ctime
,
1276 __unused
int rec_size
,
1277 __unused au_event_t e_type
,
1278 __unused au_emod_t e_mod
)
1283 token_t
*kau_to_header(const struct timespec
*ctime
, int rec_size
,
1284 au_event_t e_type
, au_emod_t e_mod
)
1286 return kau_to_header32(ctime
, rec_size
, e_type
, e_mod
);
1291 * trailer magic number 2 bytes
1292 * record byte count 4 bytes
1294 token_t
*au_to_trailer(int rec_size
)
1298 u_int16_t magic
= TRAILER_PAD_MAGIC
;
1301 GET_TOKEN_AREA(t
, dptr
, 7);
1306 ADD_U_CHAR(dptr
, AU_TRAILER_TOKEN
);
1307 ADD_U_INT16(dptr
, magic
);
1308 ADD_U_INT32(dptr
, rec_size
);