Home | History | Annotate | Download | only in common
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef	_TSOL_LABEL_H
     27 #define	_TSOL_LABEL_H
     28 
     29 #include <sys/types32.h>
     30 #include <sys/tsol/label.h>
     31 #include <priv.h>
     32 
     33 #ifdef	__cplusplus
     34 extern "C" {
     35 #endif
     36 
     37 /* Procedural Interface Structure Definitions */
     38 
     39 struct	label_info {		/* structure returned by label_info */
     40 	short	ilabel_len;		/* max Information Label length */
     41 	short	slabel_len;		/* max Sensitivity Label length */
     42 	short	clabel_len;		/* max CMW Label length */
     43 	short	clear_len;		/* max Clearance Label length */
     44 	short	vers_len;		/* version string length */
     45 	short	header_len;		/* max len of banner page header */
     46 	short	protect_as_len;		/* max len of banner page protect as */
     47 	short	caveats_len;		/* max len of banner page caveats */
     48 	short	channels_len;		/* max len of banner page channels */
     49 };
     50 
     51 typedef struct label_set_identifier {	/* valid label set identifier */
     52 	int	type;			/* type of the set */
     53 	char	*name;			/* name of the set if needed */
     54 } set_id;
     55 
     56 struct name_fields {		/* names for label builder fields */
     57 	char	*class_name;		/* Classifications field name */
     58 	char	*comps_name;		/* Compartments field name */
     59 	char	*marks_name;		/* Markings field name */
     60 };
     61 
     62 /* Label Set Identifier Types */
     63 
     64 /*
     65  * The accreditation ranges as specified in the label encodings file.
     66  * The name parameter is ignored.
     67  *
     68  * System Accreditation Range is all valid labels plus Admin High and Low.
     69  *
     70  * User Accreditation Range is valid user labels as defined in the
     71  *	ACCREDITATION RANGE: section of the label encodings file.
     72  */
     73 
     74 #define	SYSTEM_ACCREDITATION_RANGE	1
     75 #define	USER_ACCREDITATION_RANGE	2
     76 
     77 
     78 /* System Call Interface Definitions */
     79 
     80 extern int getlabel(const char *, m_label_t *);
     81 extern int fgetlabel(int, m_label_t *);
     82 
     83 extern int getplabel(m_label_t *);
     84 extern int setflabel(const char *, m_label_t *);
     85 extern char *getpathbylabel(const char *, char *, size_t,
     86     const m_label_t *sl);
     87 extern m_label_t *getzonelabelbyid(zoneid_t);
     88 extern m_label_t *getzonelabelbyname(const char *);
     89 extern zoneid_t getzoneidbylabel(const m_label_t *);
     90 extern char *getzonenamebylabel(const m_label_t *);
     91 extern char *getzonerootbyid(zoneid_t);
     92 extern char *getzonerootbyname(const char *);
     93 extern char *getzonerootbylabel(const m_label_t *);
     94 extern m_label_t *getlabelbypath(const char *);
     95 
     96 
     97 /* Flag word values */
     98 
     99 #define	ALL_ENTRIES		0x00000000
    100 #define	ACCESS_RELATED		0x00000001
    101 #define	ACCESS_MASK		0x0000FFFF
    102 #define	ACCESS_SHIFT		0
    103 
    104 #define	LONG_WORDS		0x00010000	/* use long names */
    105 #define	SHORT_WORDS		0x00020000	/* use short names if present */
    106 #define	LONG_CLASSIFICATION	0x00040000	/* use long classification */
    107 #define	SHORT_CLASSIFICATION	0x00080000	/* use short classification */
    108 #define	NO_CLASSIFICATION	0x00100000	/* don't translate the class */
    109 #define	VIEW_INTERNAL		0x00200000	/* don't promote/demote */
    110 #define	VIEW_EXTERNAL		0x00400000	/* promote/demote label */
    111 
    112 #define	NEW_LABEL		0x00000001	/* create a full new label */
    113 #define	NO_CORRECTION		0x00000002	/* don't correct label errors */
    114 						/* implies NEW_LABEL */
    115 
    116 #define	CVT_DIM			0x01		/* display word dimmed */
    117 #define	CVT_SET			0x02		/* display word currently set */
    118 
    119 /* Procedure Interface Definitions available to user */
    120 
    121 /* APIs shared with the kernel are in <sys/tsol/label.h */
    122 
    123 extern m_label_t *blabel_alloc(void);
    124 extern void	blabel_free(m_label_t *);
    125 extern size32_t blabel_size(void);
    126 extern char	*bsltoh(const m_label_t *);
    127 extern char	*bcleartoh(const m_label_t *);
    128 
    129 extern char	*bsltoh_r(const m_label_t *, char *);
    130 extern char	*bcleartoh_r(const m_label_t *, char *);
    131 extern char	*h_alloc(uint8_t);
    132 extern void	h_free(char *);
    133 
    134 extern int	htobsl(const char *, m_label_t *);
    135 extern int	htobclear(const char *, m_label_t *);
    136 
    137 extern m_range_t	*getuserrange(const char *);
    138 extern m_range_t	*getdevicerange(const char *);
    139 
    140 extern int	set_effective_priv(priv_op_t, int, ...);
    141 extern int	set_inheritable_priv(priv_op_t, int, ...);
    142 extern int	set_permitted_priv(priv_op_t, int, ...);
    143 extern int	is_system_labeled(void);
    144 
    145 /* Procedures needed for multi-level printing */
    146 
    147 extern int	tsol_check_admin_auth(uid_t uid);
    148 
    149 /* APIs implemented via labeld */
    150 
    151 extern int	blinset(const m_label_t *, const set_id *);
    152 extern int	labelinfo(struct label_info *);
    153 extern ssize_t	labelvers(char **, size_t);
    154 extern char	*bltocolor(const m_label_t *);
    155 extern char	*bltocolor_r(const m_label_t *, size_t, char *);
    156 
    157 extern ssize_t	bsltos(const m_label_t *, char **, size_t, int);
    158 extern ssize_t	bcleartos(const m_label_t *, char **, size_t, int);
    159 
    160 
    161 extern char	*sbsltos(const m_label_t *, size_t);
    162 extern char	*sbcleartos(const m_label_t *, size_t);
    163 
    164 
    165 extern int	stobsl(const char *, m_label_t *, int, int *);
    166 extern int	stobclear(const char *, m_label_t *, int, int *);
    167 extern int	bslvalid(const m_label_t *);
    168 extern int	bclearvalid(const m_label_t *);
    169 
    170 /* DIA label conversion and parsing */
    171 
    172 /* Conversion types */
    173 
    174 typedef	enum _m_label_str {
    175 	M_LABEL = 1,		/* process or user clearance */
    176 	M_INTERNAL = 2,		/* internal form for use in public databases */
    177 	M_COLOR = 3,		/* process label color */
    178 	PRINTER_TOP_BOTTOM = 4,	/* DIA banner page top/bottom */
    179 	PRINTER_LABEL = 5,	/* DIA banner page label */
    180 	PRINTER_CAVEATS = 6,	/* DIA banner page caveats */
    181 	PRINTER_CHANNELS = 7	/* DIA banner page handling channels */
    182 } m_label_str_t;
    183 
    184 /* Flags for conversion, not all flags apply to all types */
    185 #define	DEF_NAMES	0x1
    186 #define	SHORT_NAMES	0x3	/* short names are prefered where defined */
    187 #define	LONG_NAMES	0x4	/* long names are prefered where defined */
    188 
    189 extern int label_to_str(const m_label_t *, char **, const m_label_str_t,
    190     uint_t);
    191 extern int l_to_str_internal(const m_label_t *, char **);
    192 
    193 /* Parsing types */
    194 typedef enum _m_label_type {
    195 	MAC_LABEL = 1,		/* process or object label */
    196 	USER_CLEAR = 2		/* user's clearance (LUB) */
    197 } m_label_type_t;
    198 
    199 /* Flags for parsing */
    200 
    201 #define	L_DEFAULT		0x0
    202 #define	L_MODIFY_EXISTING	0x1	/* start parsing with existing label */
    203 #define	L_NO_CORRECTION		0x2	/* must be correct by l_e rules */
    204 #define	L_CHECK_AR		0x10	/* must be in l_e AR */
    205 
    206 /* EINVAL sub codes */
    207 
    208 #define	M_OUTSIDE_AR		-4	/* not in l_e AR */
    209 #define	M_BAD_STRING		-3	/* DIA L_BAD_LABEL */
    210 	/* bad requested label type, bad previous label type */
    211 #define	M_BAD_LABEL		-2	/* DIA L_BAD_CLASSIFICATION, */
    212 
    213 extern int str_to_label(const char *, m_label_t **, const m_label_type_t,
    214     uint_t, int *);
    215 extern int hexstr_to_label(const char *, m_label_t *);
    216 
    217 extern m_label_t *m_label_alloc(const m_label_type_t);
    218 
    219 extern int m_label_dup(m_label_t **, const m_label_t *);
    220 
    221 extern void m_label_free(m_label_t *);
    222 
    223 /* Contract Private interfaces with the label builder GUIs */
    224 
    225 extern int	bslcvtfull(const m_label_t *, const m_range_t *, int,
    226     char **, char **[], char **[], char *[], int *, int *);
    227 extern int	bslcvt(const m_label_t *, int, char **, char *[]);
    228 extern int	bclearcvtfull(const m_label_t *, const m_range_t *, int,
    229     char **, char **[], char **[], char *[], int *, int *);
    230 extern int	bclearcvt(const m_label_t *, int, char **, char *[]);
    231 
    232 extern int	labelfields(struct name_fields *);
    233 extern int	userdefs(m_label_t *, m_label_t *);
    234 extern int	zonecopy(m_label_t *, char *, char *, char *, int);
    235 
    236 #ifdef DEBUG
    237 /* testing hook: see devfsadm.c, mkdevalloc.c and allocate.c */
    238 #define	is_system_labeled_debug(statbufp)	\
    239 	((stat("/ALLOCATE_FORCE_LABEL", (statbufp)) == 0) ? 1 : 0)
    240 #else	/* DEBUG */
    241 #define	is_system_labeled_debug(statbufp)	0
    242 #endif	/* DEBUG */
    243 
    244 #ifdef	__cplusplus
    245 }
    246 #endif
    247 
    248 #endif	/* !_TSOL_LABEL_H */
    249