s3:registry: implement regdb_set_secdesc() with regdb_trans_do()
authorMichael Adam <obnox@samba.org>
Tue, 30 Aug 2011 14:30:01 +0000 (16:30 +0200)
committerMichael Adam <obnox@samba.org>
Tue, 11 Oct 2011 13:21:17 +0000 (15:21 +0200)
Autobuild-User: Michael Adam <obnox@samba.org>
Autobuild-Date: Fri Sep  2 00:51:40 CEST 2011 on sn-devel-104

source3/registry/reg_backend_db.c

index 6588edcbe5ae83f949f30af9e1ef3044a27edce6..0ecc661575dfbb3e7c0e3f72adf05e77b70cea58 100644 (file)
@@ -1890,47 +1890,68 @@ done:
        return err;
 }
 
-static WERROR regdb_set_secdesc(const char *key,
-                               struct security_descriptor *secdesc)
+struct regdb_set_secdesc_ctx {
+       const char *key;
+       struct security_descriptor *secdesc;
+};
+
+static NTSTATUS regdb_set_secdesc_action(struct db_context *db,
+                                        void *private_data)
 {
-       TALLOC_CTX *mem_ctx = talloc_stackframe();
        char *tdbkey;
-       WERROR err = WERR_NOMEM;
+       NTSTATUS status;
        TDB_DATA tdbdata;
+       struct regdb_set_secdesc_ctx *ctx =
+               (struct regdb_set_secdesc_ctx *)private_data;
+       TALLOC_CTX *frame = talloc_stackframe();
 
-       if (!regdb_key_exists(regdb, key)) {
-               err = WERR_BADFILE;
+       tdbkey = talloc_asprintf(frame, "%s\\%s", REG_SECDESC_PREFIX, ctx->key);
+       if (tdbkey == NULL) {
                goto done;
        }
 
-       tdbkey = talloc_asprintf(mem_ctx, "%s\\%s", REG_SECDESC_PREFIX, key);
+       tdbkey = normalize_reg_path(frame, tdbkey);
        if (tdbkey == NULL) {
+               status = NT_STATUS_NO_MEMORY;
                goto done;
        }
 
-       tdbkey = normalize_reg_path(mem_ctx, tdbkey);
-       if (tdbkey == NULL) {
-               err = WERR_NOMEM;
+       if (ctx->secdesc == NULL) {
+               /* assuming a delete */
+               status = dbwrap_delete_bystring(db, tdbkey);
                goto done;
        }
 
-       if (secdesc == NULL) {
-               /* assuming a delete */
-               err = ntstatus_to_werror(dbwrap_trans_delete_bystring(regdb,
-                                                                     tdbkey));
+       status = marshall_sec_desc(frame, ctx->secdesc, &tdbdata.dptr,
+                                  &tdbdata.dsize);
+       if (!NT_STATUS_IS_OK(status)) {
                goto done;
        }
 
-       err = ntstatus_to_werror(marshall_sec_desc(mem_ctx, secdesc,
-                                                  &tdbdata.dptr,
-                                                  &tdbdata.dsize));
-       W_ERROR_NOT_OK_GOTO_DONE(err);
+       status = dbwrap_store_bystring(db, tdbkey, tdbdata, 0);
 
-       err = ntstatus_to_werror(dbwrap_trans_store_bystring(regdb, tdbkey,
-                                                            tdbdata, 0));
+done:
+       TALLOC_FREE(frame);
+       return status;
+}
 
- done:
-       TALLOC_FREE(mem_ctx);
+static WERROR regdb_set_secdesc(const char *key,
+                               struct security_descriptor *secdesc)
+{
+       WERROR err;
+       struct regdb_set_secdesc_ctx ctx;
+
+       if (!regdb_key_exists(regdb, key)) {
+               err = WERR_BADFILE;
+               goto done;
+       }
+
+       ctx.key = key;
+       ctx.secdesc = secdesc;
+
+       err = regdb_trans_do(regdb, regdb_set_secdesc_action, &ctx);
+
+done:
        return err;
 }