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, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 #include <string.h>
28 #include <stdlib.h>
29 #include <alloca.h>
30 #include <libuutil.h>
31
32 #include "idtab.h"
33 #include "psexp.h"
34
35 void
psexp_create(psexp_t * psexp)36 psexp_create(psexp_t *psexp)
37 {
38 idtab_create(&psexp->ps_euids);
39 idtab_create(&psexp->ps_ruids);
40 idtab_create(&psexp->ps_rgids);
41 idtab_create(&psexp->ps_ppids);
42 idtab_create(&psexp->ps_pgids);
43 idtab_create(&psexp->ps_sids);
44 idtab_create(&psexp->ps_ttys);
45 idtab_create(&psexp->ps_projids);
46 idtab_create(&psexp->ps_taskids);
47 idtab_create(&psexp->ps_zoneids);
48 idtab_create(&psexp->ps_ctids);
49
50 psexp->ps_pat = NULL;
51 }
52
53 void
psexp_destroy(psexp_t * psexp)54 psexp_destroy(psexp_t *psexp)
55 {
56 idtab_destroy(&psexp->ps_euids);
57 idtab_destroy(&psexp->ps_ruids);
58 idtab_destroy(&psexp->ps_rgids);
59 idtab_destroy(&psexp->ps_ppids);
60 idtab_destroy(&psexp->ps_pgids);
61 idtab_destroy(&psexp->ps_sids);
62 idtab_destroy(&psexp->ps_ttys);
63 idtab_destroy(&psexp->ps_projids);
64 idtab_destroy(&psexp->ps_taskids);
65 idtab_destroy(&psexp->ps_zoneids);
66 idtab_destroy(&psexp->ps_ctids);
67
68 if (psexp->ps_pat)
69 regfree(&psexp->ps_reg);
70 }
71
72 int
psexp_compile(psexp_t * psexp)73 psexp_compile(psexp_t *psexp)
74 {
75 size_t nbytes;
76 char *buf;
77 int err;
78
79 idtab_sort(&psexp->ps_euids);
80 idtab_sort(&psexp->ps_ruids);
81 idtab_sort(&psexp->ps_rgids);
82 idtab_sort(&psexp->ps_ppids);
83 idtab_sort(&psexp->ps_pgids);
84 idtab_sort(&psexp->ps_sids);
85 idtab_sort(&psexp->ps_ttys);
86 idtab_sort(&psexp->ps_projids);
87 idtab_sort(&psexp->ps_taskids);
88 idtab_sort(&psexp->ps_zoneids);
89 idtab_sort(&psexp->ps_ctids);
90
91 if (psexp->ps_pat != NULL) {
92 if ((err = regcomp(&psexp->ps_reg, psexp->ps_pat,
93 REG_EXTENDED)) != 0) {
94
95 nbytes = regerror(err, &psexp->ps_reg, NULL, 0);
96 buf = alloca(nbytes + 1);
97 (void) regerror(err, &psexp->ps_reg, buf, nbytes);
98 (void) strcat(buf, "\n");
99 uu_warn(buf);
100 return (-1);
101 }
102 }
103
104 return (0);
105 }
106
107 #define NOMATCH(__f1, __f2) \
108 psexp->__f1.id_data && !idtab_search(&psexp->__f1, psinfo->__f2)
109
110 int
psexp_match(psexp_t * psexp,psinfo_t * psinfo,int flags)111 psexp_match(psexp_t *psexp, psinfo_t *psinfo, int flags)
112 {
113 regmatch_t pmatch;
114 const char *s;
115
116 if (NOMATCH(ps_euids, pr_euid))
117 return (0);
118 if (NOMATCH(ps_ruids, pr_uid))
119 return (0);
120 if (NOMATCH(ps_rgids, pr_gid))
121 return (0);
122 if (NOMATCH(ps_ppids, pr_ppid))
123 return (0);
124 if (NOMATCH(ps_pgids, pr_pgid))
125 return (0);
126 if (NOMATCH(ps_sids, pr_sid))
127 return (0);
128 if (NOMATCH(ps_ttys, pr_ttydev))
129 return (0);
130 if (NOMATCH(ps_projids, pr_projid))
131 return (0);
132 if (NOMATCH(ps_taskids, pr_taskid))
133 return (0);
134 if (NOMATCH(ps_zoneids, pr_zoneid))
135 return (0);
136 if (NOMATCH(ps_ctids, pr_contract))
137 return (0);
138
139 if (psexp->ps_pat != NULL) {
140 s = (flags & PSEXP_PSARGS) ?
141 psinfo->pr_psargs : psinfo->pr_fname;
142
143 if (regexec(&psexp->ps_reg, s, 1, &pmatch, 0) != 0)
144 return (0);
145
146 if ((flags & PSEXP_EXACT) &&
147 (pmatch.rm_so != 0 || s[pmatch.rm_eo] != '\0'))
148 return (0);
149 }
150
151 return (1);
152 }
153