s3-net: Implemented net rpc conf getincludes command
authorVicentiu Ciorbaru <cvicentiu@gmail.com>
Mon, 25 Jul 2011 22:32:23 +0000 (01:32 +0300)
committerMichael Adam <obnox@samba.org>
Mon, 22 Aug 2011 11:59:26 +0000 (13:59 +0200)
The function creates a smconf_service struct that holds the share
passed as the first argument to the command and searches in it for
"include" parameters. If any are found, they are displayed.

Signed-off-by: Michael Adam <obnox@samba.org>
source3/utils/net_rpc_conf.c

index 5ddf87b6abfe589d43a1d36f567d3a15ff484087..a2cb5cb251c2239c3587997e570633ab4e85886c 100644 (file)
@@ -91,6 +91,14 @@ static int rpc_conf_getparm_usage(struct net_context *c, int argc,
        return -1;
 }
 
+static int rpc_conf_getincludes_usage(struct net_context *c, int argc,
+                               const char **argv)
+{
+       d_printf("%s\nnet rpc conf getincludes <sharename>\n",
+                       _("Usage:"));
+       return -1;
+}
+
 static NTSTATUS rpc_conf_get_share(TALLOC_CTX *mem_ctx,
                                   struct dcerpc_binding_handle *b,
                                   struct policy_handle *parent_hnd,
@@ -971,6 +979,95 @@ error:
 
 }
 
+static NTSTATUS rpc_conf_getincludes_internal(struct net_context *c,
+                                             const struct dom_sid *domain_sid,
+                                             const char *domain_name,
+                                             struct cli_state *cli,
+                                             struct rpc_pipe_client *pipe_hnd,
+                                             TALLOC_CTX *mem_ctx,
+                                             int argc,
+                                             const char **argv )
+{
+       TALLOC_CTX *frame = talloc_stackframe();
+       NTSTATUS status = NT_STATUS_OK;
+       WERROR werr = WERR_OK;
+       WERROR _werr;
+
+       struct dcerpc_binding_handle *b = pipe_hnd->binding_handle;
+
+       /* key info */
+       struct policy_handle hive_hnd, key_hnd;
+       struct smbconf_service *service = NULL;
+
+       uint32_t param_count;
+
+
+       ZERO_STRUCT(hive_hnd);
+       ZERO_STRUCT(key_hnd);
+
+
+       if (argc != 1 || c->display_usage) {
+               rpc_conf_getincludes_usage(c, argc, argv);
+               status = NT_STATUS_INVALID_PARAMETER;
+               goto error;
+       }
+
+       status = rpc_conf_open_conf(frame,
+                                   b,
+                                   REG_KEY_READ,
+                                   &hive_hnd,
+                                   &key_hnd,
+                                   &werr);
+
+       if (!(NT_STATUS_IS_OK(status))) {
+               goto error;
+       }
+
+       if (!(W_ERROR_IS_OK(werr))) {
+               goto error;
+       }
+
+       service = talloc(frame, struct smbconf_service);
+
+       status = rpc_conf_get_share(frame,
+                                   b,
+                                   &key_hnd,
+                                   argv[0],
+                                   service,
+                                   &werr);
+
+       if (!(NT_STATUS_IS_OK(status))) {
+                       goto error;
+       }
+
+       if (!(W_ERROR_IS_OK(werr))) {
+                       goto error;
+       }
+
+       for (param_count = 0;
+            param_count < service->num_params;
+            param_count++)
+       {
+               if (strcmp(service->param_names[param_count], "include") == 0) {
+                       d_printf(_("%s = %s\n"),
+                               service->param_names[param_count],
+                               service->param_values[param_count]);
+               }
+       }
+
+error:
+
+       if (!(W_ERROR_IS_OK(werr))) {
+               status =  werror_to_ntstatus(werr);
+       }
+
+       dcerpc_winreg_CloseKey(b, frame, &hive_hnd, &_werr);
+       dcerpc_winreg_CloseKey(b, frame, &key_hnd, &_werr);
+
+       TALLOC_FREE(frame);
+       return status;
+
+}
 static int rpc_conf_drop(struct net_context *c, int argc,
                                const char **argv)
 {
@@ -1017,8 +1114,8 @@ static int rpc_conf_getparm(struct net_context *c, int argc,
 static int rpc_conf_getincludes(struct net_context *c, int argc,
                             const char **argv)
 {
-       d_printf("Function not implemented yet\n");
-       return 0;
+       return run_rpc_command(c, NULL, &ndr_table_winreg.syntax_id, 0,
+               rpc_conf_getincludes_internal, argc, argv );
 }
 
 /* function calls */