Coverage Report

Created: 2025-07-23 07:04

/src/samba/nsswitch/libwbclient/wbc_guid.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
   Unix SMB/CIFS implementation.
3
4
   Winbind client API
5
6
   Copyright (C) Gerald (Jerry) Carter 2007
7
8
9
   This library is free software; you can redistribute it and/or
10
   modify it under the terms of the GNU Lesser General Public
11
   License as published by the Free Software Foundation; either
12
   version 3 of the License, or (at your option) any later version.
13
14
   This library is distributed in the hope that it will be useful,
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17
   Library General Public License for more details.
18
19
   You should have received a copy of the GNU Lesser General Public License
20
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
*/
22
23
/* Required Headers */
24
25
#include "replace.h"
26
#include "libwbclient.h"
27
28
/* Convert a binary GUID to a character string */
29
_PUBLIC_
30
wbcErr wbcGuidToString(const struct wbcGuid *guid,
31
           char **guid_string)
32
0
{
33
0
  char *result;
34
35
0
  result = (char *)wbcAllocateMemory(37, 1, NULL);
36
0
  if (result == NULL) {
37
0
    return WBC_ERR_NO_MEMORY;
38
0
  }
39
0
  snprintf(result, 37,
40
0
     "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
41
0
     guid->time_low, guid->time_mid,
42
0
     guid->time_hi_and_version,
43
0
     guid->clock_seq[0],
44
0
     guid->clock_seq[1],
45
0
     guid->node[0], guid->node[1],
46
0
     guid->node[2], guid->node[3],
47
0
     guid->node[4], guid->node[5]);
48
0
  *guid_string = result;
49
50
0
  return WBC_ERR_SUCCESS;
51
0
}
52
53
/* @brief Convert a character string to a binary GUID */
54
_PUBLIC_
55
wbcErr wbcStringToGuid(const char *str,
56
           struct wbcGuid *guid)
57
0
{
58
0
  unsigned int time_low;
59
0
  unsigned int time_mid, time_hi_and_version;
60
0
  unsigned int clock_seq[2];
61
0
  unsigned int node[6];
62
0
  int i;
63
0
  wbcErr wbc_status = WBC_ERR_UNKNOWN_FAILURE;
64
65
0
  if (!guid) {
66
0
    wbc_status = WBC_ERR_INVALID_PARAM;
67
0
    BAIL_ON_WBC_ERROR(wbc_status);
68
0
  }
69
70
0
  if (!str) {
71
0
    wbc_status = WBC_ERR_INVALID_PARAM;
72
0
    BAIL_ON_WBC_ERROR(wbc_status);
73
0
  }
74
75
0
  if (11 == sscanf(str, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
76
0
       &time_low, &time_mid, &time_hi_and_version,
77
0
       &clock_seq[0], &clock_seq[1],
78
0
       &node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) {
79
0
          wbc_status = WBC_ERR_SUCCESS;
80
0
  } else if (11 == sscanf(str, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
81
0
        &time_low, &time_mid, &time_hi_and_version,
82
0
        &clock_seq[0], &clock_seq[1],
83
0
        &node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) {
84
0
          wbc_status = WBC_ERR_SUCCESS;
85
0
  }
86
87
0
  BAIL_ON_WBC_ERROR(wbc_status);
88
89
0
  guid->time_low = time_low;
90
0
  guid->time_mid = time_mid;
91
0
  guid->time_hi_and_version = time_hi_and_version;
92
0
  guid->clock_seq[0] = clock_seq[0];
93
0
  guid->clock_seq[1] = clock_seq[1];
94
95
0
  for (i=0;i<6;i++) {
96
0
    guid->node[i] = node[i];
97
0
  }
98
99
0
  wbc_status = WBC_ERR_SUCCESS;
100
101
0
done:
102
0
  return wbc_status;
103
0
}