#include <u.h>
#include <libc.h>
#include <bio.h>
#include <ndb.h>
#include "ndbutil.h"
enum {
Get,
GetNext,
Walk,
Bulk,
Set,
Rocomm,
Rwcomm,
Version,
Retries,
Nrep,
Maxrep,
Oid,
Setval,
Timeout
};
char *configtab[] = {
[Get] "get",
[GetNext] "getnext",
[Walk] "walk",
[Bulk] "bulk",
[Set] "set",
[Rocomm] "rocomm",
[Rwcomm] "rwcomm",
[Version] "version",
[Retries] "retries",
[Nrep] "nrep",
[Maxrep] "maxrep",
[Oid] "oid",
[Setval] "setval",
[Timeout] "timeout"
};
/* we expect op is defined just after each oid */
/* if not defined, we defaults to Get */
int
ndbgetop(char *sys, char *oid) {
Ndbtuple *t, *nt;
int op;
t = ndbsearch(NDB, &s, "sys", sys);
if(t){
for(nt = t; nt; nt = nt->entry) {
if ( strlen(nt->val) == strlen(oid) && strncmp(nt->val,oid,strlen(oid)) == 0 ) {
if ( nt = nt->entry ) {
if ( strncmp(nt->attr,"op",2) == 0 ) {
for(op=Get;op<Rocomm;op++) {
if ( strncmp(nt->val,configtab[op],strlen(configtab[op])) == 0 ) {
ndbfree(t);
return op;
}
}
} else {
ndbfree(t);
return GetNext;
}
}
}
}
/* if there is no oid in ndb, try GetNext by default */
/* this is done to be able to create arbitrary files without ndb */
ndbfree(t);
return GetNext;
}
/* sys not found - return valid pdu to be able to use */
/* hosts that are not in ndb - for testing purposes */
return GetNext;
}
/*just takes the first match */
char*
ndbget(char *host, char *attr) {
Ndbtuple *t;
char *buff = nil;
t = ndbipinfo(NDB, "sys", host, &attr, 1);
if ( t != nil )
buff = strdup(t->val);
ndbfree(t);
return buff;
}
int
isoid(char *s)
{
char *f[1];
int n;
char *aux;
aux = strdup(s);
n = getfields(aux, f, 1, 0, ".");
if ( n < 0 || atoi(f[0]) < 1 ) {
free(aux);
return 0;
}
free(aux);
return 1;
}
/* translate a name to an oid */
/* if it doesn't found the entry in NDB file */
/* returns a copy of the string *s */
char*
resolve(char *str)
{
Ndbs s;
char *buff;
buff = ndbgetvalue(NDB, &s, "name", str, "oid", nil);
if ( buff != nil )
return buff;
else {
if (isoid(str))
return strdup(str);
else
return nil;
}
}
|