Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <u.h>
#include <libc.h>
#include <bio.h>
#include <ndb.h>
#include <ndbhf.h>

/*
 *  look up the ip attributes 'list' for an entry that has the
 *  given 'attr=val' and a 'ip=' tuples.
 *
 *  return nil if not found.
 */
Ndbtuple*
csipinfo(char *netroot, char *attr, char *val, char **list, int n)
{
        Ndbtuple *t, *first, *last;
        int i;
        char line[1024];
        int fd;
        char *p, *e;

        if(netroot)
                snprint(line, sizeof(line), "%s/cs", netroot);
        else
                strcpy(line, "/net/cs");
        fd = open(line, ORDWR);
        if(fd < 0)
                return 0;
        seek(fd, 0, 0);
        e = line + sizeof(line);
        p = seprint(line, e, "!ipinfo %s=%s", attr, val);
        for(i = 0; i < n; i++){
                if(*list == nil)
                        break;
                p = seprint(p, e, " %s", *list++);
        }
        
        if(write(fd, line, strlen(line)) < 0){
                close(fd);
                return 0;
        }
        seek(fd, 0, 0);

        first = last = 0;
        for(;;){
                n = read(fd, line, sizeof(line)-2);
                if(n <= 0)
                        break;
                line[n] = '\n';
                line[n+1] = 0;

                t = _ndbparseline(line);
                if(t == 0)
                        continue;
                if(first)
                        last->entry = t;
                else
                        first = t;
                last = t;

                while(last->entry)
                        last = last->entry;
        }
        close(fd);

        ndbsetmalloctag(first, getcallerpc(&netroot));
        return first;
}