#include #include #include typedef struct Map Map; struct Map { char *oid; char *path; }; static int used; static int alloc; static Map *Maptab; /* bsearch lifted from /sys/src/ape/lib/ap/gen/bsearch.c */ void* bsearch(void* key, const void* base, int nmemb, int size, int (*compar)(void*, void*)) { long i, bot, top, new; void *p; bot = 0; top = bot + nmemb - 1; while(bot <= top){ new = (top + bot)/2; p = (char *)base+new*size; i = (*compar)(key, p); if(i == 0) return p; if(i > 0) bot = new + 1; else top = new - 1; } return 0; } static int mapcmp(void *a, void *b) { return strcmp(((Map *)a)->oid, ((Map *)b)->oid); } int load1map(char *fn) { Biobuf *bp; char *line, *arr[3]; if((bp = Bopen(fn, OREAD)) == nil) return -1; while((line = Brdline(bp, '\n')) != nil){ line[Blinelen(bp)-1] = 0; if(tokenize(line, arr, nelem(arr)) < 2) continue; if(*arr[0] == '#') continue; if(used >= alloc){ alloc += 64; if((Maptab = realloc(Maptab, alloc*sizeof(Map))) == nil) sysfatal("No memory\n"); } Maptab[used].oid = strdup(arr[0]); if(Maptab[used].oid == nil) sysfatal("No memory - %r\n"); Maptab[used].path = strdup(arr[1]); if(Maptab[used].path == nil) sysfatal("No memory - %r\n"); used++; } Bterm(bp); qsort(Maptab, used, sizeof(Map), mapcmp); return 0; } void loadmap(void) { Dir *d; char *p, *fn; int fd, n, i; char *mapdir = "/lib/snmp"; if((fd = open(mapdir, OREAD)) == -1){ fprint(2, "%s: warning: %s cannot open directory - %r\n", mapdir, argv0); return; } n = dirreadall(fd, &d); close(fd); for(i = 0; i < n; i++){ if((p = strrchr(d[i].name, '.')) == nil) continue; if(strcmp(p, ".map") == 0){ fn = smprint("%s/%s", mapdir, d[i].name); if(load1map(fn) < 0) fprint(2, "%s: warning: %s cannot open file - %r\n", argv0, fn); free(fn); } } free(d); } char * lookmap(char *oid) { Map m, *mp; m.oid = oid; mp = bsearch(&m, Maptab, used, sizeof(Map), mapcmp); if(mp == nil) return nil; return mp->path; }