s3-net: Implemented net rpc conf delparm command
authorVicentiu Ciorbaru <cvicentiu@gmail.com>
Tue, 26 Jul 2011 10:48:34 +0000 (13:48 +0300)
committerMichael Adam <obnox@samba.org>
Mon, 22 Aug 2011 11:59:27 +0000 (13:59 +0200)
The function makes use of existing code from delincludes.
It has the same logic, except it uses the second argument
passed to determine which value to delete from the registry.

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

index ed2f69bb540224d59b89fcfd63733b02c4ee3d2b..b25faef57b31861a1e391152727ba6b33a5300b9 100644 (file)
@@ -91,6 +91,14 @@ static int rpc_conf_getparm_usage(struct net_context *c, int argc,
        return -1;
 }
 
+static int rpc_conf_delparm_usage(struct net_context *c, int argc,
+                               const char **argv)
+{
+       d_printf("%s\nnet rpc conf delparm <sharename> <parameter>\n",
+                       _("Usage:"));
+       return -1;
+}
+
 static int rpc_conf_getincludes_usage(struct net_context *c, int argc,
                                const char **argv)
 {
@@ -1058,6 +1066,72 @@ error:
 
 }
 
+static NTSTATUS rpc_conf_delparm_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;
+
+
+       ZERO_STRUCT(hive_hnd);
+       ZERO_STRUCT(key_hnd);
+
+
+       if (argc != 2 || c->display_usage) {
+               rpc_conf_delparm_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;
+       }
+
+       status = rpc_conf_del_value(frame,
+                                   b,
+                                   &key_hnd,
+                                   argv[0],
+                                   argv[1],
+                                   &werr);
+
+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 NTSTATUS rpc_conf_getincludes_internal(struct net_context *c,
                                              const struct dom_sid *domain_sid,
                                              const char *domain_name,
@@ -1260,9 +1334,10 @@ static int rpc_conf_getparm(struct net_context *c, int argc,
 static int rpc_conf_delparm(struct net_context *c, int argc,
                                const char **argv)
 {
-       d_printf("Function not yet implemented\n");
-       return 0;
+       return run_rpc_command(c, NULL, &ndr_table_winreg.syntax_id, 0,
+               rpc_conf_delparm_internal, argc, argv );
 }
+
 static int rpc_conf_getincludes(struct net_context *c, int argc,
                             const char **argv)
 {