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.5 $
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,2001,2002 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 "rip.h"
34
35 /**************** PRINTING PATHS ********************************************/
36 static
37 void er_print_format(int format, GString *g_reply )
/* [<][>][^][v][top][bottom][index][help] */
38 {
39 int i;
40
41 for(i=0; er_formarr[i].n != NULL; i++) {
42 if( format & er_formarr[i].v ) {
43 g_string_sprintfa(g_reply, "%s|",er_formarr[i].n);
44 }
45 }
46 /* cut the last "|" */
47 g_string_truncate(g_reply, (int) strlen(g_reply->str)-1);
48 }
49
50
51 static
52 void er_print_one_path_descr(er_path_t *pathptr, GString *g_reply )
/* [<][>][^][v][top][bottom][index][help] */
53 {
54 er_path_descr_t *d = &(pathptr->descr);
55
56 switch(pathptr->type) {
57 case ER_PATH_NAME:
58 g_string_sprintfa(g_reply, "NAME %s%s", d->name.filename,
59 d->name.date ? " DATE" : ""
60 );
61 break;
62 case ER_PATH_SOCK:
63 g_string_sprintfa(g_reply, "SOCK %d", d->sock.fd );
64
65 break;
66
67 case ER_PATH_EXEC:
68 g_string_sprintfa(g_reply, "EXEC ");
69 if( d->exec.usepath ) {
70 g_string_sprintfa(g_reply, "PATH ");
71 }
72 {
73 char **argv = d->exec.argv;
74 int len=0;
75
76 if( argv != NULL ) {
77 while( argv[len] != NULL ) {
78 g_string_sprintfa(g_reply, "%s ", argv[len]);
79 len++;
80 }
81 }
82 }
83 break;
84
85 default:
86 /* XXX other path descriptions missing */
87 break;
88 }
89 }
90
91 static
92 void er_print_aspmask(mask_t facmask, unsigned aspmask, GString *g_reply)
/* [<][>][^][v][top][bottom][index][help] */
93 {
94 int i = 31;
95
96 while(i >= 0) {
97 if( aspmask & (1<<i) ) {
98 er_getaspsym(facmask, 1<<i, g_reply);
99 g_string_append(g_reply, "|");
100 }
101
102 i--;
103 }
104 /* cut the last "|" */
105 g_string_truncate(g_reply, (int) strlen(g_reply->str)-1);
106 }
107
108 static
109 void er_print_facmask(mask_t facmask, GString *g_reply)
/* [<][>][^][v][top][bottom][index][help] */
110 {
111 int i = FAC_NONE;
112
113 while( ++i != FAC_LAST ) {
114 if( MA_isset(facmask, er_fac_err[i].code) ) {
115 g_string_sprintfa(g_reply, "%s|", er_fac_err[i].name);
116 }
117 }
118 /* cut the last "|" */
119 g_string_truncate(g_reply, (int) strlen(g_reply->str)-1);
120
121 }
122
123 static
124 void er_print_one_filter(er_filter_t *filtptr, GString *g_reply )
/* [<][>][^][v][top][bottom][index][help] */
125 {
126 g_string_sprintfa(g_reply, "( FAC ");
127 er_print_facmask( filtptr->fac_mask, g_reply);
128
129 if( filtptr->asp_mask != 0 ) {
130 g_string_sprintfa(g_reply, " ASP ");
131 er_print_aspmask( filtptr->fac_mask, filtptr->asp_mask, g_reply);
132 }
133
134 g_string_sprintfa(g_reply, " SEV %s-%s ",
135 er_getsevsym( filtptr->sev_min, ER_M_SEVCHAR),
136 er_getsevsym( filtptr->sev_max, ER_M_SEVCHAR)
137 );
138 if( filtptr->thr_id != 0 ) {
139 g_string_sprintfa(g_reply, " THR %lu ", (long unsigned)filtptr->thr_id);
140 }
141 g_string_sprintfa(g_reply, " )" );
142 }
143
144 static
145 void er_print_one_path(er_path_t *pathptr, GString *g_reply )
/* [<][>][^][v][top][bottom][index][help] */
146 {
147 GList *qitem;
148 int f=1;
149
150 g_string_sprintfa(g_reply,"%s { ", pathptr->name );
151 g_string_sprintfa(g_reply," FORMAT ");
152 er_print_format(pathptr->format, g_reply );
153 g_string_sprintfa(g_reply," ");
154
155 er_print_one_path_descr(pathptr, g_reply);
156 g_string_sprintfa(g_reply," }\n");
157
158 for(qitem = g_list_first(pathptr->filters);
159 qitem != NULL;
160 qitem = g_list_next(qitem)) {
161 er_filter_t *filtptr = (er_filter_t *) qitem -> data;
162
163 g_string_sprintfa(g_reply,"\t");
164 er_print_one_filter(filtptr, g_reply) ;
165 g_string_sprintfa(g_reply,"\n");
166 f++;
167 }
168
169 }
170
171 void er_print_paths(char **retbuf)
/* [<][>][^][v][top][bottom][index][help] */
172 {
173 GList *qitem;
174 GString *g_reply = g_string_sized_new(2048); /* initial size */
175
176 for( qitem = g_list_first(er_pathlist);
177 qitem != NULL;
178 qitem = g_list_next(qitem)) {
179 er_path_t *pathptr = qitem -> data;
180
181 /* g_string_sprintfa(g_reply, "path type %d (%s) with %d filters\n",
182 pathptr->type, er_pathtypes[pathptr->type],
183 g_list_length(pathptr->filters));
184 */
185 er_print_one_path(pathptr, g_reply);
186
187 }
188
189 *retbuf = g_reply->str;
190
191 g_string_free( g_reply, /* CONSTCOND */ FALSE);
192 }