s3:net: refactor getting of secdesc out of net_registry_getsd()
authorMichael Adam <obnox@samba.org>
Fri, 26 Feb 2010 08:31:03 +0000 (09:31 +0100)
committerMichael Adam <obnox@samba.org>
Mon, 22 Mar 2010 16:47:59 +0000 (17:47 +0100)
New net_registry_getsd_internal does the work(),
net_registry_getsd() just prints the result.
This in preparation to add support for other output formats
than the currently used display_sec_desc().

Michael
(cherry picked from commit 9a9a70f62e31e03d427275fabc2f00bb418ffa8d)

source3/utils/net_registry.c

index 2378fd3cf8080f2cac009e15b6be3dc82924cb49..89bbf58443554786666bcc5d3d6dac16a2139ac0 100644 (file)
@@ -445,13 +445,13 @@ done:
        return ret;
 }
 
-static int net_registry_getsd(struct net_context *c, int argc,
-                             const char **argv)
+static WERROR net_registry_getsd_internal(struct net_context *c,
+                                         TALLOC_CTX *mem_ctx,
+                                         const char *keyname,
+                                         struct security_descriptor **sd)
 {
        WERROR werr;
-       int ret = -1;
        struct registry_key *key = NULL;
-       struct security_descriptor *secdesc = NULL;
        TALLOC_CTX *ctx = talloc_stackframe();
        uint32_t access_mask = REG_KEY_READ |
                               SEC_FLAG_MAXIMUM_ALLOWED |
@@ -463,30 +463,58 @@ static int net_registry_getsd(struct net_context *c, int argc,
         */
        access_mask = REG_KEY_READ;
 
-       if (argc != 1 || c->display_usage) {
-               d_printf("Usage:    net registry getsd <path>\n");
-               d_printf("Example:  net registry getsd "
-                        "'HKLM\\Software\\Samba'\n");
+       if (sd == NULL) {
+               d_fprintf(stderr, "internal error: invalid argument\n");
+               werr = WERR_INVALID_PARAM;
                goto done;
        }
-       if (strlen(argv[0]) == 0) {
+
+       if (strlen(keyname) == 0) {
                d_fprintf(stderr, "error: zero length key name given\n");
+               werr = WERR_INVALID_PARAM;
                goto done;
        }
 
-       werr = open_key(ctx, argv[0], access_mask, &key);
+       werr = open_key(ctx, keyname, access_mask, &key);
        if (!W_ERROR_IS_OK(werr)) {
                d_fprintf(stderr, "open_key failed: %s\n", win_errstr(werr));
                goto done;
        }
 
-       werr = reg_getkeysecurity(ctx, key, &secdesc);
+       werr = reg_getkeysecurity(mem_ctx, key, sd);
        if (!W_ERROR_IS_OK(werr)) {
                d_fprintf(stderr, "reg_getkeysecurity failed: %s\n",
                          win_errstr(werr));
                goto done;
        }
 
+       werr = WERR_OK;
+
+done:
+       TALLOC_FREE(ctx);
+       return werr;
+}
+
+static int net_registry_getsd(struct net_context *c, int argc,
+                             const char **argv)
+{
+       WERROR werr;
+       int ret = -1;
+       struct security_descriptor *secdesc = NULL;
+       TALLOC_CTX *ctx = talloc_stackframe();
+
+       if (argc != 1 || c->display_usage) {
+               d_printf("Usage:    net registry getsd <path>\n");
+               d_printf("Example:  net registry getsd "
+                        "'HKLM\\Software\\Samba'\n");
+               goto done;
+       }
+
+       werr = net_registry_getsd_internal(c, ctx, argv[0], &secdesc);
+       if (!W_ERROR_IS_OK(werr)) {
+               goto done;
+       }
+
        display_sec_desc(secdesc);
 
        ret = 0;