int setup_dsnt(struct query *q, char *argv[], client *cl);
int setup_ahst(struct query *q, char *argv[], client *cl);
int setup_ahal(struct query *q, char *argv[], client *cl);
+int hostname_check(char *name);
/* prototypes from qsupport.pc */
int set_pobox(struct query *q, char *argv[], client *cl);
else
row = 0;
- /* sanity check name: must start with a letter, contain only
- * letters, numerals, and hyphen, and not end with a hyphen.
- */
if (row == 0 || strcasecmp(argv[1], oldname))
{
- char *p = argv[row];
-
- if (!isalpha(*p))
- return MR_BAD_CHAR;
- for (; *p; p++)
- {
- if ((!isalnum(*p) && *p != '-' && *p != '.') ||
- (*p == '-' && p[1] == '.'))
- return MR_BAD_CHAR;
- }
- if (*(p - 1) == '-')
+ if (!hostname_check(argv[row]))
return MR_BAD_CHAR;
}
EXEC SQL END DECLARE SECTION;
char *p;
- p = name = argv[0];
- if (!isalpha(*p))
- return MR_BAD_CHAR;
- for (; *p; p++)
- {
- if ((!isalnum(*p) && *p != '-' && *p != '.') ||
- (*p == '-' && p[1] == '.'))
- return MR_BAD_CHAR;
- }
- if (*(p - 1) == '-')
+ name = argv[0];
+ if (!hostname_check(argv[0]))
return MR_BAD_CHAR;
EXEC SQL SELECT count(mach_id) INTO :cnt FROM machine WHERE
return MR_SUCCESS;
}
+
+/* hostname_check()
+ * validate the rfc1035-ness of a hostname
+ */
+
+int hostname_check(char *name)
+{
+ char *p;
+ int count;
+
+ /* sanity check name: must start with a letter, contain only
+ * letters, numerals, and hyphen, and not end with a hyphen.
+ * also make sure no label (the thing the .s seperate) is longer
+ * than 63 characters.
+ */
+
+ p = name;
+ if (!isalpha(*p))
+ return 0;
+ count = 0;
+ for (; *p; p++)
+ {
+ count++;
+ if ((!isalnum(*p) && *p != '-' && *p != '.') ||
+ (*p == '-' && p[1] == '.'))
+ return 0;
+ if (*p == '.')
+ count = 0;
+ if (count == 64)
+ return 0;
+ }
+ if (*(p - 1) == '-')
+ return 0;
+ return 1;
+}