mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
f9308648e9
Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abartlet@samba.org>
101 lines
2.0 KiB
C
101 lines
2.0 KiB
C
#include "replace.h"
|
|
#include "libcli/util/ntstatus.h"
|
|
#include "util_str_hex.h"
|
|
|
|
NTSTATUS read_hex_bytes(const char *s, uint hexchars, uint64_t *dest)
|
|
{
|
|
uint64_t x = 0;
|
|
uint i;
|
|
char c;
|
|
|
|
if ((hexchars & 1) || hexchars > 16) {
|
|
return NT_STATUS_INVALID_PARAMETER;
|
|
}
|
|
|
|
for (i = 0; i < hexchars; i++) {
|
|
x <<= 4;
|
|
c = s[i];
|
|
if (c >= '0' && c <= '9') {
|
|
x += c - '0';
|
|
}
|
|
else if (c >= 'a' && c <= 'f') {
|
|
x += c - 'a' + 10;
|
|
}
|
|
else if (c >= 'A' && c <= 'F') {
|
|
x += c - 'A' + 10;
|
|
}
|
|
else {
|
|
/* BAD character (including '\0') */
|
|
return NT_STATUS_INVALID_PARAMETER;
|
|
}
|
|
}
|
|
*dest = x;
|
|
return NT_STATUS_OK;
|
|
}
|
|
|
|
|
|
NTSTATUS parse_guid_string(const char *s,
|
|
uint32_t *time_low,
|
|
uint32_t *time_mid,
|
|
uint32_t *time_hi_and_version,
|
|
uint32_t clock_seq[2],
|
|
uint32_t node[6])
|
|
{
|
|
uint64_t tmp;
|
|
NTSTATUS status;
|
|
int i;
|
|
/* "e12b56b6-0a95-11d1-adbb-00c04fd8d5cd"
|
|
| | | | |
|
|
| | | | \ node[6]
|
|
| | | \_____ clock_seq[2]
|
|
| | \__________ time_hi_and_version
|
|
| \_______________ time_mid
|
|
\_____________________ time_low
|
|
*/
|
|
status = read_hex_bytes(s, 8, &tmp);
|
|
if (!NT_STATUS_IS_OK(status) || s[8] != '-') {
|
|
return NT_STATUS_INVALID_PARAMETER;
|
|
}
|
|
*time_low = tmp;
|
|
s += 9;
|
|
|
|
status = read_hex_bytes(s, 4, &tmp);
|
|
if (!NT_STATUS_IS_OK(status) || s[4] != '-') {
|
|
return NT_STATUS_INVALID_PARAMETER;
|
|
}
|
|
*time_mid = tmp;
|
|
s += 5;
|
|
|
|
status = read_hex_bytes(s, 4, &tmp);
|
|
if (!NT_STATUS_IS_OK(status) || s[4] != '-') {
|
|
return NT_STATUS_INVALID_PARAMETER;
|
|
}
|
|
*time_hi_and_version = tmp;
|
|
s += 5;
|
|
|
|
for (i = 0; i < 2; i++) {
|
|
status = read_hex_bytes(s, 2, &tmp);
|
|
if (!NT_STATUS_IS_OK(status)) {
|
|
return NT_STATUS_INVALID_PARAMETER;
|
|
}
|
|
clock_seq[i] = tmp;
|
|
s += 2;
|
|
}
|
|
if (s[0] != '-') {
|
|
return NT_STATUS_INVALID_PARAMETER;
|
|
}
|
|
|
|
s++;
|
|
|
|
for (i = 0; i < 6; i++) {
|
|
status = read_hex_bytes(s, 2, &tmp);
|
|
if (!NT_STATUS_IS_OK(status)) {
|
|
return NT_STATUS_INVALID_PARAMETER;
|
|
}
|
|
node[i] = tmp;
|
|
s += 2;
|
|
}
|
|
|
|
return NT_STATUS_OK;
|
|
}
|