{ NULL, NULL, NULL, NULL }
};
+static WERROR svcctl_set_secdesc_internal(struct registry_key *key,
+ struct security_descriptor *sec_desc);
/********************************************************************
********************************************************************/
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;
}