diff options
author | Volker Lendecke <vlendec@samba.org> | 2007-06-29 16:04:26 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:23:42 -0500 |
commit | 3d3035bcfee16a2ecce5f1cb7cf2e95f1f5d6d42 (patch) | |
tree | 14105fbfde24aaa14a2c2165774cbd663b1e8faf | |
parent | e388130aa63b9bbe1b27999aad6052585fc2e16b (diff) | |
download | samba-3d3035bcfee16a2ecce5f1cb7cf2e95f1f5d6d42.tar.gz samba-3d3035bcfee16a2ecce5f1cb7cf2e95f1f5d6d42.tar.bz2 samba-3d3035bcfee16a2ecce5f1cb7cf2e95f1f5d6d42.zip |
r23658: One pstring a day....
This one was particularly tasty, it was a static one. So 1k less
footprint per process.
(This used to be commit 83865e32889e2d29086ae9d9701713fc74b09175)
-rw-r--r-- | source3/lib/system.c | 55 |
1 files changed, 39 insertions, 16 deletions
diff --git a/source3/lib/system.c b/source3/lib/system.c index 3e9674d9d4..79d37d7024 100644 --- a/source3/lib/system.c +++ b/source3/lib/system.c @@ -1366,21 +1366,25 @@ SMB_STRUCT_WPASSWD *wsys_getpwuid(uid_t uid) #endif /* NOT CURRENTLY USED - JRA */ /************************************************************************** - Extract a command into an arg list. Uses a static pstring for storage. - Caller frees returned arg list (which contains pointers into the static pstring). + Extract a command into an arg list. ****************************************************************************/ -static char **extract_args(const char *command) +static char **extract_args(TALLOC_CTX *mem_ctx, const char *command) { - static pstring trunc_cmd; + char *trunc_cmd; + char *saveptr; char *ptr; int argcl; char **argl = NULL; int i; - pstrcpy(trunc_cmd, command); + if (!(trunc_cmd = talloc_strdup(mem_ctx, command))) { + DEBUG(0, ("talloc failed\n")); + goto nomem; + } - if(!(ptr = strtok(trunc_cmd, " \t"))) { + if(!(ptr = strtok_r(trunc_cmd, " \t", &saveptr))) { + TALLOC_FREE(trunc_cmd); errno = EINVAL; return NULL; } @@ -1389,27 +1393,46 @@ static char **extract_args(const char *command) * Count the args. */ - for( argcl = 1; ptr; ptr = strtok(NULL, " \t")) + for( argcl = 1; ptr; ptr = strtok_r(NULL, " \t", &saveptr)) argcl++; - if((argl = (char **)SMB_MALLOC((argcl + 1) * sizeof(char *))) == NULL) - return NULL; + TALLOC_FREE(trunc_cmd); + + if (!(argl = TALLOC_ARRAY(mem_ctx, char *, argcl + 1))) { + goto nomem; + } /* * Now do the extraction. */ - pstrcpy(trunc_cmd, command); + if (!(trunc_cmd = talloc_strdup(mem_ctx, command))) { + goto nomem; + } - ptr = strtok(trunc_cmd, " \t"); + ptr = strtok_r(trunc_cmd, " \t", &saveptr); i = 0; - argl[i++] = ptr; - while((ptr = strtok(NULL, " \t")) != NULL) - argl[i++] = ptr; + if (!(argl[i++] = talloc_strdup(argl, ptr))) { + goto nomem; + } + + while((ptr = strtok_r(NULL, " \t", &saveptr)) != NULL) { + + if (!(argl[i++] = talloc_strdup(argl, ptr))) { + goto nomem; + } + } argl[i++] = NULL; return argl; + + nomem: + DEBUG(0, ("talloc failed\n")); + TALLOC_FREE(trunc_cmd); + TALLOC_FREE(argl); + errno = ENOMEM; + return NULL; } /************************************************************************** @@ -1483,7 +1506,7 @@ int sys_popen(const char *command) * Extract the command and args into a NULL terminated array. */ - if(!(argl = extract_args(command))) + if(!(argl = extract_args(NULL, command))) goto err_exit; entry->child_pid = sys_fork(); @@ -1525,7 +1548,7 @@ int sys_popen(const char *command) */ close (child_end); - SAFE_FREE(argl); + TALLOC_FREE(argl); /* Link into popen_chain. */ entry->next = popen_chain; |