2
* Copyright (c) 2005 Massachusetts Institute of Technology
4
* Permission is hereby granted, free of charge, to any person
5
* obtaining a copy of this software and associated documentation
6
* files (the "Software"), to deal in the Software without
7
* restriction, including without limitation the rights to use, copy,
8
* modify, merge, publish, distribute, sublicense, and/or sell copies
9
* of the Software, and to permit persons to whom the Software is
10
* furnished to do so, subject to the following conditions:
12
* The above copyright notice and this permission notice shall be
13
* included in all copies or substantial portions of the Software.
15
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
#include<kcreddbinternal.h>
30
void kcdb_buf_new(kcdb_buf * buf, khm_size n_fields)
32
buf->buffer = PMALLOC(KCDB_BUF_CBBUF_INITIAL);
33
buf->cb_buffer = KCDB_BUF_CBBUF_INITIAL;
36
if(n_fields == KCDB_BUF_DEFAULT)
37
n_fields = KCDB_BUF_FIELDS_INITIAL;
39
assert(n_fields < KCDB_BUF_MAX_SLOTS);
41
buf->n_fields = n_fields;
42
buf->nc_fields = UBOUNDSS(n_fields, KCDB_BUF_FIELDS_INITIAL, KCDB_BUF_FIELDS_GROWTH);
43
buf->fields = PMALLOC(sizeof(buf->fields[0]) * buf->n_fields);
44
ZeroMemory(buf->fields, sizeof(buf->fields[0]) * buf->n_fields);
47
void kcdb_buf_delete(kcdb_buf * buf)
62
static void kcdb_buf_assert_size(kcdb_buf * buf, khm_size cbsize)
67
/* should be less than or equal to the max signed 32 bit int */
68
assert(cbsize <= KHM_INT32_MAX);
69
if(cbsize <= buf->cb_buffer)
72
new_size = UBOUNDSS(cbsize, KCDB_BUF_CBBUF_INITIAL, KCDB_BUF_CBBUF_GROWTH);
74
assert(new_size > buf->cb_buffer && new_size > 0);
76
new_buf = PMALLOC(new_size);
77
assert(new_buf != NULL);
79
memcpy(new_buf, buf->buffer, buf->cb_used);
81
buf->buffer = new_buf;
84
void kcdb_buf_alloc(kcdb_buf * buf, khm_size slot, khm_ui_2 id, khm_size cbsize)
91
cbnew = UBOUND32(cbsize);
93
assert(slot <= KCDB_BUF_APPEND);
95
if(slot == KCDB_BUF_APPEND) {
96
slot = kcdb_buf_slot_by_id(buf, id);
97
if(slot == KCDB_BUF_INVALID_SLOT)
101
assert(slot < KCDB_BUF_MAX_SLOTS);
103
if((slot + 1) > buf->nc_fields) {
107
ns = UBOUNDSS((slot + 1), KCDB_BUF_FIELDS_INITIAL, KCDB_BUF_FIELDS_GROWTH);
109
nf = PMALLOC(sizeof(buf->fields[0]) * ns);
110
memcpy(nf, buf->fields, sizeof(buf->fields[0]) * buf->n_fields);
112
if(ns > buf->n_fields)
113
memset(&(nf[buf->n_fields]), 0, sizeof(buf->fields[0]) * (ns - buf->n_fields));
120
if((slot + 1) > buf->n_fields)
121
buf->n_fields = slot + 1;
123
f = &(buf->fields[slot]);
125
if(f->flags & KCDB_CREDF_FLAG_ALLOCD) {
126
/* there's already an allocation. we have to resize it to
127
accomodate the new size */
128
cbold = UBOUND32(f->cbsize);
129
/* demote before substraction */
130
cbdelta = ((khm_ssize) cbnew) - (khm_ssize) cbold;
133
kcdb_buf_assert_size(buf, buf->cb_used + cbdelta);
136
if(buf->cb_used > f->offset + cbold) {
140
((BYTE *) buf->buffer) + (f->offset + cbnew),
141
((BYTE *) buf->buffer) + (f->offset + cbold),
142
buf->cb_used - (f->offset + cbold));
144
for(i=0; i < (int) buf->n_fields; i++) {
146
(buf->fields[i].flags & KCDB_CREDF_FLAG_ALLOCD) &&
147
buf->fields[i].offset > f->offset)
149
buf->fields[i].offset =
150
(khm_ui_4)(((khm_ssize) buf->fields[i].offset) + cbdelta);
155
/* demote integer before adding signed quantity */
156
buf->cb_used = (khm_size)(((khm_ssize) buf->cb_used) + cbdelta);
158
f->cbsize = (khm_ui_4) cbsize;
161
kcdb_buf_assert_size(buf, buf->cb_used + cbnew);
162
f->offset = (khm_ui_4) buf->cb_used;
163
f->cbsize = (khm_ui_4) cbsize;
164
buf->cb_used += cbnew;
168
f->flags &= ~KCDB_CREDF_FLAG_ALLOCD;
169
f->flags &= ~KCDB_CREDF_FLAG_DATA;
170
f->id = KCDB_BUFF_ID_INVALID;
172
f->flags |= KCDB_CREDF_FLAG_ALLOCD;
177
void kcdb_buf_dup(kcdb_buf * dest, const kcdb_buf * src)
182
cb_buf = UBOUNDSS(src->cb_used, KCDB_BUF_CBBUF_INITIAL, KCDB_BUF_CBBUF_GROWTH);
184
/* replaced by UBOUNDSS() above */
185
(src->cb_used <= kcdb_cred_initial_size)? kcdb_cred_initial_size:
186
kcdb_cred_initial_size +
187
(((src->cb_used - (kcdb_cred_initial_size + 1)) / kcdb_cred_growth_factor + 1) * kcdb_cred_growth_factor);
190
kcdb_buf_delete(dest);
192
dest->cb_buffer = cb_buf;
193
dest->cb_used = src->cb_used;
194
dest->buffer = PMALLOC(cb_buf);
195
memcpy(dest->buffer, src->buffer, src->cb_used);
197
nc_fields = UBOUNDSS(src->n_fields, KCDB_BUF_FIELDS_INITIAL, KCDB_BUF_FIELDS_GROWTH);
198
dest->nc_fields = nc_fields;
199
dest->n_fields = src->n_fields;
200
dest->fields = PMALLOC(nc_fields * sizeof(dest->fields[0]));
201
memcpy(dest->fields, src->fields, src->n_fields * sizeof(dest->fields[0]));
202
if(dest->n_fields < dest->nc_fields)
203
memset(&(dest->fields[dest->n_fields]), 0, (src->nc_fields - src->n_fields) * sizeof(dest->fields[0]));
206
void kcdb_buf_set_value(kcdb_buf * buf, khm_size slot, khm_ui_2 id, void * src, khm_size cb_src)
209
kcdb_buf_alloc(buf, slot, id, cb_src);
210
if(slot == KCDB_BUF_APPEND) {
211
slot = kcdb_buf_slot_by_id(buf, id);
212
if(slot == KCDB_BUF_INVALID_SLOT) {
220
if(kcdb_buf_exist(buf, slot)) {
221
dest = kcdb_buf_get(buf, slot);
222
memcpy(dest, src, cb_src);
224
buf->fields[slot].flags |= KCDB_CREDF_FLAG_DATA;
228
int kcdb_buf_exist(kcdb_buf * buf, khm_size slot)
230
if(slot >= buf->n_fields)
232
return (buf->fields[slot].flags & KCDB_CREDF_FLAG_ALLOCD);
235
int kcdb_buf_val_exist(kcdb_buf * buf, khm_size slot)
237
if(slot >= buf->n_fields)
239
return (buf->fields[slot].flags & KCDB_CREDF_FLAG_DATA);
242
void * kcdb_buf_get(kcdb_buf * buf, khm_size slot)
244
if(slot >= buf->n_fields ||
245
!(buf->fields[slot].flags & KCDB_CREDF_FLAG_ALLOCD))
247
return (((BYTE *) buf->buffer) + buf->fields[slot].offset);
250
khm_size kcdb_buf_size(kcdb_buf * buf, khm_size slot)
252
if(slot >= buf->n_fields ||
253
!(buf->fields[slot].flags & KCDB_CREDF_FLAG_ALLOCD))
255
return (buf->fields[slot].cbsize);
258
void kcdb_buf_set_value_flag(kcdb_buf * buf, khm_size slot)
260
if(slot >= buf->n_fields ||
261
!(buf->fields[slot].flags & KCDB_CREDF_FLAG_ALLOCD))
264
(buf->fields[slot].flags |= KCDB_CREDF_FLAG_DATA);
267
khm_size kcdb_buf_slot_by_id(kcdb_buf * buf, khm_ui_2 id)
271
for(i=0; i < (int) buf->n_fields; i++) {
272
if(buf->fields[i].id == id)
276
if(i < (int) buf->n_fields)
279
return KCDB_BUF_INVALID_SLOT;
282
/* API for accessing generic buffers */
284
KHMEXP khm_int32 KHMAPI kcdb_buf_get_attr(
287
khm_int32 * attr_type,
291
if(kcdb_cred_is_active_cred(record))
292
return kcdb_cred_get_attr(record, attr_id, attr_type, buffer, pcb_buf);
293
else if(kcdb_is_active_identity(record))
294
return kcdb_identity_get_attr(record, attr_id, attr_type, buffer, pcb_buf);
296
return KHM_ERROR_INVALID_PARAM;
299
KHMEXP khm_int32 KHMAPI kcdb_buf_get_attrib(
301
const wchar_t * attr_name,
302
khm_int32 * attr_type,
306
if(kcdb_cred_is_active_cred(record))
307
return kcdb_cred_get_attrib(record, attr_name, attr_type, buffer, pcb_buf);
308
else if(kcdb_is_active_identity(record))
309
return kcdb_identity_get_attrib(record, attr_name, attr_type, buffer, pcb_buf);
311
return KHM_ERROR_INVALID_PARAM;
314
KHMEXP khm_int32 KHMAPI kcdb_buf_get_attr_string(
321
if(kcdb_cred_is_active_cred(record))
322
return kcdb_cred_get_attr_string(record, attr_id, buffer, pcbbuf, flags);
323
else if(kcdb_is_active_identity(record))
324
return kcdb_identity_get_attr_string(record, attr_id, buffer, pcbbuf, flags);
326
return KHM_ERROR_INVALID_PARAM;
329
KHMEXP khm_int32 KHMAPI kcdb_buf_get_attrib_string(
331
const wchar_t * attr_name,
336
if(kcdb_cred_is_active_cred(record))
337
return kcdb_cred_get_attrib_string(record, attr_name, buffer, pcbbuf, flags);
338
else if(kcdb_is_active_identity(record))
339
return kcdb_identity_get_attrib_string(record, attr_name, buffer, pcbbuf, flags);
341
return KHM_ERROR_INVALID_PARAM;
344
KHMEXP khm_int32 KHMAPI kcdb_buf_set_attr(
350
if(kcdb_cred_is_active_cred(record))
351
return kcdb_cred_set_attr(record, attr_id, buffer, cbbuf);
352
else if(kcdb_is_active_identity(record))
353
return kcdb_identity_set_attr(record, attr_id, buffer, cbbuf);
355
return KHM_ERROR_INVALID_PARAM;
358
KHMEXP khm_int32 KHMAPI kcdb_buf_set_attrib(
360
const wchar_t * attr_name,
364
if(kcdb_cred_is_active_cred(record))
365
return kcdb_cred_set_attrib(record, attr_name, buffer, cbbuf);
366
else if(kcdb_is_active_identity(record))
367
return kcdb_identity_set_attrib(record, attr_name, buffer, cbbuf);
369
return KHM_ERROR_INVALID_PARAM;
372
KHMEXP khm_int32 KHMAPI kcdb_buf_hold(khm_handle record)
374
if(kcdb_cred_is_active_cred(record))
375
return kcdb_cred_hold(record);
376
else if(kcdb_is_active_identity(record))
377
return kcdb_identity_hold(record);
379
return KHM_ERROR_INVALID_PARAM;
382
KHMEXP khm_int32 KHMAPI kcdb_buf_release(khm_handle record)
384
if(kcdb_cred_is_active_cred(record))
385
return kcdb_cred_release(record);
386
else if(kcdb_is_active_identity(record))
387
return kcdb_identity_release(record);
389
return KHM_ERROR_INVALID_PARAM;