modules/er/er_print.c
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- er_print_format
- er_print_one_path_descr
- er_print_aspmask
- er_print_facmask
- er_print_one_filter
- er_print_one_path
- er_print_paths
1 /***************************************
2 $Revision: 1.2 $
3
4 Error reporting (er) er_print.c - routines to print the currently registered
5 paths and filters in a syntax compliant
6 to the one of the interpreter.
7
8 Status: NOT REVUED, PARTLY TESTED
9
10 Design and implementation by: Marek Bukowy
11
12 ******************/ /******************
13 Copyright (c) 1999,2000 RIPE NCC
14
15 All Rights Reserved
16
17 Permission to use, copy, modify, and distribute this software and its
18 documentation for any purpose and without fee is hereby granted,
19 provided that the above copyright notice appear in all copies and that
20 both that copyright notice and this permission notice appear in
21 supporting documentation, and that the name of the author not be
22 used in advertising or publicity pertaining to distribution of the
23 software without specific, written prior permission.
24
25 THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
26 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
27 AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
28 DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
29 AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
30 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
31 ***************************************/
32
33 #include "memwrap.h"
34 #include "erroutines.h"
35
36 #include "er_paths.h"
37 #include "er_arrays.h"
38
39 #include "sk.h"
40 /**************** PRINTING PATHS ********************************************/
41 static
42 void er_print_format(int format, GString *g_reply )
/* [<][>][^][v][top][bottom][index][help] */
43 {
44 int i;
45
46 for(i=0; er_formarr[i].n != NULL; i++) {
47 if( format & er_formarr[i].v ) {
48 g_string_sprintfa(g_reply, "%s|",er_formarr[i].n);
49 }
50 }
51 /* cut the last "|" */
52 g_string_truncate(g_reply, (int) strlen(g_reply->str)-1);
53 }
54
55
56 static
57 void er_print_one_path_descr(er_path_t *pathptr, GString *g_reply )
/* [<][>][^][v][top][bottom][index][help] */
58 {
59 er_path_descr_t *d = &(pathptr->descr);
60
61 switch(pathptr->type) {
62 case ER_PATH_NAME:
63 g_string_sprintfa(g_reply, "NAME %s%s", d->name.filename,
64 d->name.date ? " DATE" : ""
65 );
66 break;
67 case ER_PATH_SOCK:
68 g_string_sprintfa(g_reply, "SOCK %d", d->sock.fd );
69
70 break;
71
72 case ER_PATH_EXEC:
73 g_string_sprintfa(g_reply, "EXEC ");
74 if( d->exec.usepath ) {
75 g_string_sprintfa(g_reply, "PATH ");
76 }
77 {
78 char **argv = d->exec.argv;
79 int len=0;
80
81 if( argv != NULL ) {
82 while( argv[len] != NULL ) {
83 g_string_sprintfa(g_reply, "%s ", argv[len]);
84 len++;
85 }
86 }
87 }
88 break;
89
90 default:
91 /* XXX other path descriptions missing */
92 break;
93 }
94 }
95
96 static
97 void er_print_aspmask(mask_t facmask, unsigned aspmask, GString *g_reply)
/* [<][>][^][v][top][bottom][index][help] */
98 {
99 int i = 31;
100
101 while(i >= 0) {
102 if( aspmask & (1<<i) ) {
103 er_getaspsym(facmask, 1<<i, g_reply);
104 g_string_append(g_reply, "|");
105 }
106
107 i--;
108 }
109 /* cut the last "|" */
110 g_string_truncate(g_reply, (int) strlen(g_reply->str)-1);
111 }
112
113 static
114 void er_print_facmask(mask_t facmask, GString *g_reply)
/* [<][>][^][v][top][bottom][index][help] */
115 {
116 int i = FAC_NONE;
117
118 while( ++i != FAC_LAST ) {
119 if( MA_isset(facmask, er_fac_err[i].code) ) {
120 g_string_sprintfa(g_reply, "%s|", er_fac_err[i].name);
121 }
122 }
123 /* cut the last "|" */
124 g_string_truncate(g_reply, (int) strlen(g_reply->str)-1);
125
126 }
127
128 static
129 void er_print_one_filter(er_filter_t *filtptr, GString *g_reply )
/* [<][>][^][v][top][bottom][index][help] */
130 {
131 g_string_sprintfa(g_reply, "( FAC ");
132 er_print_facmask( filtptr->fac_mask, g_reply);
133
134 if( filtptr->asp_mask != 0 ) {
135 g_string_sprintfa(g_reply, " ASP ");
136 er_print_aspmask( filtptr->fac_mask, filtptr->asp_mask, g_reply);
137 }
138
139 g_string_sprintfa(g_reply, " SEV %s-%s ",
140 er_getsevsym( filtptr->sev_min, ER_M_SEVCHAR),
141 er_getsevsym( filtptr->sev_max, ER_M_SEVCHAR)
142 );
143 if( filtptr->thr_id != 0 ) {
144 g_string_sprintfa(g_reply, " THR %u ", filtptr->thr_id);
145 }
146 g_string_sprintfa(g_reply, " )" );
147 }
148
149 static
150 void er_print_one_path(er_path_t *pathptr, GString *g_reply )
/* [<][>][^][v][top][bottom][index][help] */
151 {
152 GList *qitem;
153 int f=1;
154
155 g_string_sprintfa(g_reply,"%s { ", pathptr->name );
156 g_string_sprintfa(g_reply," FORMAT ");
157 er_print_format(pathptr->format, g_reply );
158 g_string_sprintfa(g_reply," ");
159
160 er_print_one_path_descr(pathptr, g_reply);
161 g_string_sprintfa(g_reply," }\n");
162
163 for(qitem = g_list_first(pathptr->filters);
164 qitem != NULL;
165 qitem = g_list_next(qitem)) {
166 er_filter_t *filtptr = (er_filter_t *) qitem -> data;
167
168 g_string_sprintfa(g_reply,"\t");
169 er_print_one_filter(filtptr, g_reply) ;
170 g_string_sprintfa(g_reply,"\n");
171 f++;
172 }
173
174 }
175
176 void er_print_paths(char **retbuf)
/* [<][>][^][v][top][bottom][index][help] */
177 {
178 GList *qitem;
179 GString *g_reply = g_string_sized_new(2048); /* initial size */
180
181 for( qitem = g_list_first(er_pathlist);
182 qitem != NULL;
183 qitem = g_list_next(qitem)) {
184 er_path_t *pathptr = qitem -> data;
185
186 /* g_string_sprintfa(g_reply, "path type %d (%s) with %d filters\n",
187 pathptr->type, er_pathtypes[pathptr->type],
188 g_list_length(pathptr->filters));
189 */
190 er_print_one_path(pathptr, g_reply);
191
192 }
193
194 *retbuf = g_reply->str;
195
196 g_string_free( g_reply, /* CONSTCOND */ FALSE);
197 }