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