mirror of
https://github.com/samba-team/samba.git
synced 2025-01-12 09:18:10 +03:00
three types of array-creation / array-deletion functions:
char*
UNISTR2*
SID*
decided to create a higher-order function set, add_item_to_array()
free_item_array().
higher-order support routines needed to add a new type:
type* item_dup(const type*)
void item_free(type*)
of course, strdup() and free() are perfect, pre-existing examples
of such functions, used in the implementation of add_chars_to_array()
and free_char_array().
sid_dup() and free() work for the add_sids_to_array() and free_sid_array()
implementations.
use unistr2_dup() and created unistr2_free() because the functionality
behind these may change into something horrible, like [horror] dynamic
memory allocation of the UNISTR2 character array. argh!!!!
jean-francois, this function set implements what we talked about over...
a year ago, now :-)
(This used to be commit a80ea2eb47
)
This commit is contained in:
parent
37983b979f
commit
c015b02b43
@ -480,10 +480,16 @@ int set_maxfiles(int requested_max);
|
||||
void reg_get_subkey(char *full_keyname, char *key_name, char *subkey_name);
|
||||
BOOL reg_split_key(const char *full_keyname, uint32 *reg_type, char *key_name);
|
||||
BOOL become_user_permanently(uid_t uid, gid_t gid);
|
||||
void free_void_array(uint32 num_entries, void **entries,
|
||||
void(free_item)(void*));
|
||||
BOOL add_item_to_array(uint32 *len, void ***array, const void *item,
|
||||
void*(item_dup)(const void*));
|
||||
void free_char_array(uint32 num_entries, char **entries);
|
||||
BOOL add_chars_to_array(uint32 *len, char ***array, const char *name);
|
||||
BOOL add_sid_to_array(uint32 *len, DOM_SID ***array, const DOM_SID *sid);
|
||||
void free_unistr_array(uint32 num_entries, UNISTR2 **entries);
|
||||
BOOL add_unistr_to_array(uint32 *len, UNISTR2 ***array, UNISTR2 *name);
|
||||
void free_sid_array(uint32 num_entries, DOM_SID **entries);
|
||||
BOOL add_sid_to_array(uint32 *len, DOM_SID ***array, const DOM_SID *sid);
|
||||
|
||||
/*The following definitions come from lib/util_file.c */
|
||||
|
||||
@ -2214,7 +2220,9 @@ BOOL smb_io_buffer5(char *desc, BUFFER5 *buf5, prs_struct *ps, int depth);
|
||||
BOOL make_buffer2(BUFFER2 *str, const char *buf, int len);
|
||||
BOOL smb_io_buffer2(char *desc, BUFFER2 *buf2, uint32 buffer, prs_struct *ps, int depth);
|
||||
BOOL make_buf_unistr2(UNISTR2 *str, uint32 *ptr, char *buf);
|
||||
BOOL copy_unistr2(UNISTR2 *str, UNISTR2 *from);
|
||||
BOOL copy_unistr2(UNISTR2 *str, const UNISTR2 *from);
|
||||
UNISTR2 *unistr2_dup(const UNISTR2 *name);
|
||||
void unistr2_free(UNISTR2 *name);
|
||||
BOOL make_string2(STRING2 *str, char *buf, int len);
|
||||
BOOL smb_io_string2(char *desc, STRING2 *str2, uint32 buffer, prs_struct *ps, int depth);
|
||||
BOOL make_unistr2(UNISTR2 *str, const char *buf, int len);
|
||||
|
@ -3228,7 +3228,8 @@ BOOL become_user_permanently(uid_t uid, gid_t gid)
|
||||
return(True);
|
||||
}
|
||||
|
||||
void free_char_array(uint32 num_entries, char **entries)
|
||||
void free_void_array(uint32 num_entries, void **entries,
|
||||
void(free_item)(void*))
|
||||
{
|
||||
uint32 i;
|
||||
if (entries != NULL)
|
||||
@ -3237,62 +3238,66 @@ void free_char_array(uint32 num_entries, char **entries)
|
||||
{
|
||||
if (entries[i] != NULL)
|
||||
{
|
||||
free(entries[i]);
|
||||
free_item(entries[i]);
|
||||
}
|
||||
}
|
||||
free(entries);
|
||||
}
|
||||
}
|
||||
|
||||
BOOL add_item_to_array(uint32 *len, void ***array, const void *item,
|
||||
void*(item_dup)(const void*))
|
||||
{
|
||||
if (len == NULL || array == NULL || item_dup == NULL)
|
||||
{
|
||||
return False;
|
||||
}
|
||||
|
||||
(*array) = (void**)Realloc((*array), ((*len)+1)*sizeof((*array)[0]));
|
||||
|
||||
if ((*array) != NULL)
|
||||
{
|
||||
(*array)[(*len)] = item_dup(item);
|
||||
(*len)++;
|
||||
return True;
|
||||
}
|
||||
return True;
|
||||
}
|
||||
|
||||
void free_char_array(uint32 num_entries, char **entries)
|
||||
{
|
||||
void(*fn)(void*) = (void(*)(void*))&free;
|
||||
free_void_array(num_entries, (void**)entries, *fn);
|
||||
}
|
||||
|
||||
BOOL add_chars_to_array(uint32 *len, char ***array, const char *name)
|
||||
{
|
||||
if (len == NULL || array == NULL)
|
||||
{
|
||||
return False;
|
||||
}
|
||||
|
||||
(*array) = (char**)Realloc((*array), ((*len)+1) * sizeof((*array)[0]));
|
||||
|
||||
if ((*array) != NULL)
|
||||
{
|
||||
(*array)[(*len)] = strdup(name);
|
||||
(*len)++;
|
||||
return True;
|
||||
}
|
||||
return True;
|
||||
void*(*fn)(const void*) = (void*(*)(const void*))&strdup;
|
||||
return add_item_to_array(len, (void***)array, (const void*)name, *fn);
|
||||
|
||||
}
|
||||
|
||||
BOOL add_sid_to_array(uint32 *len, DOM_SID ***array, const DOM_SID *sid)
|
||||
void free_unistr_array(uint32 num_entries, UNISTR2 **entries)
|
||||
{
|
||||
if (len == NULL || array == NULL)
|
||||
{
|
||||
return False;
|
||||
}
|
||||
void(*fn)(void*) = (void(*)(void*))&unistr2_free;
|
||||
free_void_array(num_entries, (void**)entries, *fn);
|
||||
}
|
||||
|
||||
(*array) = (char**)Realloc((*array), ((*len)+1) * sizeof((*array)[0]));
|
||||
|
||||
if ((*array) != NULL)
|
||||
{
|
||||
(*array)[(*len)] = sid_dup(sid);
|
||||
(*len)++;
|
||||
return True;
|
||||
}
|
||||
return True;
|
||||
BOOL add_unistr_to_array(uint32 *len, UNISTR2 ***array, UNISTR2 *name)
|
||||
{
|
||||
void*(*fn)(const void*) = (void*(*)(const void*))&unistr2_dup;
|
||||
return add_item_to_array(len, (void***)array, (const void*)name, *fn);
|
||||
}
|
||||
|
||||
void free_sid_array(uint32 num_entries, DOM_SID **entries)
|
||||
{
|
||||
uint32 i;
|
||||
if (entries != NULL)
|
||||
{
|
||||
for (i = 0; i < num_entries; i++)
|
||||
{
|
||||
if (entries[i] != NULL)
|
||||
{
|
||||
free(entries[i]);
|
||||
}
|
||||
}
|
||||
free(entries);
|
||||
}
|
||||
void(*fn)(void*) = (void(*)(void*))&free;
|
||||
free_void_array(num_entries, (void**)entries, *fn);
|
||||
}
|
||||
|
||||
BOOL add_sid_to_array(uint32 *len, DOM_SID ***array, const DOM_SID *sid)
|
||||
{
|
||||
void*(*fn)(const void*) = (void*(*)(const void*))&sid_dup;
|
||||
return add_item_to_array(len, (void***)array, (const void*)sid, *fn);
|
||||
}
|
||||
|
||||
|
@ -747,7 +747,7 @@ BOOL make_buf_unistr2(UNISTR2 *str, uint32 *ptr, char *buf)
|
||||
/*******************************************************************
|
||||
copies a UNISTR2 structure.
|
||||
********************************************************************/
|
||||
BOOL copy_unistr2(UNISTR2 *str, UNISTR2 *from)
|
||||
BOOL copy_unistr2(UNISTR2 *str, const UNISTR2 *from)
|
||||
{
|
||||
/* set up string lengths. add one if string is not null-terminated */
|
||||
str->uni_max_len = from->uni_max_len;
|
||||
@ -760,6 +760,24 @@ BOOL copy_unistr2(UNISTR2 *str, UNISTR2 *from)
|
||||
return True;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
duplicates a UNISTR2 structure.
|
||||
********************************************************************/
|
||||
UNISTR2 *unistr2_dup(const UNISTR2 *name)
|
||||
{
|
||||
UNISTR2 *copy = (UNISTR2*)malloc(sizeof(*copy));
|
||||
copy_unistr2(copy, name);
|
||||
return copy;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
frees a UNISTR2 structure.
|
||||
********************************************************************/
|
||||
void unistr2_free(UNISTR2 *name)
|
||||
{
|
||||
free(name);
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
creates a STRING2 structure.
|
||||
********************************************************************/
|
||||
|
@ -94,7 +94,7 @@ END {
|
||||
gotstart = 1;
|
||||
}
|
||||
|
||||
if( $0 ~ /^LOCAL_GRP|^DOMAIN_GRP|^DOM_SID|^SEC_DESC/ ) {
|
||||
if( $0 ~ /^UNISTR2|^LOCAL_GRP|^DOMAIN_GRP|^DOM_SID|^SEC_DESC/ ) {
|
||||
gotstart = 1;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user