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#pragma ident	"%Z%%M%	%I%	%E% SMI"
28
29#include <string.h>
30#include <stdlib.h>
31#include <alloca.h>
32#include <libuutil.h>
33
34#include "idtab.h"
35#include "psexp.h"
36
37void
38psexp_create(psexp_t *psexp)
39{
40	idtab_create(&psexp->ps_euids);
41	idtab_create(&psexp->ps_ruids);
42	idtab_create(&psexp->ps_rgids);
43	idtab_create(&psexp->ps_ppids);
44	idtab_create(&psexp->ps_pgids);
45	idtab_create(&psexp->ps_sids);
46	idtab_create(&psexp->ps_ttys);
47	idtab_create(&psexp->ps_projids);
48	idtab_create(&psexp->ps_taskids);
49	idtab_create(&psexp->ps_zoneids);
50	idtab_create(&psexp->ps_ctids);
51
52	psexp->ps_pat = NULL;
53}
54
55void
56psexp_destroy(psexp_t *psexp)
57{
58	idtab_destroy(&psexp->ps_euids);
59	idtab_destroy(&psexp->ps_ruids);
60	idtab_destroy(&psexp->ps_rgids);
61	idtab_destroy(&psexp->ps_ppids);
62	idtab_destroy(&psexp->ps_pgids);
63	idtab_destroy(&psexp->ps_sids);
64	idtab_destroy(&psexp->ps_ttys);
65	idtab_destroy(&psexp->ps_projids);
66	idtab_destroy(&psexp->ps_taskids);
67	idtab_destroy(&psexp->ps_zoneids);
68	idtab_destroy(&psexp->ps_ctids);
69
70	if (psexp->ps_pat)
71		regfree(&psexp->ps_reg);
72}
73
74int
75psexp_compile(psexp_t *psexp)
76{
77	size_t nbytes;
78	char *buf;
79	int err;
80
81	idtab_sort(&psexp->ps_euids);
82	idtab_sort(&psexp->ps_ruids);
83	idtab_sort(&psexp->ps_rgids);
84	idtab_sort(&psexp->ps_ppids);
85	idtab_sort(&psexp->ps_pgids);
86	idtab_sort(&psexp->ps_sids);
87	idtab_sort(&psexp->ps_ttys);
88	idtab_sort(&psexp->ps_projids);
89	idtab_sort(&psexp->ps_taskids);
90	idtab_sort(&psexp->ps_zoneids);
91	idtab_sort(&psexp->ps_ctids);
92
93	if (psexp->ps_pat != NULL) {
94		if ((err = regcomp(&psexp->ps_reg, psexp->ps_pat,
95		    REG_EXTENDED)) != 0) {
96
97			nbytes = regerror(err, &psexp->ps_reg, NULL, 0);
98			buf = alloca(nbytes + 1);
99			(void) regerror(err, &psexp->ps_reg, buf, nbytes);
100			(void) strcat(buf, "\n");
101			uu_warn(buf);
102			return (-1);
103		}
104	}
105
106	return (0);
107}
108
109#define	NOMATCH(__f1, __f2) \
110	psexp->__f1.id_data && !idtab_search(&psexp->__f1, psinfo->__f2)
111
112int
113psexp_match(psexp_t *psexp, psinfo_t *psinfo, int flags)
114{
115	regmatch_t pmatch;
116	const char *s;
117
118	if (NOMATCH(ps_euids, pr_euid))
119		return (0);
120	if (NOMATCH(ps_ruids, pr_uid))
121		return (0);
122	if (NOMATCH(ps_rgids, pr_gid))
123		return (0);
124	if (NOMATCH(ps_ppids, pr_ppid))
125		return (0);
126	if (NOMATCH(ps_pgids, pr_pgid))
127		return (0);
128	if (NOMATCH(ps_sids, pr_sid))
129		return (0);
130	if (NOMATCH(ps_ttys, pr_ttydev))
131		return (0);
132	if (NOMATCH(ps_projids, pr_projid))
133		return (0);
134	if (NOMATCH(ps_taskids, pr_taskid))
135		return (0);
136	if (NOMATCH(ps_zoneids, pr_zoneid))
137		return (0);
138	if (NOMATCH(ps_ctids, pr_contract))
139		return (0);
140
141	if (psexp->ps_pat != NULL) {
142		s = (flags & PSEXP_PSARGS) ?
143		    psinfo->pr_psargs : psinfo->pr_fname;
144
145		if (regexec(&psexp->ps_reg, s, 1, &pmatch, 0) != 0)
146			return (0);
147
148		if ((flags & PSEXP_EXACT) &&
149		    (pmatch.rm_so != 0 || s[pmatch.rm_eo] != '\0'))
150			return (0);
151	}
152
153	return (1);
154}
155