1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
#include "includes.h"
extern int DEBUGLEVEL;
static TDB_CONTEXT *db = NULL;
static char *make_creds_key(uint32 pid, uint16 vuid, int *klen)
{
char *k;
(*klen) = sizeof(pid) + sizeof(vuid);
k = malloc((*klen) * sizeof(char));
if (k != NULL)
{
*((uint32*)k) = pid;
*((uint16*)(k+sizeof(pid))) = vuid;
DEBUG(10,("make_creds_key: pid: %x vuid %x\n",
pid, vuid));
dump_data(10, k, (*klen));
}
return k;
}
BOOL smbd_cred_get(uint32 pid, uint16 vuid, struct smbd_creds *dc)
{
int klen;
char *k;
TDB_DATA key, data;
DEBUG(10,("smbd_cred_get:\n"));
k = make_creds_key(pid, vuid, &klen);
if (k == NULL) return False;
key.dptr = k;
key.dsize = klen;
data = tdb_fetch(db, key);
free(k);
if (data.dptr == NULL)
{
DEBUG(10,("smbd_cred_get: NULL data\n"));
return False;
}
if (data.dsize != sizeof(*dc))
{
DEBUG(10,("smbd_cred_get: data size mismatch\n"));
free(data.dptr);
return False;
}
memcpy(dc, data.dptr, sizeof(*dc));
free(data.dptr);
dump_data(100, (char*)dc, sizeof(*dc));
return True;
}
BOOL smbd_cred_store(uint32 pid, uint16 vuid, struct smbd_creds *dc)
{
int klen;
char *k;
TDB_DATA key, data;
BOOL ret;
DEBUG(10,("smbd_cred_store:\n"));
k = make_creds_key(pid, vuid, &klen);
if (k == NULL) return False;
key.dptr = k;
key.dsize = klen;
data.dptr = (char*)dc;
data.dsize = sizeof(*dc);
ret = (tdb_store(db, key, data, TDB_REPLACE) == 0);
free(k);
dump_data(100, (char*)dc, sizeof(*dc));
return ret;
}
BOOL smbd_cred_init_db(void)
{
db = tdb_open(lock_path("smbdcreds.tdb"), 0, 0,
O_RDWR | O_CREAT, 0600);
if (db == NULL)
{
DEBUG(0,("smbd_cred_init_db: failed\n"));
return False;
}
DEBUG(10,("smbd_cred_init_db: opened\n"));
return True;
}
|