s3:services_db: extract core of svcctl_set_secdesc to _internal version
[amitay/samba.git] / source3 / services / services_db.c
index ee565001584d80e2e178f07e72216e420ea71723..dcfb018b41eaecd04f88679962ebce160de27aaa 100644 (file)
@@ -88,6 +88,8 @@ struct service_display_info common_unix_svcs[] = {
   { NULL, NULL, NULL, NULL }
 };
 
+static WERROR svcctl_set_secdesc_internal(struct registry_key *key,
+                                         struct security_descriptor *sec_desc);
 
 /********************************************************************
 ********************************************************************/
@@ -565,193 +567,147 @@ done:
  Wrapper to make storing a Service sd easier
 ********************************************************************/
 
-bool svcctl_set_secdesc(const char *name, struct security_descriptor *sec_desc,
-                       struct security_token *token)
+static WERROR svcctl_set_secdesc_internal(struct registry_key *key,
+                                         struct security_descriptor *sec_desc)
 {
-       struct registry_key *key = NULL;
+       struct registry_key *key_security = NULL;
        WERROR wresult;
-       char *path = NULL;
        struct registry_value value;
        NTSTATUS status;
-       bool ret = false;
+       enum winreg_CreateAction action = REG_ACTION_NONE;
        TALLOC_CTX *mem_ctx = talloc_stackframe();
 
-       /* now add the security descriptor */
-
-       path = talloc_asprintf(mem_ctx, "%s\\%s\\%s", KEY_SERVICES, name,
-                              "Security");
-       if (path == NULL) {
-               goto done;
-       }
-
-       wresult = reg_open_path(mem_ctx, path, REG_KEY_ALL, token, &key);
-
-       if ( !W_ERROR_IS_OK(wresult) ) {
-               DEBUG(0, ("svcctl_set_secdesc: key lookup failed! [%s] (%s)\n",
-                         path, win_errstr(wresult)));
+       wresult = reg_createkey(mem_ctx, key, "Security", REG_KEY_ALL, &key_security, &action);
+       if (!W_ERROR_IS_OK(wresult)) {
+               DEBUG(0, ("svcctl_set_secdesc: reg_createkey failed: "
+                         "[%s\\Security] (%s)\n", key->key->name,
+                         win_errstr(wresult)));
                goto done;
        }
 
-       /* stream the printer security descriptor */
-
        status = marshall_sec_desc(mem_ctx, sec_desc, &value.data.data,
                                   &value.data.length);
        if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(0,("svcctl_set_secdesc: ndr_push_struct_blob() failed!\n"));
+               DEBUG(0, ("svcctl_set_secdesc: marshall_sec_desc() failed: %s\n",
+                         nt_errstr(status)));
+               wresult = ntstatus_to_werror(status);
                goto done;
        }
 
        value.type = REG_BINARY;
 
-       wresult = reg_setvalue(key, "Security", &value);
+       wresult = reg_setvalue(key_security, "Security", &value);
        if (!W_ERROR_IS_OK(wresult)) {
                DEBUG(0, ("svcctl_set_secdesc: reg_setvalue failed: %s\n",
                          win_errstr(wresult)));
-               goto done;
        }
 
-       ret = true;
-
 done:
        talloc_free(mem_ctx);
-       return ret;
+       return wresult;
 }
 
-/********************************************************************
-********************************************************************/
-
-const char *svcctl_lookup_dispname(TALLOC_CTX *ctx, const char *name, struct security_token *token )
+bool svcctl_set_secdesc(const char *name, struct security_descriptor *sec_desc,
+                       struct security_token *token)
 {
-       const char *display_name = NULL;
-       struct registry_key_handle *key = NULL;
-       struct regval_ctr *values = NULL;
-       struct regval_blob *val = NULL;
-       char *path = NULL;
+       struct registry_key *key = NULL;
        WERROR wresult;
-       DATA_BLOB blob;
+       char *path = NULL;
+       bool ret = false;
        TALLOC_CTX *mem_ctx = talloc_stackframe();
 
        path = talloc_asprintf(mem_ctx, "%s\\%s", KEY_SERVICES, name);
        if (path == NULL) {
                goto done;
        }
-       wresult = regkey_open_internal(mem_ctx, &key, path, token,
-                                       REG_KEY_READ );
-       if ( !W_ERROR_IS_OK(wresult) ) {
-               DEBUG(0,("svcctl_lookup_dispname: key lookup failed! [%s] (%s)\n", 
-                       path, win_errstr(wresult)));
-               goto fail;
-       }
 
-       wresult = regval_ctr_init(key, &values);
-       if (!W_ERROR_IS_OK(wresult)) {
-               DEBUG(0,("svcctl_lookup_dispname: talloc() failed!\n"));
-               goto fail;
+       wresult = reg_open_path(mem_ctx, path, REG_KEY_ALL, token, &key);
+       if ( !W_ERROR_IS_OK(wresult) ) {
+               DEBUG(0, ("svcctl_set_secdesc: key lookup failed! [%s] (%s)\n",
+                         path, win_errstr(wresult)));
+               goto done;
        }
 
-       fetch_reg_values( key, values );
+       wresult = svcctl_set_secdesc_internal(key, sec_desc);
 
-       if ( !(val = regval_ctr_getvalue( values, "DisplayName" )) )
-               goto fail;
-
-       blob = data_blob_const(regval_data_p(val), regval_size(val));
-       pull_reg_sz(ctx, &blob, &display_name);
-
-       goto done;
-
-fail:
-       /* default to returning the service name */
-       display_name = talloc_strdup(ctx, name);
+       ret = W_ERROR_IS_OK(wresult);
 
 done:
        talloc_free(mem_ctx);
-       return display_name;
+       return ret;
 }
 
-/********************************************************************
-********************************************************************/
-
-const char *svcctl_lookup_description(TALLOC_CTX *ctx, const char *name, struct security_token *token )
+const char *svcctl_get_string_value(TALLOC_CTX *ctx, const char *key_name,
+                                   const char *value_name,
+                                   struct security_token *token)
 {
-       const char *description = NULL;
-       struct registry_key_handle *key = NULL;
-       struct regval_ctr *values = NULL;
-       struct regval_blob *val = NULL;
+       const char *result = NULL;
+       struct registry_key *key = NULL;
+       struct registry_value *value = NULL;
        char *path = NULL;
        WERROR wresult;
-       DATA_BLOB blob;
-
-       /* now add the security descriptor */
+       TALLOC_CTX *mem_ctx = talloc_stackframe();
 
-       if (asprintf(&path, "%s\\%s", KEY_SERVICES, name) < 0) {
-               return NULL;
-       }
-       wresult = regkey_open_internal( NULL, &key, path, token,
-                                       REG_KEY_READ );
-       if ( !W_ERROR_IS_OK(wresult) ) {
-               DEBUG(0,("svcctl_lookup_description: key lookup failed! [%s] (%s)\n", 
-                       path, win_errstr(wresult)));
-               SAFE_FREE(path);
-               return NULL;
+       path = talloc_asprintf(mem_ctx, "%s\\%s", KEY_SERVICES, key_name);
+       if (path == NULL) {
+               goto done;
        }
-       SAFE_FREE(path);
 
-       wresult = regval_ctr_init(key, &values);
+       wresult = reg_open_path(mem_ctx, path, REG_KEY_READ, token, &key);
        if (!W_ERROR_IS_OK(wresult)) {
-               DEBUG(0,("svcctl_lookup_description: talloc() failed!\n"));
-               TALLOC_FREE( key );
-               return NULL;
+               DEBUG(0, ("svcctl_get_string_value: key lookup failed! "
+                         "[%s] (%s)\n", path, win_errstr(wresult)));
+               goto done;
        }
 
-       fetch_reg_values( key, values );
+       wresult = reg_queryvalue(mem_ctx, key, value_name, &value);
+       if (!W_ERROR_IS_OK(wresult)) {
+               DEBUG(0, ("svcctl_get_string_value: error getting value "
+                         "'%s': %s\n", value_name, win_errstr(wresult)));
+               goto done;
+       }
 
-       if ( !(val = regval_ctr_getvalue( values, "Description" )) ) {
-               TALLOC_FREE( key );
-               return "Unix Service";
+       if (value->type != REG_SZ) {
+               goto done;
        }
 
-       blob = data_blob_const(regval_data_p(val), regval_size(val));
-       pull_reg_sz(ctx, &blob, &description);
+       pull_reg_sz(ctx, &value->data, &result);
 
-       TALLOC_FREE(key);
+       goto done;
 
-       return description;
+done:
+       talloc_free(mem_ctx);
+       return result;
 }
 
-
 /********************************************************************
 ********************************************************************/
 
-struct regval_ctr *svcctl_fetch_regvalues(const char *name, struct security_token *token)
+const char *svcctl_lookup_dispname(TALLOC_CTX *ctx, const char *name, struct security_token *token )
 {
-       struct registry_key_handle *key = NULL;
-       struct regval_ctr *values = NULL;
-       char *path = NULL;
-       WERROR wresult;
+       const char *display_name = NULL;
 
-       /* now add the security descriptor */
+       display_name = svcctl_get_string_value(ctx, name, "DisplayName", token);
 
-       if (asprintf(&path, "%s\\%s", KEY_SERVICES, name) < 0) {
-               return NULL;
+       if (display_name == NULL) {
+               display_name = talloc_strdup(ctx, name);
        }
-       wresult = regkey_open_internal( NULL, &key, path, token,
-                                       REG_KEY_READ );
-       if ( !W_ERROR_IS_OK(wresult) ) {
-               DEBUG(0,("svcctl_fetch_regvalues: key lookup failed! [%s] (%s)\n",
-                       path, win_errstr(wresult)));
-               SAFE_FREE(path);
-               return NULL;
-       }
-       SAFE_FREE(path);
 
-       wresult = regval_ctr_init(NULL, &values);
-       if (!W_ERROR_IS_OK(wresult)) {
-               DEBUG(0,("svcctl_fetch_regvalues: talloc() failed!\n"));
-               TALLOC_FREE( key );
-               return NULL;
+       return display_name;
+}
+
+/********************************************************************
+********************************************************************/
+
+const char *svcctl_lookup_description(TALLOC_CTX *ctx, const char *name, struct security_token *token )
+{
+       const char *description = NULL;
+
+       description = svcctl_get_string_value(ctx, name, "Description", token);
+
+       if (description == NULL) {
+               description = talloc_strdup(ctx, "Unix Service");
        }
-       fetch_reg_values( key, values );
 
-       TALLOC_FREE( key );
-       return values;
+       return description;
 }