1 /*        $NetBSD: subr.c,v 1.18 2011/06/01 21:28:33 alnsn Exp $      */
2 
3 /*-
4  * Copyright (c) 1988, 1993
5  *        The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of the University nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31 
32 #include <sys/cdefs.h>
33 #ifndef lint
34 #if 0
35 static char sccsid[] = "@(#)subr.c      8.2 (Berkeley) 4/28/95";
36 #else
37 __RCSID("$NetBSD: subr.c,v 1.18 2011/06/01 21:28:33 alnsn Exp $");
38 #endif
39 #endif /* not lint */
40 
41 #include <sys/param.h>
42 #include <sys/time.h>
43 #include <sys/uio.h>
44 #include <sys/ktrace.h>
45 
46 #include <stdio.h>
47 
48 #include "ktrace.h"
49 
50 int
getpoints(int facs,char * s)51 getpoints(int facs, char *s)
52 {
53           int fac;
54           int add = 1;
55 
56           /* Make -t-x equivalent to -t+-x since that is rather more useful */
57           if (*s == '-' && (facs & ALL_POINTS) == 0)
58                     facs |= DEF_POINTS;
59 
60           for (;;) {
61                     switch (*s++) {
62                     case 0:
63                               return facs;
64                     case 'A':
65                               fac = ALL_POINTS;
66                               break;
67                     case 'a':
68                               fac = KTRFAC_EXEC_ARG;
69                               break;
70                     case 'c':
71                               fac = KTRFAC_SYSCALL | KTRFAC_SYSRET;
72                               break;
73                     case 'e':
74                               fac = KTRFAC_EMUL;
75                               break;
76                     case 'f':
77                               fac = KTRFAC_EXEC_FD;
78                               break;
79                     case 'i':
80                               fac = KTRFAC_GENIO;
81                               break;
82                     case 'n':
83                               fac = KTRFAC_NAMEI;
84                               break;
85                     case 's':
86                               fac = KTRFAC_PSIG;
87                               break;
88                     case 'u':
89                               fac = KTRFAC_USER;
90                               break;
91                     case 'S':
92                               fac = KTRFAC_MIB;
93                               break;
94                     case 'v':
95                               fac = KTRFAC_EXEC_ENV;
96                               break;
97                     case 'w':
98                               fac = KTRFAC_CSW;
99                               break;
100                     case '+':
101                               if (!add) {
102                                         add = 1;
103                                         continue;
104                               }
105                               fac = DEF_POINTS;
106                               break;
107                     case '-':
108                               add = 0;
109                               continue;
110                     default:
111                               return (-1);
112                     }
113                     if (add)
114                               facs |= fac;
115                     else
116                               facs &= ~fac;
117           }
118 }
119