diff options
Diffstat (limited to 'kerberosIV/krb/krb_equiv.c')
-rw-r--r-- | kerberosIV/krb/krb_equiv.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/kerberosIV/krb/krb_equiv.c b/kerberosIV/krb/krb_equiv.c new file mode 100644 index 00000000000..0cc13a61a84 --- /dev/null +++ b/kerberosIV/krb/krb_equiv.c @@ -0,0 +1,80 @@ +/* + * int krb_equiv(u_int32_t ipaddr_a, u_int32_t ipaddr_b); + * + * Given two IP adresses return true if they match + * or are considered to belong to the same host. + * + * For example if /etc/krb.equiv looks like + * + * 130.237.223.3 192.16.126.3 # alv alv1 + * 130.237.223.4 192.16.126.4 # byse byse1 + * 130.237.228.152 192.16.126.9 # topsy topsy1 + * + * krb_equiv(alv, alv1) would return true but + * krb_equiv(alv, byse1) would not. + * + * A comment starts with an '#' and ends with '\n'. + * + */ +#include "krb_locl.h" + +int +krb_equiv(a, b) + u_int32_t a; + u_int32_t b; +{ +#ifdef NO_IPADDR_CHECK + return 1; +#else + + FILE *fil; + int result = 0; + char line[256]; + + if (a == b) /* trivial match */ + return 1; + + fil = fopen(KRB_EQUIV, "r"); + if (fil == NULL) /* open failed */ + return 0; + + while (fgets(line, sizeof(line)-1, fil) != NULL) /* for each line */ + { + int hit_a = 0, hit_b = 0; + char *t = line; + + /* for each item on this line */ + while (*t != 0) /* more addresses on this line? */ + if (*t == '#') /* rest is comment */ + *t = 0; + else if (isspace(*t)) /* skip space */ + t++; + else if (isdigit(*t)) /* an address? */ + { + u_int32_t tmp = inet_addr(t); + if (tmp == -1) + ; /* not an address (or broadcast) */ + else if (tmp == a) + hit_a = 1; + else if (tmp == b) + hit_b = 1; + + while (*t == '.' || isdigit(*t)) /* done with this address */ + t++; + } + else + *t = 0; /* garbage on this line, skip it */ + + /* line is now parsed, if we found 2 matches were done */ + if (hit_a && hit_b) + { + result = 1; + goto done; + } + } + + done: + fclose(fil); + return result; +#endif /* !NO_IPADDR_CHECK */ +} |