r101: added lsa_SetSecret() and lsa_QuerySecret()
[samba.git] / source / libcli / util / dom_sid.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    routines to manipulate a "struct dom_sid"
5
6    Copyright (C) Andrew Tridgell 2004
7    
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12    
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17    
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23 #include "includes.h"
24
25 /*
26   convert a string to a dom_sid, returning a talloc'd dom_sid
27 */
28 struct dom_sid *dom_sid_parse_talloc(TALLOC_CTX *mem_ctx, const char *sidstr)
29 {
30         struct dom_sid *ret;
31         unsigned int rev, ia, num_sub_auths, i;
32         char *p;
33   
34         if (strncasecmp(sidstr, "S-", 2)) {
35                 return NULL;
36         }
37
38         sidstr += 2;
39
40         rev = strtol(sidstr, &p, 10);
41         if (*p != '-') {
42                 return NULL;
43         }
44         sidstr = p+1;
45
46         ia = strtol(sidstr, &p, 10);
47         if (*p != '-') {
48                 return NULL;
49         }
50         sidstr = p+1;
51
52         num_sub_auths = 0;
53         for (i=0;sidstr[i];i++) {
54                 if (sidstr[i] == '-') num_sub_auths++;
55         }
56
57         ret = talloc_p(mem_ctx, struct dom_sid);
58         if (!ret) {
59                 return NULL;
60         }
61
62         ret->sub_auths = talloc_array_p(mem_ctx, uint32, num_sub_auths);
63         if (!ret->sub_auths) {
64                 return NULL;
65         }
66
67         ret->sid_rev_num = rev;
68         ret->id_auth[0] = 0;
69         ret->id_auth[0] = 0;
70         ret->id_auth[1] = 0;
71         ret->id_auth[2] = ia >> 24;
72         ret->id_auth[3] = ia >> 16;
73         ret->id_auth[4] = ia >> 8;
74         ret->id_auth[5] = ia;
75         ret->num_auths = num_sub_auths;
76
77         for (i=0;i<num_sub_auths;i++) {
78                 ret->sub_auths[i] = strtol(sidstr, &p, 10);
79                 if (p == sidstr) {
80                         return NULL;
81                 }
82                 if (*p != '-' && i < num_sub_auths-1) {
83                         return NULL;
84                 }
85                 sidstr = p+1;
86         }
87
88         return ret;
89 }
90