mirror of
https://github.com/samba-team/samba.git
synced 2025-03-27 22:50:26 +03:00
libsmbconf: rewrite API to use smbconf_service struct
instead of lists of strings and counters directly... Michael (This used to be commit 17415e2dc457ce41793a7e28e71f72c538c19c61)
This commit is contained in:
parent
5dd54c58b4
commit
fb9232c0a9
@ -91,22 +91,16 @@ WERROR smbconf_drop(struct smbconf_ctx *ctx)
|
||||
WERROR smbconf_get_config(struct smbconf_ctx *ctx,
|
||||
TALLOC_CTX *mem_ctx,
|
||||
uint32_t *num_shares,
|
||||
char ***share_names, uint32_t **num_params,
|
||||
char ****param_names, char ****param_values)
|
||||
struct smbconf_service ***services)
|
||||
{
|
||||
WERROR werr = WERR_OK;
|
||||
TALLOC_CTX *tmp_ctx = NULL;
|
||||
uint32_t tmp_num_shares;
|
||||
char **tmp_share_names;
|
||||
uint32_t *tmp_num_params;
|
||||
char ***tmp_param_names;
|
||||
char ***tmp_param_values;
|
||||
struct smbconf_service **tmp_services;
|
||||
uint32_t count;
|
||||
|
||||
if ((num_shares == NULL) || (share_names == NULL) ||
|
||||
(num_params == NULL) || (param_names == NULL) ||
|
||||
(param_values == NULL))
|
||||
{
|
||||
if ((num_shares == NULL) || (services == NULL)) {
|
||||
werr = WERR_INVALID_PARAM;
|
||||
goto done;
|
||||
}
|
||||
@ -123,23 +117,18 @@ WERROR smbconf_get_config(struct smbconf_ctx *ctx,
|
||||
goto done;
|
||||
}
|
||||
|
||||
tmp_num_params = TALLOC_ARRAY(tmp_ctx, uint32_t, tmp_num_shares);
|
||||
tmp_param_names = TALLOC_ARRAY(tmp_ctx, char **, tmp_num_shares);
|
||||
tmp_param_values = TALLOC_ARRAY(tmp_ctx, char **, tmp_num_shares);
|
||||
tmp_services = TALLOC_ARRAY(tmp_ctx, struct smbconf_service *,
|
||||
tmp_num_shares);
|
||||
|
||||
if ((tmp_num_params == NULL) || (tmp_param_names == NULL) ||
|
||||
(tmp_param_values == NULL))
|
||||
{
|
||||
if (tmp_services == NULL) {
|
||||
werr = WERR_NOMEM;
|
||||
goto done;
|
||||
}
|
||||
|
||||
for (count = 0; count < tmp_num_shares; count++) {
|
||||
werr = smbconf_get_share(ctx, mem_ctx,
|
||||
werr = smbconf_get_share(ctx, tmp_services,
|
||||
tmp_share_names[count],
|
||||
&tmp_num_params[count],
|
||||
&tmp_param_names[count],
|
||||
&tmp_param_values[count]);
|
||||
&tmp_services[count]);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
goto done;
|
||||
}
|
||||
@ -149,15 +138,9 @@ WERROR smbconf_get_config(struct smbconf_ctx *ctx,
|
||||
|
||||
*num_shares = tmp_num_shares;
|
||||
if (tmp_num_shares > 0) {
|
||||
*share_names = talloc_move(mem_ctx, &tmp_share_names);
|
||||
*num_params = talloc_move(mem_ctx, &tmp_num_params);
|
||||
*param_names = talloc_move(mem_ctx, &tmp_param_names);
|
||||
*param_values = talloc_move(mem_ctx, &tmp_param_values);
|
||||
*services = talloc_move(mem_ctx, &tmp_services);
|
||||
} else {
|
||||
*share_names = NULL;
|
||||
*num_params = NULL;
|
||||
*param_names = NULL;
|
||||
*param_values = NULL;
|
||||
*services = NULL;
|
||||
}
|
||||
|
||||
done:
|
||||
@ -204,15 +187,14 @@ WERROR smbconf_create_share(struct smbconf_ctx *ctx,
|
||||
*/
|
||||
WERROR smbconf_get_share(struct smbconf_ctx *ctx,
|
||||
TALLOC_CTX *mem_ctx,
|
||||
const char *servicename, uint32_t *num_params,
|
||||
char ***param_names, char ***param_values)
|
||||
const char *servicename,
|
||||
struct smbconf_service **service)
|
||||
{
|
||||
if (!smbconf_share_exists(ctx, servicename)) {
|
||||
return WERR_NO_SUCH_SERVICE;
|
||||
}
|
||||
|
||||
return ctx->ops->get_share(ctx, mem_ctx, servicename, num_params,
|
||||
param_names, param_values);
|
||||
return ctx->ops->get_share(ctx, mem_ctx, servicename, service);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -63,8 +63,7 @@ WERROR smbconf_drop(struct smbconf_ctx *ctx);
|
||||
WERROR smbconf_get_config(struct smbconf_ctx *ctx,
|
||||
TALLOC_CTX *mem_ctx,
|
||||
uint32_t *num_shares,
|
||||
char ***share_names, uint32_t **num_params,
|
||||
char ****param_names, char ****param_values);
|
||||
struct smbconf_service ***services);
|
||||
WERROR smbconf_get_share_names(struct smbconf_ctx *ctx,
|
||||
TALLOC_CTX *mem_ctx,
|
||||
uint32_t *num_shares,
|
||||
@ -73,8 +72,8 @@ bool smbconf_share_exists(struct smbconf_ctx *ctx, const char *servicename);
|
||||
WERROR smbconf_create_share(struct smbconf_ctx *ctx, const char *servicename);
|
||||
WERROR smbconf_get_share(struct smbconf_ctx *ctx,
|
||||
TALLOC_CTX *mem_ctx,
|
||||
const char *servicename, uint32_t *num_params,
|
||||
char ***param_names, char ***param_values);
|
||||
const char *servicename,
|
||||
struct smbconf_service **service);
|
||||
WERROR smbconf_delete_share(struct smbconf_ctx *ctx,
|
||||
const char *servicename);
|
||||
WERROR smbconf_set_parameter(struct smbconf_ctx *ctx,
|
||||
|
@ -36,8 +36,8 @@ struct smbconf_ops {
|
||||
WERROR (*create_share)(struct smbconf_ctx *ctx, const char *service);
|
||||
WERROR (*get_share)(struct smbconf_ctx *ctx,
|
||||
TALLOC_CTX *mem_ctx,
|
||||
const char *servicename, uint32_t *num_params,
|
||||
char ***param_names, char ***param_values);
|
||||
const char *servicename,
|
||||
struct smbconf_service **service);
|
||||
WERROR (*delete_share)(struct smbconf_ctx *ctx,
|
||||
const char *servicename);
|
||||
WERROR (*set_parameter)(struct smbconf_ctx *ctx,
|
||||
|
@ -875,23 +875,44 @@ static WERROR smbconf_reg_create_share(struct smbconf_ctx *ctx,
|
||||
static WERROR smbconf_reg_get_share(struct smbconf_ctx *ctx,
|
||||
TALLOC_CTX *mem_ctx,
|
||||
const char *servicename,
|
||||
uint32_t *num_params,
|
||||
char ***param_names, char ***param_values)
|
||||
struct smbconf_service **service)
|
||||
{
|
||||
WERROR werr = WERR_OK;
|
||||
struct registry_key *key = NULL;
|
||||
struct smbconf_service *tmp_service = NULL;
|
||||
TALLOC_CTX *tmp_ctx = talloc_stackframe();
|
||||
|
||||
werr = smbconf_reg_open_service_key(mem_ctx, ctx, servicename,
|
||||
werr = smbconf_reg_open_service_key(tmp_ctx, ctx, servicename,
|
||||
REG_KEY_READ, &key);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
werr = smbconf_reg_get_values(mem_ctx, key, num_params,
|
||||
param_names, param_values);
|
||||
tmp_service = TALLOC_ZERO_P(tmp_ctx, struct smbconf_service);
|
||||
if (tmp_service == NULL) {
|
||||
werr = WERR_NOMEM;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (servicename != NULL) {
|
||||
tmp_service->name = talloc_strdup(tmp_service, servicename);
|
||||
if (tmp_service->name == NULL) {
|
||||
werr = WERR_NOMEM;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
werr = smbconf_reg_get_values(tmp_service, key,
|
||||
&(tmp_service->num_params),
|
||||
&(tmp_service->param_names),
|
||||
&(tmp_service->param_values));
|
||||
|
||||
if (W_ERROR_IS_OK(werr)) {
|
||||
*service = talloc_move(mem_ctx, &tmp_service);
|
||||
}
|
||||
|
||||
done:
|
||||
TALLOC_FREE(key);
|
||||
TALLOC_FREE(tmp_ctx);
|
||||
return werr;
|
||||
}
|
||||
|
||||
|
@ -389,15 +389,13 @@ static WERROR smbconf_txt_create_share(struct smbconf_ctx *ctx,
|
||||
static WERROR smbconf_txt_get_share(struct smbconf_ctx *ctx,
|
||||
TALLOC_CTX *mem_ctx,
|
||||
const char *servicename,
|
||||
uint32_t *num_params,
|
||||
char ***param_names, char ***param_values)
|
||||
struct smbconf_service **service)
|
||||
{
|
||||
WERROR werr;
|
||||
uint32_t sidx, count;
|
||||
bool found;
|
||||
TALLOC_CTX *tmp_ctx = NULL;
|
||||
char **tmp_param_names = NULL;
|
||||
char **tmp_param_values = NULL;
|
||||
struct smbconf_service *tmp_service = NULL;
|
||||
|
||||
werr = smbconf_txt_load_file(ctx);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
@ -418,16 +416,30 @@ static WERROR smbconf_txt_get_share(struct smbconf_ctx *ctx,
|
||||
goto done;
|
||||
}
|
||||
|
||||
tmp_service = TALLOC_ZERO_P(tmp_ctx, struct smbconf_service);
|
||||
if (tmp_service == NULL) {
|
||||
werr = WERR_NOMEM;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (servicename != NULL) {
|
||||
tmp_service->name = talloc_strdup(tmp_service, servicename);
|
||||
if (tmp_service->name == NULL) {
|
||||
werr = WERR_NOMEM;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
for (count = 0; count < pd(ctx)->cache->num_params[sidx]; count++) {
|
||||
werr = smbconf_add_string_to_array(tmp_ctx,
|
||||
&tmp_param_names,
|
||||
werr = smbconf_add_string_to_array(tmp_service,
|
||||
&(tmp_service->param_names),
|
||||
count,
|
||||
pd(ctx)->cache->param_names[sidx][count]);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
goto done;
|
||||
}
|
||||
werr = smbconf_add_string_to_array(tmp_ctx,
|
||||
&tmp_param_values,
|
||||
werr = smbconf_add_string_to_array(tmp_service,
|
||||
&(tmp_service->param_values),
|
||||
count,
|
||||
pd(ctx)->cache->param_values[sidx][count]);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
@ -435,13 +447,11 @@ static WERROR smbconf_txt_get_share(struct smbconf_ctx *ctx,
|
||||
}
|
||||
}
|
||||
|
||||
*num_params = count;
|
||||
tmp_service->num_params = count;
|
||||
if (count > 0) {
|
||||
*param_names = talloc_move(mem_ctx, &tmp_param_names);
|
||||
*param_values = talloc_move(mem_ctx, &tmp_param_values);
|
||||
*service = talloc_move(mem_ctx, &tmp_service);
|
||||
} else {
|
||||
*param_names = NULL;
|
||||
*param_values = NULL;
|
||||
*service = NULL;
|
||||
}
|
||||
|
||||
done:
|
||||
|
@ -6497,9 +6497,7 @@ bool service_ok(int iService)
|
||||
static bool process_registry_globals(void)
|
||||
{
|
||||
WERROR werr;
|
||||
char **param_names;
|
||||
char **param_values;
|
||||
uint32_t num_params;
|
||||
struct smbconf_service *service = NULL;
|
||||
uint32_t count;
|
||||
TALLOC_CTX *mem_ctx = talloc_stackframe();
|
||||
bool ret = false;
|
||||
@ -6519,14 +6517,14 @@ static bool process_registry_globals(void)
|
||||
goto done;
|
||||
}
|
||||
|
||||
werr = smbconf_get_share(conf_ctx, mem_ctx, GLOBAL_NAME,
|
||||
&num_params, ¶m_names, ¶m_values);
|
||||
werr = smbconf_get_share(conf_ctx, mem_ctx, GLOBAL_NAME, &service);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
for (count = 0; count < num_params; count++) {
|
||||
ret = do_parameter(param_names[count], param_values[count],
|
||||
for (count = 0; count < service->num_params; count++) {
|
||||
ret = do_parameter(service->param_names[count],
|
||||
service->param_values[count],
|
||||
NULL);
|
||||
if (ret != true) {
|
||||
goto done;
|
||||
|
@ -138,10 +138,7 @@ static int net_conf_delincludes_usage(int argc, const char **argv)
|
||||
* This functions process a service previously loaded with libsmbconf.
|
||||
*/
|
||||
static WERROR import_process_service(struct smbconf_ctx *conf_ctx,
|
||||
const char *servicename,
|
||||
const uint32_t num_params,
|
||||
const char **param_names,
|
||||
const char **param_values)
|
||||
struct smbconf_service *service)
|
||||
{
|
||||
uint32_t idx;
|
||||
WERROR werr = WERR_OK;
|
||||
@ -151,31 +148,32 @@ static WERROR import_process_service(struct smbconf_ctx *conf_ctx,
|
||||
|
||||
if (opt_testmode) {
|
||||
const char *indent = "";
|
||||
if (servicename != NULL) {
|
||||
d_printf("[%s]\n", servicename);
|
||||
if (service->name != NULL) {
|
||||
d_printf("[%s]\n", service->name);
|
||||
indent = "\t";
|
||||
}
|
||||
for (idx = 0; idx < num_params; idx++) {
|
||||
d_printf("%s%s = %s\n", indent, param_names[idx],
|
||||
param_values[idx]);
|
||||
for (idx = 0; idx < service->num_params; idx++) {
|
||||
d_printf("%s%s = %s\n", indent,
|
||||
service->param_names[idx],
|
||||
service->param_values[idx]);
|
||||
}
|
||||
d_printf("\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (smbconf_share_exists(conf_ctx, servicename)) {
|
||||
werr = smbconf_delete_share(conf_ctx, servicename);
|
||||
if (smbconf_share_exists(conf_ctx, service->name)) {
|
||||
werr = smbconf_delete_share(conf_ctx, service->name);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
werr = smbconf_create_share(conf_ctx, servicename);
|
||||
werr = smbconf_create_share(conf_ctx, service->name);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
for (idx = 0; idx < num_params; idx ++) {
|
||||
if (strequal(param_names[idx], "include")) {
|
||||
for (idx = 0; idx < service->num_params; idx ++) {
|
||||
if (strequal(service->param_names[idx], "include")) {
|
||||
includes = TALLOC_REALLOC_ARRAY(mem_ctx,
|
||||
includes,
|
||||
char *,
|
||||
@ -185,7 +183,7 @@ static WERROR import_process_service(struct smbconf_ctx *conf_ctx,
|
||||
goto done;
|
||||
}
|
||||
includes[num_includes] = talloc_strdup(includes,
|
||||
param_values[idx]);
|
||||
service->param_values[idx]);
|
||||
if (includes[num_includes] == NULL) {
|
||||
werr = WERR_NOMEM;
|
||||
goto done;
|
||||
@ -193,16 +191,16 @@ static WERROR import_process_service(struct smbconf_ctx *conf_ctx,
|
||||
num_includes++;
|
||||
} else {
|
||||
werr = smbconf_set_parameter(conf_ctx,
|
||||
servicename,
|
||||
param_names[idx],
|
||||
param_values[idx]);
|
||||
service->name,
|
||||
service->param_names[idx],
|
||||
service->param_values[idx]);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
werr = smbconf_set_includes(conf_ctx, servicename, num_includes,
|
||||
werr = smbconf_set_includes(conf_ctx, service->name, num_includes,
|
||||
(const char **)includes);
|
||||
|
||||
done:
|
||||
@ -224,11 +222,8 @@ static int net_conf_list(struct smbconf_ctx *conf_ctx,
|
||||
int ret = -1;
|
||||
TALLOC_CTX *mem_ctx;
|
||||
uint32_t num_shares;
|
||||
char **share_names;
|
||||
uint32_t *num_params;
|
||||
char ***param_names;
|
||||
char ***param_values;
|
||||
uint32_t share_count, param_count;
|
||||
struct smbconf_service **shares = NULL;
|
||||
|
||||
mem_ctx = talloc_stackframe();
|
||||
|
||||
@ -237,8 +232,7 @@ static int net_conf_list(struct smbconf_ctx *conf_ctx,
|
||||
goto done;
|
||||
}
|
||||
|
||||
werr = smbconf_get_config(conf_ctx, mem_ctx, &num_shares, &share_names,
|
||||
&num_params, ¶m_names, ¶m_values);
|
||||
werr = smbconf_get_config(conf_ctx, mem_ctx, &num_shares, &shares);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
d_fprintf(stderr, "Error getting config: %s\n",
|
||||
dos_errstr(werr));
|
||||
@ -247,17 +241,18 @@ static int net_conf_list(struct smbconf_ctx *conf_ctx,
|
||||
|
||||
for (share_count = 0; share_count < num_shares; share_count++) {
|
||||
const char *indent = "";
|
||||
if (share_names[share_count] != NULL) {
|
||||
d_printf("[%s]\n", share_names[share_count]);
|
||||
if (shares[share_count]->name != NULL) {
|
||||
d_printf("[%s]\n", shares[share_count]->name);
|
||||
indent = "\t";
|
||||
}
|
||||
for (param_count = 0; param_count < num_params[share_count];
|
||||
for (param_count = 0;
|
||||
param_count < shares[share_count]->num_params;
|
||||
param_count++)
|
||||
{
|
||||
d_printf("%s%s = %s\n",
|
||||
indent,
|
||||
param_names[share_count][param_count],
|
||||
param_values[share_count][param_count]);
|
||||
shares[share_count]->param_names[param_count],
|
||||
shares[share_count]->param_values[param_count]);
|
||||
}
|
||||
d_printf("\n");
|
||||
}
|
||||
@ -320,35 +315,25 @@ static int net_conf_import(struct smbconf_ctx *conf_ctx,
|
||||
}
|
||||
|
||||
if (servicename != NULL) {
|
||||
char **param_names, **param_values;
|
||||
uint32_t num_params;
|
||||
struct smbconf_service *service = NULL;
|
||||
|
||||
werr = smbconf_get_share(txt_ctx, mem_ctx,
|
||||
servicename,
|
||||
&num_params,
|
||||
¶m_names,
|
||||
¶m_values);
|
||||
&service);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
goto done;
|
||||
}
|
||||
werr = import_process_service(conf_ctx,
|
||||
servicename,
|
||||
num_params,
|
||||
(const char **)param_names,
|
||||
(const char **)param_values);
|
||||
werr = import_process_service(conf_ctx, service);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
goto done;
|
||||
}
|
||||
} else {
|
||||
char **share_names, ***param_names, ***param_values;
|
||||
uint32_t num_shares, *num_params, sidx;
|
||||
struct smbconf_service **services = NULL;
|
||||
uint32_t num_shares, sidx;
|
||||
|
||||
werr = smbconf_get_config(txt_ctx, mem_ctx,
|
||||
&num_shares,
|
||||
&share_names,
|
||||
&num_params,
|
||||
¶m_names,
|
||||
¶m_values);
|
||||
&services);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
goto done;
|
||||
}
|
||||
@ -359,11 +344,7 @@ static int net_conf_import(struct smbconf_ctx *conf_ctx,
|
||||
}
|
||||
}
|
||||
for (sidx = 0; sidx < num_shares; sidx++) {
|
||||
werr = import_process_service(conf_ctx,
|
||||
share_names[sidx],
|
||||
num_params[sidx],
|
||||
(const char **)param_names[sidx],
|
||||
(const char **)param_values[sidx]);
|
||||
werr = import_process_service(conf_ctx, services[sidx]);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
goto done;
|
||||
}
|
||||
@ -442,10 +423,8 @@ static int net_conf_showshare(struct smbconf_ctx *conf_ctx,
|
||||
WERROR werr = WERR_OK;
|
||||
const char *sharename = NULL;
|
||||
TALLOC_CTX *mem_ctx;
|
||||
uint32_t num_params;
|
||||
uint32_t count;
|
||||
char **param_names;
|
||||
char **param_values;
|
||||
struct smbconf_service *service = NULL;
|
||||
|
||||
mem_ctx = talloc_stackframe();
|
||||
|
||||
@ -460,8 +439,7 @@ static int net_conf_showshare(struct smbconf_ctx *conf_ctx,
|
||||
goto done;
|
||||
}
|
||||
|
||||
werr = smbconf_get_share(conf_ctx, mem_ctx, sharename, &num_params,
|
||||
¶m_names, ¶m_values);
|
||||
werr = smbconf_get_share(conf_ctx, mem_ctx, sharename, &service);
|
||||
if (!W_ERROR_IS_OK(werr)) {
|
||||
d_printf("error getting share parameters: %s\n",
|
||||
dos_errstr(werr));
|
||||
@ -470,9 +448,9 @@ static int net_conf_showshare(struct smbconf_ctx *conf_ctx,
|
||||
|
||||
d_printf("[%s]\n", sharename);
|
||||
|
||||
for (count = 0; count < num_params; count++) {
|
||||
d_printf("\t%s = %s\n", param_names[count],
|
||||
param_values[count]);
|
||||
for (count = 0; count < service->num_params; count++) {
|
||||
d_printf("\t%s = %s\n", service->param_names[count],
|
||||
service->param_values[count]);
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user