systoken.c revision 2
2N/A * The contents of this file are subject to the terms of the 2N/A * Common Development and Distribution License (the "License"). 2N/A * You may not use this file except in compliance with the License. 2N/A * See the License for the specific language governing permissions 2N/A * and limitations under the License. 2N/A * When distributing Covered Code, include this CDDL HEADER in each 2N/A * If applicable, add the following below this CDDL HEADER, with the 2N/A * fields enclosed by brackets "[]" replaced with your own identifying 2N/A * information: Portions Copyright [yyyy] [name of copyright owner] 2N/A * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. 2N/A * Token processing for sysupd; each token function does one 2N/A * or more operations. All of them bump the buffer pointer 2N/A * to the next token; some of them extract one or more data 2N/A * parse_token - process a token in a record to (1) extract data of interest 2N/A * if any and (2) point to the next token. 2N/A * returns 0 if ok. + or - values are of debug value: 2N/A * returns -1 if the parsing of the token failed. 2N/A * returns +<previous id> if the token is not found. This value 2N/A * is used to help determine where in the record the problem 2N/A * occurred. The common failure case is that the parsing of 2N/A * token M is incorrect and the buffer pointer ends up pointing 2N/A * to garbage. The positive error value of M *may* be the id of 2N/A * the incorrectly parsed token. 2N/A /* here if token id is not in table */ 2N/A/* There should not be any file tokens in the middle of a record */ 2N/A * ====================================================== 2N/A * The following token processing routines return 2N/A * -1: can't parse and can't determine location of next token 2N/A * ====================================================== 2N/A * Format of arbitrary data token: 2N/A * arbitrary data token id &(ctx->adr) char 2N/A * how to print adr_char 2N/A * basic unit adr_char 2N/A * unit count adr_char, specifying number of units of 2N/A * data items depends on basic unit 2N/A * Format of opaque token: 2N/A * opaque token id adr_char 2N/A * data adr_char, size times 2N/A * Format of return32 value token: 2N/A * return value token id adr_char 2N/A * error number adr_char 2N/A * return value adr_u_int32 2N/A * Format of return64 value token: 2N/A * return value token id adr_char 2N/A * error number adr_char 2N/A * return value adr_u_int64 2N/A * Format of sequence token: 2N/A * sequence token id adr_char 2N/A * audit_count int32_t 2N/A * Format of text token: 2N/A * text token id adr_char 2N/A char *
bp;
/* pointer to output string */ 2N/A * Format of tid token: 2N/A * ip token id adr_char 2N/A * terminal type adr_char 2N/A * terminal type = AU_IPADR: 2N/A * remote port: ushort 2N/A * local port: ushort 2N/A * IP type: int32 -- AU_IPv4 or AU_IPv6 2N/A * address: int32 if IPv4, else 4 * int32 2N/A return (-
1);
/* other than IP type is not implemented */ 2N/A * Format of ip_addr token: 2N/A * ip token id adr_char 2N/A * Format of ip_addr_ex token: 2N/A * ip token id adr_char 2N/A * ip address adr_u_char*type 2N/A * Format of ip token: 2N/A * ip header token id adr_char 2N/A * type of service adr_char 2N/A * offset adr_u_short 2N/A * checksum adr_u_short 2N/A * source address adr_int32 2N/A * destination address adr_int32 2N/A (
2 *
sizeof (
char)) +
sizeof (
short) + (
2 *
sizeof (
int32_t));
2N/A * Format of iport token: 2N/A * ip port address token id adr_char 2N/A * port address adr_short 2N/A * Format of groups token: 2N/A * group token id adr_char 2N/A * group list adr_int32, 16 times 2N/A * Format of newgroups token: 2N/A * group token id adr_char 2N/A * number of groups adr_short 2N/A * group list adr_int32, "number" times 2N/A * Format of argument32 token: 2N/A * argument token id adr_char 2N/A * argument number adr_char 2N/A * argument value adr_int32 2N/A * argument description adr_string 2N/A * Format of argument64 token: 2N/A * argument token id adr_char 2N/A * argument number adr_char 2N/A * argument value adr_int64 2N/A * argument description adr_string 2N/A * Format of acl token: 2N/A * acl token id adr_char 2N/A * Format of ace token: 2N/A * ace token id adr_char 2N/A * access_mask adr_u_int32 2N/A * Format of attribute token: (old pre SunOS 5.7 format) 2N/A * attribute token id adr_char 2N/A * mode adr_int32 (printed in octal) 2N/A * file system id adr_int32 2N/A * Format of attribute32 token: 2N/A * attribute token id adr_char 2N/A * mode adr_int32 (printed in octal) 2N/A * file system id adr_int32 2N/A * Format of attribute64 token: 2N/A * attribute token id adr_char 2N/A * mode adr_int32 (printed in octal) 2N/A * file system id adr_int32 2N/A * Format of command token: 2N/A * attribute token id adr_char 2N/A * argv len adr_short variable amount of argv len 2N/A * argv text argv len and text 2N/A * envp count adr_short variable amount of envp len 2N/A * envp len adr_short and text 2N/A * envp text envp len 2N/A * Format of exit token: 2N/A * attribute token id adr_char 2N/A * return value adr_int32 2N/A * Format of exec_args token: 2N/A * attribute token id adr_char 2N/A * count value adr_int32 2N/A * strings null terminated strings 2N/A * Format of exec_env token: 2N/A * attribute token id adr_char 2N/A * count value adr_int32 2N/A * strings null terminated strings 2N/A * Format of liaison token: 2N/A * Format of path token: 2N/A * anchor the path because collapse_path needs it 2N/A * path attr token / AUT_XATPATH 2N/A * Format of path attr token: 2N/A * string count adr_int32 2N/A * strings adr_string 2N/A * the sequence of strings is converted to a single string with 2N/A * a blank separator replacing the EOS for all but the last 2N/A while (*p++ !=
'\0') {
2N/A /* fix up: replace each NUL except the last with ' ' */ 2N/A while (*p++ !=
'\0') {
2N/A * Format of System V IPC permission token: 2N/A * System V IPC permission token id adr_char 2N/A * Format of process32 token: 2N/A * process token id adr_char 2N/A * termid adr_int32*2 2N/A * Format of process32_ex token: 2N/A * process token id adr_char 2N/A * ip address adr_u_char*type 2N/A * Format of process64 token: 2N/A * process token id adr_char 2N/A * termid adr_int64+adr_int32 2N/A * Format of process64_ex token: 2N/A * process token id adr_char 2N/A * ip address adr_u_char*type 2N/A * Format of System V IPC token: 2N/A * System V IPC token id adr_char 2N/A * System V IPC type adr_char 2N/A * object id adr_int32 2N/A * Format of socket token: 2N/A * socket_type adrm_short 2N/A * remote_port adrm_short 2N/A * remote_inaddr adrm_int32 2N/A * Format of socket_ex token: 2N/A * socket_domain adrm_short 2N/A * socket_type adrm_short 2N/A * address_type adrm_short 2N/A * local_port adrm_short 2N/A * local_inaddr adrm_u_char*address_type 2N/A * remote_port adrm_short 2N/A * remote_inaddr adrm_u_char*address_type 2N/A * Format of subject32 token: 2N/A * subject token id adr_char 2N/A * termid adr_int32*2 2N/A * Format of subject32_ex token: 2N/A * subject token id adr_char 2N/A * ip address adr_u_char*type 2N/A * Format of subject64 token: 2N/A * subject token id adr_char 2N/A * termid adr_int64+adr_int32 2N/A * Format of subject64_ex token: 2N/A * subject token id adr_char 2N/A * ip address adr_u_char*type 2N/A * anchor a path name with a slash 2N/A * assume we have enough space 2N/A * copy path to collapsed path. 2N/A * collapsed path does not contain: 2N/A * successive slashes 2N/A * instances of dot-slash 2N/A * instances of dot-dot-slash 2N/A * passed path must be anchored with a '/' 2N/A int id;
/* index of where we are in destination string */ 2N/A int is;
/* index of where we are in source string */ 2N/A ls++;
/* source length including '\0' */ 2N/A /* previous character was a / */ 2N/A continue;
/* another slash, ignore it */ 2N/A }
else if (s[
is] ==
'/') {
2N/A /* we see a /, just copy it and try again */ 2N/A if (s[
is] ==
'.' && s[
is+
1] ==
'/') {
2N/A if (s[
is] ==
'.' && s[
is+
1] ==
'\0') {
2N/A if (s[
is] ==
'.' && s[
is+
1] ==
'.' && s[
is+
2] ==
'\0') {
2N/A if (s[
is] ==
'.' && s[
is+
1] ==
'.' && s[
is+
2] ==
'/') {
2N/A * for tokens with sub-fields that include a length, this 2N/A * skips the sub-field. 2N/A }
while (c != (
char)0);
2N/A * add a byte to specified length so there can be a prefix of 2N/A * '/' added (if needed for paths). Another is added for '\0' 2N/A * if offset is zero, new data overwrites old, if any. Otherwise 2N/A * new data is appended to the end. 2N/A len++;
/* in case need to add '/' prefix */ 2N/A * Format of host token: 2N/A * Format of useofauth token: 2N/A * uauth token id adr_char 2N/A * Format of user token: 2N/A * user token id adr_char 2N/A * username adr_string 2N/A * Format of zonename token: 2N/A * zonename token id adr_char 2N/A * zonename adr_string 2N/A * Format of fmri token: 2N/A * fmri token id adr_char 2N/A * Format of xgeneric token: 2N/A * creator UID adr_int32 2N/A * Includes: xcolormap, xcursor, xfont, xgc, xpixmap, and xwindow 2N/A * Format of xproperty token: 2N/A * creator UID adr_int32 2N/A * atom string adr_string 2N/A * Format of xclient token: 2N/A * xclient id adr_int32 2N/A * ----------------------------------------------------------------------- 2N/A * privilege_token() : Process privilege token and display contents 2N/A * Format of privilege token: 2N/A * privilege token id adr_char 2N/A * privilege type adr_string 2N/A * privilege adr_string 2N/A * ----------------------------------------------------------------------- 2N/A * Format of label token: 2N/A * compartment length 1 byte 2N/A * classification 2 bytes 2N/A * compartment words <compartment length> * 4 bytes 2N/A * Format of useofpriv token: 2N/A * priv_type adr_char 2N/A * priv_set_t adr_short 2N/A * priv_set adr_char*(sizeof (priv_set_t))