xref: /illumos-gate/usr/src/uts/common/c2/audit_token.c (revision 61b9bf51)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
545916cd2Sjpk  * Common Development and Distribution License (the "License").
645916cd2Sjpk  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
217c478bd9Sstevel@tonic-gate /*
22*61b9bf51Srica  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
237c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
247c478bd9Sstevel@tonic-gate  */
257c478bd9Sstevel@tonic-gate 
267c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
277c478bd9Sstevel@tonic-gate 
287c478bd9Sstevel@tonic-gate /*
297c478bd9Sstevel@tonic-gate  * Support routines for building audit records.
307c478bd9Sstevel@tonic-gate  */
317c478bd9Sstevel@tonic-gate 
327c478bd9Sstevel@tonic-gate #include <sys/param.h>
337c478bd9Sstevel@tonic-gate #include <sys/systm.h>		/* for rval */
347c478bd9Sstevel@tonic-gate #include <sys/time.h>
357c478bd9Sstevel@tonic-gate #include <sys/types.h>
367c478bd9Sstevel@tonic-gate #include <sys/vnode.h>
377c478bd9Sstevel@tonic-gate #include <sys/mode.h>
387c478bd9Sstevel@tonic-gate #include <sys/user.h>
397c478bd9Sstevel@tonic-gate #include <sys/session.h>
407c478bd9Sstevel@tonic-gate #include <sys/acl.h>
417c478bd9Sstevel@tonic-gate #include <sys/ipc_impl.h>
427c478bd9Sstevel@tonic-gate #include <netinet/in_systm.h>
437c478bd9Sstevel@tonic-gate #include <netinet/in.h>
447c478bd9Sstevel@tonic-gate #include <netinet/ip.h>
457c478bd9Sstevel@tonic-gate #include <sys/socket.h>
467c478bd9Sstevel@tonic-gate #include <net/route.h>
477c478bd9Sstevel@tonic-gate #include <netinet/in_pcb.h>
487c478bd9Sstevel@tonic-gate #include <c2/audit.h>
497c478bd9Sstevel@tonic-gate #include <c2/audit_kernel.h>
507c478bd9Sstevel@tonic-gate #include <c2/audit_record.h>
517c478bd9Sstevel@tonic-gate #include <sys/model.h>		/* for model_t */
527c478bd9Sstevel@tonic-gate #include <sys/vmparam.h>	/* for USRSTACK/USRSTACK32 */
537c478bd9Sstevel@tonic-gate #include <sys/vfs.h>		/* for sonode */
547c478bd9Sstevel@tonic-gate #include <sys/socketvar.h>	/* for sonode */
557c478bd9Sstevel@tonic-gate #include <sys/zone.h>
5645916cd2Sjpk #include <sys/tsol/label.h>
577c478bd9Sstevel@tonic-gate 
587c478bd9Sstevel@tonic-gate /*
597c478bd9Sstevel@tonic-gate  * These are the control tokens
607c478bd9Sstevel@tonic-gate  */
617c478bd9Sstevel@tonic-gate 
627c478bd9Sstevel@tonic-gate /*
637c478bd9Sstevel@tonic-gate  * au_to_header
647c478bd9Sstevel@tonic-gate  * returns:
657c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a header token.
667c478bd9Sstevel@tonic-gate  */
677c478bd9Sstevel@tonic-gate token_t *
687c478bd9Sstevel@tonic-gate au_to_header(int byte_count, short e_type, short e_mod)
697c478bd9Sstevel@tonic-gate {
707c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
717c478bd9Sstevel@tonic-gate 	token_t *m;			/* au_membuf pointer */
727c478bd9Sstevel@tonic-gate #ifdef _LP64
737c478bd9Sstevel@tonic-gate 	char data_header = AUT_HEADER64;	/* header for this token */
747c478bd9Sstevel@tonic-gate 	static int64_t zerotime[2];
757c478bd9Sstevel@tonic-gate #else
767c478bd9Sstevel@tonic-gate 	char data_header = AUT_HEADER32;
777c478bd9Sstevel@tonic-gate 	static int32_t zerotime[2];
787c478bd9Sstevel@tonic-gate #endif
797c478bd9Sstevel@tonic-gate 	char version = TOKEN_VERSION;	/* version of token family */
807c478bd9Sstevel@tonic-gate 
817c478bd9Sstevel@tonic-gate 	m = au_getclr();
827c478bd9Sstevel@tonic-gate 
837c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
847c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);	/* token ID */
857c478bd9Sstevel@tonic-gate 	adr_int32(&adr, (int32_t *)&byte_count, 1);	/* length of */
867c478bd9Sstevel@tonic-gate 							/* audit record */
877c478bd9Sstevel@tonic-gate 	adr_char(&adr, &version, 1);		/* version of audit tokens */
887c478bd9Sstevel@tonic-gate 	adr_short(&adr, &e_type, 1);		/* event ID */
897c478bd9Sstevel@tonic-gate 	adr_short(&adr, &e_mod, 1);		/* event ID modifier */
907c478bd9Sstevel@tonic-gate #ifdef _LP64
917c478bd9Sstevel@tonic-gate 	adr_int64(&adr, zerotime, 2);		/* time & date space */
927c478bd9Sstevel@tonic-gate #else
937c478bd9Sstevel@tonic-gate 	adr_int32(&adr, zerotime, 2);
947c478bd9Sstevel@tonic-gate #endif
957c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
967c478bd9Sstevel@tonic-gate 
977c478bd9Sstevel@tonic-gate 	return (m);
987c478bd9Sstevel@tonic-gate }
997c478bd9Sstevel@tonic-gate 
1007c478bd9Sstevel@tonic-gate token_t *
1017c478bd9Sstevel@tonic-gate au_to_header_ex(int byte_count, au_event_t e_type, au_emod_t e_mod)
1027c478bd9Sstevel@tonic-gate {
1037c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
1047c478bd9Sstevel@tonic-gate 	token_t *m;			/* au_membuf pointer */
1059e9e6ab8Spaulson 	au_kcontext_t	*kctx = GET_KCTX_PZ;
1067c478bd9Sstevel@tonic-gate 
1077c478bd9Sstevel@tonic-gate #ifdef _LP64
1087c478bd9Sstevel@tonic-gate 	char data_header = AUT_HEADER64_EX;	/* header for this token */
1097c478bd9Sstevel@tonic-gate 	static int64_t zerotime[2];
1107c478bd9Sstevel@tonic-gate #else
1117c478bd9Sstevel@tonic-gate 	char data_header = AUT_HEADER32_EX;
1127c478bd9Sstevel@tonic-gate 	static int32_t zerotime[2];
1137c478bd9Sstevel@tonic-gate #endif
1147c478bd9Sstevel@tonic-gate 	char version = TOKEN_VERSION;	/* version of token family */
1157c478bd9Sstevel@tonic-gate 
1167c478bd9Sstevel@tonic-gate 	m = au_getclr();
1177c478bd9Sstevel@tonic-gate 
1187c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
1197c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);	/* token ID */
1207c478bd9Sstevel@tonic-gate 	adr_int32(&adr, (int32_t *)&byte_count, 1);	/* length of */
1217c478bd9Sstevel@tonic-gate 							/* audit record */
1227c478bd9Sstevel@tonic-gate 	adr_char(&adr, &version, 1);		/* version of audit tokens */
1237c478bd9Sstevel@tonic-gate 	adr_short(&adr, &e_type, 1);		/* event ID */
1247c478bd9Sstevel@tonic-gate 	adr_short(&adr, &e_mod, 1);		/* event ID modifier */
1257c478bd9Sstevel@tonic-gate 	adr_uint32(&adr, &kctx->auk_info.ai_termid.at_type, 1);
1267c478bd9Sstevel@tonic-gate 	adr_char(&adr, (char *)&kctx->auk_info.ai_termid.at_addr[0],
1277c478bd9Sstevel@tonic-gate 	    (int)kctx->auk_info.ai_termid.at_type);
1287c478bd9Sstevel@tonic-gate #ifdef _LP64
1297c478bd9Sstevel@tonic-gate 	adr_int64(&adr, zerotime, 2);		/* time & date */
1307c478bd9Sstevel@tonic-gate #else
1317c478bd9Sstevel@tonic-gate 	adr_int32(&adr, zerotime, 2);
1327c478bd9Sstevel@tonic-gate #endif
1337c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
1347c478bd9Sstevel@tonic-gate 
1357c478bd9Sstevel@tonic-gate 	return (m);
1367c478bd9Sstevel@tonic-gate }
1377c478bd9Sstevel@tonic-gate 
1387c478bd9Sstevel@tonic-gate /*
1397c478bd9Sstevel@tonic-gate  * au_to_trailer
1407c478bd9Sstevel@tonic-gate  * returns:
1417c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a trailer token.
1427c478bd9Sstevel@tonic-gate  */
1437c478bd9Sstevel@tonic-gate token_t *
1447c478bd9Sstevel@tonic-gate au_to_trailer(int byte_count)
1457c478bd9Sstevel@tonic-gate {
1467c478bd9Sstevel@tonic-gate 	adr_t adr;				/* adr memory stream header */
1477c478bd9Sstevel@tonic-gate 	token_t *m;				/* au_membuf pointer */
1487c478bd9Sstevel@tonic-gate 	char data_header = AUT_TRAILER;		/* header for this token */
1497c478bd9Sstevel@tonic-gate 	short magic = (short)AUT_TRAILER_MAGIC; /* trailer magic number */
1507c478bd9Sstevel@tonic-gate 
1517c478bd9Sstevel@tonic-gate 	m = au_getclr();
1527c478bd9Sstevel@tonic-gate 
1537c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
1547c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);		/* token ID */
1557c478bd9Sstevel@tonic-gate 	adr_short(&adr, &magic, 1);			/* magic number */
1567c478bd9Sstevel@tonic-gate 	adr_int32(&adr, (int32_t *)&byte_count, 1);	/* length of */
1577c478bd9Sstevel@tonic-gate 							/* audit record */
1587c478bd9Sstevel@tonic-gate 
1597c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
1607c478bd9Sstevel@tonic-gate 
1617c478bd9Sstevel@tonic-gate 	return (m);
1627c478bd9Sstevel@tonic-gate }
1637c478bd9Sstevel@tonic-gate /*
1647c478bd9Sstevel@tonic-gate  * These are the data tokens
1657c478bd9Sstevel@tonic-gate  */
1667c478bd9Sstevel@tonic-gate 
1677c478bd9Sstevel@tonic-gate /*
1687c478bd9Sstevel@tonic-gate  * au_to_data
1697c478bd9Sstevel@tonic-gate  * returns:
1707c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a data token.
1717c478bd9Sstevel@tonic-gate  */
1727c478bd9Sstevel@tonic-gate token_t *
1737c478bd9Sstevel@tonic-gate au_to_data(char unit_print, char unit_type, char unit_count, char *p)
1747c478bd9Sstevel@tonic-gate {
1757c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
1767c478bd9Sstevel@tonic-gate 	token_t *m;			/* au_membuf pointer */
1777c478bd9Sstevel@tonic-gate 	char data_header = AUT_DATA;	/* header for this token */
1787c478bd9Sstevel@tonic-gate 
1797c478bd9Sstevel@tonic-gate 	ASSERT(p != NULL);
1807c478bd9Sstevel@tonic-gate 	ASSERT(unit_count != 0);
1817c478bd9Sstevel@tonic-gate 
1827c478bd9Sstevel@tonic-gate 	switch (unit_type) {
1837c478bd9Sstevel@tonic-gate 	case AUR_SHORT:
1847c478bd9Sstevel@tonic-gate 		if (sizeof (short) * unit_count >= AU_BUFSIZE)
1857c478bd9Sstevel@tonic-gate 			return (au_to_text("au_to_data: unit count too big"));
1867c478bd9Sstevel@tonic-gate 		break;
1877c478bd9Sstevel@tonic-gate 	case AUR_INT32:
1887c478bd9Sstevel@tonic-gate 		if (sizeof (int32_t) * unit_count >= AU_BUFSIZE)
1897c478bd9Sstevel@tonic-gate 			return (au_to_text("au_to_data: unit count too big"));
1907c478bd9Sstevel@tonic-gate 		break;
1917c478bd9Sstevel@tonic-gate 	case AUR_INT64:
1927c478bd9Sstevel@tonic-gate 		if (sizeof (int64_t) * unit_count >= AU_BUFSIZE)
1937c478bd9Sstevel@tonic-gate 			return (au_to_text("au_to_data: unit count too big"));
1947c478bd9Sstevel@tonic-gate 		break;
1957c478bd9Sstevel@tonic-gate 	case AUR_BYTE:
1967c478bd9Sstevel@tonic-gate 	default:
1977c478bd9Sstevel@tonic-gate #ifdef _CHAR_IS_UNSIGNED
1987c478bd9Sstevel@tonic-gate 		if (sizeof (char) * unit_count >= AU_BUFSIZE)
1997c478bd9Sstevel@tonic-gate 			return (au_to_text("au_to_data: unit count too big"));
2007c478bd9Sstevel@tonic-gate #endif
2017c478bd9Sstevel@tonic-gate 		/*
2027c478bd9Sstevel@tonic-gate 		 * we used to check for this:
2037c478bd9Sstevel@tonic-gate 		 * sizeof (char) * (int)unit_count >= AU_BUFSIZE).
2047c478bd9Sstevel@tonic-gate 		 * but the compiler is smart enough to see that
2057c478bd9Sstevel@tonic-gate 		 * will never be >= AU_BUFSIZE, since that's 128
2067c478bd9Sstevel@tonic-gate 		 * and unit_count maxes out at 127 (signed char),
2077c478bd9Sstevel@tonic-gate 		 * and complain.
2087c478bd9Sstevel@tonic-gate 		 */
2097c478bd9Sstevel@tonic-gate 		break;
2107c478bd9Sstevel@tonic-gate 	}
2117c478bd9Sstevel@tonic-gate 
2127c478bd9Sstevel@tonic-gate 	m = au_getclr();
2137c478bd9Sstevel@tonic-gate 
2147c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
2157c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
2167c478bd9Sstevel@tonic-gate 	adr_char(&adr, &unit_print, 1);
2177c478bd9Sstevel@tonic-gate 	adr_char(&adr, &unit_type, 1);
2187c478bd9Sstevel@tonic-gate 	adr_char(&adr, &unit_count, 1);
2197c478bd9Sstevel@tonic-gate 
2207c478bd9Sstevel@tonic-gate 	switch (unit_type) {
2217c478bd9Sstevel@tonic-gate 	case AUR_SHORT:
2227c478bd9Sstevel@tonic-gate 		adr_short(&adr, (short *)p, unit_count);
2237c478bd9Sstevel@tonic-gate 		break;
2247c478bd9Sstevel@tonic-gate 	case AUR_INT32:
2257c478bd9Sstevel@tonic-gate 		adr_int32(&adr, (int32_t *)p, unit_count);
2267c478bd9Sstevel@tonic-gate 		break;
2277c478bd9Sstevel@tonic-gate 	case AUR_INT64:
2287c478bd9Sstevel@tonic-gate 		adr_int64(&adr, (int64_t *)p, unit_count);
2297c478bd9Sstevel@tonic-gate 		break;
2307c478bd9Sstevel@tonic-gate 	case AUR_BYTE:
2317c478bd9Sstevel@tonic-gate 	default:
2327c478bd9Sstevel@tonic-gate 		adr_char(&adr, p, unit_count);
2337c478bd9Sstevel@tonic-gate 		break;
2347c478bd9Sstevel@tonic-gate 	}
2357c478bd9Sstevel@tonic-gate 
2367c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
2377c478bd9Sstevel@tonic-gate 
2387c478bd9Sstevel@tonic-gate 	return (m);
2397c478bd9Sstevel@tonic-gate }
2407c478bd9Sstevel@tonic-gate 
2417c478bd9Sstevel@tonic-gate /*
2427c478bd9Sstevel@tonic-gate  * au_to_process
2437c478bd9Sstevel@tonic-gate  * au_to_subject
2447c478bd9Sstevel@tonic-gate  * returns:
2457c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a process token.
2467c478bd9Sstevel@tonic-gate  */
2477c478bd9Sstevel@tonic-gate static token_t *au_to_any_process(char, uid_t, gid_t, uid_t, gid_t,
2487c478bd9Sstevel@tonic-gate     pid_t, au_id_t, au_asid_t, const au_tid_addr_t *atid);
2497c478bd9Sstevel@tonic-gate 
2507c478bd9Sstevel@tonic-gate token_t *
2517c478bd9Sstevel@tonic-gate au_to_process(uid_t uid, gid_t gid, uid_t ruid, gid_t rgid, pid_t pid,
2527c478bd9Sstevel@tonic-gate     au_id_t auid, au_asid_t asid, const au_tid_addr_t *atid)
2537c478bd9Sstevel@tonic-gate {
2547c478bd9Sstevel@tonic-gate 	char data_header;
2557c478bd9Sstevel@tonic-gate 
2567c478bd9Sstevel@tonic-gate #ifdef _LP64
2577c478bd9Sstevel@tonic-gate 	if (atid->at_type == AU_IPv6)
2587c478bd9Sstevel@tonic-gate 		data_header = AUT_PROCESS64_EX;
2597c478bd9Sstevel@tonic-gate 	else
2607c478bd9Sstevel@tonic-gate 		data_header = AUT_PROCESS64;
2617c478bd9Sstevel@tonic-gate #else
2627c478bd9Sstevel@tonic-gate 	if (atid->at_type == AU_IPv6)
2637c478bd9Sstevel@tonic-gate 		data_header = AUT_PROCESS32_EX;
2647c478bd9Sstevel@tonic-gate 	else
2657c478bd9Sstevel@tonic-gate 		data_header = AUT_PROCESS32;
2667c478bd9Sstevel@tonic-gate #endif
2677c478bd9Sstevel@tonic-gate 
2687c478bd9Sstevel@tonic-gate 	return (au_to_any_process(data_header, uid, gid, ruid,
2697c478bd9Sstevel@tonic-gate 	    rgid, pid, auid, asid, atid));
2707c478bd9Sstevel@tonic-gate }
2717c478bd9Sstevel@tonic-gate 
2727c478bd9Sstevel@tonic-gate token_t *
2737c478bd9Sstevel@tonic-gate au_to_subject(uid_t uid, gid_t gid, uid_t ruid, gid_t rgid, pid_t pid,
2747c478bd9Sstevel@tonic-gate     au_id_t auid, au_asid_t asid, const au_tid_addr_t *atid)
2757c478bd9Sstevel@tonic-gate {
2767c478bd9Sstevel@tonic-gate 	char data_header;
2777c478bd9Sstevel@tonic-gate 
2787c478bd9Sstevel@tonic-gate #ifdef _LP64
2797c478bd9Sstevel@tonic-gate 	if (atid->at_type == AU_IPv6)
2807c478bd9Sstevel@tonic-gate 		data_header = AUT_SUBJECT64_EX;
2817c478bd9Sstevel@tonic-gate 	else
2827c478bd9Sstevel@tonic-gate 		data_header = AUT_SUBJECT64;
2837c478bd9Sstevel@tonic-gate #else
2847c478bd9Sstevel@tonic-gate 	if (atid->at_type == AU_IPv6)
2857c478bd9Sstevel@tonic-gate 		data_header = AUT_SUBJECT32_EX;
2867c478bd9Sstevel@tonic-gate 	else
2877c478bd9Sstevel@tonic-gate 		data_header = AUT_SUBJECT32;
2887c478bd9Sstevel@tonic-gate #endif
2897c478bd9Sstevel@tonic-gate 	return (au_to_any_process(data_header, uid, gid, ruid,
2907c478bd9Sstevel@tonic-gate 	    rgid, pid, auid, asid, atid));
2917c478bd9Sstevel@tonic-gate }
2927c478bd9Sstevel@tonic-gate 
2937c478bd9Sstevel@tonic-gate 
2947c478bd9Sstevel@tonic-gate static token_t *
2957c478bd9Sstevel@tonic-gate au_to_any_process(char data_header,
2967c478bd9Sstevel@tonic-gate     uid_t uid, gid_t gid, uid_t ruid, gid_t rgid, pid_t pid,
2977c478bd9Sstevel@tonic-gate     au_id_t auid, au_asid_t asid, const au_tid_addr_t *atid)
2987c478bd9Sstevel@tonic-gate {
2997c478bd9Sstevel@tonic-gate 	token_t *m;	/* local au_membuf */
3007c478bd9Sstevel@tonic-gate 	adr_t adr;	/* adr memory stream header */
3017c478bd9Sstevel@tonic-gate 	int32_t value;
3027c478bd9Sstevel@tonic-gate 
3037c478bd9Sstevel@tonic-gate 	m = au_getclr();
3047c478bd9Sstevel@tonic-gate 
3057c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
3067c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
3077c478bd9Sstevel@tonic-gate 	value = (int32_t)auid;
3087c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
3097c478bd9Sstevel@tonic-gate 	value = (int32_t)uid;
3107c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
3117c478bd9Sstevel@tonic-gate 	value = (int32_t)gid;
3127c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
3137c478bd9Sstevel@tonic-gate 	value = (int32_t)ruid;
3147c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
3157c478bd9Sstevel@tonic-gate 	value = (int32_t)rgid;
3167c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
3177c478bd9Sstevel@tonic-gate 	value = (int32_t)pid;
3187c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
3197c478bd9Sstevel@tonic-gate 	value = (int32_t)asid;
3207c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
3217c478bd9Sstevel@tonic-gate #ifdef _LP64
3227c478bd9Sstevel@tonic-gate 	adr_int64(&adr, (int64_t *)&(atid->at_port), 1);
3237c478bd9Sstevel@tonic-gate #else
3247c478bd9Sstevel@tonic-gate 	adr_int32(&adr, (int32_t *)&(atid->at_port), 1);
3257c478bd9Sstevel@tonic-gate #endif
3267c478bd9Sstevel@tonic-gate 	if (atid->at_type == AU_IPv6) {
3277c478bd9Sstevel@tonic-gate 		adr_uint32(&adr, (uint_t *)&atid->at_type, 1);
3287c478bd9Sstevel@tonic-gate 		adr_char(&adr, (char *)&atid->at_addr[0], 16);
3297c478bd9Sstevel@tonic-gate 	} else {
3307c478bd9Sstevel@tonic-gate 		adr_char(&adr, (char *)&(atid->at_addr[0]), 4);
3317c478bd9Sstevel@tonic-gate 	}
3327c478bd9Sstevel@tonic-gate 
3337c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
3347c478bd9Sstevel@tonic-gate 
3357c478bd9Sstevel@tonic-gate 	return (m);
3367c478bd9Sstevel@tonic-gate }
3377c478bd9Sstevel@tonic-gate 
3387c478bd9Sstevel@tonic-gate /*
3397c478bd9Sstevel@tonic-gate  * au_to_text
3407c478bd9Sstevel@tonic-gate  * returns:
3417c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a text token.
3427c478bd9Sstevel@tonic-gate  */
3437c478bd9Sstevel@tonic-gate token_t *
3447c478bd9Sstevel@tonic-gate au_to_text(const char *text)
3457c478bd9Sstevel@tonic-gate {
3467c478bd9Sstevel@tonic-gate 	token_t *token;			/* local au_membuf */
3477c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
3487c478bd9Sstevel@tonic-gate 	char data_header = AUT_TEXT;	/* header for this token */
3497c478bd9Sstevel@tonic-gate 	short bytes;			/* length of string */
3507c478bd9Sstevel@tonic-gate 
3517c478bd9Sstevel@tonic-gate 	token = au_getclr();
3527c478bd9Sstevel@tonic-gate 
3537c478bd9Sstevel@tonic-gate 	bytes = (short)strlen(text) + 1;
3547c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(token, char *));
3557c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
3567c478bd9Sstevel@tonic-gate 	adr_short(&adr, &bytes, 1);
3577c478bd9Sstevel@tonic-gate 
3587c478bd9Sstevel@tonic-gate 	token->len = (char)adr_count(&adr);
3597c478bd9Sstevel@tonic-gate 	/*
3607c478bd9Sstevel@tonic-gate 	 * Now attach the text
3617c478bd9Sstevel@tonic-gate 	 */
3627c478bd9Sstevel@tonic-gate 	(void) au_append_buf(text, bytes, token);
3637c478bd9Sstevel@tonic-gate 
3647c478bd9Sstevel@tonic-gate 	return (token);
3657c478bd9Sstevel@tonic-gate }
3667c478bd9Sstevel@tonic-gate 
3677c478bd9Sstevel@tonic-gate /*
3687c478bd9Sstevel@tonic-gate  * au_zonename_length
3697c478bd9Sstevel@tonic-gate  * returns:
3707c478bd9Sstevel@tonic-gate  * -	length of zonename token to be generated
3717c478bd9Sstevel@tonic-gate  * -	zone name up to ZONENAME_MAX + 1 in length
3727c478bd9Sstevel@tonic-gate  */
3737c478bd9Sstevel@tonic-gate #define	ZONE_TOKEN_OVERHEAD 3
3747c478bd9Sstevel@tonic-gate 	/*
3757c478bd9Sstevel@tonic-gate 	 * the zone token is
3767c478bd9Sstevel@tonic-gate 	 * token id (1 byte)
3777c478bd9Sstevel@tonic-gate 	 * string length (2 bytes)
3787c478bd9Sstevel@tonic-gate 	 * the string (strlen(zonename) + 1)
3797c478bd9Sstevel@tonic-gate 	 */
3807c478bd9Sstevel@tonic-gate size_t
3811d7bfecdStz au_zonename_length(zone_t *zone)
3827c478bd9Sstevel@tonic-gate {
3831d7bfecdStz 	if (zone == NULL)
3841d7bfecdStz 		zone = curproc->p_zone;
3851d7bfecdStz 	return (strlen(zone->zone_name) + 1 +
3867c478bd9Sstevel@tonic-gate 	    ZONE_TOKEN_OVERHEAD);
3877c478bd9Sstevel@tonic-gate }
3887c478bd9Sstevel@tonic-gate 
3897c478bd9Sstevel@tonic-gate /*
3907c478bd9Sstevel@tonic-gate  * au_to_zonename
3917c478bd9Sstevel@tonic-gate  *
3927c478bd9Sstevel@tonic-gate  * A length of zero input to au_to_zonename means the length is not
3937c478bd9Sstevel@tonic-gate  * pre-calculated.
3947c478bd9Sstevel@tonic-gate  *
3957c478bd9Sstevel@tonic-gate  * The caller is responsible for checking the AUDIT_ZONENAME policy
3967c478bd9Sstevel@tonic-gate  * before calling au_zonename_length() and au_to_zonename().  If
3977c478bd9Sstevel@tonic-gate  * the policy changes between the calls, no harm is done, so the
3987c478bd9Sstevel@tonic-gate  * policy only needs to be checked once.
3997c478bd9Sstevel@tonic-gate  *
4007c478bd9Sstevel@tonic-gate  * returns:
4017c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a zonename token; NULL if
4027c478bd9Sstevel@tonic-gate  *	policy is off.
4037c478bd9Sstevel@tonic-gate  *
4047c478bd9Sstevel@tonic-gate  *	if the zonename token is generated at token generation close time,
4057c478bd9Sstevel@tonic-gate  *	the length of the token is already known and it is ASSERTed that
4067c478bd9Sstevel@tonic-gate  *	it has not changed.  If not precalculated, zone_length must be
4077c478bd9Sstevel@tonic-gate  *	zero.
4087c478bd9Sstevel@tonic-gate  */
4097c478bd9Sstevel@tonic-gate token_t *
4101d7bfecdStz au_to_zonename(size_t zone_length, zone_t *zone)
4117c478bd9Sstevel@tonic-gate {
4127c478bd9Sstevel@tonic-gate 	token_t *token;			/* local au_membuf */
4137c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
4147c478bd9Sstevel@tonic-gate 	char data_header = AUT_ZONENAME;	/* header for this token */
4157c478bd9Sstevel@tonic-gate 	short bytes;			/* length of string */
4167c478bd9Sstevel@tonic-gate 
4177c478bd9Sstevel@tonic-gate 	token = au_getclr();
4187c478bd9Sstevel@tonic-gate 
4191d7bfecdStz 	if (zone == NULL)
4201d7bfecdStz 		zone = curproc->p_zone;
4211d7bfecdStz 	bytes = (short)strlen(zone->zone_name) + 1;
4227c478bd9Sstevel@tonic-gate 	/*
4237c478bd9Sstevel@tonic-gate 	 * If zone_length != 0, it was precalculated and is
4247c478bd9Sstevel@tonic-gate 	 * the token length, not the string length.
4257c478bd9Sstevel@tonic-gate 	 */
4267c478bd9Sstevel@tonic-gate 	ASSERT((zone_length == 0) ||
4277c478bd9Sstevel@tonic-gate 	    (zone_length == (bytes + ZONE_TOKEN_OVERHEAD)));
4287c478bd9Sstevel@tonic-gate 
4297c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(token, char *));
4307c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
4317c478bd9Sstevel@tonic-gate 	adr_short(&adr, &bytes, 1);
4327c478bd9Sstevel@tonic-gate 
4337c478bd9Sstevel@tonic-gate 	token->len = (char)adr_count(&adr);
4341d7bfecdStz 	(void) au_append_buf(zone->zone_name, bytes, token);
4357c478bd9Sstevel@tonic-gate 
4367c478bd9Sstevel@tonic-gate 	return (token);
4377c478bd9Sstevel@tonic-gate }
4387c478bd9Sstevel@tonic-gate 
4397c478bd9Sstevel@tonic-gate /*
4407c478bd9Sstevel@tonic-gate  * au_to_strings
4417c478bd9Sstevel@tonic-gate  * returns:
4427c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a strings array token.
4437c478bd9Sstevel@tonic-gate  */
4447c478bd9Sstevel@tonic-gate token_t *
4457c478bd9Sstevel@tonic-gate au_to_strings(
4467c478bd9Sstevel@tonic-gate 	char header,		/* token type */
4477c478bd9Sstevel@tonic-gate 	const char *kstrp,	/* kernel string pointer */
4487c478bd9Sstevel@tonic-gate 	ssize_t count)		/* count of arguments */
4497c478bd9Sstevel@tonic-gate {
4507c478bd9Sstevel@tonic-gate 	token_t *token;			/* local au_membuf */
4517c478bd9Sstevel@tonic-gate 	token_t *m;			/* local au_membuf */
4527c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
4537c478bd9Sstevel@tonic-gate 	size_t len;
4547c478bd9Sstevel@tonic-gate 	int32_t tlen;
4557c478bd9Sstevel@tonic-gate 
4567c478bd9Sstevel@tonic-gate 	token = au_getclr();
4577c478bd9Sstevel@tonic-gate 
4587c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(token, char *));
4597c478bd9Sstevel@tonic-gate 	adr_char(&adr, &header, 1);
4607c478bd9Sstevel@tonic-gate 	tlen = (int32_t)count;
4617c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &tlen, 1);
4627c478bd9Sstevel@tonic-gate 
4637c478bd9Sstevel@tonic-gate 	token->len = (char)adr_count(&adr);
4647c478bd9Sstevel@tonic-gate 
4657c478bd9Sstevel@tonic-gate 	while (count-- > 0) {
4667c478bd9Sstevel@tonic-gate 		m = au_getclr();
4677c478bd9Sstevel@tonic-gate 		len = strlen(kstrp) + 1;
4687c478bd9Sstevel@tonic-gate 		(void) au_append_buf(kstrp, len, m);
4697c478bd9Sstevel@tonic-gate 		(void) au_append_rec((token_t *)token, (token_t *)m, AU_PACK);
4707c478bd9Sstevel@tonic-gate 		kstrp += len;
4717c478bd9Sstevel@tonic-gate 	}
4727c478bd9Sstevel@tonic-gate 
4737c478bd9Sstevel@tonic-gate 	return (token);
4747c478bd9Sstevel@tonic-gate }
4757c478bd9Sstevel@tonic-gate 
4767c478bd9Sstevel@tonic-gate /*
4777c478bd9Sstevel@tonic-gate  * au_to_exec_args
4787c478bd9Sstevel@tonic-gate  * returns:
4797c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a argv token.
4807c478bd9Sstevel@tonic-gate  */
4817c478bd9Sstevel@tonic-gate token_t *
4827c478bd9Sstevel@tonic-gate au_to_exec_args(const char *kstrp, ssize_t argc)
4837c478bd9Sstevel@tonic-gate {
4847c478bd9Sstevel@tonic-gate 	return (au_to_strings(AUT_EXEC_ARGS, kstrp, argc));
4857c478bd9Sstevel@tonic-gate }
4867c478bd9Sstevel@tonic-gate 
4877c478bd9Sstevel@tonic-gate /*
4887c478bd9Sstevel@tonic-gate  * au_to_exec_env
4897c478bd9Sstevel@tonic-gate  * returns:
4907c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a arge token.
4917c478bd9Sstevel@tonic-gate  */
4927c478bd9Sstevel@tonic-gate token_t *
4937c478bd9Sstevel@tonic-gate au_to_exec_env(const char *kstrp, ssize_t envc)
4947c478bd9Sstevel@tonic-gate {
4957c478bd9Sstevel@tonic-gate 	return (au_to_strings(AUT_EXEC_ENV, kstrp, envc));
4967c478bd9Sstevel@tonic-gate }
4977c478bd9Sstevel@tonic-gate 
4987c478bd9Sstevel@tonic-gate /*
4997c478bd9Sstevel@tonic-gate  * au_to_arg32
5007c478bd9Sstevel@tonic-gate  *	char   n;	argument # being used
5017c478bd9Sstevel@tonic-gate  *	char  *text;	text describing argument
5027c478bd9Sstevel@tonic-gate  *	uint32_t v;	argument value
5037c478bd9Sstevel@tonic-gate  * returns:
5047c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing an argument token.
5057c478bd9Sstevel@tonic-gate  */
5067c478bd9Sstevel@tonic-gate token_t *
5077c478bd9Sstevel@tonic-gate au_to_arg32(char n, char *text, uint32_t v)
5087c478bd9Sstevel@tonic-gate {
5097c478bd9Sstevel@tonic-gate 	token_t *token;			/* local au_membuf */
5107c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
5117c478bd9Sstevel@tonic-gate 	char data_header = AUT_ARG32;	/* header for this token */
5127c478bd9Sstevel@tonic-gate 	short bytes;			/* length of string */
5137c478bd9Sstevel@tonic-gate 
5147c478bd9Sstevel@tonic-gate 	token = au_getclr();
5157c478bd9Sstevel@tonic-gate 
5167c478bd9Sstevel@tonic-gate 	bytes = strlen(text) + 1;
5177c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(token, char *));
5187c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);	/* token type */
5197c478bd9Sstevel@tonic-gate 	adr_char(&adr, &n, 1);			/* argument id */
5207c478bd9Sstevel@tonic-gate 	adr_uint32(&adr, &v, 1);		/* argument value */
5217c478bd9Sstevel@tonic-gate 	adr_short(&adr, &bytes, 1);
5227c478bd9Sstevel@tonic-gate 
5237c478bd9Sstevel@tonic-gate 	token->len = adr_count(&adr);
5247c478bd9Sstevel@tonic-gate 	/*
5257c478bd9Sstevel@tonic-gate 	 * Now add the description
5267c478bd9Sstevel@tonic-gate 	 */
5277c478bd9Sstevel@tonic-gate 	(void) au_append_buf(text, bytes, token);
5287c478bd9Sstevel@tonic-gate 
5297c478bd9Sstevel@tonic-gate 	return (token);
5307c478bd9Sstevel@tonic-gate }
5317c478bd9Sstevel@tonic-gate 
5327c478bd9Sstevel@tonic-gate 
5337c478bd9Sstevel@tonic-gate /*
5347c478bd9Sstevel@tonic-gate  * au_to_arg64
5357c478bd9Sstevel@tonic-gate  *	char		n;	argument # being used
5367c478bd9Sstevel@tonic-gate  *	char		*text;	text describing argument
5377c478bd9Sstevel@tonic-gate  *	uint64_t	v;	argument value
5387c478bd9Sstevel@tonic-gate  * returns:
5397c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing an argument token.
5407c478bd9Sstevel@tonic-gate  */
5417c478bd9Sstevel@tonic-gate token_t *
5427c478bd9Sstevel@tonic-gate au_to_arg64(char n, char *text, uint64_t v)
5437c478bd9Sstevel@tonic-gate {
5447c478bd9Sstevel@tonic-gate 	token_t *token;			/* local au_membuf */
5457c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
5467c478bd9Sstevel@tonic-gate 	char data_header = AUT_ARG64;	/* header for this token */
5477c478bd9Sstevel@tonic-gate 	short bytes;			/* length of string */
5487c478bd9Sstevel@tonic-gate 
5497c478bd9Sstevel@tonic-gate 	token = au_getclr();
5507c478bd9Sstevel@tonic-gate 
5517c478bd9Sstevel@tonic-gate 	bytes = strlen(text) + 1;
5527c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(token, char *));
5537c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);	/* token type */
5547c478bd9Sstevel@tonic-gate 	adr_char(&adr, &n, 1);			/* argument id */
5557c478bd9Sstevel@tonic-gate 	adr_uint64(&adr, &v, 1);		/* argument value */
5567c478bd9Sstevel@tonic-gate 	adr_short(&adr, &bytes, 1);
5577c478bd9Sstevel@tonic-gate 
5587c478bd9Sstevel@tonic-gate 	token->len = adr_count(&adr);
5597c478bd9Sstevel@tonic-gate 	/*
5607c478bd9Sstevel@tonic-gate 	 * Now the description
5617c478bd9Sstevel@tonic-gate 	 */
5627c478bd9Sstevel@tonic-gate 	(void) au_append_buf(text, bytes, token);
5637c478bd9Sstevel@tonic-gate 
5647c478bd9Sstevel@tonic-gate 	return (token);
5657c478bd9Sstevel@tonic-gate }
5667c478bd9Sstevel@tonic-gate 
5677c478bd9Sstevel@tonic-gate 
5687c478bd9Sstevel@tonic-gate /*
5697c478bd9Sstevel@tonic-gate  * au_to_path
5707c478bd9Sstevel@tonic-gate  * returns:
5717c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a path token.
5727c478bd9Sstevel@tonic-gate  */
5737c478bd9Sstevel@tonic-gate token_t *
5747c478bd9Sstevel@tonic-gate au_to_path(struct audit_path *app)
5757c478bd9Sstevel@tonic-gate {
5767c478bd9Sstevel@tonic-gate 	token_t *token;			/* local au_membuf */
5777c478bd9Sstevel@tonic-gate 	token_t *m;			/* local au_membuf */
5787c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
5797c478bd9Sstevel@tonic-gate 	char data_header = AUT_PATH;	/* header for this token */
5807c478bd9Sstevel@tonic-gate 	short bytes;			/* length of string */
5817c478bd9Sstevel@tonic-gate 	char *path = app->audp_sect[0];
5827c478bd9Sstevel@tonic-gate 
5837c478bd9Sstevel@tonic-gate 	bytes = (short)(app->audp_sect[1] - app->audp_sect[0]);
5847c478bd9Sstevel@tonic-gate 
5857c478bd9Sstevel@tonic-gate 	/*
5867c478bd9Sstevel@tonic-gate 	 * generate path token header
5877c478bd9Sstevel@tonic-gate 	 */
5887c478bd9Sstevel@tonic-gate 	m = au_getclr();
5897c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
5907c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
5917c478bd9Sstevel@tonic-gate 	adr_short(&adr, &bytes, 1);
5927c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
5937c478bd9Sstevel@tonic-gate 
5947c478bd9Sstevel@tonic-gate 	/* append path string */
5957c478bd9Sstevel@tonic-gate 	token = m;
5967c478bd9Sstevel@tonic-gate 	(void) au_append_buf(path, bytes, token);
5977c478bd9Sstevel@tonic-gate 
5987c478bd9Sstevel@tonic-gate 	if (app->audp_cnt > 1) {
5997c478bd9Sstevel@tonic-gate 		/* generate attribute path strings token */
6007c478bd9Sstevel@tonic-gate 		m = au_to_strings(AUT_XATPATH, app->audp_sect[1],
6017c478bd9Sstevel@tonic-gate 		    app->audp_cnt - 1);
6027c478bd9Sstevel@tonic-gate 
6037c478bd9Sstevel@tonic-gate 		token = au_append_token(token, m);
6047c478bd9Sstevel@tonic-gate 	}
6057c478bd9Sstevel@tonic-gate 
6067c478bd9Sstevel@tonic-gate 	return (token);
6077c478bd9Sstevel@tonic-gate }
6087c478bd9Sstevel@tonic-gate 
6097c478bd9Sstevel@tonic-gate /*
6107c478bd9Sstevel@tonic-gate  * au_to_ipc
6117c478bd9Sstevel@tonic-gate  * returns:
6127c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a System V IPC token.
6137c478bd9Sstevel@tonic-gate  */
6147c478bd9Sstevel@tonic-gate token_t *
6157c478bd9Sstevel@tonic-gate au_to_ipc(char type, int id)
6167c478bd9Sstevel@tonic-gate {
6177c478bd9Sstevel@tonic-gate 	token_t *m;			/* local au_membuf */
6187c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
6197c478bd9Sstevel@tonic-gate 	char data_header = AUT_IPC;	/* header for this token */
6207c478bd9Sstevel@tonic-gate 
6217c478bd9Sstevel@tonic-gate 	m = au_getclr();
6227c478bd9Sstevel@tonic-gate 
6237c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
6247c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
6257c478bd9Sstevel@tonic-gate 	adr_char(&adr, &type, 1);		/* type of IPC object */
6267c478bd9Sstevel@tonic-gate 	adr_int32(&adr, (int32_t *)&id, 1);
6277c478bd9Sstevel@tonic-gate 
6287c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
6297c478bd9Sstevel@tonic-gate 
6307c478bd9Sstevel@tonic-gate 	return (m);
6317c478bd9Sstevel@tonic-gate }
6327c478bd9Sstevel@tonic-gate 
6337c478bd9Sstevel@tonic-gate /*
6347c478bd9Sstevel@tonic-gate  * au_to_return32
6357c478bd9Sstevel@tonic-gate  * returns:
6367c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a return value token.
6377c478bd9Sstevel@tonic-gate  */
6387c478bd9Sstevel@tonic-gate token_t *
6397c478bd9Sstevel@tonic-gate au_to_return32(int error, int32_t rv)
6407c478bd9Sstevel@tonic-gate {
6417c478bd9Sstevel@tonic-gate 	token_t *m;			/* local au_membuf */
6427c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
6437c478bd9Sstevel@tonic-gate 	char data_header = AUT_RETURN32; /* header for this token */
6447c478bd9Sstevel@tonic-gate 	int32_t val;
6457c478bd9Sstevel@tonic-gate 	char ed = error;
6467c478bd9Sstevel@tonic-gate 
6477c478bd9Sstevel@tonic-gate 	m = au_getclr();
6487c478bd9Sstevel@tonic-gate 
6497c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
6507c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
6517c478bd9Sstevel@tonic-gate 	adr_char(&adr, &ed, 1);
6527c478bd9Sstevel@tonic-gate 
6537c478bd9Sstevel@tonic-gate 	if (error) {
6547c478bd9Sstevel@tonic-gate 		val = -1;
6557c478bd9Sstevel@tonic-gate 		adr_int32(&adr, &val, 1);
6567c478bd9Sstevel@tonic-gate 	} else {
6577c478bd9Sstevel@tonic-gate 		adr_int32(&adr, &rv, 1);
6587c478bd9Sstevel@tonic-gate 	}
6597c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
6607c478bd9Sstevel@tonic-gate 
6617c478bd9Sstevel@tonic-gate 	return (m);
6627c478bd9Sstevel@tonic-gate }
6637c478bd9Sstevel@tonic-gate 
6647c478bd9Sstevel@tonic-gate /*
6657c478bd9Sstevel@tonic-gate  * au_to_return64
6667c478bd9Sstevel@tonic-gate  * returns:
6677c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a return value token.
6687c478bd9Sstevel@tonic-gate  */
6697c478bd9Sstevel@tonic-gate token_t *
6707c478bd9Sstevel@tonic-gate au_to_return64(int error, int64_t rv)
6717c478bd9Sstevel@tonic-gate {
6727c478bd9Sstevel@tonic-gate 	token_t *m;			/* local au_membuf */
6737c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
6747c478bd9Sstevel@tonic-gate 	char data_header = AUT_RETURN64; /* header for this token */
6757c478bd9Sstevel@tonic-gate 	int64_t val;
6767c478bd9Sstevel@tonic-gate 	char ed = error;
6777c478bd9Sstevel@tonic-gate 
6787c478bd9Sstevel@tonic-gate 	m = au_getclr();
6797c478bd9Sstevel@tonic-gate 
6807c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
6817c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
6827c478bd9Sstevel@tonic-gate 	adr_char(&adr, &ed, 1);
6837c478bd9Sstevel@tonic-gate 
6847c478bd9Sstevel@tonic-gate 	if (error) {
6857c478bd9Sstevel@tonic-gate 		val = -1;
6867c478bd9Sstevel@tonic-gate 		adr_int64(&adr, &val, 1);
6877c478bd9Sstevel@tonic-gate 	} else {
6887c478bd9Sstevel@tonic-gate 		adr_int64(&adr, &rv, 1);
6897c478bd9Sstevel@tonic-gate 	}
6907c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
6917c478bd9Sstevel@tonic-gate 
6927c478bd9Sstevel@tonic-gate 	return (m);
6937c478bd9Sstevel@tonic-gate }
6947c478bd9Sstevel@tonic-gate 
6957c478bd9Sstevel@tonic-gate #ifdef	AU_MAY_USE_SOMEDAY
6967c478bd9Sstevel@tonic-gate /*
6977c478bd9Sstevel@tonic-gate  * au_to_opaque
6987c478bd9Sstevel@tonic-gate  * returns:
6997c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a opaque token.
7007c478bd9Sstevel@tonic-gate  */
7017c478bd9Sstevel@tonic-gate token_t *
7027c478bd9Sstevel@tonic-gate au_to_opaque(short bytes, char *opaque)
7037c478bd9Sstevel@tonic-gate {
7047c478bd9Sstevel@tonic-gate 	token_t *token;			/* local au_membuf */
7057c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
7067c478bd9Sstevel@tonic-gate 	char data_header = AUT_OPAQUE;	/* header for this token */
7077c478bd9Sstevel@tonic-gate 
7087c478bd9Sstevel@tonic-gate 	token = au_getclr();
7097c478bd9Sstevel@tonic-gate 
7107c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(token, char *));
7117c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
7127c478bd9Sstevel@tonic-gate 	adr_short(&adr, &bytes, 1);
7137c478bd9Sstevel@tonic-gate 
7147c478bd9Sstevel@tonic-gate 	token->len = adr_count(&adr);
7157c478bd9Sstevel@tonic-gate 
7167c478bd9Sstevel@tonic-gate 	/*
7177c478bd9Sstevel@tonic-gate 	 * Now attach the data
7187c478bd9Sstevel@tonic-gate 	 */
7197c478bd9Sstevel@tonic-gate 	(void) au_append_buf(opaque, bytes, token);
7207c478bd9Sstevel@tonic-gate 
7217c478bd9Sstevel@tonic-gate 	return (token);
7227c478bd9Sstevel@tonic-gate }
7237c478bd9Sstevel@tonic-gate #endif	/* AU_MAY_USE_SOMEDAY */
7247c478bd9Sstevel@tonic-gate 
7257c478bd9Sstevel@tonic-gate /*
7267c478bd9Sstevel@tonic-gate  * au_to_ip
7277c478bd9Sstevel@tonic-gate  * returns:
7287c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a ip header token
7297c478bd9Sstevel@tonic-gate  */
7307c478bd9Sstevel@tonic-gate token_t *
7317c478bd9Sstevel@tonic-gate au_to_ip(struct ip *ipp)
7327c478bd9Sstevel@tonic-gate {
7337c478bd9Sstevel@tonic-gate 	token_t *m;			/* local au_membuf */
7347c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
7357c478bd9Sstevel@tonic-gate 	char data_header = AUT_IP;	/* header for this token */
7367c478bd9Sstevel@tonic-gate 
7377c478bd9Sstevel@tonic-gate 	m = au_getclr();
7387c478bd9Sstevel@tonic-gate 
7397c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
7407c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
7417c478bd9Sstevel@tonic-gate 	adr_char(&adr, (char *)ipp, 2);
7427c478bd9Sstevel@tonic-gate 	adr_short(&adr, (short *)&(ipp->ip_len), 3);
7437c478bd9Sstevel@tonic-gate 	adr_char(&adr, (char *)&(ipp->ip_ttl), 2);
7447c478bd9Sstevel@tonic-gate 	adr_short(&adr, (short *)&(ipp->ip_sum), 1);
7457c478bd9Sstevel@tonic-gate 	adr_int32(&adr, (int32_t *)&(ipp->ip_src), 2);
7467c478bd9Sstevel@tonic-gate 
7477c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
7487c478bd9Sstevel@tonic-gate 
7497c478bd9Sstevel@tonic-gate 	return (m);
7507c478bd9Sstevel@tonic-gate }
7517c478bd9Sstevel@tonic-gate 
7527c478bd9Sstevel@tonic-gate /*
7537c478bd9Sstevel@tonic-gate  * au_to_iport
7547c478bd9Sstevel@tonic-gate  * returns:
7557c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a ip path token
7567c478bd9Sstevel@tonic-gate  */
7577c478bd9Sstevel@tonic-gate token_t *
7587c478bd9Sstevel@tonic-gate au_to_iport(ushort_t iport)
7597c478bd9Sstevel@tonic-gate {
7607c478bd9Sstevel@tonic-gate 	token_t *m;			/* local au_membuf */
7617c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
7627c478bd9Sstevel@tonic-gate 	char data_header = AUT_IPORT;	/* header for this token */
7637c478bd9Sstevel@tonic-gate 
7647c478bd9Sstevel@tonic-gate 	m = au_getclr();
7657c478bd9Sstevel@tonic-gate 
7667c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
7677c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
7687c478bd9Sstevel@tonic-gate 	adr_ushort(&adr, &iport, 1);
7697c478bd9Sstevel@tonic-gate 
7707c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
7717c478bd9Sstevel@tonic-gate 
7727c478bd9Sstevel@tonic-gate 	return (m);
7737c478bd9Sstevel@tonic-gate }
7747c478bd9Sstevel@tonic-gate 
7757c478bd9Sstevel@tonic-gate /*
7767c478bd9Sstevel@tonic-gate  * au_to_in_addr
7777c478bd9Sstevel@tonic-gate  * returns:
7787c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a ip path token
7797c478bd9Sstevel@tonic-gate  */
7807c478bd9Sstevel@tonic-gate token_t *
7817c478bd9Sstevel@tonic-gate au_to_in_addr(struct in_addr *internet_addr)
7827c478bd9Sstevel@tonic-gate {
7837c478bd9Sstevel@tonic-gate 	token_t *m;			/* local au_membuf */
7847c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
7857c478bd9Sstevel@tonic-gate 	char data_header = AUT_IN_ADDR;	/* header for this token */
7867c478bd9Sstevel@tonic-gate 
7877c478bd9Sstevel@tonic-gate 	m = au_getclr();
7887c478bd9Sstevel@tonic-gate 
7897c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
7907c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
7917c478bd9Sstevel@tonic-gate 	adr_char(&adr, (char *)internet_addr, sizeof (struct in_addr));
7927c478bd9Sstevel@tonic-gate 
7937c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
7947c478bd9Sstevel@tonic-gate 
7957c478bd9Sstevel@tonic-gate 	return (m);
7967c478bd9Sstevel@tonic-gate }
7977c478bd9Sstevel@tonic-gate 
7987c478bd9Sstevel@tonic-gate /*
7997c478bd9Sstevel@tonic-gate  * au_to_in_addr_ex
8007c478bd9Sstevel@tonic-gate  * returns:
8017c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing an ipv6 token
8027c478bd9Sstevel@tonic-gate  */
8037c478bd9Sstevel@tonic-gate token_t *
8047c478bd9Sstevel@tonic-gate au_to_in_addr_ex(int32_t *internet_addr)
8057c478bd9Sstevel@tonic-gate {
8067c478bd9Sstevel@tonic-gate 	token_t *m;			/* local au_membuf */
8077c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
8087c478bd9Sstevel@tonic-gate 	char data_header_v4 = AUT_IN_ADDR;	/* header for v4 token */
8097c478bd9Sstevel@tonic-gate 	char data_header_v6 = AUT_IN_ADDR_EX;	/* header for v6 token */
8107c478bd9Sstevel@tonic-gate 	int32_t type = AU_IPv6;
8117c478bd9Sstevel@tonic-gate 
8127c478bd9Sstevel@tonic-gate 	m = au_getclr();
8137c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
8147c478bd9Sstevel@tonic-gate 
8157c478bd9Sstevel@tonic-gate 	if (IN6_IS_ADDR_V4MAPPED((in6_addr_t *)internet_addr)) {
816*61b9bf51Srica 		in_addr_t in4;
817*61b9bf51Srica 
818*61b9bf51Srica 		/*
819*61b9bf51Srica 		 * An IPv4-mapped IPv6 address is really an IPv4 address
820*61b9bf51Srica 		 * in IPv6 format.
821*61b9bf51Srica 		 */
822*61b9bf51Srica 		IN6_V4MAPPED_TO_IPADDR((in6_addr_t *)internet_addr, in4);
823*61b9bf51Srica 
8247c478bd9Sstevel@tonic-gate 		adr_char(&adr, &data_header_v4, 1);
825*61b9bf51Srica 		adr_char(&adr, (char *)&in4, sizeof (struct in_addr));
8267c478bd9Sstevel@tonic-gate 	} else {
8277c478bd9Sstevel@tonic-gate 		adr_char(&adr, &data_header_v6, 1);
8287c478bd9Sstevel@tonic-gate 		adr_int32(&adr, &type, 1);
8297c478bd9Sstevel@tonic-gate 		adr_char(&adr, (char *)internet_addr, sizeof (struct in6_addr));
8307c478bd9Sstevel@tonic-gate 	}
8317c478bd9Sstevel@tonic-gate 
8327c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
8337c478bd9Sstevel@tonic-gate 
8347c478bd9Sstevel@tonic-gate 	return (m);
8357c478bd9Sstevel@tonic-gate }
8367c478bd9Sstevel@tonic-gate 
8377c478bd9Sstevel@tonic-gate /*
8387c478bd9Sstevel@tonic-gate  * The Modifier tokens
8397c478bd9Sstevel@tonic-gate  */
8407c478bd9Sstevel@tonic-gate 
8417c478bd9Sstevel@tonic-gate /*
8427c478bd9Sstevel@tonic-gate  * au_to_attr
8437c478bd9Sstevel@tonic-gate  * returns:
8447c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing an attribute token.
8457c478bd9Sstevel@tonic-gate  */
8467c478bd9Sstevel@tonic-gate token_t *
8477c478bd9Sstevel@tonic-gate au_to_attr(struct vattr *attr)
8487c478bd9Sstevel@tonic-gate {
8497c478bd9Sstevel@tonic-gate 	token_t *m;			/* local au_membuf */
8507c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
8517c478bd9Sstevel@tonic-gate #ifdef _LP64
8527c478bd9Sstevel@tonic-gate 	char data_header = AUT_ATTR64;	/* header for this token */
8537c478bd9Sstevel@tonic-gate #else
8547c478bd9Sstevel@tonic-gate 	char data_header = AUT_ATTR32;
8557c478bd9Sstevel@tonic-gate #endif
8567c478bd9Sstevel@tonic-gate 	int32_t value;
8577c478bd9Sstevel@tonic-gate 
8587c478bd9Sstevel@tonic-gate 	m = au_getclr();
8597c478bd9Sstevel@tonic-gate 
8607c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
8617c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
8627c478bd9Sstevel@tonic-gate 	value = (int32_t)attr->va_mode;
8637c478bd9Sstevel@tonic-gate 	value |= (int32_t)(VTTOIF(attr->va_type));
8647c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
8657c478bd9Sstevel@tonic-gate 	value = (int32_t)attr->va_uid;
8667c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
8677c478bd9Sstevel@tonic-gate 	value = (int32_t)attr->va_gid;
8687c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
8697c478bd9Sstevel@tonic-gate 	adr_int32(&adr, (int32_t *)&(attr->va_fsid), 1);
8707c478bd9Sstevel@tonic-gate 	adr_int64(&adr, (int64_t *)&(attr->va_nodeid), 1);
8717c478bd9Sstevel@tonic-gate #ifdef _LP64
8727c478bd9Sstevel@tonic-gate 	adr_int64(&adr, (int64_t *)&(attr->va_rdev), 1);
8737c478bd9Sstevel@tonic-gate #else
8747c478bd9Sstevel@tonic-gate 	adr_int32(&adr, (int32_t *)&(attr->va_rdev), 1);
8757c478bd9Sstevel@tonic-gate #endif
8767c478bd9Sstevel@tonic-gate 
8777c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
8787c478bd9Sstevel@tonic-gate 
8797c478bd9Sstevel@tonic-gate 	return (m);
8807c478bd9Sstevel@tonic-gate }
8817c478bd9Sstevel@tonic-gate 
8827c478bd9Sstevel@tonic-gate token_t *
8837c478bd9Sstevel@tonic-gate au_to_acl(struct acl *aclp)
8847c478bd9Sstevel@tonic-gate {
8857c478bd9Sstevel@tonic-gate 	token_t *m;				/* local au_membuf */
8867c478bd9Sstevel@tonic-gate 	adr_t adr;				/* adr memory stream header */
8877c478bd9Sstevel@tonic-gate 	char data_header = AUT_ACL;		/* header for this token */
8887c478bd9Sstevel@tonic-gate 	int32_t value;
8897c478bd9Sstevel@tonic-gate 
8907c478bd9Sstevel@tonic-gate 	m = au_getclr();
8917c478bd9Sstevel@tonic-gate 
8927c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
8937c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
8947c478bd9Sstevel@tonic-gate 
8957c478bd9Sstevel@tonic-gate 	value = (int32_t)aclp->a_type;
8967c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
8977c478bd9Sstevel@tonic-gate 	value = (int32_t)aclp->a_id;
8987c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
8997c478bd9Sstevel@tonic-gate 	value = (int32_t)aclp->a_perm;
9007c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
9017c478bd9Sstevel@tonic-gate 
9027c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
9037c478bd9Sstevel@tonic-gate 	return (m);
9047c478bd9Sstevel@tonic-gate }
9057c478bd9Sstevel@tonic-gate 
906a7746f66Stz token_t *
907a7746f66Stz au_to_ace(ace_t *acep)
908a7746f66Stz {
909a7746f66Stz 	token_t *m;				/* local au_membuf */
910a7746f66Stz 	adr_t adr;				/* adr memory stream header */
911a7746f66Stz 	char data_header = AUT_ACE;		/* header for this token */
912a7746f66Stz 
913a7746f66Stz 	m = au_getclr();
914a7746f66Stz 
915a7746f66Stz 	adr_start(&adr, memtod(m, char *));
916a7746f66Stz 	adr_char(&adr, &data_header, 1);
917a7746f66Stz 
918a7746f66Stz 	adr_uint32(&adr, &(acep->a_who), 1);
919a7746f66Stz 	adr_uint32(&adr, &(acep->a_access_mask), 1);
920a7746f66Stz 	adr_ushort(&adr, &(acep->a_flags), 1);
921a7746f66Stz 	adr_ushort(&adr, &(acep->a_type), 1);
922a7746f66Stz 
923a7746f66Stz 	m->len = adr_count(&adr);
924a7746f66Stz 	return (m);
925a7746f66Stz }
926a7746f66Stz 
9277c478bd9Sstevel@tonic-gate /*
9287c478bd9Sstevel@tonic-gate  * au_to_ipc_perm
9297c478bd9Sstevel@tonic-gate  * returns:
9307c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a System V IPC attribute token.
9317c478bd9Sstevel@tonic-gate  */
9327c478bd9Sstevel@tonic-gate token_t *
9337c478bd9Sstevel@tonic-gate au_to_ipc_perm(struct kipc_perm *perm)
9347c478bd9Sstevel@tonic-gate {
9357c478bd9Sstevel@tonic-gate 	token_t *m;				/* local au_membuf */
9367c478bd9Sstevel@tonic-gate 	adr_t adr;				/* adr memory stream header */
9377c478bd9Sstevel@tonic-gate 	char data_header = AUT_IPC_PERM;	/* header for this token */
9387c478bd9Sstevel@tonic-gate 	int32_t value;
9397c478bd9Sstevel@tonic-gate 
9407c478bd9Sstevel@tonic-gate 	m = au_getclr();
9417c478bd9Sstevel@tonic-gate 
9427c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
9437c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
9447c478bd9Sstevel@tonic-gate 	value = (int32_t)perm->ipc_uid;
9457c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
9467c478bd9Sstevel@tonic-gate 	value = (int32_t)perm->ipc_gid;
9477c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
9487c478bd9Sstevel@tonic-gate 	value = (int32_t)perm->ipc_cuid;
9497c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
9507c478bd9Sstevel@tonic-gate 	value = (int32_t)perm->ipc_cgid;
9517c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
9527c478bd9Sstevel@tonic-gate 	value = (int32_t)perm->ipc_mode;
9537c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
9547c478bd9Sstevel@tonic-gate 	value = 0;			/* seq is now obsolete */
9557c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
9567c478bd9Sstevel@tonic-gate 	value = (int32_t)perm->ipc_key;
9577c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &value, 1);
9587c478bd9Sstevel@tonic-gate 
9597c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
9607c478bd9Sstevel@tonic-gate 
9617c478bd9Sstevel@tonic-gate 	return (m);
9627c478bd9Sstevel@tonic-gate }
9637c478bd9Sstevel@tonic-gate 
9647c478bd9Sstevel@tonic-gate token_t *
9657c478bd9Sstevel@tonic-gate au_to_groups(const gid_t *crgroups, uint_t crngroups)
9667c478bd9Sstevel@tonic-gate {
9677c478bd9Sstevel@tonic-gate 	token_t *m;			/* local au_membuf */
9687c478bd9Sstevel@tonic-gate 	adr_t adr;			/* adr memory stream header */
9697c478bd9Sstevel@tonic-gate 	char data_header = AUT_NEWGROUPS;	/* header for this token */
9707c478bd9Sstevel@tonic-gate 	short n_groups;
9717c478bd9Sstevel@tonic-gate 
9727c478bd9Sstevel@tonic-gate 	m = au_getclr();
9737c478bd9Sstevel@tonic-gate 
9747c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
9757c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
9767c478bd9Sstevel@tonic-gate 	n_groups = (short)crngroups;
9777c478bd9Sstevel@tonic-gate 	adr_short(&adr, &n_groups, 1);
9787c478bd9Sstevel@tonic-gate 	adr_int32(&adr, (int32_t *)crgroups, (int)crngroups);
9797c478bd9Sstevel@tonic-gate 
9807c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
9817c478bd9Sstevel@tonic-gate 
9827c478bd9Sstevel@tonic-gate 	return (m);
9837c478bd9Sstevel@tonic-gate }
9847c478bd9Sstevel@tonic-gate 
9857c478bd9Sstevel@tonic-gate /*
9867c478bd9Sstevel@tonic-gate  * au_to_socket_ex
9877c478bd9Sstevel@tonic-gate  * returns:
9887c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a socket token.
9897c478bd9Sstevel@tonic-gate  */
9907c478bd9Sstevel@tonic-gate token_t *
9917c478bd9Sstevel@tonic-gate au_to_socket_ex(short dom, short type, char *l, char *f)
9927c478bd9Sstevel@tonic-gate {
9937c478bd9Sstevel@tonic-gate 	adr_t adr;
9947c478bd9Sstevel@tonic-gate 	token_t *m;
9957c478bd9Sstevel@tonic-gate 	char data_header = AUT_SOCKET_EX;
9967c478bd9Sstevel@tonic-gate 	struct sockaddr_in6 *addr6;
9977c478bd9Sstevel@tonic-gate 	struct sockaddr_in  *addr4;
9987c478bd9Sstevel@tonic-gate 	short size;
9997c478bd9Sstevel@tonic-gate 
10007c478bd9Sstevel@tonic-gate 	m = au_getclr();
10017c478bd9Sstevel@tonic-gate 
10027c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
10037c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
10047c478bd9Sstevel@tonic-gate 	adr_short(&adr, &dom, 1);		/* dom of socket */
10057c478bd9Sstevel@tonic-gate 	adr_short(&adr, &type, 1);		/* type of socket */
10067c478bd9Sstevel@tonic-gate 
10077c478bd9Sstevel@tonic-gate 	if (dom == AF_INET6) {
10087c478bd9Sstevel@tonic-gate 		size = AU_IPv6;
10097c478bd9Sstevel@tonic-gate 		adr_short(&adr, &size, 1);	/* type of addresses */
10107c478bd9Sstevel@tonic-gate 		addr6 = (struct sockaddr_in6 *)l;
10117c478bd9Sstevel@tonic-gate 		adr_short(&adr, (short *)&addr6->sin6_port, 1);
10127c478bd9Sstevel@tonic-gate 		adr_char(&adr, (char *)&addr6->sin6_addr, size);
10137c478bd9Sstevel@tonic-gate 		addr6 = (struct sockaddr_in6 *)f;
10147c478bd9Sstevel@tonic-gate 		adr_short(&adr, (short *)&addr6->sin6_port, 1);
10157c478bd9Sstevel@tonic-gate 		adr_char(&adr, (char *)&addr6->sin6_addr, size);
10167c478bd9Sstevel@tonic-gate 	} else if (dom == AF_INET) {
10177c478bd9Sstevel@tonic-gate 		size = AU_IPv4;
10187c478bd9Sstevel@tonic-gate 		adr_short(&adr, &size, 1);	/* type of addresses */
10197c478bd9Sstevel@tonic-gate 		addr4 = (struct sockaddr_in *)l;
10207c478bd9Sstevel@tonic-gate 		adr_short(&adr, (short *)&addr4->sin_port, 1);
10217c478bd9Sstevel@tonic-gate 		adr_char(&adr, (char *)&addr4->sin_addr, size);
10227c478bd9Sstevel@tonic-gate 		addr4 = (struct sockaddr_in *)f;
10237c478bd9Sstevel@tonic-gate 		adr_short(&adr, (short *)&addr4->sin_port, 1);
10247c478bd9Sstevel@tonic-gate 		adr_char(&adr, (char *)&addr4->sin_addr, size);
10257c478bd9Sstevel@tonic-gate 	}
10267c478bd9Sstevel@tonic-gate 
10277c478bd9Sstevel@tonic-gate 
10287c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
10297c478bd9Sstevel@tonic-gate 
10307c478bd9Sstevel@tonic-gate 	return (m);
10317c478bd9Sstevel@tonic-gate }
10327c478bd9Sstevel@tonic-gate 
10337c478bd9Sstevel@tonic-gate /*
10347c478bd9Sstevel@tonic-gate  * au_to_seq
10357c478bd9Sstevel@tonic-gate  * returns:
10367c478bd9Sstevel@tonic-gate  *	pointer to au_membuf chain containing a sequence token.
10377c478bd9Sstevel@tonic-gate  */
10387c478bd9Sstevel@tonic-gate token_t *
10397c478bd9Sstevel@tonic-gate au_to_seq()
10407c478bd9Sstevel@tonic-gate {
10417c478bd9Sstevel@tonic-gate 	adr_t adr;
10427c478bd9Sstevel@tonic-gate 	token_t *m;
10437c478bd9Sstevel@tonic-gate 	char data_header = AUT_SEQ;
10447c478bd9Sstevel@tonic-gate 	static int32_t zerocount;
10457c478bd9Sstevel@tonic-gate 
10467c478bd9Sstevel@tonic-gate 	m = au_getclr();
10477c478bd9Sstevel@tonic-gate 
10487c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
10497c478bd9Sstevel@tonic-gate 
10507c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
10517c478bd9Sstevel@tonic-gate 
10527c478bd9Sstevel@tonic-gate 	adr_int32(&adr, &zerocount, 1);
10537c478bd9Sstevel@tonic-gate 
10547c478bd9Sstevel@tonic-gate 	m->len = adr_count(&adr);
10557c478bd9Sstevel@tonic-gate 
10567c478bd9Sstevel@tonic-gate 	return (m);
10577c478bd9Sstevel@tonic-gate }
10587c478bd9Sstevel@tonic-gate 
10597c478bd9Sstevel@tonic-gate token_t *
10607c478bd9Sstevel@tonic-gate au_to_sock_inet(struct sockaddr_in *s_inet)
10617c478bd9Sstevel@tonic-gate {
10627c478bd9Sstevel@tonic-gate 	adr_t adr;
10637c478bd9Sstevel@tonic-gate 	token_t *m;
10647c478bd9Sstevel@tonic-gate 	char data_header = AUT_SOCKET;
10657c478bd9Sstevel@tonic-gate 
10667c478bd9Sstevel@tonic-gate 	m = au_getclr();
10677c478bd9Sstevel@tonic-gate 
10687c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(m, char *));
10697c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
10707c478bd9Sstevel@tonic-gate 	adr_short(&adr, (short *)&s_inet->sin_family, 1);
10717c478bd9Sstevel@tonic-gate 	adr_short(&adr, (short *)&s_inet->sin_port, 1);
10727c478bd9Sstevel@tonic-gate 
10737c478bd9Sstevel@tonic-gate 	/* remote addr */
10747c478bd9Sstevel@tonic-gate 	adr_int32(&adr, (int32_t *)&s_inet->sin_addr.s_addr, 1);
10757c478bd9Sstevel@tonic-gate 
10767c478bd9Sstevel@tonic-gate 	m->len = (uchar_t)adr_count(&adr);
10777c478bd9Sstevel@tonic-gate 
10787c478bd9Sstevel@tonic-gate 	return (m);
10797c478bd9Sstevel@tonic-gate }
10807c478bd9Sstevel@tonic-gate 
10817c478bd9Sstevel@tonic-gate extern int maxprivbytes;
10827c478bd9Sstevel@tonic-gate 
10837c478bd9Sstevel@tonic-gate token_t *
10847c478bd9Sstevel@tonic-gate au_to_privset(
10857c478bd9Sstevel@tonic-gate     const char *set,
10867c478bd9Sstevel@tonic-gate     const priv_set_t *pset,
10877c478bd9Sstevel@tonic-gate     char data_header,
10887c478bd9Sstevel@tonic-gate     int success)
10897c478bd9Sstevel@tonic-gate {
10907c478bd9Sstevel@tonic-gate 	token_t *token, *m;
10917c478bd9Sstevel@tonic-gate 	adr_t adr;
10927c478bd9Sstevel@tonic-gate 	int priv;
10937c478bd9Sstevel@tonic-gate 	const char *pname;
10947c478bd9Sstevel@tonic-gate 	char sf = (char)success;
10957c478bd9Sstevel@tonic-gate 	char *buf, *q;
10967c478bd9Sstevel@tonic-gate 	short sz;
10977c478bd9Sstevel@tonic-gate 	boolean_t full;
10987c478bd9Sstevel@tonic-gate 
10997c478bd9Sstevel@tonic-gate 	token = au_getclr();
11007c478bd9Sstevel@tonic-gate 
11017c478bd9Sstevel@tonic-gate 	adr_start(&adr, memtod(token, char *));
11027c478bd9Sstevel@tonic-gate 	adr_char(&adr, &data_header, 1);
11037c478bd9Sstevel@tonic-gate 	/*
11047c478bd9Sstevel@tonic-gate 	 * set is not used for AUT_UPRIV and sf (== success) is not
11057c478bd9Sstevel@tonic-gate 	 * used for AUT_PRIV
11067c478bd9Sstevel@tonic-gate 	 */
11077c478bd9Sstevel@tonic-gate 	if (data_header == AUT_UPRIV) {
11087c478bd9Sstevel@tonic-gate 		adr_char(&adr, &sf, 1);
11097c478bd9Sstevel@tonic-gate 	} else {
11107c478bd9Sstevel@tonic-gate 		sz = strlen(set) + 1;
11117c478bd9Sstevel@tonic-gate 		adr_short(&adr, &sz, 1);
11127c478bd9Sstevel@tonic-gate 
11137c478bd9Sstevel@tonic-gate 		token->len = (uchar_t)adr_count(&adr);
11147c478bd9Sstevel@tonic-gate 		m = au_getclr();
11157c478bd9Sstevel@tonic-gate 
11167c478bd9Sstevel@tonic-gate 		(void) au_append_buf(set, sz, m);
11177c478bd9Sstevel@tonic-gate 		(void) au_append_rec(token, m, AU_PACK);
11187c478bd9Sstevel@tonic-gate 		adr.adr_now += sz;
11197c478bd9Sstevel@tonic-gate 	}
11207c478bd9Sstevel@tonic-gate 
11217c478bd9Sstevel@tonic-gate 	full = priv_isfullset(pset);
11227c478bd9Sstevel@tonic-gate 
11237c478bd9Sstevel@tonic-gate 	if (full) {
11247c478bd9Sstevel@tonic-gate 		buf = "ALL";
11257c478bd9Sstevel@tonic-gate 		sz = strlen(buf) + 1;
11267c478bd9Sstevel@tonic-gate 	} else {
11277c478bd9Sstevel@tonic-gate 		q = buf = kmem_alloc(maxprivbytes, KM_SLEEP);
11287c478bd9Sstevel@tonic-gate 		*buf = '\0';
11297c478bd9Sstevel@tonic-gate 
11307c478bd9Sstevel@tonic-gate 		for (priv = 0; (pname = priv_getbynum(priv)) != NULL; priv++) {
11317c478bd9Sstevel@tonic-gate 			if (priv_ismember(pset, priv)) {
11327c478bd9Sstevel@tonic-gate 				if (q != buf)
11337c478bd9Sstevel@tonic-gate 					*q++ = ',';
11347c478bd9Sstevel@tonic-gate 				(void) strcpy(q, pname);
11357c478bd9Sstevel@tonic-gate 				q += strlen(q);
11367c478bd9Sstevel@tonic-gate 			}
11377c478bd9Sstevel@tonic-gate 		}
11387c478bd9Sstevel@tonic-gate 		sz = (q - buf) + 1;
11397c478bd9Sstevel@tonic-gate 	}
11407c478bd9Sstevel@tonic-gate 
11417c478bd9Sstevel@tonic-gate 	adr_short(&adr, &sz, 1);
11427c478bd9Sstevel@tonic-gate 	token->len = (uchar_t)adr_count(&adr);
11437c478bd9Sstevel@tonic-gate 
11447c478bd9Sstevel@tonic-gate 	m = au_getclr();
11457c478bd9Sstevel@tonic-gate 	(void) au_append_buf(buf, sz, m);
11467c478bd9Sstevel@tonic-gate 	(void) au_append_rec(token, m, AU_PACK);
11477c478bd9Sstevel@tonic-gate 
11487c478bd9Sstevel@tonic-gate 	if (!full)
11497c478bd9Sstevel@tonic-gate 		kmem_free(buf, maxprivbytes);
11507c478bd9Sstevel@tonic-gate 
11517c478bd9Sstevel@tonic-gate 	return (token);
11527c478bd9Sstevel@tonic-gate }
115345916cd2Sjpk 
115445916cd2Sjpk /*
115545916cd2Sjpk  * au_to_label
115645916cd2Sjpk  * returns:
1157d31ffe99Srica  *	pointer to au_membuf chain containing a label token.
115845916cd2Sjpk  */
115945916cd2Sjpk token_t *
116045916cd2Sjpk au_to_label(bslabel_t *label)
116145916cd2Sjpk {
116245916cd2Sjpk 	token_t *m;			/* local au_membuf */
116345916cd2Sjpk 	adr_t adr;			/* adr memory stream header */
116445916cd2Sjpk 	char data_header = AUT_LABEL;	/* header for this token */
116545916cd2Sjpk 
116645916cd2Sjpk 	m = au_getclr();
116745916cd2Sjpk 
116845916cd2Sjpk 	adr_start(&adr, memtod(m, char *));
116945916cd2Sjpk 	adr_char(&adr, &data_header, 1);
117045916cd2Sjpk 	adr_char(&adr, (char *)label, sizeof (bslabel_t));
117145916cd2Sjpk 	m->len = adr_count(&adr);
117245916cd2Sjpk 
117345916cd2Sjpk 	return (m);
117445916cd2Sjpk }
1175