Source File er/er_print.c

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