int lp_client_ldap_sasl_wrapping(void);
char *lp_parm_talloc_string(int snum, const char *type, const char *option, const char *def);
const char *lp_parm_const_string(int snum, const char *type, const char *option, const char *def);
+struct loadparm_service;
+const char *lp_parm_const_string_service(struct loadparm_service *service, const char *type, const char *option);
const char **lp_parm_string_list(int snum, const char *type, const char *option, const char **def);
int lp_parm_int(int snum, const char *type, const char *option, int def);
unsigned long lp_parm_ulong(int snum, const char *type, const char *option, unsigned long def);
const char *lp_ldap_user_suffix(void);
const char *lp_ldap_group_suffix(void);
const char *lp_ldap_idmap_suffix(void);
-struct loadparm_service;
struct parm_struct;
+/* Return a pointer to a service by name. */
+struct loadparm_service *lp_service(const char *pszServiceName);
void *lp_parm_ptr(struct loadparm_service *service, struct parm_struct *parm);
void *lp_local_ptr_by_snum(int snum, struct parm_struct *parm);
bool lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue);
* pointer to parametrical option value if it exists or NULL otherwise. Actual
* parametrical functions are quite simple
*/
-static struct param_opt_struct *get_parametrics(int snum, const char *type,
- const char *option)
+static struct param_opt_struct *get_parametrics_by_service(struct loadparm_service *service, const char *type,
+ const char *option)
{
bool global_section = false;
char* param_key;
struct param_opt_struct *data;
- if (snum >= iNumServices) return NULL;
-
- if (snum < 0) {
+ if (service == NULL) {
data = Globals.param_opt;
global_section = true;
} else {
- data = ServicePtrs[snum]->param_opt;
+ data = service->param_opt;
}
if (asprintf(¶m_key, "%s:%s", type, option) == -1) {
return NULL;
}
+/*
+ * This is a helper function for parametrical options support. It returns a
+ * pointer to parametrical option value if it exists or NULL otherwise. Actual
+ * parametrical functions are quite simple
+ */
+static struct param_opt_struct *get_parametrics(int snum, const char *type,
+ const char *option)
+{
+ struct param_opt_struct *data;
+
+ if (snum >= iNumServices) return NULL;
+
+ if (snum < 0) {
+ return get_parametrics_by_service(NULL, type, option);
+ } else {
+ return get_parametrics_by_service(ServicePtrs[snum], type, option);
+ }
+}
+
#define MISSING_PARAMETER(name) \
DEBUG(0, ("%s(): value is NULL or empty!\n", #name))
return data->value;
}
+const char *lp_parm_const_string_service(struct loadparm_service *service, const char *type, const char *option)
+{
+ struct param_opt_struct *data = get_parametrics_by_service(service, type, option);
+
+ if (data == NULL||data->value==NULL)
+ return NULL;
+
+ return data->value;
+}
+
+
/* Return parametric option from a given service. Type is a part of option before ':' */
/* Parametric option has following syntax: 'Type: option = value' */
return (iService);
}
+/* Return a pointer to a service by name. Unlike getservicebyname, it does not copy the service */
+struct loadparm_service *lp_service(const char *pszServiceName)
+{
+ int iService = getservicebyname(pszServiceName, NULL);
+ if (iService == -1 || !LP_SNUM_OK(iService)) {
+ return NULL;
+ }
+ return ServicePtrs[iService];
+}
+
+
/***************************************************************************
Copy a service structure to another.
If pcopymapDest is NULL then copy all fields
#include "includes.h"
#include "../source4/param/s3_param.h"
-static const char *get_parametric(const char *type, const char *option)
-{
- return lp_parm_const_string(-1, type, option, NULL);
-}
-
/* These are in the order that they appear in the s4 loadparm file.
* All of the s4 loadparm functions should be here eventually, once
* they are implemented in the s3 loadparm, have the same format (enum
* values in particular) and defaults. */
static const struct loadparm_s3_context s3_fns =
{
- .get_parametric = get_parametric,
+ .get_parametric = lp_parm_const_string_service,
+ .get_parm_struct = lp_get_parameter,
+ .get_parm_ptr = lp_parm_ptr,
+ .get_service = lp_service,
.server_role = lp_server_role,
return lp_ctx->sDefault;
}
-/*
- return the parameter table
-*/
-struct parm_struct *lpcfg_parm_table(void)
-{
- return parm_table;
-}
-
/**
* Convenience routine to grab string parameters into temporary memory
* and run standard_sub_basic on them.
return NULL;
if (lp_ctx->s3_fns) {
- SMB_ASSERT(service == NULL);
- return lp_ctx->s3_fns->get_parametric(type, option);
+ return lp_ctx->s3_fns->get_parametric(service, type, option);
}
data = (service == NULL ? lp_ctx->globals->param_opt : service->param_opt);
/**
return the parameter structure for a parameter
*/
-struct parm_struct *lpcfg_parm_struct(const char *name)
+struct parm_struct *lpcfg_parm_struct(struct loadparm_context *lp_ctx, const char *name)
{
- int parmnum = map_parameter(name);
+ int parmnum;
+
+ if (lp_ctx->s3_fns) {
+ return lp_ctx->s3_fns->get_parm_struct(name);
+ }
+
+ parmnum = map_parameter(name);
if (parmnum == -1) return NULL;
return &parm_table[parmnum];
}
void *lpcfg_parm_ptr(struct loadparm_context *lp_ctx,
struct loadparm_service *service, struct parm_struct *parm)
{
+ if (lp_ctx->s3_fns) {
+ return lp_ctx->s3_fns->get_parm_ptr(service, parm);
+ }
+
if (service == NULL) {
if (parm->p_class == P_LOCAL)
return ((char *)lp_ctx->sDefault)+parm->offset;
struct parm_struct *parm;
void *ptr;
- parm = lpcfg_parm_struct(parm_name);
+ parm = lpcfg_parm_struct(lp_ctx, parm_name);
if (!parm) {
return false;
}
int iService;
char *serviceName;
+ if (lp_ctx->s3_fns) {
+ return lp_ctx->s3_fns->get_service(service_name);
+ }
+
for (iService = lp_ctx->iNumServices - 1; iService >= 0; iService--) {
if (lp_ctx->services[iService] &&
lp_ctx->services[iService]->szService) {
void reload_charcnv(struct loadparm_context *lp_ctx);
struct loadparm_service *lpcfg_default_service(struct loadparm_context *lp_ctx);
-struct parm_struct *lpcfg_parm_table(void);
char *lpcfg_tls_keyfile(TALLOC_CTX *mem_ctx, struct loadparm_context *);
bool lpcfg_add_printer(struct loadparm_context *lp_ctx,
const char *pszPrintername,
struct loadparm_service *default_service);
-struct parm_struct *lpcfg_parm_struct(const char *name);
+struct parm_struct *lpcfg_parm_struct(struct loadparm_context *lp_ctx, const char *name);
void *lpcfg_parm_ptr(struct loadparm_context *lp_ctx,
struct loadparm_service *service, struct parm_struct *parm);
bool lpcfg_file_list_changed(struct loadparm_context *lp_ctx);
return PyString_FromString(value);
}
- parm = lpcfg_parm_struct(param_name);
+ parm = lpcfg_parm_struct(lp_ctx, param_name);
if (parm == NULL || parm->p_class == P_GLOBAL) {
return NULL;
}
return PyString_FromString(value);
} else {
/* its a global parameter */
- parm = lpcfg_parm_struct(param_name);
+ parm = lpcfg_parm_struct(lp_ctx, param_name);
if (parm == NULL) {
return NULL;
}
$file->("/* This file was automatically generated by mks3param.pl. DO NOT EDIT */\n\n");
$file->("struct loadparm_s3_context\n");
$file->("{\n");
- $file->("\tconst char * (*get_parametric)(const char *type, const char *option);");
+ $file->("\tconst char * (*get_parametric)(struct loadparm_service *, const char *type, const char *option);\n");
+ $file->("\tstruct parm_struct * (*get_parm_struct)(const char *param_name);\n");
+ $file->("\tvoid * (*get_parm_ptr)(struct loadparm_service *service, struct parm_struct *parm);\n");
+ $file->("\tstruct loadparm_service * (*get_service)(const char *service_name);\n");
}
sub print_footer($$)