Rev 12126: Use talloc in loadparm. in
file:///home/jelmer/bzr.samba/SAMBA_4_0/
Jelmer Vernooij
jelmer at samba.org
Wed May 9 11:28:23 GMT 2007
At file:///home/jelmer/bzr.samba/SAMBA_4_0/
------------------------------------------------------------
revno: 12126
revision-id: jelmer at samba.org-20070509112813-hfcw7ovikq4o69bj
parent: jelmer at samba.org-20070509105243-c8umb0w5w1d1ogsj
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: SAMBA_4_0
timestamp: Wed 2007-05-09 13:28:13 +0200
message:
Use talloc in loadparm.
modified:
source/lib/util/util_str.c svn-v2:13658 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-branches%2fSAMBA_4_0-source%2flib%2futil%2futil_str.c
source/param/loadparm.c svn-v2:2 at 0c0555d6-39d7-0310-84fc-f1cc0bd64818-trunk-source%2fparam%2floadparm.c
=== modified file 'source/lib/util/util_str.c'
--- a/source/lib/util/util_str.c 2007-04-19 14:21:56 +0000
+++ b/source/lib/util/util_str.c 2007-05-09 11:28:13 +0000
@@ -246,36 +246,23 @@
}
/**
- Set a string value, allocing the space for the string
-**/
-static BOOL string_init(char **dest,const char *src)
-{
- if (!src) src = "";
-
- (*dest) = strdup(src);
- if ((*dest) == NULL) {
- DEBUG(0,("Out of memory in string_init\n"));
- return False;
- }
- return True;
-}
-
-/**
- Free a string value.
-**/
-_PUBLIC_ void string_free(char **s)
-{
- if (s) SAFE_FREE(*s);
-}
-
-/**
Set a string value, deallocating any existing space, and allocing the space
for the string
**/
-_PUBLIC_ BOOL string_set(char **dest, const char *src)
+_PUBLIC_ BOOL string_set(TALLOC_CTX *mem_ctx, char **dest, const char *src)
{
- string_free(dest);
- return string_init(dest,src);
+ if (dest != NULL)
+ talloc_free(*dest);
+
+ if (src == NULL)
+ src = "";
+
+ (*dest) = talloc_strdup(mem_ctx, src);
+ if ((*dest) == NULL) {
+ DEBUG(0,("Out of memory in string_set\n"));
+ return false;
+ }
+ return true;
}
/**
=== modified file 'source/param/loadparm.c'
--- a/source/param/loadparm.c 2007-05-09 10:52:43 +0000
+++ b/source/param/loadparm.c 2007-05-09 11:28:13 +0000
@@ -598,7 +598,7 @@
parm_table[i].type == P_USTRING) &&
parm_table[i].ptr &&
!(parm_table[i].flags & FLAG_CMDLINE)) {
- string_set(parm_table[i].ptr, "");
+ string_set(ctx, parm_table[i].ptr, "");
}
}
@@ -974,30 +974,28 @@
if (lookup_service >= ctx->iNumServices)
return NULL;
- data = (lookup_service < 0) ?
- Globals.param_opt : ctx->ServicePtrs[lookup_service]->param_opt;
asprintf(&vfskey, "%s:%s", type, option);
strlower(vfskey);
- while (data) {
+ data = (lookup_service < 0) ?
+ Globals.param_opt : ctx->ServicePtrs[lookup_service]->param_opt;
+ for (; data; data = data->next) {
if (strcmp(data->key, vfskey) == 0) {
free(vfskey);
return data->value;
}
- data = data->next;
}
if (lookup_service >= 0) {
/* Try to fetch the same option but from globals */
/* but only if we are not already working with Globals */
- data = Globals.param_opt;
- while (data) {
+
+ for (data = Globals.param_opt; data; data = data->next) {
if (strcmp(data->key, vfskey) == 0) {
free(vfskey);
return data->value;
}
- data = data->next;
}
}
@@ -1167,45 +1165,7 @@
static void free_service(struct service *pservice)
{
- int i;
- struct param_opt *data, *pdata;
- if (!pservice)
- return;
-
- if (pservice->szService)
- DEBUG(5, ("free_service: Freeing service %s\n",
- pservice->szService));
-
- string_free(&pservice->szService);
- SAFE_FREE(pservice->copymap);
-
- for (i = 0; parm_table[i].label; i++) {
- if ((parm_table[i].type == P_STRING ||
- parm_table[i].type == P_USTRING) &&
- parm_table[i].class == P_LOCAL) {
- string_free((char **)
- (((char *)pservice) +
- PTR_DIFF(parm_table[i].ptr, &sDefault)));
- } else if (parm_table[i].type == P_LIST &&
- parm_table[i].class == P_LOCAL) {
- char ***listp = (char ***)(((char *)pservice) +
- PTR_DIFF(parm_table[i].ptr, &sDefault));
- talloc_free(*listp);
- *listp = NULL;
- }
- }
-
- DEBUG(5,("Freeing parametrics:\n"));
- data = pservice->param_opt;
- while (data) {
- DEBUG(5,("[%s = %s]\n", data->key, data->value));
- string_free(&data->key);
- string_free(&data->value);
- pdata = data->next;
- SAFE_FREE(data);
- data = pdata;
- }
-
+ talloc_free_children(pservice);
ZERO_STRUCTP(pservice);
}
@@ -1225,21 +1185,19 @@
tservice = *pservice;
/* it might already exist */
- if (name) {
+ if (name != NULL) {
i = getservicebyname(ctx, name, NULL);
if (i >= 0) {
/* Clean all parametric options for service */
/* They will be added during parsing again */
data = ctx->ServicePtrs[i]->param_opt;
while (data) {
- string_free(&data->key);
- string_free(&data->value);
pdata = data->next;
- SAFE_FREE(data);
+ talloc_free(data);
data = pdata;
}
ctx->ServicePtrs[i]->param_opt = NULL;
- return (i);
+ return i;
}
}
@@ -1252,7 +1210,8 @@
if (i == ctx->iNumServices) {
struct service **tsp;
- tsp = realloc_p(ctx->ServicePtrs, struct service *, num_to_alloc);
+ tsp = talloc_realloc(ctx, ctx->ServicePtrs, struct service *,
+ num_to_alloc);
if (!tsp) {
DEBUG(0,("add_a_service: failed to enlarge ServicePtrs!\n"));
@@ -1260,7 +1219,7 @@
}
else {
ctx->ServicePtrs = tsp;
- ctx->ServicePtrs[ctx->iNumServices] = malloc_p(struct service);
+ ctx->ServicePtrs[ctx->iNumServices] = talloc(ctx, struct service);
}
if (!ctx->ServicePtrs[ctx->iNumServices]) {
DEBUG(0,("add_a_service: out of memory!\n"));
@@ -1276,8 +1235,8 @@
init_service(ctx->ServicePtrs[i]);
copy_service(ctx->ServicePtrs[i], &tservice, NULL);
if (name)
- string_set(&ctx->ServicePtrs[i]->szService, name);
- return (i);
+ string_set(ctx, &ctx->ServicePtrs[i]->szService, name);
+ return i;
}
/***************************************************************************
@@ -1305,13 +1264,13 @@
string_sub(newHomedir,"%H", pszHomedir, sizeof(newHomedir));
}
- string_set(&ctx->ServicePtrs[i]->szPath, newHomedir);
+ string_set(ctx, &ctx->ServicePtrs[i]->szPath, newHomedir);
if (!(*(ctx->ServicePtrs[i]->comment))) {
pstring comment;
slprintf(comment, sizeof(comment) - 1,
"Home directory of %s", user);
- string_set(&ctx->ServicePtrs[i]->comment, comment);
+ string_set(ctx, &ctx->ServicePtrs[i]->comment, comment);
}
ctx->ServicePtrs[i]->bAvailable = sDefault.bAvailable;
ctx->ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
@@ -1319,7 +1278,7 @@
DEBUG(3, ("adding home's share [%s] for user '%s' at '%s'\n", pszHomename,
user, newHomedir));
- return (True);
+ return true;
}
/***************************************************************************
@@ -1348,9 +1307,9 @@
slprintf(comment, sizeof(comment) - 1,
"%s Service (%s)", fstype, Globals.szServerString);
- string_set(&ctx->ServicePtrs[i]->szPath, tmpdir());
- string_set(&ctx->ServicePtrs[i]->comment, comment);
- string_set(&ctx->ServicePtrs[i]->fstype, fstype);
+ string_set(ctx, &ctx->ServicePtrs[i]->szPath, tmpdir());
+ string_set(ctx, &ctx->ServicePtrs[i]->comment, comment);
+ string_set(ctx, &ctx->ServicePtrs[i]->fstype, fstype);
ctx->ServicePtrs[i]->iMaxConnections = -1;
ctx->ServicePtrs[i]->bAvailable = true;
ctx->ServicePtrs[i]->bRead_only = true;
@@ -1363,7 +1322,7 @@
DEBUG(3, ("adding hidden service %s\n", name));
- return (True);
+ return true;
}
/***************************************************************************
@@ -1377,16 +1336,16 @@
int i = add_a_service(ctx, ctx->ServicePtrs[iDefaultService], pszPrintername);
if (i < 0)
- return (False);
+ return false;
- /* note that we do NOT default the availability flag to True - */
+ /* note that we do NOT default the availability flag to true - */
/* we take it from the default service passed. This allows all */
/* dynamic printers to be disabled by disabling the [printers] */
/* entry (if/when the 'available' keyword is implemented!). */
/* the printer name is set to the service name. */
- string_set(&ctx->ServicePtrs[i]->szPrintername, pszPrintername);
- string_set(&ctx->ServicePtrs[i]->comment, comment);
+ string_set(ctx, &ctx->ServicePtrs[i]->szPrintername, pszPrintername);
+ string_set(ctx, &ctx->ServicePtrs[i]->comment, comment);
ctx->ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
/* Printers cannot be read_only. */
ctx->ServicePtrs[i]->bRead_only = false;
@@ -1395,7 +1354,7 @@
DEBUG(3, ("adding printer service %s\n", pszPrintername));
- return (True);
+ return true;
}
/***************************************************************************
@@ -1408,11 +1367,11 @@
int iIndex;
if (*pszParmName == '-')
- return (-1);
+ return -1;
for (iIndex = 0; parm_table[iIndex].label; iIndex++)
if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
- return (iIndex);
+ return iIndex;
/* Warn only if it isn't parametric option */
if (strchr(pszParmName, ':') == NULL)
@@ -1420,7 +1379,7 @@
/* We do return 'fail' for parametric options as well because they are
stored in different storage
*/
- return (-1);
+ return -1;
}
@@ -1502,17 +1461,17 @@
break;
case P_STRING:
- string_set(dest_ptr,
+ string_set(pserviceDest, dest_ptr,
*(char **)src_ptr);
break;
case P_USTRING:
- string_set(dest_ptr,
+ string_set(pserviceDest, dest_ptr,
*(char **)src_ptr);
strupper(*(char **)dest_ptr);
break;
case P_LIST:
- *(const char ***)dest_ptr = str_list_copy(talloc_autofree_context(),
+ *(const char ***)dest_ptr = str_list_copy(pserviceDest,
*(const char ***)src_ptr);
break;
default:
@@ -1528,30 +1487,26 @@
sizeof(int) * NUMPARAMETERS);
}
- data = pserviceSource->param_opt;
- while (data) {
+ for (data = pserviceSource->param_opt; data; data = data->next) {
not_added = true;
- pdata = pserviceDest->param_opt;
/* Traverse destination */
- while (pdata) {
+ for (pdata = pserviceDest->param_opt; pdata; pdata = pdata->next) {
/* If we already have same option, override it */
if (strcmp(pdata->key, data->key) == 0) {
- string_free(&pdata->value);
- pdata->value = strdup(data->value);
+ talloc_free(&pdata->value);
+ pdata->value = talloc_strdup(pdata, data->value);
not_added = false;
break;
}
- pdata = pdata->next;
}
if (not_added) {
- paramo = malloc_p(struct param_opt);
+ paramo = talloc(pserviceDest, struct param_opt);
if (!paramo)
smb_panic("OOM");
- paramo->key = strdup(data->key);
- paramo->value = strdup(data->value);
+ paramo->key = talloc_strdup(paramo, data->key);
+ paramo->value = talloc_strdup(paramo, data->value);
DLIST_ADD(pserviceDest->param_opt, paramo);
}
- data = data->next;
}
}
@@ -1609,18 +1564,18 @@
}
if (!f) {
- f = malloc_p(struct file_lists);
+ f = talloc(ctx, struct file_lists);
if (!f)
return;
f->next = ctx->file_lists;
f->name = strdup(fname);
if (!f->name) {
- SAFE_FREE(f);
+ talloc_free(f);
return;
}
- f->subfname = strdup(subfname);
+ f->subfname = talloc_strdup(f, subfname);
if (!f->subfname) {
- SAFE_FREE(f);
+ talloc_free(f);
return;
}
ctx->file_lists = f;
@@ -1658,7 +1613,7 @@
("file %s modified: %s\n", n2,
ctime(&mod_time)));
f->modtime = mod_time;
- SAFE_FREE(f->subfname);
+ talloc_free(f->subfname);
f->subfname = strdup(n2);
return true;
}
@@ -1680,7 +1635,7 @@
add_to_file_list(ctx, pszParmValue, fname);
- string_set(ptr, fname);
+ string_set(ctx, ptr, fname);
if (file_exist(fname))
return (pm_process(fname, parse_section, parse_parameter, ctx));
@@ -1701,7 +1656,7 @@
int iTemp;
struct service serviceTemp;
- string_set(ptr, pszParmValue);
+ string_set(ctx, ptr, pszParmValue);
init_service(&serviceTemp);
@@ -1734,8 +1689,8 @@
static void init_copymap(struct service *pservice)
{
int i;
- SAFE_FREE(pservice->copymap);
- pservice->copymap = malloc_array_p(int, NUMPARAMETERS);
+ pservice->copymap = talloc_realloc(pservice, pservice->copymap,
+ int, NUMPARAMETERS);
if (!pservice->copymap)
DEBUG(0,
("Couldn't allocate copymap!! (size %d)\n",
@@ -1754,20 +1709,24 @@
{
struct param_opt *paramo, *data;
char *name;
+ TALLOC_CTX *mem_ctx;
while (isspace((unsigned char)*pszParmName)) {
pszParmName++;
}
name = strdup(pszParmName);
- if (!name) return False;
+ if (name == NULL)
+ return False;
strlower(name);
if (snum < 0) {
data = Globals.param_opt;
+ mem_ctx = lp_talloc; /* FIXME */
} else {
data = ctx->ServicePtrs[snum]->param_opt;
+ mem_ctx = ctx->ServicePtrs[snum];
}
/* Traverse destination */
@@ -1780,19 +1739,19 @@
return True;
}
- free(paramo->value);
- paramo->value = strdup(pszParmValue);
+ talloc_free(paramo->value);
+ paramo->value = talloc_strdup(paramo, pszParmValue);
paramo->flags = flags;
free(name);
return True;
}
}
- paramo = malloc_p(struct param_opt);
+ paramo = talloc(mem_ctx, struct param_opt);
if (!paramo)
smb_panic("OOM");
- paramo->key = strdup(name);
- paramo->value = strdup(pszParmValue);
+ paramo->key = talloc_strdup(paramo, name);
+ paramo->value = talloc_strdup(paramo, pszParmValue);
paramo->flags = flags;
if (snum < 0) {
DLIST_ADD(Globals.param_opt, paramo);
@@ -1823,7 +1782,7 @@
return lp_do_parameter_parametric(ctx, snum, pszParmName, pszParmValue, 0);
}
DEBUG(0, ("Ignoring unknown parameter \"%s\"\n", pszParmName));
- return (True);
+ return true;
}
if (parm_table[parmnum].flags & FLAG_DEPRECATED) {
@@ -1834,7 +1793,7 @@
/* if the flag has been set on the command line, then don't allow override,
but don't report an error */
if (parm_table[parmnum].flags & FLAG_CMDLINE) {
- return True;
+ return true;
}
def_ptr = parm_table[parmnum].ptr;
@@ -1847,7 +1806,7 @@
DEBUG(0,
("Global parameter %s found in service section!\n",
pszParmName));
- return (True);
+ return true;
}
parm_ptr =
((char *)ctx->ServicePtrs[snum]) + PTR_DIFF(def_ptr,
@@ -1868,7 +1827,7 @@
/* if it is a special case then go ahead */
if (parm_table[parmnum].special) {
parm_table[parmnum].special(ctx, pszParmValue, (char **)parm_ptr);
- return (True);
+ return true;
}
/* now switch on the type of variable it is */
@@ -1909,11 +1868,11 @@
break;
case P_STRING:
- string_set(parm_ptr, pszParmValue);
+ string_set(ctx, parm_ptr, pszParmValue);
break;
case P_USTRING:
- string_set(parm_ptr, pszParmValue);
+ string_set(ctx, parm_ptr, pszParmValue);
strupper(*(char **)parm_ptr);
break;
@@ -1949,7 +1908,7 @@
}
}
- return (True);
+ return true;
}
/***************************************************************************
More information about the samba-cvs
mailing list