summaryrefslogtreecommitdiff
path: root/kerberosIV/krb/krb_equiv.c
diff options
context:
space:
mode:
Diffstat (limited to 'kerberosIV/krb/krb_equiv.c')
-rw-r--r--kerberosIV/krb/krb_equiv.c80
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 */
+}