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