/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 | } |