xref: /freebsd/contrib/sendmail/src/trace.c (revision 6990ffd8a95caaba6858ad44ff1b3157d1efba8f)
1 /*
2  * Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
3  *	All rights reserved.
4  * Copyright (c) 1983, 1995-1997 Eric P. Allman.  All rights reserved.
5  * Copyright (c) 1988, 1993
6  *	The Regents of the University of California.  All rights reserved.
7  *
8  * By using this file, you agree to the terms and conditions set
9  * forth in the LICENSE file which can be found at the top level of
10  * the sendmail distribution.
11  *
12  */
13 
14 #ifndef lint
15 static char id[] = "@(#)$Id: trace.c,v 8.20.22.4 2001/08/15 13:05:43 ca Exp $";
16 #endif /* ! lint */
17 
18 #include <sendmail.h>
19 
20 /*
21 **  TtSETUP -- set up for trace package.
22 **
23 **	Parameters:
24 **		vect -- pointer to trace vector.
25 **		size -- number of flags in trace vector.
26 **		defflags -- flags to set if no value given.
27 **
28 **	Returns:
29 **		none
30 **
31 **	Side Effects:
32 **		environment is set up.
33 */
34 
35 static u_char	*tTvect;
36 static int	tTsize;
37 static char	*DefFlags;
38 
39 void
40 tTsetup(vect, size, defflags)
41 	u_char *vect;
42 	int size;
43 	char *defflags;
44 {
45 	tTvect = vect;
46 	tTsize = size;
47 	DefFlags = defflags;
48 }
49 /*
50 **  TtFLAG -- process an external trace flag description.
51 **
52 **	Parameters:
53 **		s -- the trace flag.
54 **
55 **	Returns:
56 **		none.
57 **
58 **	Side Effects:
59 **		sets/clears trace flags.
60 */
61 
62 void
63 tTflag(s)
64 	register char *s;
65 {
66 	unsigned int first, last;
67 	register unsigned int i;
68 
69 	if (*s == '\0')
70 		s = DefFlags;
71 
72 	for (;;)
73 	{
74 		/* find first flag to set */
75 		i = 0;
76 		while (isascii(*s) && isdigit(*s) && i < tTsize)
77 			i = i * 10 + (*s++ - '0');
78 
79 		/*
80 		**  skip over rest of a too large number
81 		**  Maybe we should complain if out-of-bounds values are used.
82 		*/
83 
84 		while (isascii(*s) && isdigit(*s) && i >= tTsize)
85 			s++;
86 		first = i;
87 
88 		/* find last flag to set */
89 		if (*s == '-')
90 		{
91 			i = 0;
92 			while (isascii(*++s) && isdigit(*s) && i < tTsize)
93 				i = i * 10 + (*s - '0');
94 
95 			/* skip over rest of a too large number */
96 			while (isascii(*s) && isdigit(*s) && i >= tTsize)
97 				s++;
98 		}
99 		last = i;
100 
101 		/* find the level to set it to */
102 		i = 1;
103 		if (*s == '.')
104 		{
105 			i = 0;
106 			while (isascii(*++s) && isdigit(*s))
107 				i = i * 10 + (*s - '0');
108 		}
109 
110 		/* clean up args */
111 		if (first >= tTsize)
112 			first = tTsize - 1;
113 		if (last >= tTsize)
114 			last = tTsize - 1;
115 
116 		/* set the flags */
117 		while (first <= last)
118 			tTvect[first++] = i;
119 
120 		/* more arguments? */
121 		if (*s++ == '\0')
122 			return;
123 	}
124 }
125