r16945: Sync trunk -> 3.0 for 3.0.24 code. Still need
[vlendec/samba-autobuild/.git] / source3 / torture / vfstest.c
index 9deb3093525ff997533b2940a9ee6bf3cbbf999c..fa0545988e9eb3064844db8e16e5ec333f0eac3c 100644 (file)
@@ -4,7 +4,7 @@
 
    Copyright (C) Simo Sorce 2002
    Copyright (C) Eric Lorimer 2002
-   Copyright (C) Jelmer Vernooij 2002
+   Copyright (C) Jelmer Vernooij 2002,2003
 
    Most of this code was ripped off of rpcclient.
    Copyright (C) Tim Potter 2000-2001
@@ -33,12 +33,12 @@ static struct cmd_list {
        struct cmd_set *cmd_set;
 } *cmd_list;
 
-TALLOC_CTX *global_ctx;
+extern pstring user_socket_options;
 
 /****************************************************************************
 handle completion of commands for readline
 ****************************************************************************/
-static char **completion_fn(char *text, int start, int end)
+static char **completion_fn(const char *text, int start, int end)
 {
 #define MAX_COMPLETIONS 100
        char **matches;
@@ -52,10 +52,10 @@ static char **completion_fn(char *text, int start, int end)
        if (!commands) 
                return NULL;
 
-       matches = (char **)malloc(sizeof(matches[0])*MAX_COMPLETIONS);
+       matches = SMB_MALLOC_ARRAY(char *, MAX_COMPLETIONS);
        if (!matches) return NULL;
 
-       matches[count++] = strdup(text);
+       matches[count++] = SMB_STRDUP(text);
        if (!matches[0]) return NULL;
 
        while (commands && count < MAX_COMPLETIONS-1) 
@@ -68,7 +68,7 @@ static char **completion_fn(char *text, int start, int end)
                        if ((strncmp(text, commands->cmd_set[i].name, strlen(text)) == 0) &&
                                commands->cmd_set[i].fn) 
                        {
-                               matches[count] = strdup(commands->cmd_set[i].name);
+                               matches[count] = SMB_STRDUP(commands->cmd_set[i].name);
                                if (!matches[count]) 
                                        return NULL;
                                count++;
@@ -81,13 +81,13 @@ static char **completion_fn(char *text, int start, int end)
 
        if (count == 2) {
                SAFE_FREE(matches[0]);
-               matches[0] = strdup(matches[1]);
+               matches[0] = SMB_STRDUP(matches[1]);
        }
        matches[count] = NULL;
        return matches;
 }
 
-static char* next_command (char** cmdstr)
+static char* next_command(char** cmdstr)
 {
        static pstring          command;
        char                    *p;
@@ -106,14 +106,14 @@ static char* next_command (char** cmdstr)
 
 /* Load specified configuration file */
 static NTSTATUS cmd_conf(struct vfs_state *vfs, TALLOC_CTX *mem_ctx,
-                       int argc, char **argv)
+                       int argc, const char **argv)
 {
        if (argc != 2) {
                printf("Usage: %s <smb.conf>\n", argv[0]);
                return NT_STATUS_OK;
        }
 
-       if (!lp_load(argv[1], False, True, False)) {
+       if (!lp_load(argv[1], False, True, False, True)) {
                printf("Error loading \"%s\"\n", argv[1]);
                return NT_STATUS_OK;
        }
@@ -124,7 +124,7 @@ static NTSTATUS cmd_conf(struct vfs_state *vfs, TALLOC_CTX *mem_ctx,
        
 /* Display help on commands */
 static NTSTATUS cmd_help(struct vfs_state *vfs, TALLOC_CTX *mem_ctx,
-                        int argc, char **argv)
+                        int argc, const char **argv)
 {
        struct cmd_list *tmp;
        struct cmd_set *tmp_set;
@@ -181,7 +181,7 @@ static NTSTATUS cmd_help(struct vfs_state *vfs, TALLOC_CTX *mem_ctx,
 }
 
 /* Change the debug level */
-static NTSTATUS cmd_debuglevel(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, char **argv)
+static NTSTATUS cmd_debuglevel(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv)
 {
        if (argc > 2) {
                printf("Usage: %s [debuglevel]\n", argv[0]);
@@ -197,20 +197,20 @@ static NTSTATUS cmd_debuglevel(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int a
        return NT_STATUS_OK;
 }
 
-static NTSTATUS cmd_freemem(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, char **argv)
+static NTSTATUS cmd_freemem(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv)
 {
        /* Cleanup */
-       talloc_destroy(global_ctx);
-       global_ctx = NULL;
+       talloc_destroy(mem_ctx);
+       mem_ctx = NULL;
        vfs->data = NULL;
        vfs->data_size = 0;
        return NT_STATUS_OK;
 }
 
-static NTSTATUS cmd_quit(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, char **argv)
+static NTSTATUS cmd_quit(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv)
 {
        /* Cleanup */
-       talloc_destroy(global_ctx);
+       talloc_destroy(mem_ctx);
 
        exit(0);
        return NT_STATUS_OK; /* NOTREACHED */
@@ -248,7 +248,7 @@ static void add_command_set(struct cmd_set *cmd_set)
 {
        struct cmd_list *entry;
 
-       if (!(entry = (struct cmd_list *)malloc(sizeof(struct cmd_list)))) {
+       if (!(entry = SMB_MALLOC_P(struct cmd_list))) {
                DEBUG(0, ("out of memory\n"));
                return;
        }
@@ -261,9 +261,11 @@ static void add_command_set(struct cmd_set *cmd_set)
 
 static NTSTATUS do_cmd(struct vfs_state *vfs, struct cmd_set *cmd_entry, char *cmd)
 {
-       char *p = cmd, **argv = NULL;
+       const char *p = cmd;
+       char **argv = NULL;
        NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
        pstring buf;
+       TALLOC_CTX *mem_ctx = NULL;
        int argc = 0, i;
 
        /* Count number of arguments first time through the loop then
@@ -272,7 +274,7 @@ static NTSTATUS do_cmd(struct vfs_state *vfs, struct cmd_set *cmd_entry, char *c
  again:
        while(next_token(&p, buf, " ", sizeof(buf))) {
                if (argv) {
-                       argv[argc] = strdup(buf);
+                       argv[argc] = SMB_STRDUP(buf);
                }
                
                argc++;
@@ -282,7 +284,7 @@ static NTSTATUS do_cmd(struct vfs_state *vfs, struct cmd_set *cmd_entry, char *c
 
                /* Create argument list */
 
-               argv = (char **)malloc(sizeof(char *) * argc);
+               argv = SMB_MALLOC_ARRAY(char *, argc);
                memset(argv, 0, sizeof(char *) * argc);
 
                if (!argv) {
@@ -301,16 +303,16 @@ static NTSTATUS do_cmd(struct vfs_state *vfs, struct cmd_set *cmd_entry, char *c
 
        if (cmd_entry->fn) {
 
-               if (global_ctx == NULL) {
+               if (mem_ctx == NULL) {
                        /* Create mem_ctx */
-                       if (!(global_ctx = talloc_init())) {
+                       if (!(mem_ctx = talloc_init("do_cmd"))) {
                                DEBUG(0, ("talloc_init() failed\n"));
                                goto done;
                        }
                }
 
                /* Run command */
-               result = cmd_entry->fn(vfs, global_ctx, argc, argv);
+               result = cmd_entry->fn(vfs, mem_ctx, argc, (const char **)argv);
 
        } else {
                fprintf (stderr, "Invalid command\n");
@@ -337,7 +339,7 @@ static NTSTATUS process_cmd(struct vfs_state *vfs, char *cmd)
        struct cmd_list *temp_list;
        BOOL found = False;
        pstring buf;
-       char *p = cmd;
+       const char *p = cmd;
        NTSTATUS result = NT_STATUS_OK;
        int len = 0;
 
@@ -382,12 +384,37 @@ static NTSTATUS process_cmd(struct vfs_state *vfs, char *cmd)
        return result;
 }
 
-void exit_server(char *reason)
+static void process_file(struct vfs_state *pvfs, char *filename) {
+       FILE *file;
+       char command[3 * PATH_MAX];
+
+       if (*filename == '-') {
+               file = stdin;
+       } else {
+               file = fopen(filename, "r");
+               if (file == NULL) {
+                       printf("vfstest: error reading file (%s)!", filename);
+                       printf("errno n.%d: %s", errno, strerror(errno));
+                       exit(-1);
+               }
+       }
+
+       while (fgets(command, 3 * PATH_MAX, file) != NULL) {
+               process_cmd(pvfs, command);
+       }
+}
+
+void exit_server(const char *reason)
 {
        DEBUG(3,("Server exit (%s)\n", (reason ? reason : "")));
        exit(0);
 }
 
+void exit_server_cleanly(const char *const reason)
+{
+       exit_server("normal exit");
+}
+
 static int server_fd = -1;
 int last_message = -1;
 
@@ -396,88 +423,101 @@ int smbd_server_fd(void)
                return server_fd;
 }
 
-BOOL reload_services(BOOL test)
+void reload_printers(void)
 {
-       return True;
+       return;
 }
 
-/* Print usage information */
-static void usage(void)
+/****************************************************************************
+ Reload the services file.
+**************************************************************************/
+
+BOOL reload_services(BOOL test)
 {
-       printf("Usage: vfstest [options]\n");
+       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();
 
-       printf("\t-c or --command \"command string\"   execute semicolon separated cmds\n");
-       printf("\t-d or --debug debuglevel         set the debuglevel\n");
-       printf("\t-l or --logfile logfile           logfile to use instead of stdout\n");
-       printf("\t-h or --help                 Print this help message.\n");
-       printf("\n");
+       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[])
 {
-       BOOL                    interactive = True;
-       int                     opt;
-       static char             *cmdstr = "";
-       static char *opt_logfile=NULL;
-       static int              opt_debuglevel;
-       pstring                 logfile;
+       static char             *cmdstr = NULL;
        struct cmd_set          **cmd_set;
-       extern BOOL             AllowDebugChange;
        static struct vfs_state vfs;
        int i;
-
+       static char             *filename = NULL;
 
        /* make sure the vars that get altered (4th field) are in
           a fixed location or certain compilers complain */
        poptContext pc;
        struct poptOption long_options[] = {
-               {"debug",       'd', POPT_ARG_INT,      &opt_debuglevel, 'd'},
-               {"debuglevel",  'd', POPT_ARG_INT,      &opt_debuglevel, 'd'},
-               {"command",     'c', POPT_ARG_STRING,   &cmdstr},
-               {"logfile",     'l', POPT_ARG_STRING,   &opt_logfile, 'l'},
-               {"help",        'h', POPT_ARG_NONE,     0, 'h'},
-               { 0, 0, 0, 0}
+               POPT_AUTOHELP
+               {"file",        'f', POPT_ARG_STRING,   &filename, 0, },
+               {"command",     'c', POPT_ARG_STRING,   &cmdstr, 0, "Execute specified list of commands" },
+               POPT_COMMON_SAMBA
+               POPT_TABLEEND
        };
 
+       load_case_tables();
 
        setlinebuf(stdout);
 
-       DEBUGLEVEL = 1;
-       AllowDebugChange = False;
-
        pc = poptGetContext("vfstest", argc, (const char **) argv,
                            long_options, 0);
        
-       while((opt = poptGetNextOpt(pc)) != -1) {
-               switch (opt) {
-               case 'l':
-                       slprintf(logfile, sizeof(logfile) - 1, "%s.client", 
-                                opt_logfile);
-                       lp_set_logfile(logfile);
-                       interactive = False;
-                       break;
-                       
-               case 'd':
-                       DEBUGLEVEL = opt_debuglevel;
-                       break;
-                       
-               case 'h':
-               default:
-                       usage();
-                       exit(1);
-               }
-       }
+       while(poptGetNextOpt(pc) != -1);
 
 
        poptFreeContext(pc);
 
+       /* TODO: check output */
+       reload_services(False);
+
        /* the following functions are part of the Samba debugging
           facilities.  See lib/debug.c */
-       setup_logging("vfstest", interactive);
-       if (!interactive) 
-               reopen_logs();
+       setup_logging("vfstest", True);
        
        /* Load command lists */
 
@@ -490,13 +530,24 @@ int main(int argc, char *argv[])
        }
 
        /* some basic initialization stuff */
-       vfs.conn = (struct connection_struct *)malloc(sizeof(struct connection_struct));
-       vfs.conn->user = "vfstest";
+       sec_init();
+       conn_init();
+       vfs.conn = conn_new();
+       string_set(&vfs.conn->user,"vfstest");
        for (i=0; i < 1024; i++)
                vfs.files[i] = NULL;
 
-       /* Do anything specified with -c */
-       if (cmdstr[0]) {
+       /* some advanced initiliazation stuff */
+       smbd_vfs_init(vfs.conn);
+
+       /* Do we have a file input? */
+       if (filename && filename[0]) {
+               process_file(&vfs, filename);
+               return 0;
+       }
+
+       /* Do anything specified with -c */
+       if (cmdstr && cmdstr[0]) {
                char    *cmd;
                char    *p = cmdstr;
  
@@ -507,10 +558,6 @@ int main(int argc, char *argv[])
                return 0;
        }
 
-       /* Initialize VFS */
-       vfs.conn->vfs_private = NULL;
-       smbd_vfs_init(vfs.conn);
-
        /* Loop around accepting commands */
 
        while(1) {
@@ -528,6 +575,6 @@ int main(int argc, char *argv[])
                        process_cmd(&vfs, line);
        }
        
-       free(vfs.conn);
+       conn_free(vfs.conn);
        return 0;
 }