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 )
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 )
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)
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)
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 )
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 )
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)
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 | }