xref: /illumos-gate/usr/src/lib/libc/port/gen/psecflags.c (revision d2a70789)
1*d2a70789SRichard Lowe /*
2*d2a70789SRichard Lowe  * This file and its contents are supplied under the terms of the
3*d2a70789SRichard Lowe  * Common Development and Distribution License ("CDDL"), version 1.0.
4*d2a70789SRichard Lowe  * You may only use this file in accordance with the terms of version
5*d2a70789SRichard Lowe  * 1.0 of the CDDL.
6*d2a70789SRichard Lowe  *
7*d2a70789SRichard Lowe  * A full copy of the text of the CDDL should have accompanied this
8*d2a70789SRichard Lowe  * source.  A copy of the CDDL is also available via the Internet at
9*d2a70789SRichard Lowe  * http://www.illumos.org/license/CDDL.
10*d2a70789SRichard Lowe  */
11*d2a70789SRichard Lowe 
12*d2a70789SRichard Lowe /* Copyright 2015, Richard Lowe. */
13*d2a70789SRichard Lowe 
14*d2a70789SRichard Lowe #include "lint.h"
15*d2a70789SRichard Lowe 
16*d2a70789SRichard Lowe #include <errno.h>
17*d2a70789SRichard Lowe #include <stdio.h>
18*d2a70789SRichard Lowe #include <stdlib.h>
19*d2a70789SRichard Lowe #include <string.h>
20*d2a70789SRichard Lowe #include <strings.h>
21*d2a70789SRichard Lowe 
22*d2a70789SRichard Lowe #include <sys/proc.h>
23*d2a70789SRichard Lowe #include <sys/procset.h>
24*d2a70789SRichard Lowe #include <sys/syscall.h>
25*d2a70789SRichard Lowe #include <sys/secflags.h>
26*d2a70789SRichard Lowe 
27*d2a70789SRichard Lowe extern int __psecflagsset(procset_t *, psecflagwhich_t, secflagdelta_t *);
28*d2a70789SRichard Lowe 
29*d2a70789SRichard Lowe int
psecflags(idtype_t idtype,id_t id,psecflagwhich_t which,secflagdelta_t * delta)30*d2a70789SRichard Lowe psecflags(idtype_t idtype, id_t id, psecflagwhich_t which,
31*d2a70789SRichard Lowe     secflagdelta_t *delta)
32*d2a70789SRichard Lowe {
33*d2a70789SRichard Lowe 	procset_t procset;
34*d2a70789SRichard Lowe 
35*d2a70789SRichard Lowe 	setprocset(&procset, POP_AND, idtype, id, P_ALL, 0);
36*d2a70789SRichard Lowe 
37*d2a70789SRichard Lowe 	return (__psecflagsset(&procset, which, delta));
38*d2a70789SRichard Lowe }
39*d2a70789SRichard Lowe 
40*d2a70789SRichard Lowe int
secflags_parse(const secflagset_t * defaults,const char * flags,secflagdelta_t * ret)41*d2a70789SRichard Lowe secflags_parse(const secflagset_t *defaults, const char *flags,
42*d2a70789SRichard Lowe     secflagdelta_t *ret)
43*d2a70789SRichard Lowe {
44*d2a70789SRichard Lowe 	char *flag;
45*d2a70789SRichard Lowe 	char *s, *ss;
46*d2a70789SRichard Lowe 	boolean_t current = B_FALSE;
47*d2a70789SRichard Lowe 
48*d2a70789SRichard Lowe 	/* Guarantee a clean base */
49*d2a70789SRichard Lowe 	bzero(ret, sizeof (*ret));
50*d2a70789SRichard Lowe 
51*d2a70789SRichard Lowe 	if ((ss = s = strdup(flags)) == NULL)
52*d2a70789SRichard Lowe 		return (-1);	/* errno set for us */
53*d2a70789SRichard Lowe 
54*d2a70789SRichard Lowe 
55*d2a70789SRichard Lowe 	while ((flag = strsep(&s, ",")) != NULL) {
56*d2a70789SRichard Lowe 		secflag_t sf = 0;
57*d2a70789SRichard Lowe 		boolean_t del = B_FALSE;
58*d2a70789SRichard Lowe 
59*d2a70789SRichard Lowe 		if (strcasecmp(flag, "default") == 0) {
60*d2a70789SRichard Lowe 			if (defaults != NULL) {
61*d2a70789SRichard Lowe 				secflags_union(&ret->psd_add, defaults);
62*d2a70789SRichard Lowe 			} else {
63*d2a70789SRichard Lowe 				free(ss);
64*d2a70789SRichard Lowe 				errno = EINVAL;
65*d2a70789SRichard Lowe 				return (-1);
66*d2a70789SRichard Lowe 			}
67*d2a70789SRichard Lowe 			continue;
68*d2a70789SRichard Lowe 		} else if (strcasecmp(flag, "all") == 0) {
69*d2a70789SRichard Lowe 			secflags_fullset(&ret->psd_add);
70*d2a70789SRichard Lowe 			continue;
71*d2a70789SRichard Lowe 		} else if (strcasecmp(flag, "none") == 0) {
72*d2a70789SRichard Lowe 			secflags_fullset(&ret->psd_rem);
73*d2a70789SRichard Lowe 			continue;
74*d2a70789SRichard Lowe 		} else if (strcasecmp(flag, "current") == 0) {
75*d2a70789SRichard Lowe 			current = B_TRUE;
76*d2a70789SRichard Lowe 			continue;
77*d2a70789SRichard Lowe 		}
78*d2a70789SRichard Lowe 
79*d2a70789SRichard Lowe 		if ((flag[0] == '-') || (flag[0] == '!')) {
80*d2a70789SRichard Lowe 			flag++;
81*d2a70789SRichard Lowe 			del = B_TRUE;
82*d2a70789SRichard Lowe 		} else if (flag[0] == '+') {
83*d2a70789SRichard Lowe 			flag++;
84*d2a70789SRichard Lowe 		}
85*d2a70789SRichard Lowe 
86*d2a70789SRichard Lowe 		if ((secflag_by_name(flag, &sf)) != B_TRUE) {
87*d2a70789SRichard Lowe 			free(ss);
88*d2a70789SRichard Lowe 			errno = EINVAL;
89*d2a70789SRichard Lowe 			return (-1);
90*d2a70789SRichard Lowe 		}
91*d2a70789SRichard Lowe 
92*d2a70789SRichard Lowe 		if (del)
93*d2a70789SRichard Lowe 			secflag_set(&(ret->psd_rem), sf);
94*d2a70789SRichard Lowe 		else
95*d2a70789SRichard Lowe 			secflag_set(&(ret->psd_add), sf);
96*d2a70789SRichard Lowe 	}
97*d2a70789SRichard Lowe 
98*d2a70789SRichard Lowe 	/*
99*d2a70789SRichard Lowe 	 * If we're not using the current flags, this is strict assignment.
100*d2a70789SRichard Lowe 	 * Negatives "win".
101*d2a70789SRichard Lowe 	 */
102*d2a70789SRichard Lowe 	if (!current) {
103*d2a70789SRichard Lowe 		secflags_copy(&ret->psd_assign, &ret->psd_add);
104*d2a70789SRichard Lowe 		secflags_difference(&ret->psd_assign, &ret->psd_rem);
105*d2a70789SRichard Lowe 		ret->psd_ass_active = B_TRUE;
106*d2a70789SRichard Lowe 		secflags_zero(&ret->psd_add);
107*d2a70789SRichard Lowe 		secflags_zero(&ret->psd_rem);
108*d2a70789SRichard Lowe 	}
109*d2a70789SRichard Lowe 
110*d2a70789SRichard Lowe 	free(ss);
111*d2a70789SRichard Lowe 	return (0);
112*d2a70789SRichard Lowe }
113