This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "includes.h"
+#include "popt_common.h"
#include "vfstest.h"
+#include "../libcli/smbreadline/smbreadline.h"
/* List to hold groups of commands */
static struct cmd_list {
struct cmd_set *cmd_set;
} *cmd_list;
-extern pstring user_socket_options;
-
/****************************************************************************
handle completion of commands for readline
****************************************************************************/
return matches;
}
-static char* next_command(char** cmdstr)
+static char *next_command(TALLOC_CTX *ctx, char **cmdstr)
{
- static pstring command;
- char *p;
-
+ char *command;
+ char *p;
+
if (!cmdstr || !(*cmdstr))
return NULL;
-
+
p = strchr_m(*cmdstr, ';');
if (p)
*p = '\0';
- pstrcpy(command, *cmdstr);
+ command = talloc_strdup(ctx, *cmdstr);
*cmdstr = p;
-
+
return command;
}
}
if (argc == 2) {
- DEBUGLEVEL = atoi(argv[1]);
+ lp_set_cmdline("log level", argv[1]);
}
printf("debuglevel is %d\n", DEBUGLEVEL);
const char *p = cmd;
char **argv = NULL;
NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
- pstring buf;
- TALLOC_CTX *mem_ctx = NULL;
+ char *buf;
+ TALLOC_CTX *mem_ctx = talloc_stackframe();
int argc = 0, i;
/* Count number of arguments first time through the loop then
allocate memory and strdup them. */
again:
- while(next_token(&p, buf, " ", sizeof(buf))) {
+ while(next_token_talloc(mem_ctx, &p, &buf, " ")) {
if (argv) {
argv[argc] = SMB_STRDUP(buf);
}
-
argc++;
}
-
- if (!argv) {
+ if (!argv) {
/* Create argument list */
argv = SMB_MALLOC_ARRAY(char *, argc);
result = NT_STATUS_NO_MEMORY;
goto done;
}
-
+
p = cmd;
argc = 0;
-
+
goto again;
}
/* Call the function */
if (cmd_entry->fn) {
-
- if (mem_ctx == NULL) {
- /* Create mem_ctx */
- if (!(mem_ctx = talloc_init("do_cmd"))) {
- DEBUG(0, ("talloc_init() failed\n"));
- goto done;
- }
- }
-
/* Run command */
result = cmd_entry->fn(vfs, mem_ctx, argc, (const char **)argv);
-
} else {
fprintf (stderr, "Invalid command\n");
goto done;
}
done:
-
+
/* Cleanup */
if (argv) {
for (i = 0; i < argc; i++)
SAFE_FREE(argv[i]);
-
+
SAFE_FREE(argv);
}
-
+
+ TALLOC_FREE(mem_ctx);
return result;
}
static NTSTATUS process_cmd(struct vfs_state *vfs, char *cmd)
{
struct cmd_list *temp_list;
- BOOL found = False;
- pstring buf;
+ bool found = False;
+ char *buf;
const char *p = cmd;
NTSTATUS result = NT_STATUS_OK;
+ TALLOC_CTX *mem_ctx = talloc_stackframe();
int len = 0;
if (cmd[strlen(cmd) - 1] == '\n')
cmd[strlen(cmd) - 1] = '\0';
- if (!next_token(&p, buf, " ", sizeof(buf))) {
+ if (!next_token_talloc(mem_ctx, &p, &buf, " ")) {
+ TALLOC_FREE(mem_ctx);
return NT_STATUS_OK;
}
- /* strip the trainly \n if it exsists */
+ /* Strip the trailing \n if it exists */
len = strlen(buf);
if (buf[len-1] == '\n')
buf[len-1] = '\0';
done:
if (!found && buf[0]) {
printf("command not found: %s\n", buf);
+ TALLOC_FREE(mem_ctx);
return NT_STATUS_OK;
}
printf("result was %s\n", nt_errstr(result));
}
+ TALLOC_FREE(mem_ctx);
return result;
}
while (fgets(command, 3 * PATH_MAX, file) != NULL) {
process_cmd(pvfs, command);
}
+
+ if (file != stdin) {
+ fclose(file);
+ }
}
void exit_server(const char *reason)
exit_server("normal exit");
}
-static int server_fd = -1;
int last_message = -1;
-int smbd_server_fd(void)
-{
- return server_fd;
-}
-
-void reload_printers(void)
-{
- return;
-}
-
-/****************************************************************************
- Reload the services file.
-**************************************************************************/
-
-BOOL reload_services(BOOL test)
-{
- BOOL ret;
-
- if (lp_loaded()) {
- pstring fname;
- pstrcpy(fname,lp_configfile());
- if (file_exist(fname, NULL) &&
- !strcsequal(fname, dyn_CONFIGFILE)) {
- pstrcpy(dyn_CONFIGFILE, fname);
- test = False;
- }
- }
-
- reopen_logs();
-
- if (test && !lp_file_list_changed())
- return(True);
-
- lp_killunused(conn_snum_used);
-
- ret = lp_load(dyn_CONFIGFILE, False, False, True, True);
-
- /* perhaps the config filename is now set */
- if (!test)
- reload_services(True);
-
- reopen_logs();
-
- load_interfaces();
-
- {
- if (smbd_server_fd() != -1) {
- set_socket_options(smbd_server_fd(),"SO_KEEPALIVE");
- set_socket_options(smbd_server_fd(), user_socket_options);
- }
- }
-
- mangle_reset_cache();
- reset_stat_cache();
-
- /* this forces service parameters to be flushed */
- set_current_service(NULL,0,True);
-
- return (ret);
-}
-
struct event_context *smbd_event_context(void)
{
static struct event_context *ctx;
static struct vfs_state vfs;
int i;
static char *filename = NULL;
+ TALLOC_CTX *frame = talloc_stackframe();
/* make sure the vars that get altered (4th field) are in
a fixed location or certain compilers complain */
poptFreeContext(pc);
+ lp_load_initial_only(get_dyn_CONFIGFILE());
+
/* TODO: check output */
- reload_services(False);
+ reload_services(smbd_messaging_context(), -1, False);
/* the following functions are part of the Samba debugging
facilities. See lib/debug.c */
- setup_logging("vfstest", True);
+ setup_logging("vfstest", DEBUG_STDOUT);
/* Load command lists */
/* some basic initialization stuff */
sec_init();
- conn_init();
- vfs.conn = conn_new();
- string_set(&vfs.conn->user,"vfstest");
+ vfs.conn = TALLOC_ZERO_P(NULL, connection_struct);
+ vfs.conn->params = TALLOC_P(vfs.conn, struct share_params);
for (i=0; i < 1024; i++)
vfs.files[i] = NULL;
if (cmdstr && cmdstr[0]) {
char *cmd;
char *p = cmdstr;
-
- while((cmd=next_command(&p)) != NULL) {
+
+ while((cmd=next_command(frame, &p)) != NULL) {
process_cmd(&vfs, cmd);
}
-
+
+ TALLOC_FREE(cmd);
return 0;
}
/* Loop around accepting commands */
while(1) {
- pstring prompt;
- char *line;
+ char *line = NULL;
- slprintf(prompt, sizeof(prompt) - 1, "vfstest $> ");
+ line = smb_readline("vfstest $> ", NULL, completion_fn);
- line = smb_readline(prompt, NULL, completion_fn);
-
- if (line == NULL)
+ if (line == NULL) {
break;
+ }
- if (line[0] != '\n')
+ if (line[0] != '\n') {
process_cmd(&vfs, line);
+ }
+ SAFE_FREE(line);
}
-
- conn_free(vfs.conn);
+
+ TALLOC_FREE(vfs.conn);
+ TALLOC_FREE(frame);
return 0;
}