s3-vfstest: Initialize some more
[nivanova/samba-autobuild/.git] / source3 / torture / vfstest.c
index fa0545988e9eb3064844db8e16e5ec333f0eac3c..6e25b34dee02de7602cf8370d203865a70abc30e 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    Unix SMB/CIFS implementation.
    VFS module tester
 
 
    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,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    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 "smbd/smbd.h"
+#include "smbd/globals.h"
+#include "popt_common.h"
 #include "vfstest.h"
+#include "../libcli/smbreadline/smbreadline.h"
+#include "auth.h"
+#include "serverid.h"
+#include "messages.h"
+#include "libcli/security/security.h"
 
 /* List to hold groups of commands */
 static struct cmd_list {
@@ -33,8 +40,6 @@ static struct cmd_list {
        struct cmd_set *cmd_set;
 } *cmd_list;
 
-extern pstring user_socket_options;
-
 /****************************************************************************
 handle completion of commands for readline
 ****************************************************************************/
@@ -45,11 +50,11 @@ static char **completion_fn(const char *text, int start, int end)
        int i, count=0;
        struct cmd_list *commands = cmd_list;
 
-       if (start) 
+       if (start)
                return NULL;
 
        /* make sure we have a list of valid commands */
-       if (!commands) 
+       if (!commands)
                return NULL;
 
        matches = SMB_MALLOC_ARRAY(char *, MAX_COMPLETIONS);
@@ -58,25 +63,24 @@ static char **completion_fn(const char *text, int start, int end)
        matches[count++] = SMB_STRDUP(text);
        if (!matches[0]) return NULL;
 
-       while (commands && count < MAX_COMPLETIONS-1) 
+       while (commands && count < MAX_COMPLETIONS-1)
        {
                if (!commands->cmd_set)
                        break;
-               
+
                for (i=0; commands->cmd_set[i].name; i++)
                {
                        if ((strncmp(text, commands->cmd_set[i].name, strlen(text)) == 0) &&
-                               commands->cmd_set[i].fn) 
+                               commands->cmd_set[i].fn)
                        {
                                matches[count] = SMB_STRDUP(commands->cmd_set[i].name);
-                               if (!matches[count]) 
+                               if (!matches[count])
                                        return NULL;
                                count++;
                        }
                }
-               
+
                commands = commands->next;
-               
        }
 
        if (count == 2) {
@@ -87,20 +91,20 @@ static char **completion_fn(const char *text, int start, int end)
        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;
 }
 
@@ -121,7 +125,7 @@ static NTSTATUS cmd_conf(struct vfs_state *vfs, TALLOC_CTX *mem_ctx,
        printf("\"%s\" successfully loaded\n", argv[1]);
        return NT_STATUS_OK;
 }
-       
+
 /* Display help on commands */
 static NTSTATUS cmd_help(struct vfs_state *vfs, TALLOC_CTX *mem_ctx,
                         int argc, const char **argv)
@@ -139,7 +143,7 @@ static NTSTATUS cmd_help(struct vfs_state *vfs, TALLOC_CTX *mem_ctx,
 
        if (argc == 2) {
                for (tmp = cmd_list; tmp; tmp = tmp->next) {
-                       
+
                        tmp_set = tmp->cmd_set;
 
                        while(tmp_set->name) {
@@ -189,7 +193,7 @@ static NTSTATUS cmd_debuglevel(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int a
        }
 
        if (argc == 2) {
-               DEBUGLEVEL = atoi(argv[1]);
+               lp_set_cmdline("log level", argv[1]);
        }
 
        printf("debuglevel is %d\n", DEBUGLEVEL);
@@ -264,24 +268,22 @@ static NTSTATUS do_cmd(struct vfs_state *vfs, struct cmd_set *cmd_entry, char *c
        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);
@@ -292,44 +294,35 @@ static NTSTATUS do_cmd(struct vfs_state *vfs, struct cmd_set *cmd_entry, char *c
                        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;
 }
 
@@ -337,20 +330,22 @@ static NTSTATUS do_cmd(struct vfs_state *vfs, struct cmd_set *cmd_entry, char *c
 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';
@@ -374,6 +369,7 @@ static NTSTATUS process_cmd(struct vfs_state *vfs, char *cmd)
  done:
        if (!found && buf[0]) {
                printf("command not found: %s\n", buf);
+               TALLOC_FREE(mem_ctx);
                return NT_STATUS_OK;
        }
 
@@ -381,6 +377,7 @@ static NTSTATUS process_cmd(struct vfs_state *vfs, char *cmd)
                printf("result was %s\n", nt_errstr(result));
        }
 
+       TALLOC_FREE(mem_ctx);
        return result;
 }
 
@@ -402,6 +399,10 @@ static void process_file(struct vfs_state *pvfs, char *filename) {
        while (fgets(command, 3 * PATH_MAX, file) != NULL) {
                process_cmd(pvfs, command);
        }
+
+       if (file != stdin) {
+               fclose(file);
+       }
 }
 
 void exit_server(const char *reason)
@@ -415,79 +416,18 @@ void exit_server_cleanly(const char *const 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);
-}
-
 /* Main function */
 
 int main(int argc, char *argv[])
 {
-       static char             *cmdstr = NULL;
-       struct cmd_set          **cmd_set;
-       static struct vfs_state vfs;
+       char *cmdstr = NULL;
+       struct cmd_set  **cmd_set;
+       struct vfs_state vfs = { 0, };
        int i;
-       static char             *filename = NULL;
+       char *filename = NULL;
+       char cwd[MAXPATHLEN];
+       TALLOC_CTX *frame = talloc_stackframe();
+       struct tevent_context *ev = tevent_context_init(NULL);
 
        /* make sure the vars that get altered (4th field) are in
           a fixed location or certain compilers complain */
@@ -506,19 +446,21 @@ int main(int argc, char *argv[])
 
        pc = poptGetContext("vfstest", argc, (const char **) argv,
                            long_options, 0);
-       
+
        while(poptGetNextOpt(pc) != -1);
 
 
        poptFreeContext(pc);
 
+       lp_load_initial_only(get_dyn_CONFIGFILE());
+
        /* TODO: check output */
-       reload_services(False);
+       reload_services(NULL, NULL, 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 */
 
        cmd_set = vfstest_command_list;
@@ -531,15 +473,29 @@ int main(int argc, char *argv[])
 
        /* some basic initialization stuff */
        sec_init();
-       conn_init();
-       vfs.conn = conn_new();
-       string_set(&vfs.conn->user,"vfstest");
+       init_guest_info();
+       locking_init();
+       serverid_parent_init(NULL);
+       vfs.conn = talloc_zero(NULL, connection_struct);
+       vfs.conn->share_access = FILE_GENERIC_ALL;
+       vfs.conn->params = talloc_zero(vfs.conn, struct share_params);
+       vfs.conn->sconn = talloc_zero(NULL, struct smbd_server_connection);
+       vfs.conn->sconn->msg_ctx = messaging_init(vfs.conn->sconn, ev);
+       vfs.conn->sconn->ev_ctx = ev;
+       serverid_register(messaging_server_id(vfs.conn->sconn->msg_ctx), 0);
+       make_session_info_guest(NULL, &vfs.conn->session_info);
+       file_init(vfs.conn->sconn);
+       set_conn_connectpath(vfs.conn, getcwd(cwd, sizeof(cwd)));
        for (i=0; i < 1024; i++)
                vfs.files[i] = NULL;
 
-       /* some advanced initiliazation stuff */
+       /* some advanced initialization stuff */
        smbd_vfs_init(vfs.conn);
 
+       if (!posix_locking_init(false)) {
+               return 1;
+       }
+
        /* Do we have a file input? */
        if (filename && filename[0]) {
                process_file(&vfs, filename);
@@ -550,31 +506,33 @@ int main(int argc, char *argv[])
        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;
-
-               slprintf(prompt, sizeof(prompt) - 1, "vfstest $> ");
+               char *line = NULL;
 
-               line = smb_readline(prompt, NULL, completion_fn);
+               line = smb_readline("vfstest $> ", 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;
 }