validate_uuid: absorb the rest of parse_uuid with a flags arg
This makes the naming annoyance (validate_uuid vs. parse_uuid) less of an issue and centralizes all of the functionality into the new KPI while still making the extra validation optional. The end-result is all the same as far as hostuuid validation-only goes.
This commit is contained in:
parent
bfe26b9707
commit
3fb92d4cb1
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=359980
@ -382,13 +382,21 @@ be_uuid_dec(void const *buf, struct uuid *uuid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
validate_uuid(const char *str, size_t size, struct uuid *uuid)
|
validate_uuid(const char *str, size_t size, struct uuid *uuid, int flags)
|
||||||
{
|
{
|
||||||
u_int c[11];
|
u_int c[11];
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
if (size == 0 || *str == '\0')
|
if (size == 0 || *str == '\0') {
|
||||||
|
/* An empty string may represent a nil UUID. */
|
||||||
|
if ((flags & VUUIDF_EMPTYOK) != 0) {
|
||||||
|
if (uuid != NULL)
|
||||||
|
bzero(uuid, sizeof(*uuid));
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
return (EINVAL);
|
return (EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
/* The UUID string representation has a fixed length. */
|
/* The UUID string representation has a fixed length. */
|
||||||
if (size != 36)
|
if (size != 36)
|
||||||
@ -421,30 +429,21 @@ validate_uuid(const char *str, size_t size, struct uuid *uuid)
|
|||||||
uuid->node[n] = c[n + 5];
|
uuid->node[n] = c[n + 5];
|
||||||
}
|
}
|
||||||
|
|
||||||
return (0);
|
if ((flags & VUUIDF_CHECKSEMANTICS) == 0)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
return (((c[3] & 0x80) != 0x00 && /* variant 0? */
|
||||||
|
(c[3] & 0xc0) != 0x80 && /* variant 1? */
|
||||||
|
(c[3] & 0xe0) != 0xc0) ? EINVAL : 0); /* variant 2? */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define VUUIDF_PARSEFLAGS (VUUIDF_EMPTYOK | VUUIDF_CHECKSEMANTICS)
|
||||||
|
|
||||||
int
|
int
|
||||||
parse_uuid(const char *str, struct uuid *uuid)
|
parse_uuid(const char *str, struct uuid *uuid)
|
||||||
{
|
{
|
||||||
unsigned int clock_seq;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
/* An empty string represents a nil UUID. */
|
return (validate_uuid(str, strlen(str), uuid, VUUIDF_PARSEFLAGS));
|
||||||
if (*str == '\0') {
|
|
||||||
bzero(uuid, sizeof(*uuid));
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = validate_uuid(str, strlen(str), uuid);
|
|
||||||
if (ret != 0)
|
|
||||||
return (ret);
|
|
||||||
|
|
||||||
/* Check semantics... */
|
|
||||||
clock_seq = uuid->clock_seq_hi_and_reserved;
|
|
||||||
return (((clock_seq & 0x80) != 0x00 && /* variant 0? */
|
|
||||||
(clock_seq & 0xc0) != 0x80 && /* variant 1? */
|
|
||||||
(clock_seq & 0xe0) != 0xc0) ? EINVAL : 0); /* variant 2? */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -68,20 +68,18 @@ int printf_uuid(struct uuid *);
|
|||||||
int sbuf_printf_uuid(struct sbuf *, struct uuid *);
|
int sbuf_printf_uuid(struct sbuf *, struct uuid *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* There are a few key differences between validate_uuid and parse_uuid:
|
* validate_uuid will, with no flags passed, validate only the format of the
|
||||||
*
|
* passed in UUID. Flags below are available to give it part of or all of the
|
||||||
* - The struct uuid * parameter to validate_uuid is optional, so the caller
|
* functionality that parse_uuid has traditionally had: acknowledging an empty
|
||||||
* can simply validate UUID format without doing anything with the result.
|
* string as valid, and checking the semantics of the UUID as well.
|
||||||
* - validate_uuid will not pass an empty string as a valid UUID, as it doesn't
|
|
||||||
* strictly meet the formatting requirements. parse_uuid will accept an
|
|
||||||
* empty string and zero out the uuid struct accordingly.
|
|
||||||
* - parse_uuid does additional semantic checks on clock_seq_hi_and_reserved
|
|
||||||
* that validate_uuid will not do.
|
|
||||||
*
|
|
||||||
* validate_uuid is intended to strictly check that it's a well-formed uuid.
|
|
||||||
*/
|
*/
|
||||||
int validate_uuid(const char *, size_t, struct uuid *);
|
int validate_uuid(const char *, size_t, struct uuid *, int);
|
||||||
int parse_uuid(const char *, struct uuid *);
|
int parse_uuid(const char *, struct uuid *);
|
||||||
|
|
||||||
|
/* Flags to validate_uuid(). */
|
||||||
|
#define VUUIDF_EMPTYOK 0x0001
|
||||||
|
#define VUUIDF_CHECKSEMANTICS 0x0002
|
||||||
|
|
||||||
int uuidcmp(const struct uuid *, const struct uuid *);
|
int uuidcmp(const struct uuid *, const struct uuid *);
|
||||||
|
|
||||||
void be_uuid_dec(void const *buf, struct uuid *uuid);
|
void be_uuid_dec(void const *buf, struct uuid *uuid);
|
||||||
|
Loading…
Reference in New Issue
Block a user