Home | History | Annotate | Download | only in c2
      1     0    stevel /*
      2     0    stevel  * CDDL HEADER START
      3     0    stevel  *
      4     0    stevel  * The contents of this file are subject to the terms of the
      5  1676       jpk  * Common Development and Distribution License (the "License").
      6  1676       jpk  * You may not use this file except in compliance with the License.
      7     0    stevel  *
      8     0    stevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9     0    stevel  * or http://www.opensolaris.org/os/licensing.
     10     0    stevel  * See the License for the specific language governing permissions
     11     0    stevel  * and limitations under the License.
     12     0    stevel  *
     13     0    stevel  * When distributing Covered Code, include this CDDL HEADER in each
     14     0    stevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15     0    stevel  * If applicable, add the following below this CDDL HEADER, with the
     16     0    stevel  * fields enclosed by brackets "[]" replaced with your own identifying
     17     0    stevel  * information: Portions Copyright [yyyy] [name of copyright owner]
     18     0    stevel  *
     19     0    stevel  * CDDL HEADER END
     20     0    stevel  */
     21     0    stevel /*
     22  6688      rica  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23     0    stevel  * Use is subject to license terms.
     24     0    stevel  */
     25     0    stevel 
     26     0    stevel /*
     27     0    stevel  * Support routines for building audit records.
     28     0    stevel  */
     29     0    stevel 
     30     0    stevel #include <sys/param.h>
     31     0    stevel #include <sys/systm.h>		/* for rval */
     32     0    stevel #include <sys/time.h>
     33     0    stevel #include <sys/types.h>
     34     0    stevel #include <sys/vnode.h>
     35     0    stevel #include <sys/mode.h>
     36     0    stevel #include <sys/user.h>
     37     0    stevel #include <sys/session.h>
     38     0    stevel #include <sys/acl.h>
     39     0    stevel #include <sys/ipc_impl.h>
     40     0    stevel #include <netinet/in_systm.h>
     41     0    stevel #include <netinet/in.h>
     42     0    stevel #include <netinet/ip.h>
     43     0    stevel #include <sys/socket.h>
     44     0    stevel #include <net/route.h>
     45     0    stevel #include <netinet/in_pcb.h>
     46     0    stevel #include <c2/audit.h>
     47     0    stevel #include <c2/audit_kernel.h>
     48     0    stevel #include <c2/audit_record.h>
     49     0    stevel #include <sys/model.h>		/* for model_t */
     50     0    stevel #include <sys/vmparam.h>	/* for USRSTACK/USRSTACK32 */
     51     0    stevel #include <sys/vfs.h>		/* for sonode */
     52     0    stevel #include <sys/socketvar.h>	/* for sonode */
     53     0    stevel #include <sys/zone.h>
     54  1676       jpk #include <sys/tsol/label.h>
     55     0    stevel 
     56     0    stevel /*
     57     0    stevel  * These are the control tokens
     58     0    stevel  */
     59     0    stevel 
     60     0    stevel /*
     61     0    stevel  * au_to_header
     62     0    stevel  * returns:
     63     0    stevel  *	pointer to au_membuf chain containing a header token.
     64     0    stevel  */
     65     0    stevel token_t *
     66  7753       Ton au_to_header(int byte_count, au_event_t e_type, au_emod_t e_mod)
     67     0    stevel {
     68     0    stevel 	adr_t adr;			/* adr memory stream header */
     69     0    stevel 	token_t *m;			/* au_membuf pointer */
     70     0    stevel #ifdef _LP64
     71     0    stevel 	char data_header = AUT_HEADER64;	/* header for this token */
     72     0    stevel 	static int64_t zerotime[2];
     73     0    stevel #else
     74     0    stevel 	char data_header = AUT_HEADER32;
     75     0    stevel 	static int32_t zerotime[2];
     76     0    stevel #endif
     77     0    stevel 	char version = TOKEN_VERSION;	/* version of token family */
     78     0    stevel 
     79     0    stevel 	m = au_getclr();
     80     0    stevel 
     81     0    stevel 	adr_start(&adr, memtod(m, char *));
     82     0    stevel 	adr_char(&adr, &data_header, 1);	/* token ID */
     83     0    stevel 	adr_int32(&adr, (int32_t *)&byte_count, 1);	/* length of */
     84     0    stevel 							/* audit record */
     85     0    stevel 	adr_char(&adr, &version, 1);		/* version of audit tokens */
     86  7753       Ton 	adr_ushort(&adr, &e_type, 1);		/* event ID */
     87  7753       Ton 	adr_ushort(&adr, &e_mod, 1);		/* event ID modifier */
     88     0    stevel #ifdef _LP64
     89     0    stevel 	adr_int64(&adr, zerotime, 2);		/* time & date space */
     90     0    stevel #else
     91     0    stevel 	adr_int32(&adr, zerotime, 2);
     92     0    stevel #endif
     93     0    stevel 	m->len = adr_count(&adr);
     94     0    stevel 
     95     0    stevel 	return (m);
     96     0    stevel }
     97     0    stevel 
     98     0    stevel token_t *
     99     0    stevel au_to_header_ex(int byte_count, au_event_t e_type, au_emod_t e_mod)
    100     0    stevel {
    101     0    stevel 	adr_t adr;			/* adr memory stream header */
    102     0    stevel 	token_t *m;			/* au_membuf pointer */
    103  4197   paulson 	au_kcontext_t	*kctx = GET_KCTX_PZ;
    104     0    stevel 
    105     0    stevel #ifdef _LP64
    106     0    stevel 	char data_header = AUT_HEADER64_EX;	/* header for this token */
    107     0    stevel 	static int64_t zerotime[2];
    108     0    stevel #else
    109     0    stevel 	char data_header = AUT_HEADER32_EX;
    110     0    stevel 	static int32_t zerotime[2];
    111     0    stevel #endif
    112     0    stevel 	char version = TOKEN_VERSION;	/* version of token family */
    113     0    stevel 
    114     0    stevel 	m = au_getclr();
    115     0    stevel 
    116     0    stevel 	adr_start(&adr, memtod(m, char *));
    117     0    stevel 	adr_char(&adr, &data_header, 1);	/* token ID */
    118     0    stevel 	adr_int32(&adr, (int32_t *)&byte_count, 1);	/* length of */
    119     0    stevel 							/* audit record */
    120     0    stevel 	adr_char(&adr, &version, 1);		/* version of audit tokens */
    121  7753       Ton 	adr_ushort(&adr, &e_type, 1);		/* event ID */
    122  7753       Ton 	adr_ushort(&adr, &e_mod, 1);		/* event ID modifier */
    123     0    stevel 	adr_uint32(&adr, &kctx->auk_info.ai_termid.at_type, 1);
    124     0    stevel 	adr_char(&adr, (char *)&kctx->auk_info.ai_termid.at_addr[0],
    125     0    stevel 	    (int)kctx->auk_info.ai_termid.at_type);
    126     0    stevel #ifdef _LP64
    127     0    stevel 	adr_int64(&adr, zerotime, 2);		/* time & date */
    128     0    stevel #else
    129     0    stevel 	adr_int32(&adr, zerotime, 2);
    130     0    stevel #endif
    131     0    stevel 	m->len = adr_count(&adr);
    132     0    stevel 
    133     0    stevel 	return (m);
    134     0    stevel }
    135     0    stevel 
    136     0    stevel /*
    137     0    stevel  * au_to_trailer
    138     0    stevel  * returns:
    139     0    stevel  *	pointer to au_membuf chain containing a trailer token.
    140     0    stevel  */
    141     0    stevel token_t *
    142     0    stevel au_to_trailer(int byte_count)
    143     0    stevel {
    144     0    stevel 	adr_t adr;				/* adr memory stream header */
    145     0    stevel 	token_t *m;				/* au_membuf pointer */
    146     0    stevel 	char data_header = AUT_TRAILER;		/* header for this token */
    147     0    stevel 	short magic = (short)AUT_TRAILER_MAGIC; /* trailer magic number */
    148     0    stevel 
    149     0    stevel 	m = au_getclr();
    150     0    stevel 
    151     0    stevel 	adr_start(&adr, memtod(m, char *));
    152     0    stevel 	adr_char(&adr, &data_header, 1);		/* token ID */
    153     0    stevel 	adr_short(&adr, &magic, 1);			/* magic number */
    154     0    stevel 	adr_int32(&adr, (int32_t *)&byte_count, 1);	/* length of */
    155     0    stevel 							/* audit record */
    156     0    stevel 
    157     0    stevel 	m->len = adr_count(&adr);
    158     0    stevel 
    159     0    stevel 	return (m);
    160     0    stevel }
    161     0    stevel /*
    162     0    stevel  * These are the data tokens
    163     0    stevel  */
    164     0    stevel 
    165     0    stevel /*
    166     0    stevel  * au_to_data
    167     0    stevel  * returns:
    168     0    stevel  *	pointer to au_membuf chain containing a data token.
    169     0    stevel  */
    170     0    stevel token_t *
    171     0    stevel au_to_data(char unit_print, char unit_type, char unit_count, char *p)
    172     0    stevel {
    173     0    stevel 	adr_t adr;			/* adr memory stream header */
    174     0    stevel 	token_t *m;			/* au_membuf pointer */
    175     0    stevel 	char data_header = AUT_DATA;	/* header for this token */
    176     0    stevel 
    177     0    stevel 	ASSERT(p != NULL);
    178     0    stevel 	ASSERT(unit_count != 0);
    179     0    stevel 
    180     0    stevel 	switch (unit_type) {
    181     0    stevel 	case AUR_SHORT:
    182     0    stevel 		if (sizeof (short) * unit_count >= AU_BUFSIZE)
    183     0    stevel 			return (au_to_text("au_to_data: unit count too big"));
    184     0    stevel 		break;
    185     0    stevel 	case AUR_INT32:
    186     0    stevel 		if (sizeof (int32_t) * unit_count >= AU_BUFSIZE)
    187     0    stevel 			return (au_to_text("au_to_data: unit count too big"));
    188     0    stevel 		break;
    189     0    stevel 	case AUR_INT64:
    190     0    stevel 		if (sizeof (int64_t) * unit_count >= AU_BUFSIZE)
    191     0    stevel 			return (au_to_text("au_to_data: unit count too big"));
    192     0    stevel 		break;
    193     0    stevel 	case AUR_BYTE:
    194     0    stevel 	default:
    195     0    stevel #ifdef _CHAR_IS_UNSIGNED
    196     0    stevel 		if (sizeof (char) * unit_count >= AU_BUFSIZE)
    197     0    stevel 			return (au_to_text("au_to_data: unit count too big"));
    198     0    stevel #endif
    199     0    stevel 		/*
    200     0    stevel 		 * we used to check for this:
    201     0    stevel 		 * sizeof (char) * (int)unit_count >= AU_BUFSIZE).
    202     0    stevel 		 * but the compiler is smart enough to see that
    203     0    stevel 		 * will never be >= AU_BUFSIZE, since that's 128
    204     0    stevel 		 * and unit_count maxes out at 127 (signed char),
    205     0    stevel 		 * and complain.
    206     0    stevel 		 */
    207     0    stevel 		break;
    208     0    stevel 	}
    209     0    stevel 
    210     0    stevel 	m = au_getclr();
    211     0    stevel 
    212     0    stevel 	adr_start(&adr, memtod(m, char *));
    213     0    stevel 	adr_char(&adr, &data_header, 1);
    214     0    stevel 	adr_char(&adr, &unit_print, 1);
    215     0    stevel 	adr_char(&adr, &unit_type, 1);
    216     0    stevel 	adr_char(&adr, &unit_count, 1);
    217     0    stevel 
    218     0    stevel 	switch (unit_type) {
    219     0    stevel 	case AUR_SHORT:
    220     0    stevel 		adr_short(&adr, (short *)p, unit_count);
    221     0    stevel 		break;
    222     0    stevel 	case AUR_INT32:
    223     0    stevel 		adr_int32(&adr, (int32_t *)p, unit_count);
    224     0    stevel 		break;
    225     0    stevel 	case AUR_INT64:
    226     0    stevel 		adr_int64(&adr, (int64_t *)p, unit_count);
    227     0    stevel 		break;
    228     0    stevel 	case AUR_BYTE:
    229     0    stevel 	default:
    230     0    stevel 		adr_char(&adr, p, unit_count);
    231     0    stevel 		break;
    232     0    stevel 	}
    233     0    stevel 
    234     0    stevel 	m->len = adr_count(&adr);
    235     0    stevel 
    236     0    stevel 	return (m);
    237     0    stevel }
    238     0    stevel 
    239     0    stevel /*
    240     0    stevel  * au_to_process
    241     0    stevel  * au_to_subject
    242     0    stevel  * returns:
    243     0    stevel  *	pointer to au_membuf chain containing a process token.
    244     0    stevel  */
    245     0    stevel static token_t *au_to_any_process(char, uid_t, gid_t, uid_t, gid_t,
    246     0    stevel     pid_t, au_id_t, au_asid_t, const au_tid_addr_t *atid);
    247     0    stevel 
    248     0    stevel token_t *
    249     0    stevel au_to_process(uid_t uid, gid_t gid, uid_t ruid, gid_t rgid, pid_t pid,
    250     0    stevel     au_id_t auid, au_asid_t asid, const au_tid_addr_t *atid)
    251     0    stevel {
    252     0    stevel 	char data_header;
    253     0    stevel 
    254     0    stevel #ifdef _LP64
    255     0    stevel 	if (atid->at_type == AU_IPv6)
    256     0    stevel 		data_header = AUT_PROCESS64_EX;
    257     0    stevel 	else
    258     0    stevel 		data_header = AUT_PROCESS64;
    259     0    stevel #else
    260     0    stevel 	if (atid->at_type == AU_IPv6)
    261     0    stevel 		data_header = AUT_PROCESS32_EX;
    262     0    stevel 	else
    263     0    stevel 		data_header = AUT_PROCESS32;
    264     0    stevel #endif
    265     0    stevel 
    266     0    stevel 	return (au_to_any_process(data_header, uid, gid, ruid,
    267     0    stevel 	    rgid, pid, auid, asid, atid));
    268     0    stevel }
    269     0    stevel 
    270     0    stevel token_t *
    271     0    stevel au_to_subject(uid_t uid, gid_t gid, uid_t ruid, gid_t rgid, pid_t pid,
    272     0    stevel     au_id_t auid, au_asid_t asid, const au_tid_addr_t *atid)
    273     0    stevel {
    274     0    stevel 	char data_header;
    275     0    stevel 
    276     0    stevel #ifdef _LP64
    277     0    stevel 	if (atid->at_type == AU_IPv6)
    278     0    stevel 		data_header = AUT_SUBJECT64_EX;
    279     0    stevel 	else
    280     0    stevel 		data_header = AUT_SUBJECT64;
    281     0    stevel #else
    282     0    stevel 	if (atid->at_type == AU_IPv6)
    283     0    stevel 		data_header = AUT_SUBJECT32_EX;
    284     0    stevel 	else
    285     0    stevel 		data_header = AUT_SUBJECT32;
    286     0    stevel #endif
    287     0    stevel 	return (au_to_any_process(data_header, uid, gid, ruid,
    288     0    stevel 	    rgid, pid, auid, asid, atid));
    289     0    stevel }
    290     0    stevel 
    291     0    stevel 
    292     0    stevel static token_t *
    293     0    stevel au_to_any_process(char data_header,
    294     0    stevel     uid_t uid, gid_t gid, uid_t ruid, gid_t rgid, pid_t pid,
    295     0    stevel     au_id_t auid, au_asid_t asid, const au_tid_addr_t *atid)
    296     0    stevel {
    297     0    stevel 	token_t *m;	/* local au_membuf */
    298     0    stevel 	adr_t adr;	/* adr memory stream header */
    299     0    stevel 	int32_t value;
    300     0    stevel 
    301     0    stevel 	m = au_getclr();
    302     0    stevel 
    303     0    stevel 	adr_start(&adr, memtod(m, char *));
    304     0    stevel 	adr_char(&adr, &data_header, 1);
    305     0    stevel 	value = (int32_t)auid;
    306     0    stevel 	adr_int32(&adr, &value, 1);
    307     0    stevel 	value = (int32_t)uid;
    308     0    stevel 	adr_int32(&adr, &value, 1);
    309     0    stevel 	value = (int32_t)gid;
    310     0    stevel 	adr_int32(&adr, &value, 1);
    311     0    stevel 	value = (int32_t)ruid;
    312     0    stevel 	adr_int32(&adr, &value, 1);
    313     0    stevel 	value = (int32_t)rgid;
    314     0    stevel 	adr_int32(&adr, &value, 1);
    315     0    stevel 	value = (int32_t)pid;
    316     0    stevel 	adr_int32(&adr, &value, 1);
    317     0    stevel 	value = (int32_t)asid;
    318     0    stevel 	adr_int32(&adr, &value, 1);
    319     0    stevel #ifdef _LP64
    320     0    stevel 	adr_int64(&adr, (int64_t *)&(atid->at_port), 1);
    321     0    stevel #else
    322     0    stevel 	adr_int32(&adr, (int32_t *)&(atid->at_port), 1);
    323     0    stevel #endif
    324     0    stevel 	if (atid->at_type == AU_IPv6) {
    325     0    stevel 		adr_uint32(&adr, (uint_t *)&atid->at_type, 1);
    326     0    stevel 		adr_char(&adr, (char *)&atid->at_addr[0], 16);
    327     0    stevel 	} else {
    328     0    stevel 		adr_char(&adr, (char *)&(atid->at_addr[0]), 4);
    329     0    stevel 	}
    330     0    stevel 
    331     0    stevel 	m->len = adr_count(&adr);
    332     0    stevel 
    333     0    stevel 	return (m);
    334     0    stevel }
    335     0    stevel 
    336     0    stevel /*
    337     0    stevel  * au_to_text
    338     0    stevel  * returns:
    339     0    stevel  *	pointer to au_membuf chain containing a text token.
    340     0    stevel  */
    341     0    stevel token_t *
    342     0    stevel au_to_text(const char *text)
    343     0    stevel {
    344     0    stevel 	token_t *token;			/* local au_membuf */
    345     0    stevel 	adr_t adr;			/* adr memory stream header */
    346     0    stevel 	char data_header = AUT_TEXT;	/* header for this token */
    347     0    stevel 	short bytes;			/* length of string */
    348     0    stevel 
    349     0    stevel 	token = au_getclr();
    350     0    stevel 
    351     0    stevel 	bytes = (short)strlen(text) + 1;
    352     0    stevel 	adr_start(&adr, memtod(token, char *));
    353     0    stevel 	adr_char(&adr, &data_header, 1);
    354     0    stevel 	adr_short(&adr, &bytes, 1);
    355     0    stevel 
    356     0    stevel 	token->len = (char)adr_count(&adr);
    357     0    stevel 	/*
    358     0    stevel 	 * Now attach the text
    359     0    stevel 	 */
    360     0    stevel 	(void) au_append_buf(text, bytes, token);
    361     0    stevel 
    362     0    stevel 	return (token);
    363     0    stevel }
    364     0    stevel 
    365     0    stevel /*
    366     0    stevel  * au_zonename_length
    367     0    stevel  * returns:
    368     0    stevel  * -	length of zonename token to be generated
    369     0    stevel  * -	zone name up to ZONENAME_MAX + 1 in length
    370     0    stevel  */
    371     0    stevel #define	ZONE_TOKEN_OVERHEAD 3
    372     0    stevel 	/*
    373     0    stevel 	 * the zone token is
    374     0    stevel 	 * token id (1 byte)
    375     0    stevel 	 * string length (2 bytes)
    376     0    stevel 	 * the string (strlen(zonename) + 1)
    377     0    stevel 	 */
    378     0    stevel size_t
    379  4165  tz204579 au_zonename_length(zone_t *zone)
    380     0    stevel {
    381  4165  tz204579 	if (zone == NULL)
    382  4165  tz204579 		zone = curproc->p_zone;
    383  4165  tz204579 	return (strlen(zone->zone_name) + 1 +
    384     0    stevel 	    ZONE_TOKEN_OVERHEAD);
    385     0    stevel }
    386     0    stevel 
    387     0    stevel /*
    388     0    stevel  * au_to_zonename
    389     0    stevel  *
    390     0    stevel  * A length of zero input to au_to_zonename means the length is not
    391     0    stevel  * pre-calculated.
    392     0    stevel  *
    393     0    stevel  * The caller is responsible for checking the AUDIT_ZONENAME policy
    394     0    stevel  * before calling au_zonename_length() and au_to_zonename().  If
    395     0    stevel  * the policy changes between the calls, no harm is done, so the
    396     0    stevel  * policy only needs to be checked once.
    397     0    stevel  *
    398     0    stevel  * returns:
    399     0    stevel  *	pointer to au_membuf chain containing a zonename token; NULL if
    400     0    stevel  *	policy is off.
    401     0    stevel  *
    402     0    stevel  *	if the zonename token is generated at token generation close time,
    403     0    stevel  *	the length of the token is already known and it is ASSERTed that
    404     0    stevel  *	it has not changed.  If not precalculated, zone_length must be
    405     0    stevel  *	zero.
    406     0    stevel  */
    407     0    stevel token_t *
    408  4165  tz204579 au_to_zonename(size_t zone_length, zone_t *zone)
    409     0    stevel {
    410     0    stevel 	token_t *token;			/* local au_membuf */
    411     0    stevel 	adr_t adr;			/* adr memory stream header */
    412     0    stevel 	char data_header = AUT_ZONENAME;	/* header for this token */
    413     0    stevel 	short bytes;			/* length of string */
    414     0    stevel 
    415     0    stevel 	token = au_getclr();
    416     0    stevel 
    417  4165  tz204579 	if (zone == NULL)
    418  4165  tz204579 		zone = curproc->p_zone;
    419  4165  tz204579 	bytes = (short)strlen(zone->zone_name) + 1;
    420     0    stevel 	/*
    421     0    stevel 	 * If zone_length != 0, it was precalculated and is
    422     0    stevel 	 * the token length, not the string length.
    423     0    stevel 	 */
    424     0    stevel 	ASSERT((zone_length == 0) ||
    425     0    stevel 	    (zone_length == (bytes + ZONE_TOKEN_OVERHEAD)));
    426     0    stevel 
    427     0    stevel 	adr_start(&adr, memtod(token, char *));
    428     0    stevel 	adr_char(&adr, &data_header, 1);
    429     0    stevel 	adr_short(&adr, &bytes, 1);
    430     0    stevel 
    431     0    stevel 	token->len = (char)adr_count(&adr);
    432  4165  tz204579 	(void) au_append_buf(zone->zone_name, bytes, token);
    433     0    stevel 
    434     0    stevel 	return (token);
    435     0    stevel }
    436     0    stevel 
    437     0    stevel /*
    438     0    stevel  * au_to_strings
    439     0    stevel  * returns:
    440     0    stevel  *	pointer to au_membuf chain containing a strings array token.
    441     0    stevel  */
    442     0    stevel token_t *
    443     0    stevel au_to_strings(
    444     0    stevel 	char header,		/* token type */
    445     0    stevel 	const char *kstrp,	/* kernel string pointer */
    446     0    stevel 	ssize_t count)		/* count of arguments */
    447     0    stevel {
    448     0    stevel 	token_t *token;			/* local au_membuf */
    449     0    stevel 	token_t *m;			/* local au_membuf */
    450     0    stevel 	adr_t adr;			/* adr memory stream header */
    451     0    stevel 	size_t len;
    452     0    stevel 	int32_t tlen;
    453     0    stevel 
    454     0    stevel 	token = au_getclr();
    455     0    stevel 
    456     0    stevel 	adr_start(&adr, memtod(token, char *));
    457     0    stevel 	adr_char(&adr, &header, 1);
    458     0    stevel 	tlen = (int32_t)count;
    459     0    stevel 	adr_int32(&adr, &tlen, 1);
    460     0    stevel 
    461     0    stevel 	token->len = (char)adr_count(&adr);
    462     0    stevel 
    463     0    stevel 	while (count-- > 0) {
    464     0    stevel 		m = au_getclr();
    465     0    stevel 		len = strlen(kstrp) + 1;
    466     0    stevel 		(void) au_append_buf(kstrp, len, m);
    467     0    stevel 		(void) au_append_rec((token_t *)token, (token_t *)m, AU_PACK);
    468     0    stevel 		kstrp += len;
    469     0    stevel 	}
    470     0    stevel 
    471     0    stevel 	return (token);
    472     0    stevel }
    473     0    stevel 
    474     0    stevel /*
    475     0    stevel  * au_to_exec_args
    476     0    stevel  * returns:
    477     0    stevel  *	pointer to au_membuf chain containing a argv token.
    478     0    stevel  */
    479     0    stevel token_t *
    480     0    stevel au_to_exec_args(const char *kstrp, ssize_t argc)
    481     0    stevel {
    482     0    stevel 	return (au_to_strings(AUT_EXEC_ARGS, kstrp, argc));
    483     0    stevel }
    484     0    stevel 
    485     0    stevel /*
    486     0    stevel  * au_to_exec_env
    487     0    stevel  * returns:
    488     0    stevel  *	pointer to au_membuf chain containing a arge token.
    489     0    stevel  */
    490     0    stevel token_t *
    491     0    stevel au_to_exec_env(const char *kstrp, ssize_t envc)
    492     0    stevel {
    493     0    stevel 	return (au_to_strings(AUT_EXEC_ENV, kstrp, envc));
    494     0    stevel }
    495     0    stevel 
    496     0    stevel /*
    497     0    stevel  * au_to_arg32
    498     0    stevel  *	char   n;	argument # being used
    499     0    stevel  *	char  *text;	text describing argument
    500     0    stevel  *	uint32_t v;	argument value
    501     0    stevel  * returns:
    502     0    stevel  *	pointer to au_membuf chain containing an argument token.
    503     0    stevel  */
    504     0    stevel token_t *
    505     0    stevel au_to_arg32(char n, char *text, uint32_t v)
    506     0    stevel {
    507     0    stevel 	token_t *token;			/* local au_membuf */
    508     0    stevel 	adr_t adr;			/* adr memory stream header */
    509     0    stevel 	char data_header = AUT_ARG32;	/* header for this token */
    510     0    stevel 	short bytes;			/* length of string */
    511     0    stevel 
    512     0    stevel 	token = au_getclr();
    513     0    stevel 
    514     0    stevel 	bytes = strlen(text) + 1;
    515     0    stevel 	adr_start(&adr, memtod(token, char *));
    516     0    stevel 	adr_char(&adr, &data_header, 1);	/* token type */
    517     0    stevel 	adr_char(&adr, &n, 1);			/* argument id */
    518     0    stevel 	adr_uint32(&adr, &v, 1);		/* argument value */
    519     0    stevel 	adr_short(&adr, &bytes, 1);
    520     0    stevel 
    521     0    stevel 	token->len = adr_count(&adr);
    522     0    stevel 	/*
    523     0    stevel 	 * Now add the description
    524     0    stevel 	 */
    525     0    stevel 	(void) au_append_buf(text, bytes, token);
    526     0    stevel 
    527     0    stevel 	return (token);
    528     0    stevel }
    529     0    stevel 
    530     0    stevel 
    531     0    stevel /*
    532     0    stevel  * au_to_arg64
    533     0    stevel  *	char		n;	argument # being used
    534     0    stevel  *	char		*text;	text describing argument
    535     0    stevel  *	uint64_t	v;	argument value
    536     0    stevel  * returns:
    537     0    stevel  *	pointer to au_membuf chain containing an argument token.
    538     0    stevel  */
    539     0    stevel token_t *
    540     0    stevel au_to_arg64(char n, char *text, uint64_t v)
    541     0    stevel {
    542     0    stevel 	token_t *token;			/* local au_membuf */
    543     0    stevel 	adr_t adr;			/* adr memory stream header */
    544     0    stevel 	char data_header = AUT_ARG64;	/* header for this token */
    545     0    stevel 	short bytes;			/* length of string */
    546     0    stevel 
    547     0    stevel 	token = au_getclr();
    548     0    stevel 
    549     0    stevel 	bytes = strlen(text) + 1;
    550     0    stevel 	adr_start(&adr, memtod(token, char *));
    551     0    stevel 	adr_char(&adr, &data_header, 1);	/* token type */
    552     0    stevel 	adr_char(&adr, &n, 1);			/* argument id */
    553     0    stevel 	adr_uint64(&adr, &v, 1);		/* argument value */
    554     0    stevel 	adr_short(&adr, &bytes, 1);
    555     0    stevel 
    556     0    stevel 	token->len = adr_count(&adr);
    557     0    stevel 	/*
    558     0    stevel 	 * Now the description
    559     0    stevel 	 */
    560     0    stevel 	(void) au_append_buf(text, bytes, token);
    561     0    stevel 
    562     0    stevel 	return (token);
    563     0    stevel }
    564     0    stevel 
    565     0    stevel 
    566     0    stevel /*
    567     0    stevel  * au_to_path
    568     0    stevel  * returns:
    569     0    stevel  *	pointer to au_membuf chain containing a path token.
    570     0    stevel  */
    571     0    stevel token_t *
    572     0    stevel au_to_path(struct audit_path *app)
    573     0    stevel {
    574     0    stevel 	token_t *token;			/* local au_membuf */
    575     0    stevel 	token_t *m;			/* local au_membuf */
    576     0    stevel 	adr_t adr;			/* adr memory stream header */
    577     0    stevel 	char data_header = AUT_PATH;	/* header for this token */
    578     0    stevel 	short bytes;			/* length of string */
    579     0    stevel 	char *path = app->audp_sect[0];
    580     0    stevel 
    581     0    stevel 	bytes = (short)(app->audp_sect[1] - app->audp_sect[0]);
    582     0    stevel 
    583     0    stevel 	/*
    584     0    stevel 	 * generate path token header
    585     0    stevel 	 */
    586     0    stevel 	m = au_getclr();
    587     0    stevel 	adr_start(&adr, memtod(m, char *));
    588     0    stevel 	adr_char(&adr, &data_header, 1);
    589     0    stevel 	adr_short(&adr, &bytes, 1);
    590     0    stevel 	m->len = adr_count(&adr);
    591     0    stevel 
    592     0    stevel 	/* append path string */
    593     0    stevel 	token = m;
    594     0    stevel 	(void) au_append_buf(path, bytes, token);
    595     0    stevel 
    596     0    stevel 	if (app->audp_cnt > 1) {
    597     0    stevel 		/* generate attribute path strings token */
    598     0    stevel 		m = au_to_strings(AUT_XATPATH, app->audp_sect[1],
    599     0    stevel 		    app->audp_cnt - 1);
    600     0    stevel 
    601     0    stevel 		token = au_append_token(token, m);
    602     0    stevel 	}
    603     0    stevel 
    604     0    stevel 	return (token);
    605     0    stevel }
    606     0    stevel 
    607     0    stevel /*
    608     0    stevel  * au_to_ipc
    609     0    stevel  * returns:
    610     0    stevel  *	pointer to au_membuf chain containing a System V IPC token.
    611     0    stevel  */
    612     0    stevel token_t *
    613     0    stevel au_to_ipc(char type, int id)
    614     0    stevel {
    615     0    stevel 	token_t *m;			/* local au_membuf */
    616     0    stevel 	adr_t adr;			/* adr memory stream header */
    617     0    stevel 	char data_header = AUT_IPC;	/* header for this token */
    618     0    stevel 
    619     0    stevel 	m = au_getclr();
    620     0    stevel 
    621     0    stevel 	adr_start(&adr, memtod(m, char *));
    622     0    stevel 	adr_char(&adr, &data_header, 1);
    623     0    stevel 	adr_char(&adr, &type, 1);		/* type of IPC object */
    624     0    stevel 	adr_int32(&adr, (int32_t *)&id, 1);
    625     0    stevel 
    626     0    stevel 	m->len = adr_count(&adr);
    627     0    stevel 
    628     0    stevel 	return (m);
    629     0    stevel }
    630     0    stevel 
    631     0    stevel /*
    632     0    stevel  * au_to_return32
    633     0    stevel  * returns:
    634     0    stevel  *	pointer to au_membuf chain containing a return value token.
    635     0    stevel  */
    636     0    stevel token_t *
    637     0    stevel au_to_return32(int error, int32_t rv)
    638     0    stevel {
    639     0    stevel 	token_t *m;			/* local au_membuf */
    640     0    stevel 	adr_t adr;			/* adr memory stream header */
    641     0    stevel 	char data_header = AUT_RETURN32; /* header for this token */
    642     0    stevel 	int32_t val;
    643     0    stevel 	char ed = error;
    644     0    stevel 
    645     0    stevel 	m = au_getclr();
    646     0    stevel 
    647     0    stevel 	adr_start(&adr, memtod(m, char *));
    648     0    stevel 	adr_char(&adr, &data_header, 1);
    649     0    stevel 	adr_char(&adr, &ed, 1);
    650     0    stevel 
    651     0    stevel 	if (error) {
    652     0    stevel 		val = -1;
    653     0    stevel 		adr_int32(&adr, &val, 1);
    654     0    stevel 	} else {
    655     0    stevel 		adr_int32(&adr, &rv, 1);
    656     0    stevel 	}
    657     0    stevel 	m->len = adr_count(&adr);
    658     0    stevel 
    659     0    stevel 	return (m);
    660     0    stevel }
    661     0    stevel 
    662     0    stevel /*
    663     0    stevel  * au_to_return64
    664     0    stevel  * returns:
    665     0    stevel  *	pointer to au_membuf chain containing a return value token.
    666     0    stevel  */
    667     0    stevel token_t *
    668     0    stevel au_to_return64(int error, int64_t rv)
    669     0    stevel {
    670     0    stevel 	token_t *m;			/* local au_membuf */
    671     0    stevel 	adr_t adr;			/* adr memory stream header */
    672     0    stevel 	char data_header = AUT_RETURN64; /* header for this token */
    673     0    stevel 	int64_t val;
    674     0    stevel 	char ed = error;
    675     0    stevel 
    676     0    stevel 	m = au_getclr();
    677     0    stevel 
    678     0    stevel 	adr_start(&adr, memtod(m, char *));
    679     0    stevel 	adr_char(&adr, &data_header, 1);
    680     0    stevel 	adr_char(&adr, &ed, 1);
    681     0    stevel 
    682     0    stevel 	if (error) {
    683     0    stevel 		val = -1;
    684     0    stevel 		adr_int64(&adr, &val, 1);
    685     0    stevel 	} else {
    686     0    stevel 		adr_int64(&adr, &rv, 1);
    687     0    stevel 	}
    688     0    stevel 	m->len = adr_count(&adr);
    689     0    stevel 
    690     0    stevel 	return (m);
    691     0    stevel }
    692     0    stevel 
    693     0    stevel #ifdef	AU_MAY_USE_SOMEDAY
    694     0    stevel /*
    695     0    stevel  * au_to_opaque
    696     0    stevel  * returns:
    697     0    stevel  *	pointer to au_membuf chain containing a opaque token.
    698     0    stevel  */
    699     0    stevel token_t *
    700     0    stevel au_to_opaque(short bytes, char *opaque)
    701     0    stevel {
    702     0    stevel 	token_t *token;			/* local au_membuf */
    703     0    stevel 	adr_t adr;			/* adr memory stream header */
    704     0    stevel 	char data_header = AUT_OPAQUE;	/* header for this token */
    705     0    stevel 
    706     0    stevel 	token = au_getclr();
    707     0    stevel 
    708     0    stevel 	adr_start(&adr, memtod(token, char *));
    709     0    stevel 	adr_char(&adr, &data_header, 1);
    710     0    stevel 	adr_short(&adr, &bytes, 1);
    711     0    stevel 
    712     0    stevel 	token->len = adr_count(&adr);
    713     0    stevel 
    714     0    stevel 	/*
    715     0    stevel 	 * Now attach the data
    716     0    stevel 	 */
    717     0    stevel 	(void) au_append_buf(opaque, bytes, token);
    718     0    stevel 
    719     0    stevel 	return (token);
    720     0    stevel }
    721     0    stevel #endif	/* AU_MAY_USE_SOMEDAY */
    722     0    stevel 
    723     0    stevel /*
    724     0    stevel  * au_to_ip
    725     0    stevel  * returns:
    726     0    stevel  *	pointer to au_membuf chain containing a ip header token
    727     0    stevel  */
    728     0    stevel token_t *
    729     0    stevel au_to_ip(struct ip *ipp)
    730     0    stevel {
    731     0    stevel 	token_t *m;			/* local au_membuf */
    732     0    stevel 	adr_t adr;			/* adr memory stream header */
    733     0    stevel 	char data_header = AUT_IP;	/* header for this token */
    734     0    stevel 
    735     0    stevel 	m = au_getclr();
    736     0    stevel 
    737     0    stevel 	adr_start(&adr, memtod(m, char *));
    738     0    stevel 	adr_char(&adr, &data_header, 1);
    739     0    stevel 	adr_char(&adr, (char *)ipp, 2);
    740     0    stevel 	adr_short(&adr, (short *)&(ipp->ip_len), 3);
    741     0    stevel 	adr_char(&adr, (char *)&(ipp->ip_ttl), 2);
    742     0    stevel 	adr_short(&adr, (short *)&(ipp->ip_sum), 1);
    743     0    stevel 	adr_int32(&adr, (int32_t *)&(ipp->ip_src), 2);
    744     0    stevel 
    745     0    stevel 	m->len = adr_count(&adr);
    746     0    stevel 
    747     0    stevel 	return (m);
    748     0    stevel }
    749     0    stevel 
    750     0    stevel /*
    751     0    stevel  * au_to_iport
    752     0    stevel  * returns:
    753     0    stevel  *	pointer to au_membuf chain containing a ip path token
    754     0    stevel  */
    755     0    stevel token_t *
    756     0    stevel au_to_iport(ushort_t iport)
    757     0    stevel {
    758     0    stevel 	token_t *m;			/* local au_membuf */
    759     0    stevel 	adr_t adr;			/* adr memory stream header */
    760     0    stevel 	char data_header = AUT_IPORT;	/* header for this token */
    761     0    stevel 
    762     0    stevel 	m = au_getclr();
    763     0    stevel 
    764     0    stevel 	adr_start(&adr, memtod(m, char *));
    765     0    stevel 	adr_char(&adr, &data_header, 1);
    766     0    stevel 	adr_ushort(&adr, &iport, 1);
    767     0    stevel 
    768     0    stevel 	m->len = adr_count(&adr);
    769     0    stevel 
    770     0    stevel 	return (m);
    771     0    stevel }
    772     0    stevel 
    773     0    stevel /*
    774     0    stevel  * au_to_in_addr
    775     0    stevel  * returns:
    776     0    stevel  *	pointer to au_membuf chain containing a ip path token
    777     0    stevel  */
    778     0    stevel token_t *
    779     0    stevel au_to_in_addr(struct in_addr *internet_addr)
    780     0    stevel {
    781     0    stevel 	token_t *m;			/* local au_membuf */
    782     0    stevel 	adr_t adr;			/* adr memory stream header */
    783     0    stevel 	char data_header = AUT_IN_ADDR;	/* header for this token */
    784     0    stevel 
    785     0    stevel 	m = au_getclr();
    786     0    stevel 
    787     0    stevel 	adr_start(&adr, memtod(m, char *));
    788     0    stevel 	adr_char(&adr, &data_header, 1);
    789     0    stevel 	adr_char(&adr, (char *)internet_addr, sizeof (struct in_addr));
    790     0    stevel 
    791     0    stevel 	m->len = adr_count(&adr);
    792     0    stevel 
    793     0    stevel 	return (m);
    794     0    stevel }
    795     0    stevel 
    796     0    stevel /*
    797     0    stevel  * au_to_in_addr_ex
    798     0    stevel  * returns:
    799     0    stevel  *	pointer to au_membuf chain containing an ipv6 token
    800     0    stevel  */
    801     0    stevel token_t *
    802     0    stevel au_to_in_addr_ex(int32_t *internet_addr)
    803     0    stevel {
    804     0    stevel 	token_t *m;			/* local au_membuf */
    805     0    stevel 	adr_t adr;			/* adr memory stream header */
    806     0    stevel 	char data_header_v4 = AUT_IN_ADDR;	/* header for v4 token */
    807     0    stevel 	char data_header_v6 = AUT_IN_ADDR_EX;	/* header for v6 token */
    808     0    stevel 	int32_t type = AU_IPv6;
    809     0    stevel 
    810     0    stevel 	m = au_getclr();
    811     0    stevel 	adr_start(&adr, memtod(m, char *));
    812     0    stevel 
    813     0    stevel 	if (IN6_IS_ADDR_V4MAPPED((in6_addr_t *)internet_addr)) {
    814  7379       Ric 		ipaddr_t in4;
    815  6688      rica 
    816  6688      rica 		/*
    817  6688      rica 		 * An IPv4-mapped IPv6 address is really an IPv4 address
    818  6688      rica 		 * in IPv6 format.
    819  6688      rica 		 */
    820  6688      rica 		IN6_V4MAPPED_TO_IPADDR((in6_addr_t *)internet_addr, in4);
    821  6688      rica 
    822     0    stevel 		adr_char(&adr, &data_header_v4, 1);
    823  7379       Ric 		adr_char(&adr, (char *)&in4, sizeof (ipaddr_t));
    824     0    stevel 	} else {
    825     0    stevel 		adr_char(&adr, &data_header_v6, 1);
    826     0    stevel 		adr_int32(&adr, &type, 1);
    827     0    stevel 		adr_char(&adr, (char *)internet_addr, sizeof (struct in6_addr));
    828     0    stevel 	}
    829     0    stevel 
    830     0    stevel 	m->len = adr_count(&adr);
    831     0    stevel 
    832     0    stevel 	return (m);
    833     0    stevel }
    834     0    stevel 
    835     0    stevel /*
    836     0    stevel  * The Modifier tokens
    837     0    stevel  */
    838     0    stevel 
    839     0    stevel /*
    840     0    stevel  * au_to_attr
    841     0    stevel  * returns:
    842     0    stevel  *	pointer to au_membuf chain containing an attribute token.
    843     0    stevel  */
    844     0    stevel token_t *
    845     0    stevel au_to_attr(struct vattr *attr)
    846     0    stevel {
    847     0    stevel 	token_t *m;			/* local au_membuf */
    848     0    stevel 	adr_t adr;			/* adr memory stream header */
    849     0    stevel #ifdef _LP64
    850     0    stevel 	char data_header = AUT_ATTR64;	/* header for this token */
    851     0    stevel #else
    852     0    stevel 	char data_header = AUT_ATTR32;
    853     0    stevel #endif
    854     0    stevel 	int32_t value;
    855     0    stevel 
    856     0    stevel 	m = au_getclr();
    857     0    stevel 
    858     0    stevel 	adr_start(&adr, memtod(m, char *));
    859     0    stevel 	adr_char(&adr, &data_header, 1);
    860     0    stevel 	value = (int32_t)attr->va_mode;
    861     0    stevel 	value |= (int32_t)(VTTOIF(attr->va_type));
    862     0    stevel 	adr_int32(&adr, &value, 1);
    863     0    stevel 	value = (int32_t)attr->va_uid;
    864     0    stevel 	adr_int32(&adr, &value, 1);
    865     0    stevel 	value = (int32_t)attr->va_gid;
    866     0    stevel 	adr_int32(&adr, &value, 1);
    867     0    stevel 	adr_int32(&adr, (int32_t *)&(attr->va_fsid), 1);
    868     0    stevel 	adr_int64(&adr, (int64_t *)&(attr->va_nodeid), 1);
    869     0    stevel #ifdef _LP64
    870     0    stevel 	adr_int64(&adr, (int64_t *)&(attr->va_rdev), 1);
    871     0    stevel #else
    872     0    stevel 	adr_int32(&adr, (int32_t *)&(attr->va_rdev), 1);
    873     0    stevel #endif
    874     0    stevel 
    875     0    stevel 	m->len = adr_count(&adr);
    876     0    stevel 
    877     0    stevel 	return (m);
    878     0    stevel }
    879     0    stevel 
    880     0    stevel token_t *
    881     0    stevel au_to_acl(struct acl *aclp)
    882     0    stevel {
    883     0    stevel 	token_t *m;				/* local au_membuf */
    884     0    stevel 	adr_t adr;				/* adr memory stream header */
    885     0    stevel 	char data_header = AUT_ACL;		/* header for this token */
    886     0    stevel 	int32_t value;
    887     0    stevel 
    888     0    stevel 	m = au_getclr();
    889     0    stevel 
    890     0    stevel 	adr_start(&adr, memtod(m, char *));
    891     0    stevel 	adr_char(&adr, &data_header, 1);
    892     0    stevel 
    893     0    stevel 	value = (int32_t)aclp->a_type;
    894     0    stevel 	adr_int32(&adr, &value, 1);
    895     0    stevel 	value = (int32_t)aclp->a_id;
    896     0    stevel 	adr_int32(&adr, &value, 1);
    897     0    stevel 	value = (int32_t)aclp->a_perm;
    898     0    stevel 	adr_int32(&adr, &value, 1);
    899     0    stevel 
    900     0    stevel 	m->len = adr_count(&adr);
    901     0    stevel 	return (m);
    902     0    stevel }
    903     0    stevel 
    904  5344  tz204579 token_t *
    905  5344  tz204579 au_to_ace(ace_t *acep)
    906  5344  tz204579 {
    907  5344  tz204579 	token_t *m;				/* local au_membuf */
    908  5344  tz204579 	adr_t adr;				/* adr memory stream header */
    909  5344  tz204579 	char data_header = AUT_ACE;		/* header for this token */
    910  5344  tz204579 
    911  5344  tz204579 	m = au_getclr();
    912  5344  tz204579 
    913  5344  tz204579 	adr_start(&adr, memtod(m, char *));
    914  5344  tz204579 	adr_char(&adr, &data_header, 1);
    915  5344  tz204579 
    916  5344  tz204579 	adr_uint32(&adr, &(acep->a_who), 1);
    917  5344  tz204579 	adr_uint32(&adr, &(acep->a_access_mask), 1);
    918  5344  tz204579 	adr_ushort(&adr, &(acep->a_flags), 1);
    919  5344  tz204579 	adr_ushort(&adr, &(acep->a_type), 1);
    920  5344  tz204579 
    921  5344  tz204579 	m->len = adr_count(&adr);
    922  5344  tz204579 	return (m);
    923  5344  tz204579 }
    924  5344  tz204579 
    925     0    stevel /*
    926     0    stevel  * au_to_ipc_perm
    927     0    stevel  * returns:
    928     0    stevel  *	pointer to au_membuf chain containing a System V IPC attribute token.
    929     0    stevel  */
    930     0    stevel token_t *
    931     0    stevel au_to_ipc_perm(struct kipc_perm *perm)
    932     0    stevel {
    933     0    stevel 	token_t *m;				/* local au_membuf */
    934     0    stevel 	adr_t adr;				/* adr memory stream header */
    935     0    stevel 	char data_header = AUT_IPC_PERM;	/* header for this token */
    936     0    stevel 	int32_t value;
    937     0    stevel 
    938     0    stevel 	m = au_getclr();
    939     0    stevel 
    940     0    stevel 	adr_start(&adr, memtod(m, char *));
    941     0    stevel 	adr_char(&adr, &data_header, 1);
    942     0    stevel 	value = (int32_t)perm->ipc_uid;
    943     0    stevel 	adr_int32(&adr, &value, 1);
    944     0    stevel 	value = (int32_t)perm->ipc_gid;
    945     0    stevel 	adr_int32(&adr, &value, 1);
    946     0    stevel 	value = (int32_t)perm->ipc_cuid;
    947     0    stevel 	adr_int32(&adr, &value, 1);
    948     0    stevel 	value = (int32_t)perm->ipc_cgid;
    949     0    stevel 	adr_int32(&adr, &value, 1);
    950     0    stevel 	value = (int32_t)perm->ipc_mode;
    951     0    stevel 	adr_int32(&adr, &value, 1);
    952     0    stevel 	value = 0;			/* seq is now obsolete */
    953     0    stevel 	adr_int32(&adr, &value, 1);
    954     0    stevel 	value = (int32_t)perm->ipc_key;
    955     0    stevel 	adr_int32(&adr, &value, 1);
    956     0    stevel 
    957     0    stevel 	m->len = adr_count(&adr);
    958     0    stevel 
    959     0    stevel 	return (m);
    960     0    stevel }
    961     0    stevel 
    962     0    stevel token_t *
    963     0    stevel au_to_groups(const gid_t *crgroups, uint_t crngroups)
    964     0    stevel {
    965     0    stevel 	token_t *m;			/* local au_membuf */
    966     0    stevel 	adr_t adr;			/* adr memory stream header */
    967     0    stevel 	char data_header = AUT_NEWGROUPS;	/* header for this token */
    968     0    stevel 	short n_groups;
    969     0    stevel 
    970     0    stevel 	m = au_getclr();
    971     0    stevel 
    972     0    stevel 	adr_start(&adr, memtod(m, char *));
    973     0    stevel 	adr_char(&adr, &data_header, 1);
    974     0    stevel 	n_groups = (short)crngroups;
    975     0    stevel 	adr_short(&adr, &n_groups, 1);
    976     0    stevel 	adr_int32(&adr, (int32_t *)crgroups, (int)crngroups);
    977     0    stevel 
    978     0    stevel 	m->len = adr_count(&adr);
    979     0    stevel 
    980     0    stevel 	return (m);
    981     0    stevel }
    982     0    stevel 
    983     0    stevel /*
    984     0    stevel  * au_to_socket_ex
    985     0    stevel  * returns:
    986     0    stevel  *	pointer to au_membuf chain containing a socket token.
    987     0    stevel  */
    988     0    stevel token_t *
    989     0    stevel au_to_socket_ex(short dom, short type, char *l, char *f)
    990     0    stevel {
    991     0    stevel 	adr_t adr;
    992     0    stevel 	token_t *m;
    993     0    stevel 	char data_header = AUT_SOCKET_EX;
    994     0    stevel 	struct sockaddr_in6 *addr6;
    995     0    stevel 	struct sockaddr_in  *addr4;
    996     0    stevel 	short size;
    997     0    stevel 
    998     0    stevel 	m = au_getclr();
    999     0    stevel 
   1000     0    stevel 	adr_start(&adr, memtod(m, char *));
   1001     0    stevel 	adr_char(&adr, &data_header, 1);
   1002     0    stevel 	adr_short(&adr, &dom, 1);		/* dom of socket */
   1003     0    stevel 	adr_short(&adr, &type, 1);		/* type of socket */
   1004     0    stevel 
   1005     0    stevel 	if (dom == AF_INET6) {
   1006     0    stevel 		size = AU_IPv6;
   1007     0    stevel 		adr_short(&adr, &size, 1);	/* type of addresses */
   1008     0    stevel 		addr6 = (struct sockaddr_in6 *)l;
   1009     0    stevel 		adr_short(&adr, (short *)&addr6->sin6_port, 1);
   1010     0    stevel 		adr_char(&adr, (char *)&addr6->sin6_addr, size);
   1011     0    stevel 		addr6 = (struct sockaddr_in6 *)f;
   1012     0    stevel 		adr_short(&adr, (short *)&addr6->sin6_port, 1);
   1013     0    stevel 		adr_char(&adr, (char *)&addr6->sin6_addr, size);
   1014     0    stevel 	} else if (dom == AF_INET) {
   1015     0    stevel 		size = AU_IPv4;
   1016     0    stevel 		adr_short(&adr, &size, 1);	/* type of addresses */
   1017     0    stevel 		addr4 = (struct sockaddr_in *)l;
   1018     0    stevel 		adr_short(&adr, (short *)&addr4->sin_port, 1);
   1019     0    stevel 		adr_char(&adr, (char *)&addr4->sin_addr, size);
   1020     0    stevel 		addr4 = (struct sockaddr_in *)f;
   1021     0    stevel 		adr_short(&adr, (short *)&addr4->sin_port, 1);
   1022     0    stevel 		adr_char(&adr, (char *)&addr4->sin_addr, size);
   1023     0    stevel 	}
   1024     0    stevel 
   1025     0    stevel 
   1026     0    stevel 	m->len = adr_count(&adr);
   1027     0    stevel 
   1028     0    stevel 	return (m);
   1029     0    stevel }
   1030     0    stevel 
   1031     0    stevel /*
   1032     0    stevel  * au_to_seq
   1033     0    stevel  * returns:
   1034     0    stevel  *	pointer to au_membuf chain containing a sequence token.
   1035     0    stevel  */
   1036     0    stevel token_t *
   1037     0    stevel au_to_seq()
   1038     0    stevel {
   1039     0    stevel 	adr_t adr;
   1040     0    stevel 	token_t *m;
   1041     0    stevel 	char data_header = AUT_SEQ;
   1042     0    stevel 	static int32_t zerocount;
   1043     0    stevel 
   1044     0    stevel 	m = au_getclr();
   1045     0    stevel 
   1046     0    stevel 	adr_start(&adr, memtod(m, char *));
   1047     0    stevel 
   1048     0    stevel 	adr_char(&adr, &data_header, 1);
   1049     0    stevel 
   1050     0    stevel 	adr_int32(&adr, &zerocount, 1);
   1051     0    stevel 
   1052     0    stevel 	m->len = adr_count(&adr);
   1053     0    stevel 
   1054     0    stevel 	return (m);
   1055     0    stevel }
   1056     0    stevel 
   1057     0    stevel token_t *
   1058     0    stevel au_to_sock_inet(struct sockaddr_in *s_inet)
   1059     0    stevel {
   1060     0    stevel 	adr_t adr;
   1061     0    stevel 	token_t *m;
   1062     0    stevel 	char data_header = AUT_SOCKET;
   1063     0    stevel 
   1064     0    stevel 	m = au_getclr();
   1065     0    stevel 
   1066     0    stevel 	adr_start(&adr, memtod(m, char *));
   1067     0    stevel 	adr_char(&adr, &data_header, 1);
   1068     0    stevel 	adr_short(&adr, (short *)&s_inet->sin_family, 1);
   1069     0    stevel 	adr_short(&adr, (short *)&s_inet->sin_port, 1);
   1070     0    stevel 
   1071     0    stevel 	/* remote addr */
   1072     0    stevel 	adr_int32(&adr, (int32_t *)&s_inet->sin_addr.s_addr, 1);
   1073     0    stevel 
   1074     0    stevel 	m->len = (uchar_t)adr_count(&adr);
   1075     0    stevel 
   1076     0    stevel 	return (m);
   1077     0    stevel }
   1078     0    stevel 
   1079     0    stevel extern int maxprivbytes;
   1080     0    stevel 
   1081     0    stevel token_t *
   1082     0    stevel au_to_privset(
   1083     0    stevel     const char *set,
   1084     0    stevel     const priv_set_t *pset,
   1085     0    stevel     char data_header,
   1086     0    stevel     int success)
   1087     0    stevel {
   1088     0    stevel 	token_t *token, *m;
   1089     0    stevel 	adr_t adr;
   1090     0    stevel 	int priv;
   1091     0    stevel 	const char *pname;
   1092     0    stevel 	char sf = (char)success;
   1093     0    stevel 	char *buf, *q;
   1094     0    stevel 	short sz;
   1095     0    stevel 	boolean_t full;
   1096     0    stevel 
   1097     0    stevel 	token = au_getclr();
   1098     0    stevel 
   1099     0    stevel 	adr_start(&adr, memtod(token, char *));
   1100     0    stevel 	adr_char(&adr, &data_header, 1);
   1101     0    stevel 	/*
   1102     0    stevel 	 * set is not used for AUT_UPRIV and sf (== success) is not
   1103     0    stevel 	 * used for AUT_PRIV
   1104     0    stevel 	 */
   1105     0    stevel 	if (data_header == AUT_UPRIV) {
   1106     0    stevel 		adr_char(&adr, &sf, 1);
   1107     0    stevel 	} else {
   1108     0    stevel 		sz = strlen(set) + 1;
   1109     0    stevel 		adr_short(&adr, &sz, 1);
   1110     0    stevel 
   1111     0    stevel 		token->len = (uchar_t)adr_count(&adr);
   1112     0    stevel 		m = au_getclr();
   1113     0    stevel 
   1114     0    stevel 		(void) au_append_buf(set, sz, m);
   1115     0    stevel 		(void) au_append_rec(token, m, AU_PACK);
   1116     0    stevel 		adr.adr_now += sz;
   1117     0    stevel 	}
   1118     0    stevel 
   1119     0    stevel 	full = priv_isfullset(pset);
   1120     0    stevel 
   1121     0    stevel 	if (full) {
   1122     0    stevel 		buf = "ALL";
   1123     0    stevel 		sz = strlen(buf) + 1;
   1124     0    stevel 	} else {
   1125     0    stevel 		q = buf = kmem_alloc(maxprivbytes, KM_SLEEP);
   1126     0    stevel 		*buf = '\0';
   1127     0    stevel 
   1128     0    stevel 		for (priv = 0; (pname = priv_getbynum(priv)) != NULL; priv++) {
   1129     0    stevel 			if (priv_ismember(pset, priv)) {
   1130     0    stevel 				if (q != buf)
   1131     0    stevel 					*q++ = ',';
   1132     0    stevel 				(void) strcpy(q, pname);
   1133     0    stevel 				q += strlen(q);
   1134     0    stevel 			}
   1135     0    stevel 		}
   1136     0    stevel 		sz = (q - buf) + 1;
   1137     0    stevel 	}
   1138     0    stevel 
   1139     0    stevel 	adr_short(&adr, &sz, 1);
   1140     0    stevel 	token->len = (uchar_t)adr_count(&adr);
   1141     0    stevel 
   1142     0    stevel 	m = au_getclr();
   1143     0    stevel 	(void) au_append_buf(buf, sz, m);
   1144     0    stevel 	(void) au_append_rec(token, m, AU_PACK);
   1145     0    stevel 
   1146     0    stevel 	if (!full)
   1147     0    stevel 		kmem_free(buf, maxprivbytes);
   1148     0    stevel 
   1149     0    stevel 	return (token);
   1150     0    stevel }
   1151  1676       jpk 
   1152  1676       jpk /*
   1153  1676       jpk  * au_to_label
   1154  1676       jpk  * returns:
   1155  2640      rica  *	pointer to au_membuf chain containing a label token.
   1156  1676       jpk  */
   1157  1676       jpk token_t *
   1158  1676       jpk au_to_label(bslabel_t *label)
   1159  1676       jpk {
   1160  1676       jpk 	token_t *m;			/* local au_membuf */
   1161  1676       jpk 	adr_t adr;			/* adr memory stream header */
   1162  1676       jpk 	char data_header = AUT_LABEL;	/* header for this token */
   1163  1676       jpk 
   1164  1676       jpk 	m = au_getclr();
   1165  1676       jpk 
   1166  1676       jpk 	adr_start(&adr, memtod(m, char *));
   1167  1676       jpk 	adr_char(&adr, &data_header, 1);
   1168  7379       Ric 	adr_char(&adr, (char *)label, sizeof (_mac_label_impl_t));
   1169  7379       Ric 
   1170  1676       jpk 	m->len = adr_count(&adr);
   1171  1676       jpk 
   1172  1676       jpk 	return (m);
   1173  1676       jpk }
   1174