1
0
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:
Luke Leighton 1999-11-03 19:58:47 +00:00
parent 37983b979f
commit c015b02b43
4 changed files with 77 additions and 46 deletions

View File

@ -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);

View File

@ -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);
}

View File

@ -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.
********************************************************************/

View File

@ -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;
}