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 <ctype.h>

Biobuf in;
Biobuf out;

enum
{
        Empty,
        Sys,
        Dk,
        Ip,
        Domain,
};

int
iscomment(char *name)
{
        return *name == '#';
}

/*
 *  is this a fully specified datakit name?
 */
int
isdk(char *name)
{
        int slash;

        slash = 0;
        for(; *name; name++){
                if(isalnum(*name))
                        continue;
                if(*name == '/'){
                        slash = 1;
                        continue;
                }
                return 0;
        }
        return slash;
}

/*
 *  Is this an internet domain name?
 */
int
isdomain(char *name)
{
        int dot = 0;
        int alpha = 0;

        for(; *name; name++){
                if(isalpha(*name) || *name == '-'){
                        alpha = 1;
                        continue;
                }
                if(*name == '.'){
                        dot = 1;
                        continue;
                }
                if(isdigit(*name))
                        continue;
                return 0;
        }
        return dot && alpha;
}

/*
 *  is this an ip address?
 */
int
isip(char *name)
{
        int dot = 0;

        for(; *name; name++){
                if(*name == '.'){
                        dot = 1;
                        continue;
                }
                if(isdigit(*name))
                        continue;
                return 0;
        }
        return dot;
}

char tup[64][64];
int ttype[64];
int ntup;

void
tprint(void)
{
        int i, tab;
        char *p;

        tab = 0;
        for(i = 0; i < ntup; i++){
                if(ttype[i] == Sys){
                        Bprint(&out, "sys = %s\n", tup[i]);
                        tab = 1;
                        ttype[i] = Empty;
                        break;
                }
        }
        for(i = 0; i < ntup; i++){
                if(ttype[i] == Empty)
                        continue;
                if(tab)
                        Bprint(&out, "\t");
                tab = 1;

                switch(ttype[i]){
                case Domain:
                        Bprint(&out, "dom=%s\n", tup[i]);
                        break;
                case Ip:
                        Bprint(&out, "ip=%s\n", tup[i]);
                        break;
                case Dk:
                        p = strrchr(tup[i], '/');
                        if(p){
                                p++;
                                if((*p == 'C' || *p == 'R')
                                && strncmp(tup[i], "nj/astro/", p-tup[i]) == 0)
                                        Bprint(&out, "flavor=console ");
                        }
                        Bprint(&out, "dk=%s\n", tup[i]);
                        break;
                case Sys:
                        Bprint(&out, "sys=%s\n", tup[i]);
                        break;
                }
        }
}

#define NFIELDS 64

/*
 *  make a database file from a merged uucp/inet database
 */
void
main(void)
{
        int n, i, j;
        char *l;
        char *fields[NFIELDS];
        int ftype[NFIELDS];
        int same, match;

        Binit(&in, 0, OREAD);
        Binit(&out, 1, OWRITE);
        ntup = 0;
        while(l = Brdline(&in, '\n')){
                l[Blinelen(&in)-1] = 0;
                n = getfields(l, fields, NFIELDS, 1, " \t");
                same = 0;
                for(i = 0; i < n; i++){
                        if(iscomment(fields[i])){
                                n = i;
                                break;
                        }
                        if(isdomain(fields[i])){
                                ftype[i] = Domain;
                                for(j = 0; j < ntup; j++)
                                        if(ttype[j] == Domain && strcmp(fields[i], tup[j]) == 0){
                                                same = 1;
                                                ftype[i] = Empty;
                                                break;
                                        }
                        } else if(isip(fields[i]))
                                ftype[i] = Ip;
                        else if(isdk(fields[i]))
                                ftype[i] = Dk;
                        else
                                ftype[i] = Sys;
                }
                if(!same && ntup){
                        tprint();
                        ntup = 0;
                }
                for(i = 0; i < n; i++){
                        match = 0;
                        for(j = 0; j < ntup; j++){
                                if(ftype[i] == ttype[j] && strcmp(fields[i], tup[j]) == 0){
                                        match = 1;
                                        break;
                                }
                        }
                        if(!match){
                                ttype[ntup] = ftype[i];
                                strcpy(tup[ntup], fields[i]);
                                ntup++;
                        }
                }
        }
        if(ntup)
                tprint();
        exits(0);
}