1177633Sdfr/*	$NetBSD: subr.c,v 1.17 2011/04/27 00:00:47 joerg Exp $	*/
2177633Sdfr
3177633Sdfr/*-
4177633Sdfr * Copyright (c) 1988, 1993
5177633Sdfr *	The Regents of the University of California.  All rights reserved.
6177685Sdfr *
7177633Sdfr * Redistribution and use in source and binary forms, with or without
8177633Sdfr * modification, are permitted provided that the following conditions
9177633Sdfr * are met:
10177633Sdfr * 1. Redistributions of source code must retain the above copyright
11177633Sdfr *    notice, this list of conditions and the following disclaimer.
12177633Sdfr * 2. Redistributions in binary form must reproduce the above copyright
13177633Sdfr *    notice, this list of conditions and the following disclaimer in the
14177633Sdfr *    documentation and/or other materials provided with the distribution.
15177633Sdfr * 3. Neither the name of the University nor the names of its contributors
16177633Sdfr *    may be used to endorse or promote products derived from this software
17177633Sdfr *    without specific prior written permission.
18177633Sdfr *
19177633Sdfr * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20177633Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21177633Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22177633Sdfr * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23177633Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24177633Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25177633Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26177633Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27177633Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28177633Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29177633Sdfr * SUCH DAMAGE.
30177633Sdfr */
31177633Sdfr
32177633Sdfr#include <sys/cdefs.h>
33177633Sdfr#ifndef lint
34177633Sdfr#if 0
35177633Sdfrstatic char sccsid[] = "@(#)subr.c	8.2 (Berkeley) 4/28/95";
36177633Sdfr#else
37177633Sdfr__RCSID("$NetBSD: subr.c,v 1.17 2011/04/27 00:00:47 joerg Exp $");
38177633Sdfr#endif
39177633Sdfr#endif /* not lint */
40177633Sdfr
41177633Sdfr#include <sys/param.h>
42177633Sdfr#include <sys/time.h>
43177633Sdfr#include <sys/uio.h>
44177633Sdfr#include <sys/ktrace.h>
45177633Sdfr
46177633Sdfr#include <stdio.h>
47177633Sdfr
48177633Sdfr#include "ktrace.h"
49177633Sdfr
50177633Sdfrint
51177633Sdfrgetpoints(int facs, char *s)
52177633Sdfr{
53177633Sdfr	int fac;
54177633Sdfr	int add = 1;
55177633Sdfr
56177633Sdfr	/* Make -t-x equivalent to -t+-x since that is rather more useful */
57177633Sdfr	if (*s == '-' && (facs & ALL_POINTS) == 0)
58177633Sdfr		facs |= DEF_POINTS;
59177633Sdfr
60177633Sdfr	for (;;) {
61177633Sdfr		switch (*s++) {
62177633Sdfr		case 0:
63177633Sdfr			return facs;
64177633Sdfr		case 'A':
65177633Sdfr			fac = ALL_POINTS;
66177633Sdfr			break;
67177633Sdfr		case 'a':
68177633Sdfr			fac = KTRFAC_EXEC_ARG;
69177633Sdfr			break;
70177633Sdfr		case 'c':
71177633Sdfr			fac = KTRFAC_SYSCALL | KTRFAC_SYSRET;
72177633Sdfr			break;
73177633Sdfr		case 'e':
74177633Sdfr			fac = KTRFAC_EMUL;
75177633Sdfr			break;
76177633Sdfr		case 'f':
77177633Sdfr			fac = KTRFAC_EXEC_FD;
78177633Sdfr			break;
79177633Sdfr		case 'i':
80177633Sdfr			fac = KTRFAC_GENIO;
81177633Sdfr			break;
82177633Sdfr		case 'n':
83177633Sdfr			fac = KTRFAC_NAMEI;
84177633Sdfr			break;
85177633Sdfr		case 's':
86177633Sdfr			fac = KTRFAC_PSIG;
87177633Sdfr			break;
88177633Sdfr		case 'u':
89177633Sdfr			fac = KTRFAC_USER;
90177633Sdfr			break;
91177633Sdfr		case 'S':
92177633Sdfr			fac = KTRFAC_MIB;
93177633Sdfr			break;
94177633Sdfr		case 'v':
95177633Sdfr			fac = KTRFAC_EXEC_ENV;
96177633Sdfr			break;
97177633Sdfr		case 'w':
98177633Sdfr			fac = KTRFAC_CSW;
99177633Sdfr			break;
100177633Sdfr		case '+':
101177633Sdfr			if (!add) {
102177633Sdfr				add = 1;
103177633Sdfr				continue;
104177633Sdfr			}
105177633Sdfr			fac = DEF_POINTS;
106177633Sdfr			break;
107177633Sdfr		case '-':
108177633Sdfr			add = 0;
109177633Sdfr			continue;
110177633Sdfr		default:
111177633Sdfr			return (-1);
112177633Sdfr		}
113177633Sdfr		if (add)
114177633Sdfr			facs |= fac;
115177633Sdfr		else
116177633Sdfr			facs &= ~fac;
117177633Sdfr	}
118177633Sdfr}
119177633Sdfr