On Wed, 2008-06-04 at 22:06 +0200, Bernhard Fischer wrote:
> On Wed, Jun 04, 2008 at 08:29:56PM +0200, Natanael Copa wrote:
> > Hi,
> >
> > Attatched is a patch for the LOWER_UP flag in 'ip link/addr' output.  
> > Useful to check if network cable is inserted or not.
> >
> > The code does an ugly ifdef to check if IFF_LOWER_UP is declared or not.  
> > On my zenwalk desktop it was not. It looks like iproute2 maintain their  
> > own copies of the linux headers so I suppose we cannot expect the flag  
> > be there. (should mabe be in one of the include files rather than in the  
> > .c file?)
> >
> > The patch does increase the size a bit due to a macro. Maybe should have  
> > a config option for it?
> 
> no config, no.
> 
> I was about to apply it but looking at the macro i'd be curious if we
> have more occurances of the 
> if (foo & flag)
>       emit(#flag)
> pattern so we should provide something like the reversed form of
> index_in_strings() like string_in_index(int state) that emits the
> corresponding string?

maybe string_in_mask()/string_in_flags()?


> Could you try that and convert some users to that scheme? I'd be
> surprised if this would not be an overall win.

I think that we maybe want something like this:

struct mask_string {
        int mask;
        const char *string;
}       

void print_flags(struct mask_string* ms, int flags, const char *separator)
{
        int need_separator = 0;
        while (ms) {
                if (flags, ms->mask) {
                        printf("%s%s", need_separator ? separator : "",
                                ms->string)
                        need_separator = 1;
                }
                ms++;   
        }
}



I checked and atleast the following files would benefit from something like 
that:

./miscutils/hdparm.c:1231:              if (id->eide_pio_modes & 1) 
printf("pio3 ");
...

./networking/arp.c:336: if (arp_flags & ATF_PERM)
./networking/arp.c:337:         printf("PERM ");
./networking/arp.c:338: if (arp_flags & ATF_PUBL)
./networking/arp.c:339:         printf("PUP ");
...

./util-linux/fdisk_osf.c:517:           if (lp->d_flags & BSD_D_REMOVABLE)
./util-linux/fdisk_osf.c:518:                   printf(" removable");
./util-linux/fdisk_osf.c:519:           if (lp->d_flags & BSD_D_ECC)
./util-linux/fdisk_osf.c:520:                   printf(" ecc");
...

-nc

_______________________________________________
busybox mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/busybox

Reply via email to