On 11/07/13 17:48, Otto Moerbeek wrote: > On Thu, Nov 07, 2013 at 11:32:48AM -0500, Ted Unangst wrote: > >> On Thu, Nov 07, 2013 at 17:19, Peter J. Philipp wrote: >> >>>> + gid = getgid(); >>>> + >>>> + if (setgroups(1, &gid) == -1) >>>> + err(1, "setgroups"); >>>> + >>>> + if (setresgid(gid, gid, gid) == -1) >>>> + err(1, "setresgid"); >>>> + >>>> if (setresuid(uid, uid, uid) == -1) >>>> err(1, "setresuid"); >>>> >>> >>> >>> I thought about it and thought my patch didn't really do anything. So >> >> Right. This doesn't do anything. traceroute isn't setgid, it has no >> group privileges to revoke. >> >> >>> /* DiffServ Codepoints and other TOS mappings */ >>> + /* KEEP SORTED */ >>> const struct toskeywords { >>> const char *keyword; >>> int val; >>> @@ -1258,14 +1268,13 @@ map_tos(char *s, int *val) >>> { NULL, -1 }, >>> }; >>> >>> - for (t = toskeywords; t->keyword != NULL; t++) { >>> - if (strcmp(s, t->keyword) == 0) { >>> - *val = t->val; >>> - return (1); >>> - } >>> - } >>> + t = bsearch(s, toskeywords, nitems(toskeywords), sizeof(struct >>> toskeywords), (int (*)(const void *, const void *))strcmp); >> >> I don't like the way this is abusing types. In fact, I don't think this >> even works. Did you test it? A pointer to a struct toskeyword will not >> have the same value as the keyword member. > > The first field of a struct has the same address as the the struct > itself. Still I consider this bad form and overkill. > > -Otto
Hi, while I don't want to persue this patch further, I'd like to say that I finished it on my own, thanks to your input I understand what base in bsearch() is supposed to be now. I had something in mind from qsort() which also has a variable called base in the manpages and that had confused me. I have taken a look how bsearch() in other programs and I have noticed that some are doing it like me but wrap strcmp inside another *cmp where there is a bit of casting being done. I'm wondering if that is the right way? Or if it can be cleaned up? Thanks! -peter