au_to.c revision 047f6e6f42a3d50d3e38a05c00bf7dd3fafac726
3853N/A/*
3853N/A * CDDL HEADER START
3853N/A *
3853N/A * The contents of this file are subject to the terms of the
3853N/A * Common Development and Distribution License (the "License").
3853N/A * You may not use this file except in compliance with the License.
3853N/A *
3853N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3853N/A * or http://www.opensolaris.org/os/licensing.
3853N/A * See the License for the specific language governing permissions
3853N/A * and limitations under the License.
3853N/A *
3853N/A * When distributing Covered Code, include this CDDL HEADER in each
3853N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3853N/A * If applicable, add the following below this CDDL HEADER, with the
3853N/A * fields enclosed by brackets "[]" replaced with your own identifying
3853N/A * information: Portions Copyright [yyyy] [name of copyright owner]
3853N/A *
3853N/A * CDDL HEADER END
3853N/A */
3853N/A/*
3853N/A * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
3853N/A * Use is subject to license terms.
3853N/A */
5027N/A
3853N/A
3853N/A#include <sys/types.h>
3853N/A#include <unistd.h>
3853N/A#include <bsm/audit.h>
4500N/A#include <bsm/audit_record.h>
3853N/A#include <bsm/libbsm.h>
3853N/A#include <priv.h>
3853N/A#include <sys/ipc.h>
3853N/A#include <sys/param.h>
3853N/A#include <sys/socket.h>
3853N/A#include <sys/time.h>
3853N/A#include <sys/vnode.h>
3853N/A#include <malloc.h>
3853N/A#include <net/route.h>
3853N/A#include <netinet/in.h>
3853N/A#include <netinet/in_pcb.h>
3853N/A#include <string.h>
3853N/A#include <ucred.h>
3853N/A#include <zone.h>
3853N/A#include <sys/tsol/label.h>
3853N/A
3853N/A#define NGROUPS 16 /* XXX - temporary */
4294N/A
4294N/Atoken_t *au_to_arg(char n, char *text, uint32_t v);
3853N/A#pragma weak au_to_arg = au_to_arg32
3853N/Atoken_t *au_to_return(char number, uint32_t value);
3853N/A#pragma weak au_to_return = au_to_return32
3853N/A
3853N/Astatic token_t *au_to_exec(char **, char);
3853N/A
3853N/Astatic token_t *
3853N/Aget_token(int s)
3853N/A{
3853N/A token_t *token; /* Resultant token */
3853N/A
3853N/A if ((token = (token_t *)malloc(sizeof (token_t))) == NULL)
4500N/A return (NULL);
3853N/A if ((token->tt_data = malloc(s)) == NULL) {
3853N/A free(token);
3853N/A return (NULL);
3853N/A }
3853N/A token->tt_size = s;
3853N/A token->tt_next = NULL;
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
4136N/A * au_to_header
3853N/A * return s:
3853N/A * pointer to header token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_header(au_event_t e_type, au_emod_t e_mod)
3853N/A{
3853N/A adr_t adr; /* adr memory stream header */
3853N/A token_t *token; /* token pointer */
3853N/A char version = TOKEN_VERSION; /* version of token family */
3853N/A int32_t byte_count;
3853N/A struct timeval tv;
3853N/A#ifdef _LP64
5085N/A char data_header = AUT_HEADER64; /* header for this token */
3853N/A
3853N/A token = get_token(2 * sizeof (char) + sizeof (int32_t) +
3853N/A 2 * sizeof (int64_t) + 2 * sizeof (short));
3853N/A#else
3853N/A char data_header = AUT_HEADER32;
3853N/A
4500N/A token = get_token(2 * sizeof (char) + 3 * sizeof (int32_t) +
3884N/A 2 * sizeof (short));
3884N/A#endif
4500N/A
4500N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1); /* token ID */
4500N/A adr_int32(&adr, &byte_count, 1); /* length of audit record */
4500N/A adr_char(&adr, &version, 1); /* version of audit tokens */
3853N/A adr_ushort(&adr, &e_type, 1); /* event ID */
3853N/A adr_ushort(&adr, &e_mod, 1); /* event ID modifier */
3853N/A#ifdef _LP64
3853N/A adr_int64(&adr, (int64_t *)&tv, 2); /* time & date */
3853N/A#else
3853N/A adr_int32(&adr, (int32_t *)&tv, 2); /* time & date */
3853N/A#endif
3853N/A return (token);
3853N/A}
4294N/A
4294N/A/*
4294N/A * au_to_header_ex
3853N/A * return s:
3853N/A * pointer to header token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_header_ex(au_event_t e_type, au_emod_t e_mod)
3853N/A{
3853N/A adr_t adr; /* adr memory stream header */
3853N/A token_t *token; /* token pointer */
3858N/A char version = TOKEN_VERSION; /* version of token family */
3858N/A int32_t byte_count;
3858N/A struct timeval tv;
3858N/A auditinfo_addr_t audit_info;
3858N/A au_tid_addr_t *host_info = &audit_info.ai_termid;
3853N/A#ifdef _LP64
3853N/A char data_header = AUT_HEADER64_EX; /* header for this token */
3853N/A#else
3853N/A char data_header = AUT_HEADER32_EX;
3853N/A#endif
3853N/A
3853N/A /* If our host address can't be determined, revert to un-extended hdr */
3853N/A
3853N/A if (auditon(A_GETKAUDIT, (caddr_t)&audit_info,
3853N/A sizeof (audit_info)) < 0)
3853N/A return (au_to_header(e_type, e_mod));
3853N/A
3853N/A if (host_info->at_type == AU_IPv6)
3853N/A if (IN6_IS_ADDR_UNSPECIFIED((in6_addr_t *)host_info->at_addr))
3853N/A return (au_to_header(e_type, e_mod));
3853N/A else
3853N/A if (host_info->at_addr[0] == htonl(INADDR_ANY))
3853N/A return (au_to_header(e_type, e_mod));
3853N/A
3853N/A#ifdef _LP64
3853N/A token = get_token(2 * sizeof (char) + sizeof (int32_t) +
3853N/A 2 * sizeof (int64_t) + 2 * sizeof (short) +
3853N/A sizeof (int32_t) + host_info->at_type);
3853N/A#else
3853N/A token = get_token(2 * sizeof (char) + 3 * sizeof (int32_t) +
3853N/A 2 * sizeof (short) + sizeof (int32_t) + host_info->at_type);
3853N/A#endif
3853N/A
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1); /* token ID */
3853N/A adr_int32(&adr, &byte_count, 1); /* length of audit record */
3853N/A adr_char(&adr, &version, 1); /* version of audit tokens */
3853N/A adr_ushort(&adr, &e_type, 1); /* event ID */
3853N/A adr_ushort(&adr, &e_mod, 1); /* event ID modifier */
3853N/A adr_int32(&adr, (int32_t *)&host_info->at_type, 1);
3853N/A adr_char(&adr, (char *)host_info->at_addr,
3853N/A (int)host_info->at_type);
3853N/A#ifdef _LP64
3853N/A adr_int64(&adr, (int64_t *)&tv, 2); /* time & date */
3853N/A#else
3853N/A adr_int32(&adr, (int32_t *)&tv, 2); /* time & date */
3853N/A#endif
3853N/A return (token);
4923N/A}
3853N/A
3853N/A/*
3853N/A * au_to_trailer
3853N/A * return s:
3853N/A * pointer to a trailer token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_trailer(void)
3853N/A{
4923N/A adr_t adr; /* adr memory stream header */
4923N/A token_t *token; /* token pointer */
4923N/A char data_header = AUT_TRAILER; /* header for this token */
4923N/A short magic = (short)AUT_TRAILER_MAGIC; /* trailer magic number */
4923N/A int32_t byte_count;
4923N/A
4923N/A token = get_token(sizeof (char) + sizeof (int32_t) + sizeof (short));
4923N/A if (token == NULL)
4923N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1); /* token ID */
3853N/A adr_short(&adr, &magic, 1); /* magic number */
3853N/A adr_int32(&adr, &byte_count, 1); /* length of audit record */
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_arg32
3853N/A * return s:
3853N/A * pointer to an argument token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_arg32(char n, char *text, uint32_t v)
3853N/A{
3853N/A token_t *token; /* local token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A char data_header = AUT_ARG32; /* header for this token */
3853N/A short bytes; /* length of string */
3853N/A
3853N/A bytes = strlen(text) + 1;
3853N/A
3853N/A token = get_token((int)(2 * sizeof (char) + sizeof (int32_t) +
3853N/A sizeof (short) + bytes));
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1); /* token type */
3853N/A adr_char(&adr, &n, 1); /* argument id */
3853N/A adr_int32(&adr, (int32_t *)&v, 1); /* argument value */
3853N/A adr_short(&adr, &bytes, 1);
3853N/A adr_char(&adr, text, bytes);
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_arg64
3853N/A * return s:
3853N/A * pointer to an argument token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_arg64(char n, char *text, uint64_t v)
3853N/A{
3853N/A token_t *token; /* local token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A char data_header = AUT_ARG64; /* header for this token */
3853N/A short bytes; /* length of string */
3853N/A
3853N/A bytes = strlen(text) + 1;
3853N/A
3853N/A token = get_token((int)(2 * sizeof (char) + sizeof (int64_t) +
3853N/A sizeof (short) + bytes));
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1); /* token type */
3853N/A adr_char(&adr, &n, 1); /* argument id */
3853N/A adr_int64(&adr, (int64_t *)&v, 1); /* argument value */
3853N/A adr_short(&adr, &bytes, 1);
3853N/A adr_char(&adr, text, bytes);
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A
3853N/A/*
3853N/A * au_to_attr
3853N/A * return s:
3853N/A * pointer to an attribute token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_attr(struct vattr *attr)
3853N/A{
3853N/A token_t *token; /* local token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A int32_t value;
3853N/A#ifdef _LP64
3853N/A char data_header = AUT_ATTR64; /* header for this token */
3853N/A
3853N/A token = get_token(sizeof (char) +
3853N/A sizeof (int32_t) * 4 +
3853N/A sizeof (int64_t) * 2);
3853N/A#else
3853N/A char data_header = AUT_ATTR32;
3853N/A
3853N/A token = get_token(sizeof (char) + sizeof (int32_t) * 5 +
3853N/A sizeof (int64_t));
3853N/A#endif
3853N/A
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A value = (int32_t)attr->va_mode;
3853N/A adr_int32(&adr, &value, 1);
3853N/A value = (int32_t)attr->va_uid;
3853N/A adr_int32(&adr, &value, 1);
3853N/A value = (int32_t)attr->va_gid;
3853N/A adr_int32(&adr, &value, 1);
3853N/A adr_int32(&adr, (int32_t *)&(attr->va_fsid), 1);
3853N/A adr_int64(&adr, (int64_t *)&(attr->va_nodeid), 1);
3853N/A#ifdef _LP64
3853N/A adr_int64(&adr, (int64_t *)&(attr->va_rdev), 1);
3853N/A#else
3853N/A adr_int32(&adr, (int32_t *)&(attr->va_rdev), 1);
3853N/A#endif
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_data
3853N/A * return s:
3853N/A * pointer to a data token.
3853N/A */
3853N/Atoken_t *
3884N/Aau_to_data(char unit_print, char unit_type, char unit_count, char *p)
3884N/A{
3884N/A adr_t adr; /* adr memory stream header */
3884N/A token_t *token; /* token pointer */
4500N/A char data_header = AUT_DATA; /* header for this token */
4500N/A int byte_count; /* number of bytes */
3884N/A
3853N/A if (p == NULL || unit_count < 1)
3853N/A return (NULL);
3853N/A
3853N/A /*
3853N/A * Check validity of print type
3853N/A */
3853N/A if (unit_print < AUP_BINARY || unit_print > AUP_STRING)
3853N/A return (NULL);
3853N/A
3853N/A switch (unit_type) {
3853N/A case AUR_SHORT:
3853N/A byte_count = unit_count * sizeof (short);
3853N/A break;
3853N/A case AUR_INT32:
3853N/A byte_count = unit_count * sizeof (int32_t);
3853N/A break;
3853N/A case AUR_INT64:
3853N/A byte_count = unit_count * sizeof (int64_t);
3853N/A break;
3853N/A /* case AUR_CHAR: */
3853N/A case AUR_BYTE:
3853N/A byte_count = unit_count * sizeof (char);
3853N/A break;
3853N/A default:
3853N/A return (NULL);
3853N/A }
3853N/A
3853N/A token = get_token((int)(4 * sizeof (char) + byte_count));
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_char(&adr, &unit_print, 1);
3853N/A adr_char(&adr, &unit_type, 1);
3853N/A adr_char(&adr, &unit_count, 1);
3853N/A
3853N/A switch (unit_type) {
3853N/A case AUR_SHORT:
3853N/A /* LINTED */
3853N/A adr_short(&adr, (short *)p, unit_count);
5085N/A break;
3853N/A case AUR_INT32:
3853N/A /* LINTED */
3853N/A adr_int32(&adr, (int32_t *)p, unit_count);
3853N/A break;
3853N/A case AUR_INT64:
3853N/A /* LINTED */
3853N/A adr_int64(&adr, (int64_t *)p, unit_count);
3853N/A break;
3853N/A /* case AUR_CHAR: */
3853N/A case AUR_BYTE:
3853N/A adr_char(&adr, p, unit_count);
3853N/A break;
3853N/A }
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_privset
3853N/A *
3853N/A * priv_type (LIMIT, INHERIT...) is the first string and privilege
3853N/A * in translated into the second string. The format is as follows:
3853N/A *
3853N/A * token id adr_char
3853N/A * priv type adr_string (short, string)
3853N/A * priv set adr_string (short, string)
3853N/A *
3853N/A * return s:
3853N/A * pointer to a AUT_PRIV token.
3853N/A */
3853N/Atoken_t *
4294N/Aau_to_privset(const char *priv_type, const priv_set_t *privilege)
4294N/A{
4294N/A token_t *token; /* local token */
4294N/A adr_t adr; /* adr memory stream header */
4294N/A char data_header = AUT_PRIV; /* header for this token */
4294N/A short t_bytes; /* length of type string */
4294N/A short p_bytes; /* length of privilege string */
4294N/A char *priv_string; /* privilege string */
4294N/A
4294N/A t_bytes = strlen(priv_type) + 1;
4294N/A
4294N/A if ((privilege == NULL) || (priv_string =
4294N/A priv_set_to_str(privilege, ',',
4294N/A PRIV_STR_LIT)) == NULL)
3853N/A return (NULL);
3853N/A
3853N/A p_bytes = strlen(priv_string) + 1;
3853N/A
3853N/A token = get_token((int)(sizeof (char) + (2 * sizeof (short)) + t_bytes
3853N/A + p_bytes));
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_short(&adr, &t_bytes, 1);
3853N/A adr_char(&adr, (char *)priv_type, t_bytes);
3853N/A adr_short(&adr, &p_bytes, 1);
3858N/A adr_char(&adr, priv_string, p_bytes);
3858N/A
3858N/A free(priv_string);
3858N/A
3858N/A return (token);
3858N/A}
3858N/A
3858N/A/*
3858N/A * au_to_process
3858N/A * return s:
3858N/A * pointer to a process token.
3858N/A */
3858N/A
3858N/Atoken_t *
3858N/Aau_to_process(au_id_t auid, uid_t euid, gid_t egid, uid_t ruid, gid_t rgid,
3858N/A pid_t pid, au_asid_t sid, au_tid_t *tid)
3858N/A{
3858N/A token_t *token; /* local token */
3858N/A adr_t adr; /* adr memory stream header */
3858N/A#ifdef _LP64
3858N/A char data_header = AUT_PROCESS64; /* header for this token */
3858N/A
3858N/A token = get_token(sizeof (char) + 8 * sizeof (int32_t) +
4500N/A sizeof (int64_t));
4500N/A#else
4500N/A char data_header = AUT_PROCESS32;
3858N/A
3858N/A token = get_token(sizeof (char) + 9 * sizeof (int32_t));
3858N/A#endif
3858N/A
3858N/A if (token == NULL)
3858N/A return (NULL);
3858N/A adr_start(&adr, token->tt_data);
3858N/A adr_char(&adr, &data_header, 1);
3858N/A adr_int32(&adr, (int32_t *)&auid, 1);
3858N/A adr_int32(&adr, (int32_t *)&euid, 1);
3858N/A adr_int32(&adr, (int32_t *)&egid, 1);
3858N/A adr_int32(&adr, (int32_t *)&ruid, 1);
3858N/A adr_int32(&adr, (int32_t *)&rgid, 1);
3858N/A adr_int32(&adr, (int32_t *)&pid, 1);
3858N/A adr_int32(&adr, (int32_t *)&sid, 1);
3858N/A#ifdef _LP64
3858N/A adr_int64(&adr, (int64_t *)&tid->port, 1);
3858N/A#else
4530N/A adr_int32(&adr, (int32_t *)&tid->port, 1);
3858N/A#endif
3853N/A adr_int32(&adr, (int32_t *)&tid->machine, 1);
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
4500N/A/*
4500N/A * au_to_process_ex
3858N/A * return s:
4500N/A * pointer to a process_ex token.
3853N/A */
4500N/Atoken_t *
3853N/Aau_to_process_ex(au_id_t auid, uid_t euid, gid_t egid, uid_t ruid, gid_t rgid,
4500N/A pid_t pid, au_asid_t sid, au_tid_addr_t *tid)
4500N/A{
4803N/A token_t *token; /* local token */
4803N/A adr_t adr; /* adr memory stream header */
5027N/A char data_header; /* header for this token */
4500N/A
4500N/A#ifdef _LP64
4500N/A if (tid->at_type == AU_IPv6) {
4500N/A data_header = AUT_PROCESS64_EX;
4500N/A token = get_token(sizeof (char) + sizeof (int64_t) +
4500N/A 12 * sizeof (int32_t));
4500N/A } else {
4500N/A data_header = AUT_PROCESS64;
3853N/A token = get_token(sizeof (char) + sizeof (int64_t) +
4500N/A 8 * sizeof (int32_t));
4500N/A }
4500N/A#else
4500N/A if (tid->at_type == AU_IPv6) {
4500N/A data_header = AUT_PROCESS32_EX;
4500N/A token = get_token(sizeof (char) + 13 * sizeof (int32_t));
4500N/A } else {
3853N/A data_header = AUT_PROCESS32;
3853N/A token = get_token(sizeof (char) + 9 * sizeof (int32_t));
3853N/A }
3853N/A#endif
3853N/A if (token == NULL)
3853N/A return (NULL);
4500N/A adr_start(&adr, token->tt_data);
4500N/A adr_char(&adr, &data_header, 1);
3853N/A adr_int32(&adr, (int32_t *)&auid, 1);
3853N/A adr_int32(&adr, (int32_t *)&euid, 1);
3853N/A adr_int32(&adr, (int32_t *)&egid, 1);
3853N/A adr_int32(&adr, (int32_t *)&ruid, 1);
4500N/A adr_int32(&adr, (int32_t *)&rgid, 1);
4500N/A adr_int32(&adr, (int32_t *)&pid, 1);
3853N/A adr_int32(&adr, (int32_t *)&sid, 1);
3853N/A#ifdef _LP64
3853N/A adr_int64(&adr, (int64_t *)&tid->at_port, 1);
3853N/A#else
3853N/A adr_int32(&adr, (int32_t *)&tid->at_port, 1);
3853N/A#endif
3853N/A if (tid->at_type == AU_IPv6) {
3853N/A adr_int32(&adr, (int32_t *)&tid->at_type, 1);
3853N/A adr_char(&adr, (char *)tid->at_addr, 16);
3853N/A } else {
3853N/A adr_char(&adr, (char *)tid->at_addr, 4);
3853N/A }
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_seq
3853N/A * return s:
3853N/A * pointer to token chain containing a sequence token
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_seq(int audit_count)
3853N/A{
3853N/A token_t *token; /* local token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A char data_header = AUT_SEQ; /* header for this token */
3853N/A
3853N/A token = get_token(sizeof (char) + sizeof (int32_t));
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_int32(&adr, (int32_t *)&audit_count, 1);
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_socket
3853N/A * return s:
3853N/A * pointer to mbuf chain containing a socket token.
4500N/A */
4500N/Atoken_t *
4500N/Aau_to_socket(struct oldsocket *so)
4500N/A{
4500N/A adr_t adr;
4500N/A token_t *token;
4500N/A char data_header = AUT_SOCKET;
4500N/A struct inpcb *inp = so->so_pcb;
4500N/A
3853N/A token = get_token(sizeof (char) + sizeof (short) * 3 +
3853N/A sizeof (int32_t) * 2);
4500N/A if (token == NULL)
4803N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3884N/A adr_short(&adr, (short *)&so->so_type, 1);
3884N/A adr_short(&adr, (short *)&inp->inp_lport, 1);
3884N/A adr_int32(&adr, (int32_t *)&inp->inp_laddr, 1);
3884N/A adr_short(&adr, (short *)&inp->inp_fport, 1);
3884N/A adr_int32(&adr, (int32_t *)&inp->inp_faddr, 1);
3884N/A
4500N/A return (token);
4500N/A}
4500N/A
3884N/A/*
4500N/A * au_to_subject
4500N/A * return s:
4500N/A * pointer to a process token.
4500N/A */
4500N/A
4500N/Atoken_t *
5085N/Aau_to_subject(au_id_t auid, uid_t euid, gid_t egid, uid_t ruid, gid_t rgid,
4500N/A pid_t pid, au_asid_t sid, au_tid_t *tid)
4500N/A{
3884N/A token_t *token; /* local token */
3884N/A adr_t adr; /* adr memory stream header */
3884N/A#ifdef _LP64
3884N/A char data_header = AUT_SUBJECT64; /* header for this token */
3884N/A
3884N/A token = get_token(sizeof (char) + sizeof (int64_t) +
3884N/A 8 * sizeof (int32_t));
3884N/A#else
3884N/A char data_header = AUT_SUBJECT32;
3884N/A
3884N/A token = get_token(sizeof (char) + 9 * sizeof (int32_t));
3884N/A#endif
3884N/A
3884N/A if (token == NULL)
3884N/A return (NULL);
4500N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3858N/A adr_int32(&adr, (int32_t *)&auid, 1);
3853N/A adr_int32(&adr, (int32_t *)&euid, 1);
3853N/A adr_int32(&adr, (int32_t *)&egid, 1);
3853N/A adr_int32(&adr, (int32_t *)&ruid, 1);
3853N/A adr_int32(&adr, (int32_t *)&rgid, 1);
4500N/A adr_int32(&adr, (int32_t *)&pid, 1);
4500N/A adr_int32(&adr, (int32_t *)&sid, 1);
4500N/A#ifdef _LP64
4500N/A adr_int64(&adr, (int64_t *)&tid->port, 1);
4500N/A#else
4500N/A adr_int32(&adr, (int32_t *)&tid->port, 1);
3853N/A#endif
4500N/A adr_int32(&adr, (int32_t *)&tid->machine, 1);
4500N/A
4853N/A return (token);
4853N/A}
4853N/A
3853N/A/*
4853N/A * au_to_subject_ex
4853N/A * return s:
4853N/A * pointer to a process token.
4853N/A */
4853N/A
4853N/Atoken_t *
4853N/Aau_to_subject_ex(au_id_t auid, uid_t euid, gid_t egid, uid_t ruid, gid_t rgid,
4853N/A pid_t pid, au_asid_t sid, au_tid_addr_t *tid)
4853N/A{
4853N/A token_t *token; /* local token */
4853N/A adr_t adr; /* adr memory stream header */
4853N/A#ifdef _LP64
4853N/A char data_header; /* header for this token */
4853N/A
4853N/A if (tid->at_type == AU_IPv6) {
4853N/A data_header = AUT_SUBJECT64_EX;
4853N/A token = get_token(sizeof (char) + sizeof (int64_t) +
4853N/A 12 * sizeof (int32_t));
4853N/A } else {
4853N/A data_header = AUT_SUBJECT64;
4853N/A token = get_token(sizeof (char) + sizeof (int64_t) +
3853N/A 8 * sizeof (int32_t));
3884N/A }
3884N/A#else
4853N/A char data_header; /* header for this token */
3884N/A
3884N/A if (tid->at_type == AU_IPv6) {
3884N/A data_header = AUT_SUBJECT32_EX;
3884N/A token = get_token(sizeof (char) + 13 * sizeof (int32_t));
4853N/A } else {
4853N/A data_header = AUT_SUBJECT32;
4853N/A token = get_token(sizeof (char) + 9 * sizeof (int32_t));
4853N/A }
3853N/A#endif
4853N/A
4853N/A if (token == NULL)
4853N/A return (NULL);
4853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_int32(&adr, (int32_t *)&auid, 1);
3853N/A adr_int32(&adr, (int32_t *)&euid, 1);
4500N/A adr_int32(&adr, (int32_t *)&egid, 1);
4141N/A adr_int32(&adr, (int32_t *)&ruid, 1);
4500N/A adr_int32(&adr, (int32_t *)&rgid, 1);
4500N/A adr_int32(&adr, (int32_t *)&pid, 1);
4500N/A adr_int32(&adr, (int32_t *)&sid, 1);
4518N/A#ifdef _LP64
4500N/A adr_int64(&adr, (int64_t *)&tid->at_port, 1);
4500N/A#else
4500N/A adr_int32(&adr, (int32_t *)&tid->at_port, 1);
4500N/A#endif
4500N/A if (tid->at_type == AU_IPv6) {
4500N/A adr_int32(&adr, (int32_t *)&tid->at_type, 1);
4500N/A adr_char(&adr, (char *)tid->at_addr, 16);
4500N/A } else {
4500N/A adr_char(&adr, (char *)tid->at_addr, 4);
4500N/A }
4500N/A
4500N/A return (token);
4500N/A}
4500N/A
4803N/A/*
4500N/A * au_to_me
4500N/A * return s:
4500N/A * pointer to a process token.
4500N/A */
4500N/A
4803N/Atoken_t *
4500N/Aau_to_me(void)
4500N/A{
4141N/A auditinfo_addr_t info;
3853N/A
3853N/A if (getaudit_addr(&info, sizeof (info)))
3853N/A return (NULL);
3853N/A return (au_to_subject_ex(info.ai_auid, geteuid(), getegid(), getuid(),
3853N/A getgid(), getpid(), info.ai_asid, &info.ai_termid));
3858N/A}
3853N/A/*
3853N/A * au_to_text
4500N/A * return s:
4500N/A * pointer to a text token.
4500N/A */
4500N/Atoken_t *
3853N/Aau_to_text(char *text)
3853N/A{
3853N/A token_t *token; /* local token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A char data_header = AUT_TEXT; /* header for this token */
3853N/A short bytes; /* length of string */
3853N/A
4500N/A bytes = strlen(text) + 1;
4500N/A token = get_token((int)(sizeof (char) + sizeof (short) + bytes));
4500N/A if (token == NULL)
4500N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_short(&adr, &bytes, 1);
3853N/A adr_char(&adr, text, bytes);
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_path
3853N/A * return s:
3853N/A * pointer to a path token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_path(char *path)
3853N/A{
3853N/A token_t *token; /* local token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A char data_header = AUT_PATH; /* header for this token */
3853N/A short bytes; /* length of string */
3853N/A
3853N/A bytes = (short)strlen(path) + 1;
3853N/A
3853N/A token = get_token((int)(sizeof (char) + sizeof (short) + bytes));
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_short(&adr, &bytes, 1);
3853N/A adr_char(&adr, path, bytes);
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_cmd
3853N/A * return s:
3853N/A * pointer to an command line argument token
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_cmd(uint_t argc, char **argv, char **envp)
3853N/A{
3853N/A token_t *token; /* local token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A char data_header = AUT_CMD; /* header for this token */
3853N/A short len = 0;
3853N/A short cnt = 0;
3853N/A short envc = 0;
3853N/A short largc = (short)argc;
3853N/A
3853N/A /*
4294N/A * one char for the header, one short for argc,
4294N/A * one short for # envp strings.
4294N/A */
4294N/A len = sizeof (char) + sizeof (short) + sizeof (short);
4294N/A
4294N/A /* get sizes of strings */
4294N/A
4294N/A for (cnt = 0; cnt < argc; cnt++) {
4294N/A len += (short)sizeof (short) + (short)(strlen(argv[cnt]) + 1);
4294N/A }
4294N/A
4294N/A if (envp != NULL) {
4294N/A for (envc = 0; envp[envc] != NULL; envc++) {
4294N/A len += (short)sizeof (short) +
4294N/A (short)(strlen(envp[envc]) + 1);
4294N/A }
4294N/A }
4294N/A
4294N/A token = get_token(len);
4294N/A if (token == NULL)
4294N/A return (NULL);
3853N/A
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A
3853N/A adr_short(&adr, &largc, 1);
3853N/A
3853N/A for (cnt = 0; cnt < argc; cnt++) {
3853N/A len = (short)(strlen(argv[cnt]) + 1);
3853N/A adr_short(&adr, &len, 1);
3853N/A adr_char(&adr, argv[cnt], len);
3853N/A }
3853N/A
3853N/A adr_short(&adr, &envc, 1);
3853N/A
3853N/A for (cnt = 0; cnt < envc; cnt++) {
3853N/A len = (short)(strlen(envp[cnt]) + 1);
3853N/A adr_short(&adr, &len, 1);
3853N/A adr_char(&adr, envp[cnt], len);
3853N/A }
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
4136N/A * au_to_exit
3853N/A * return s:
3853N/A * pointer to a exit value token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_exit(int retval, int err)
3853N/A{
3853N/A token_t *token; /* local token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A char data_header = AUT_EXIT; /* header for this token */
3853N/A
3853N/A token = get_token(sizeof (char) + (2 * sizeof (int32_t)));
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_int32(&adr, (int32_t *)&retval, 1);
4923N/A adr_int32(&adr, (int32_t *)&err, 1);
3853N/A
4136N/A return (token);
3853N/A}
4500N/A
3853N/A/*
3853N/A * au_to_return
3853N/A * return s:
3853N/A * pointer to a return value token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_return32(char number, uint32_t value)
3853N/A{
3853N/A token_t *token; /* local token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A char data_header = AUT_RETURN32; /* header for this token */
3853N/A
3853N/A token = get_token(2 * sizeof (char) + sizeof (int32_t));
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_char(&adr, &number, 1);
3853N/A adr_int32(&adr, (int32_t *)&value, 1);
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_return
3853N/A * return s:
3853N/A * pointer to a return value token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_return64(char number, uint64_t value)
3853N/A{
3853N/A token_t *token; /* local token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A char data_header = AUT_RETURN64; /* header for this token */
3853N/A
3853N/A token = get_token(2 * sizeof (char) + sizeof (int64_t));
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_char(&adr, &number, 1);
3853N/A adr_int64(&adr, (int64_t *)&value, 1);
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A
3853N/A/*
3853N/A * au_to_opaque
3853N/A * return s:
3853N/A * pointer to a opaque token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_opaque(char *opaque, short bytes)
3853N/A{
3853N/A token_t *token; /* local token */
5085N/A adr_t adr; /* adr memory stream header */
5085N/A char data_header = AUT_OPAQUE; /* header for this token */
5085N/A
5085N/A if (bytes < 1)
5085N/A return (NULL);
5085N/A
5085N/A token = get_token((int)(sizeof (char) + sizeof (short) + bytes));
5085N/A if (token == NULL)
5085N/A return (NULL);
5085N/A adr_start(&adr, token->tt_data);
5085N/A adr_char(&adr, &data_header, 1);
5085N/A adr_short(&adr, &bytes, 1);
5085N/A adr_char(&adr, opaque, bytes);
5085N/A
5085N/A return (token);
5085N/A}
5085N/A
5085N/A/*
5085N/A * au_to_in_addr
5085N/A * return s:
5085N/A * pointer to an internet address token
5085N/A */
3853N/Atoken_t *
3853N/Aau_to_in_addr(struct in_addr *internet_addr)
3853N/A{
3853N/A token_t *token; /* local token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A char data_header = AUT_IN_ADDR; /* header for this token */
3853N/A
3853N/A token = get_token(sizeof (char) + sizeof (struct in_addr));
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_char(&adr, (char *)internet_addr, sizeof (struct in_addr));
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_in_addr_ex
3853N/A * return s:
3853N/A * pointer to an internet extended token
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_in_addr_ex(struct in6_addr *addr)
3853N/A{
3853N/A token_t *token;
3853N/A adr_t adr;
3853N/A
3853N/A if (IN6_IS_ADDR_V4MAPPED(addr)) {
3853N/A ipaddr_t in4;
3853N/A
3853N/A /*
3853N/A * An IPv4-mapped IPv6 address is really an IPv4 address
3853N/A * in IPv6 format.
3853N/A */
3853N/A
3853N/A IN6_V4MAPPED_TO_IPADDR(addr, in4);
3853N/A return (au_to_in_addr((struct in_addr *)&in4));
3853N/A
4500N/A } else {
4500N/A char data_header = AUT_IN_ADDR_EX;
4500N/A int32_t type = AU_IPv6;
4500N/A
4500N/A if ((token = get_token(sizeof (char) + sizeof (int32_t) +
4500N/A sizeof (struct in6_addr))) == NULL) {
4500N/A return (NULL);
4500N/A }
4500N/A
4500N/A adr_start(&adr, token->tt_data);
4500N/A adr_char(&adr, &data_header, 1);
4500N/A adr_int32(&adr, &type, 1);
4500N/A adr_char(&adr, (char *)addr, sizeof (struct in6_addr));
4500N/A }
4500N/A
4500N/A return (token);
4500N/A}
4500N/A
4500N/A/*
4500N/A * au_to_iport
4500N/A * return s:
4500N/A * pointer to token chain containing a ip port address token
4500N/A */
3853N/Atoken_t *
3853N/Aau_to_iport(ushort_t iport)
3853N/A{
3853N/A token_t *token; /* local token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A char data_header = AUT_IPORT; /* header for this token */
3853N/A
3853N/A token = get_token(sizeof (char) + sizeof (short));
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_short(&adr, (short *)&iport, 1);
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/Atoken_t *
3853N/Aau_to_ipc(char type, int id)
3853N/A{
3853N/A token_t *token; /* local token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A char data_header = AUT_IPC; /* header for this token */
3853N/A
3853N/A token = get_token((2 * sizeof (char)) + sizeof (int32_t));
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_char(&adr, &type, 1);
3853N/A adr_int32(&adr, (int32_t *)&id, 1);
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_tid
3853N/A *
3853N/A * output format depends on type; at present only IP v4 and v6 addresses
3853N/A * are defined.
3853N/A *
3853N/A * IPv4 -- tid type, 16 bit remote port, 16 bit local port, ip type,
3853N/A * 32 bit IP address.
3853N/A * IPv6 -- tid type, 16 bit remote port, 16 bit local port, ip type,
3853N/A * 4 x 32 bit IP address.
3853N/A *
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_tid(au_generic_tid_t *tid)
3853N/A{
3853N/A char data_header = AUT_TID; /* header for this token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A token_t *token; /* local token */
3853N/A au_ip_t *ip;
3853N/A
3853N/A switch (tid->gt_type) {
3853N/A case AU_IPADR:
3853N/A ip = &(tid->gt_adr.at_ip);
3853N/A token = get_token((int)(2 * sizeof (char) + 2 * sizeof (short) +
3853N/A sizeof (uint32_t) + ip->at_type));
3853N/A if (token == NULL)
3853N/A return (NULL);
3994N/A
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_char(&adr, (char *)&(tid->gt_type), 1);
3853N/A adr_short(&adr, (short *)&(ip->at_r_port), 1);
4530N/A adr_short(&adr, (short *)&(ip->at_l_port), 1);
4530N/A adr_int32(&adr, (int32_t *)&(ip->at_type), 1);
4530N/A
4530N/A adr_char(&adr, (char *)ip->at_addr, ip->at_type);
4530N/A
4530N/A break;
4530N/A default:
4530N/A return (NULL);
4530N/A }
4530N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * The Modifier tokens
3853N/A */
3853N/A
4530N/A/*
4530N/A * au_to_groups
4530N/A * return s:
4530N/A * pointer to a group list token.
4530N/A *
4530N/A * This function is obsolete. Please use au_to_newgroups.
4530N/A */
4530N/Atoken_t *
4530N/Aau_to_groups(int *groups)
4530N/A{
4530N/A token_t *token; /* local token */
4530N/A adr_t adr; /* adr memory stream header */
4530N/A char data_header = AUT_GROUPS; /* header for this token */
4530N/A
3853N/A token = get_token(sizeof (char) + NGROUPS * sizeof (int32_t));
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_int32(&adr, (int32_t *)groups, NGROUPS);
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_newgroups
3853N/A * return s:
3853N/A * pointer to a group list token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_newgroups(int n, gid_t *groups)
3853N/A{
4500N/A token_t *token; /* local token */
4500N/A adr_t adr; /* adr memory stream header */
4500N/A char data_header = AUT_NEWGROUPS; /* header for this token */
4500N/A short n_groups;
4500N/A
4500N/A if (n < 0 || n > SHRT_MAX || groups == NULL)
4773N/A return (NULL);
4500N/A token = get_token(sizeof (char) + sizeof (short) + n * sizeof (gid_t));
4500N/A if (token == NULL)
4500N/A return (NULL);
4500N/A n_groups = (short)n;
4773N/A adr_start(&adr, token->tt_data);
4773N/A adr_char(&adr, &data_header, 1);
4500N/A adr_short(&adr, &n_groups, 1);
3853N/A adr_int32(&adr, (int32_t *)groups, n_groups);
3853N/A
4500N/A return (token);
4500N/A}
4500N/A
4500N/A/*
3853N/A * au_to_exec_args
3853N/A * returns:
3853N/A * pointer to an exec args token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_exec_args(char **argv)
3853N/A{
3853N/A return (au_to_exec(argv, AUT_EXEC_ARGS));
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_exec_env
3853N/A * returns:
3853N/A * pointer to an exec args token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_exec_env(char **envp)
3853N/A{
3853N/A return (au_to_exec(envp, AUT_EXEC_ENV));
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_exec
3853N/A * returns:
3853N/A * pointer to an exec args token.
3853N/A */
3853N/Astatic token_t *
3853N/Aau_to_exec(char **v, char data_header)
3853N/A{
3853N/A token_t *token;
3853N/A adr_t adr;
3853N/A char **p;
3853N/A int32_t n = 0;
3853N/A int len = 0;
3853N/A
3853N/A for (p = v; *p != NULL; p++) {
3853N/A len += strlen(*p) + 1;
3853N/A n++;
3853N/A }
3853N/A token = get_token(sizeof (char) + sizeof (int32_t) + len);
3853N/A if (token == (token_t *)NULL)
3853N/A return ((token_t *)NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_int32(&adr, &n, 1);
3853N/A for (p = v; *p != NULL; p++) {
3853N/A adr_char(&adr, *p, strlen(*p) + 1);
3853N/A }
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_uauth
3853N/A * return s:
3853N/A * pointer to a uauth token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_uauth(char *text)
3853N/A{
3853N/A token_t *token; /* local token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A char data_header = AUT_UAUTH; /* header for this token */
3853N/A short bytes; /* length of string */
3853N/A
3853N/A bytes = strlen(text) + 1;
3853N/A
3853N/A token = get_token((int)(sizeof (char) + sizeof (short) + bytes));
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_short(&adr, &bytes, 1);
3853N/A adr_char(&adr, text, bytes);
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_upriv
4676N/A * return s:
3853N/A * pointer to a use of privilege token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_upriv(char sorf, char *priv)
3853N/A{
3853N/A token_t *token; /* local token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A char data_header = AUT_UAUTH; /* header for this token */
3853N/A short bytes; /* length of string */
3853N/A
3853N/A bytes = strlen(priv) + 1;
3853N/A
3853N/A token = get_token(sizeof (char) + sizeof (char) + sizeof (short) +
3853N/A bytes);
3853N/A if (token == NULL)
3853N/A return (NULL);
3853N/A adr_start(&adr, token->tt_data);
3853N/A adr_char(&adr, &data_header, 1);
3853N/A adr_char(&adr, &sorf, 1); /* success/failure */
3853N/A adr_short(&adr, &bytes, 1);
3853N/A adr_char(&adr, priv, bytes);
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_user
3853N/A * return s:
3853N/A * pointer to a user token.
4500N/A */
4500N/Atoken_t *
4500N/Aau_to_user(uid_t uid, char *username)
4500N/A{
4500N/A token_t *token; /* local token */
4500N/A adr_t adr; /* adr memory stream header */
4500N/A char data_header = AUT_USER; /* header for this token */
4500N/A short bytes; /* length of string */
4500N/A
4500N/A bytes = (short)strlen(username) + 1;
4500N/A
4500N/A token = get_token(sizeof (char) + sizeof (uid_t) + sizeof (short) +
4500N/A bytes);
4500N/A if (token == NULL)
4500N/A return (NULL);
4500N/A adr_start(&adr, token->tt_data);
4500N/A adr_char(&adr, &data_header, 1);
4500N/A adr_uid(&adr, &uid, 1);
4500N/A adr_short(&adr, &bytes, 1);
4500N/A adr_char(&adr, username, bytes);
3853N/A
3853N/A return (token);
3853N/A}
3853N/A
3853N/A/*
3853N/A * au_to_xatom
3853N/A * return s:
3853N/A * pointer to a xatom token.
3853N/A */
3853N/Atoken_t *
3853N/Aau_to_xatom(char *atom)
3853N/A{
3853N/A token_t *token; /* local token */
3853N/A adr_t adr; /* adr memory stream header */
3853N/A char data_header = AUT_XATOM; /* header for this token */
3853N/A short len;
4136N/A
4136N/A len = strlen(atom) + 1;
4136N/A
4136N/A token = get_token(sizeof (char) + sizeof (short) + len);
4136N/A if (token == NULL)
4136N/A return (NULL);
4136N/A adr_start(&adr, token->tt_data);
4136N/A adr_char(&adr, &data_header, 1);
4136N/A adr_short(&adr, (short *)&len, 1);
4136N/A adr_char(&adr, atom, len);
4136N/A
4136N/A return (token);
4136N/A}
4136N/A
4136N/A/*
4136N/A * au_to_xselect
4136N/A * return s:
4136N/A * pointer to a X select token.
4500N/A */
4500N/Atoken_t *
4923N/Aau_to_xselect(char *propname, char *proptype, char *windata)
4923N/A{
4923N/A token_t *token; /* local token */
4923N/A adr_t adr; /* adr memory stream header */
4923N/A char data_header = AUT_XSELECT; /* header for this token */
4923N/A short proplen;
4923N/A short typelen;
4923N/A short datalen;
4923N/A
4923N/A proplen = strlen(propname) + 1;
4923N/A typelen = strlen(proptype) + 1;
4923N/A datalen = strlen(windata) + 1;
4923N/A
4923N/A token = get_token(sizeof (char) + (sizeof (short) * 3) +
4923N/A proplen + typelen + datalen);
4923N/A if (token == NULL)
4923N/A return (NULL);
4923N/A adr_start(&adr, token->tt_data);
4923N/A adr_char(&adr, &data_header, 1);
4923N/A adr_short(&adr, &proplen, 1);
4500N/A adr_char(&adr, propname, proplen);
4500N/A adr_short(&adr, &typelen, 1);
4500N/A adr_char(&adr, proptype, typelen);
4500N/A adr_short(&adr, &datalen, 1);
4500N/A adr_char(&adr, windata, datalen);
4500N/A
4500N/A return (token);
4500N/A}
4500N/A
4500N/A/*
4500N/A * x_common
4500N/A * return s:
4500N/A * pointer to a common X token.
4500N/A */
4500N/A
4500N/Astatic token_t *
4500N/Ax_common(char data_header, int32_t xid, uid_t cuid)
4500N/A{
4500N/A token_t *token; /* local token */
4500N/A adr_t adr; /* adr memory stream header */
4500N/A
4500N/A token = get_token(sizeof (char) + sizeof (int32_t) + sizeof (uid_t));
4500N/A if (token == NULL)
4500N/A return (NULL);
4500N/A adr_start(&adr, token->tt_data);
4500N/A adr_char(&adr, &data_header, 1);
4500N/A adr_int32(&adr, &xid, 1);
4500N/A adr_uid(&adr, &cuid, 1);
4500N/A
4500N/A return (token);
4500N/A}
4500N/A
4500N/A/*
4500N/A * au_to_xcolormap
4500N/A * return s:
4500N/A * pointer to a X Colormap token.
4500N/A */
4500N/A
4500N/Atoken_t *
4500N/Aau_to_xcolormap(int32_t xid, uid_t cuid)
4500N/A{
4500N/A return (x_common(AUT_XCOLORMAP, xid, cuid));
4500N/A}
4500N/A
4500N/A/*
4500N/A * au_to_xcursor
4500N/A * return s:
4500N/A * pointer to a X Cursor token.
4500N/A */
4803N/A
4803N/Atoken_t *
4500N/Aau_to_xcursor(int32_t xid, uid_t cuid)
4500N/A{
4500N/A return (x_common(AUT_XCURSOR, xid, cuid));
4500N/A}
4500N/A
4500N/A/*
4500N/A * au_to_xfont
4500N/A * return s:
4500N/A * pointer to a X Font token.
4500N/A */
4500N/A
4500N/Atoken_t *
4500N/Aau_to_xfont(int32_t xid, uid_t cuid)
4500N/A{
4500N/A return (x_common(AUT_XFONT, xid, cuid));
4500N/A}
4500N/A
4500N/A/*
4500N/A * au_to_xgc
4500N/A * return s:
4500N/A * pointer to a X Graphic Context token.
4500N/A */
4500N/A
4500N/Atoken_t *
4500N/Aau_to_xgc(int32_t xid, uid_t cuid)
4500N/A{
4500N/A return (x_common(AUT_XGC, xid, cuid));
4500N/A}
4500N/A
4500N/A/*
4853N/A * au_to_xpixmap
4853N/A * return s:
4853N/A * pointer to a X Pixal Map token.
4853N/A */
4853N/A
4853N/Atoken_t *
4853N/Aau_to_xpixmap(int32_t xid, uid_t cuid)
4853N/A{
4853N/A return (x_common(AUT_XPIXMAP, xid, cuid));
4853N/A}
4853N/A
4853N/A/*
4853N/A * au_to_xwindow
4853N/A * return s:
4853N/A * pointer to a X Window token.
4853N/A */
4853N/A
4853N/Atoken_t *
4853N/Aau_to_xwindow(int32_t xid, uid_t cuid)
4853N/A{
4853N/A return (x_common(AUT_XWINDOW, xid, cuid));
4853N/A}
4853N/A
4853N/A/*
4853N/A * au_to_xproperty
4853N/A * return s:
4853N/A * pointer to a X Property token.
4853N/A */
4853N/A
4853N/Atoken_t *
4853N/Aau_to_xproperty(int32_t xid, uid_t cuid, char *propname)
3853N/A{
token_t *token; /* local token */
adr_t adr; /* adr memory stream header */
char data_header = AUT_XPROPERTY; /* header for this token */
short proplen;
proplen = strlen(propname) + 1;
token = get_token(sizeof (char) + sizeof (int32_t) + sizeof (uid_t) +
sizeof (short) + proplen);
if (token == NULL)
return (NULL);
adr_start(&adr, token->tt_data);
adr_char(&adr, &data_header, 1);
adr_int32(&adr, &xid, 1);
adr_uid(&adr, &cuid, 1);
adr_short(&adr, &proplen, 1);
adr_char(&adr, propname, proplen);
return (token);
}
/*
* au_to_xclient
* return s:
* pointer to a X Client token
*/
token_t *
au_to_xclient(uint32_t client)
{
token_t *token; /* local token */
adr_t adr; /* adr memory stream header */
char data_header = AUT_XCLIENT; /* header for this token */
token = get_token(sizeof (char) + sizeof (uint32_t));
if (token == NULL)
return (NULL);
adr_start(&adr, token->tt_data);
adr_char(&adr, &data_header, 1);
adr_int32(&adr, (int32_t *)&client, 1);
return (token);
}
/*
* au_to_label
* return s:
* pointer to a label token.
*/
token_t *
au_to_label(m_label_t *label)
{
token_t *token; /* local token */
adr_t adr; /* adr memory stream header */
char data_header = AUT_LABEL; /* header for this token */
size32_t llen = blabel_size();
token = get_token(sizeof (char) + llen);
if (token == NULL) {
return (NULL);
} else if (label == NULL) {
free(token);
return (NULL);
}
adr_start(&adr, token->tt_data);
adr_char(&adr, &data_header, 1);
adr_char(&adr, (char *)label, llen);
return (token);
}
/*
* au_to_mylabel
* return s:
* pointer to a label token.
*/
token_t *
au_to_mylabel(void)
{
ucred_t *uc;
token_t *token;
if ((uc = ucred_get(P_MYID)) == NULL) {
return (NULL);
}
token = au_to_label(ucred_getlabel(uc));
ucred_free(uc);
return (token);
}
/*
* au_to_zonename
* return s:
* pointer to a zonename token.
*/
token_t *
au_to_zonename(char *name)
{
token_t *token; /* local token */
adr_t adr; /* adr memory stream header */
char data_header = AUT_ZONENAME; /* header for this token */
short bytes; /* length of string */
if (name == NULL)
return (NULL);
bytes = strlen(name) + 1;
token = get_token((int)(sizeof (char) + sizeof (short) + bytes));
if (token == NULL)
return (NULL);
adr_start(&adr, token->tt_data);
adr_char(&adr, &data_header, 1);
adr_short(&adr, &bytes, 1);
adr_char(&adr, name, bytes);
return (token);
}
/*
* au_to_fmri
* return s:
* pointer to a fmri token.
*/
token_t *
au_to_fmri(char *fmri)
{
token_t *token; /* local token */
adr_t adr; /* adr memory stream header */
char data_header = AUT_FMRI; /* header for this token */
short bytes; /* length of string */
if (fmri == NULL)
return (NULL);
bytes = strlen(fmri) + 1;
token = get_token((int)(sizeof (char) + sizeof (short) + bytes));
if (token == NULL)
return (NULL);
adr_start(&adr, token->tt_data);
adr_char(&adr, &data_header, 1);
adr_short(&adr, &bytes, 1);
adr_char(&adr, fmri, bytes);
return (token);
}