Ethereal-dev: Re: [Ethereal-dev] tap-protocolinfo fustration...
I think option2 would be the best solution.
Lets just add it in case it was missing.
Can you change the code so that there is a function call that adds it to the
filter string if it is missing
like add_field_to_filter_if_it_is_missing(filter, field)
because this would be useful in both gui and tethereal versions of iostat as
well
and would be useful also when a gui version of proto,colinfo is written.
----- Original Message -----
From: "Jason House"
Sent: Friday, May 02, 2003 2:02 AM
Subject: [Ethereal-dev] tap-protocolinfo fustration...
> Ok, I tried to use tap-protocolinfo this morning... It seems that each
> time I go to use it after not using it for a while, I use it
> incorrectly...
>
> The format:
> -z proto,colinfo,<filter>,<field>
>
> What I did this morning:
> -z proto,colinfo,ip,ip.len
>
> I forgot about the implementation detail that the filter must include
> the field... -z proto,colinfo,ip.len,ip.len
>
> This isn't truly required in that there could be some other filter that
> has registered the required field for caching...
>
> The question comes down to, should the user be trusted to take advantage
> of this special case?
>
> Yes: tap-protocolinfo.c.diff (attached) will warn the user who leaves
> out the field that they should ensure that it is supplied somewhere.
>
> No: tap-protocolinfo.c.diff2 (attached) will automatically add the field
> to the filter expression if the user did not include it in the filter
> (or had no filter at all)...
----------------------------------------------------------------------------
----
> Index: tap-protocolinfo.c
> ===================================================================
> RCS file: /cvsroot/ethereal/tap-protocolinfo.c,v
> retrieving revision 1.3
> diff -u -r1.3 tap-protocolinfo.c
> --- tap-protocolinfo.c 23 Apr 2003 08:20:01 -0000 1.3
> +++ tap-protocolinfo.c 1 May 2003 15:49:39 -0000
> @@ -100,11 +100,23 @@
> rs=g_malloc(sizeof(pci_t));
> rs->hf_index=hfi->id;
> if((field-filter)>1){
> - rs->filter=g_malloc(field-filter);
> - strncpy(rs->filter,filter,(field-filter)-1);
> - rs->filter[(field-filter)-1]=0;
> + if (strstr(filter,field) != field){
> + rs->filter=g_malloc(field-filter);
> + strncpy(rs->filter,filter,(field-filter)-1);
> + rs->filter[(field-filter)-1]=0;
> + }
> + else{
> + /* create filter of '(filter)&&field' */
> + rs->filter=g_malloc( (field-filter)+strlen(field)+4 );
> + rs->filter[0] = '(';
> + strncpy(&rs->filter[1],filter,(field-filter)-1);
> + strncpy(&rs->filter[(field-filter)], ")&&", 3);
> + strncpy(&rs->filter[(filed-filter)+3], field, 1+strlen(field));
> + }
> } else {
> - rs->filter=NULL;
> + rs->filter=g_malloc(strlen(field)+1);
> + strncpy(rs->filter,field,strlen(field));
> + rs->filter[strlen(field)]=0;
> }
>
> error_string=register_tap_listener("frame", rs, rs->filter, NULL,
protocolinfo_packet, NULL);
>
----------------------------------------------------------------------------
----
> Index: tap-protocolinfo.c
> ===================================================================
> RCS file: /cvsroot/ethereal/tap-protocolinfo.c,v
> retrieving revision 1.3
> diff -u -r1.3 tap-protocolinfo.c
> --- tap-protocolinfo.c 23 Apr 2003 08:20:01 -0000 1.3
> +++ tap-protocolinfo.c 1 May 2003 15:14:21 -0000
> @@ -99,6 +99,10 @@
>
> rs=g_malloc(sizeof(pci_t));
> rs->hf_index=hfi->id;
> + if (strstr(filter,field)==field){
> + fprintf(stderr, "tethereal: Warning proto,colinfo needs the field '%s'
to occur in a filter. "
> + "It did not occur in the filter you supplied...", field);
> + }
> if((field-filter)>1){
> rs->filter=g_malloc(field-filter);
> strncpy(rs->filter,filter,(field-filter)-1);
>