diff options
Diffstat (limited to 'source4/param/loadparm.c')
-rw-r--r-- | source4/param/loadparm.c | 198 |
1 files changed, 72 insertions, 126 deletions
diff --git a/source4/param/loadparm.c b/source4/param/loadparm.c index 6becf82066..f508f32d06 100644 --- a/source4/param/loadparm.c +++ b/source4/param/loadparm.c @@ -70,7 +70,6 @@ static bool bLoaded = false; #define standard_sub_basic talloc_strdup /* some helpful bits */ -#define LP_SNUM_OK(i) (((i) >= 0) && ((i) < loadparm.iNumServices) && VALID(i)) #define VALID(i) (loadparm.ServicePtrs[i] != NULL) static bool do_parameter(const char *, const char *, void *); @@ -193,7 +192,7 @@ struct global /* * This structure describes a single service. */ -struct service +struct loadparm_service { char *szService; char *szPath; @@ -232,7 +231,7 @@ struct service /* This is a default service used to prime a services structure */ -static struct service sDefault = { +static struct loadparm_service sDefault = { NULL, /* szService */ NULL, /* szPath */ NULL, /* szCopy */ @@ -271,9 +270,9 @@ static struct service sDefault = { /* local variables */ static struct loadparm_context { struct global Globals; - struct service **ServicePtrs; + struct loadparm_service **ServicePtrs; int iNumServices; - struct service *currentService; + struct loadparm_service *currentService; bool bInGlobalSection; } loadparm = { .iNumServices = 0, @@ -660,15 +659,15 @@ static const char *lp_string(const char *s) int fn_name(void) {return(*(int *)(ptr));} #define FN_LOCAL_STRING(fn_name,val) \ - const char *fn_name(struct service *service) {return(lp_string((const char *)((service != NULL && service->val != NULL) ? service->val : sDefault.val)));} + const char *fn_name(struct loadparm_service *service) {return(lp_string((const char *)((service != NULL && service->val != NULL) ? service->val : sDefault.val)));} #define FN_LOCAL_CONST_STRING(fn_name,val) \ - const char *fn_name(struct service *service) {return (const char *)(service != NULL && service->val != NULL) ? service->val : sDefault.val;} + const char *fn_name(struct loadparm_service *service) {return (const char *)(service != NULL && service->val != NULL) ? service->val : sDefault.val;} #define FN_LOCAL_LIST(fn_name,val) \ - const char **fn_name(struct service *service) {return(const char **)(service != NULL && service->val != NULL? service->val : sDefault.val);} + const char **fn_name(struct loadparm_service *service) {return(const char **)(service != NULL && service->val != NULL? service->val : sDefault.val);} #define FN_LOCAL_BOOL(fn_name,val) \ - bool fn_name(struct service *service) {return((service != NULL)? service->val : sDefault.val);} + bool fn_name(struct loadparm_service *service) {return((service != NULL)? service->val : sDefault.val);} #define FN_LOCAL_INTEGER(fn_name,val) \ - int fn_name(struct service *service) {return((service != NULL)? service->val : sDefault.val);} + int fn_name(struct loadparm_service *service) {return((service != NULL)? service->val : sDefault.val);} _PUBLIC_ FN_GLOBAL_INTEGER(lp_server_role, &loadparm.Globals.server_role) _PUBLIC_ FN_GLOBAL_LIST(lp_smb_ports, &loadparm.Globals.smb_ports) @@ -794,18 +793,20 @@ _PUBLIC_ FN_GLOBAL_INTEGER(lp_client_signing, &loadparm.Globals.client_signing) /* local prototypes */ static int map_parameter(const char *pszParmName); -static struct service *getservicebyname(const char *pszServiceName); -static void copy_service(struct service *pserviceDest, - struct service *pserviceSource, int *pcopymapDest); -static bool service_ok(struct service *service); +static struct loadparm_service *getservicebyname(struct loadparm_context *lp_ctx, + const char *pszServiceName); +static void copy_service(struct loadparm_service *pserviceDest, + struct loadparm_service *pserviceSource, + int *pcopymapDest); +static bool service_ok(struct loadparm_service *service); static bool do_section(const char *pszSectionName, void *); -static void init_copymap(struct service *pservice); +static void init_copymap(struct loadparm_service *pservice); /* 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 */ -const char *lp_get_parametric(struct service *service, const char *type, - const char *option) +const char *lp_get_parametric(struct loadparm_service *service, + const char *type, const char *option) { char *vfskey; struct param_opt *data; @@ -908,7 +909,7 @@ static bool lp_bool(const char *s) /* Parametric option has following syntax: 'Type: option = value' */ /* Returned value is allocated in 'lp_talloc' context */ -const char *lp_parm_string(struct service *service, const char *type, +const char *lp_parm_string(struct loadparm_service *service, const char *type, const char *option) { const char *value = lp_get_parametric(service, type, option); @@ -923,7 +924,8 @@ const char *lp_parm_string(struct service *service, const char *type, /* Parametric option has following syntax: 'Type: option = value' */ /* Returned value is allocated in 'lp_talloc' context */ -const char **lp_parm_string_list(struct service *service, const char *type, +const char **lp_parm_string_list(struct loadparm_service *service, + const char *type, const char *option, const char *separator) { const char *value = lp_get_parametric(service, type, option); @@ -938,8 +940,8 @@ const char **lp_parm_string_list(struct service *service, const char *type, /* Return parametric option from a given service. Type is a part of option before ':' */ /* Parametric option has following syntax: 'Type: option = value' */ -int lp_parm_int(struct service *service, const char *type, const char *option, - int default_v) +int lp_parm_int(struct loadparm_service *service, const char *type, + const char *option, int default_v) { const char *value = lp_get_parametric(service, type, option); @@ -954,7 +956,7 @@ int lp_parm_int(struct service *service, const char *type, const char *option, * Parametric option has following syntax: 'Type: option = value'. */ -int lp_parm_bytes(struct service *service, const char *type, +int lp_parm_bytes(struct loadparm_service *service, const char *type, const char *option, int default_v) { uint64_t bval; @@ -973,7 +975,7 @@ int lp_parm_bytes(struct service *service, const char *type, /* Return parametric option from a given service. Type is a part of option before ':' */ /* Parametric option has following syntax: 'Type: option = value' */ -unsigned long lp_parm_ulong(struct service *service, const char *type, +unsigned long lp_parm_ulong(struct loadparm_service *service, const char *type, const char *option, unsigned long default_v) { const char *value = lp_get_parametric(service, type, option); @@ -985,7 +987,7 @@ unsigned long lp_parm_ulong(struct service *service, const char *type, } -double lp_parm_double(struct service *service, const char *type, +double lp_parm_double(struct loadparm_service *service, const char *type, const char *option, double default_v) { const char *value = lp_get_parametric(service, type, option); @@ -999,7 +1001,7 @@ double lp_parm_double(struct service *service, const char *type, /* Return parametric option from a given service. Type is a part of option before ':' */ /* Parametric option has following syntax: 'Type: option = value' */ -bool lp_parm_bool(struct service *service, const char *type, +bool lp_parm_bool(struct loadparm_service *service, const char *type, const char *option, bool default_v) { const char *value = lp_get_parametric(service, type, option); @@ -1015,9 +1017,10 @@ bool lp_parm_bool(struct service *service, const char *type, Initialise a service to the defaults. ***************************************************************************/ -static struct service *init_service(TALLOC_CTX *mem_ctx) +static struct loadparm_service *init_service(TALLOC_CTX *mem_ctx) { - struct service *pservice = talloc_zero(mem_ctx, struct service); + struct loadparm_service *pservice = + talloc_zero(mem_ctx, struct loadparm_service); copy_service(pservice, &sDefault, NULL); return pservice; } @@ -1027,12 +1030,12 @@ static struct service *init_service(TALLOC_CTX *mem_ctx) service. ***************************************************************************/ -static struct service *add_a_service(struct loadparm_context *lp_ctx, - const struct service *pservice, +static struct loadparm_service *add_a_service(struct loadparm_context *lp_ctx, + const struct loadparm_service *pservice, const char *name) { int i; - struct service tservice; + struct loadparm_service tservice; int num_to_alloc = lp_ctx->iNumServices + 1; struct param_opt *data, *pdata; @@ -1040,7 +1043,8 @@ static struct service *add_a_service(struct loadparm_context *lp_ctx, /* it might already exist */ if (name) { - struct service *service = getservicebyname(name); + struct loadparm_service *service = getservicebyname(lp_ctx, + name); if (service != NULL) { /* Clean all parametric options for service */ /* They will be added during parsing again */ @@ -1062,9 +1066,9 @@ static struct service *add_a_service(struct loadparm_context *lp_ctx, /* if not, then create one */ if (i == lp_ctx->iNumServices) { - struct service **tsp; + struct loadparm_service **tsp; - tsp = realloc_p(lp_ctx->ServicePtrs, struct service *, + tsp = realloc_p(lp_ctx->ServicePtrs, struct loadparm_service *, num_to_alloc); if (!tsp) { @@ -1096,10 +1100,11 @@ static struct service *add_a_service(struct loadparm_context *lp_ctx, ***************************************************************************/ bool lp_add_home(struct loadparm_context *lp_ctx, - const char *pszHomename, struct service *default_service, + const char *pszHomename, + struct loadparm_service *default_service, const char *user, const char *pszHomedir) { - struct service *service; + struct loadparm_service *service; pstring newHomedir; service = add_a_service(lp_ctx, default_service, pszHomename); @@ -1133,9 +1138,9 @@ bool lp_add_home(struct loadparm_context *lp_ctx, Add a new service, based on an old one. ***************************************************************************/ -struct service *lp_add_service(struct loadparm_context *lp_ctx, +struct loadparm_service *lp_add_service(struct loadparm_context *lp_ctx, const char *pszService, - struct service *default_service) + struct loadparm_service *default_service) { return add_a_service(lp_ctx, default_service, pszService); } @@ -1147,7 +1152,7 @@ struct service *lp_add_service(struct loadparm_context *lp_ctx, static bool lp_add_hidden(struct loadparm_context *lp_ctx, const char *name, const char *fstype) { - struct service *service = add_a_service(lp_ctx, &sDefault, name); + struct loadparm_service *service = add_a_service(lp_ctx, &sDefault, name); if (service == NULL) return false; @@ -1178,10 +1183,10 @@ static bool lp_add_hidden(struct loadparm_context *lp_ctx, const char *name, bool lp_add_printer(struct loadparm_context *lp_ctx, const char *pszPrintername, - struct service *default_service) + struct loadparm_service *default_service) { const char *comment = "From Printcap"; - struct service *service; + struct loadparm_service *service; service = add_a_service(lp_ctx, default_service, pszPrintername); if (service == NULL) @@ -1245,7 +1250,7 @@ struct parm_struct *lp_parm_struct(const char *name) /* return the parameter pointer for a parameter */ -void *lp_parm_ptr(struct service *service, struct parm_struct *parm) +void *lp_parm_ptr(struct loadparm_service *service, struct parm_struct *parm) { if (service == NULL) return parm->ptr; @@ -1257,14 +1262,15 @@ void *lp_parm_ptr(struct service *service, struct parm_struct *parm) Find a service by name. Otherwise works like get_service. ***************************************************************************/ -static struct service *getservicebyname(const char *pszServiceName) +static struct loadparm_service *getservicebyname(struct loadparm_context *lp_ctx, + const char *pszServiceName) { int iService; - for (iService = loadparm.iNumServices - 1; iService >= 0; iService--) - if (VALID(iService) && - strwicmp(loadparm.ServicePtrs[iService]->szService, pszServiceName) == 0) { - return loadparm.ServicePtrs[iService]; + for (iService = lp_ctx->iNumServices - 1; iService >= 0; iService--) + if (lp_ctx->ServicePtrs[iService] != NULL && + strwicmp(lp_ctx->ServicePtrs[iService]->szService, pszServiceName) == 0) { + return lp_ctx->ServicePtrs[iService]; } return NULL; @@ -1275,8 +1281,8 @@ static struct service *getservicebyname(const char *pszServiceName) If pcopymapDest is NULL then copy all fields ***************************************************************************/ -static void copy_service(struct service *pserviceDest, - struct service *pserviceSource, +static void copy_service(struct loadparm_service *pserviceDest, + struct loadparm_service *pserviceSource, int *pcopymapDest) { int i; @@ -1368,7 +1374,7 @@ Check a service for consistency. Return False if the service is in any way incomplete or faulty, else True. ***************************************************************************/ -static bool service_ok(struct service *service) +static bool service_ok(struct loadparm_service *service) { bool bRetval; @@ -1506,7 +1512,7 @@ static bool handle_include(const char *pszParmValue, char **ptr) static bool handle_copy(const char *pszParmValue, char **ptr) { bool bRetval; - struct service *serviceTemp; + struct loadparm_service *serviceTemp; string_set(talloc_autofree_context(), ptr, pszParmValue); @@ -1514,7 +1520,7 @@ static bool handle_copy(const char *pszParmValue, char **ptr) DEBUG(3, ("Copying service from service %s\n", pszParmValue)); - if ((serviceTemp = getservicebyname(pszParmValue)) != NULL) { + if ((serviceTemp = getservicebyname(&loadparm, pszParmValue)) != NULL) { if (serviceTemp == loadparm.currentService) { DEBUG(0, ("Can't copy service %s - unable to copy self!\n", pszParmValue)); } else { @@ -1535,7 +1541,7 @@ static bool handle_copy(const char *pszParmValue, char **ptr) Initialise a copymap. ***************************************************************************/ -static void init_copymap(struct service *pservice) +static void init_copymap(struct loadparm_service *pservice) { int i; talloc_free(pservice->copymap); @@ -1550,22 +1556,10 @@ static void init_copymap(struct service *pservice) pservice->copymap[i] = true; } -#if 0 /* not used anywhere */ -/*************************************************************************** - Return the local pointer to a parameter given the service number and the - pointer into the default structure. -***************************************************************************/ - -void *lp_local_ptr(int snum, void *ptr) -{ - return (void *)(((char *)ServicePtrs[snum]) + PTR_DIFF(ptr, &sDefault)); -} -#endif - /*************************************************************************** Process a parametric option ***************************************************************************/ -static bool lp_do_parameter_parametric(struct service *service, +static bool lp_do_parameter_parametric(struct loadparm_service *service, const char *pszParmName, const char *pszParmValue, int flags) { @@ -1751,7 +1745,7 @@ bool lp_do_global_parameter(struct loadparm_context *lp_ctx, pszParmName, pszParmValue); } -bool lp_do_service_parameter(struct service *service, +bool lp_do_service_parameter(struct loadparm_service *service, const char *pszParmName, const char *pszParmValue) { void *def_ptr = NULL; @@ -1805,7 +1799,7 @@ bool lp_do_service_parameter(struct service *service, Process a parameter for a particular service number. If snum < 0 then assume we are in the globals. ***************************************************************************/ -bool lp_do_parameter(struct service *service, const char *pszParmName, +bool lp_do_parameter(struct loadparm_service *service, const char *pszParmName, const char *pszParmValue) { if (service == NULL) { @@ -2126,7 +2120,7 @@ static void dump_globals(FILE *f, bool show_defaults) Display the contents of a single services record. ***************************************************************************/ -static void dump_a_service(struct service * pService, FILE * f) +static void dump_a_service(struct loadparm_service * pService, FILE * f) { int i; struct param_opt *data; @@ -2167,7 +2161,7 @@ static void dump_a_service(struct service * pService, FILE * f) bool lp_dump_a_parameter(int snum, char *parm_name, FILE * f, bool isGlobal) { - struct service * pService = loadparm.ServicePtrs[snum]; + struct loadparm_service * pService = loadparm.ServicePtrs[snum]; struct parm_struct *parm; void *ptr; @@ -2213,7 +2207,7 @@ struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters) return &parm_table[(*i)++]; } } else { - struct service *pService = loadparm.ServicePtrs[snum]; + struct loadparm_service *pService = loadparm.ServicePtrs[snum]; for (; parm_table[*i].label; (*i)++) { if (parm_table[*i].class == P_SEPARATOR) @@ -2248,15 +2242,6 @@ struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters) /*************************************************************************** - Return TRUE if the passed service number is within range. -***************************************************************************/ - -bool lp_snum_ok(int iService) -{ - return (LP_SNUM_OK(iService) && loadparm.ServicePtrs[iService]->bAvailable); -} - -/*************************************************************************** Auto-load some home services. ***************************************************************************/ @@ -2283,7 +2268,7 @@ void lp_killunused(struct smbsrv_connection *smb, bool (*snumused) (struct smbsr { int i; for (i = 0; i < loadparm.iNumServices; i++) { - if (!VALID(i)) + if (loadparm.ServicePtrs[i] == NULL) continue; if (!snumused || !snumused(smb, i)) { @@ -2294,18 +2279,6 @@ void lp_killunused(struct smbsrv_connection *smb, bool (*snumused) (struct smbsr } /*************************************************************************** - Unload a service. -***************************************************************************/ - -void lp_killservice(int iServiceIn) -{ - if (VALID(iServiceIn)) { - talloc_free(loadparm.ServicePtrs[iServiceIn]); - loadparm.ServicePtrs[iServiceIn] = NULL; - } -} - -/*************************************************************************** Initialise the global parameter structure. ***************************************************************************/ bool loadparm_init(struct loadparm_context *lp_ctx) @@ -2557,7 +2530,7 @@ void lp_dump(FILE *f, bool show_defaults, int maxtoprint) Display the contents of one service in human-readable form. ***************************************************************************/ -void lp_dump_one(FILE *f, bool show_defaults, struct service *service) +void lp_dump_one(FILE *f, bool show_defaults, struct loadparm_service *service) { if (service != NULL) { if (service->szService[0] == '\0') @@ -2566,12 +2539,12 @@ void lp_dump_one(FILE *f, bool show_defaults, struct service *service) } } -struct service *lp_servicebynum(int snum) +struct loadparm_service *lp_servicebynum(int snum) { return loadparm.ServicePtrs[snum]; } -struct service *lp_service(const char *service_name) +struct loadparm_service *lp_service(const char *service_name) { int snum = lp_servicenumber(service_name); if (snum < 0) @@ -2611,28 +2584,10 @@ int lp_servicenumber(const char *pszServiceName) return iService; } -int lp_find_valid_service(const char *pszServiceName) -{ - int iService; - - iService = lp_servicenumber(pszServiceName); - - if (iService >= 0 && !lp_snum_ok(iService)) { - DEBUG(0,("lp_find_valid_service: Invalid snum %d for '%s'\n",iService, pszServiceName)); - iService = -1; - } - - if (iService == -1) { - DEBUG(3,("lp_find_valid_service: failed to find service '%s'\n", pszServiceName)); - } - - return iService; -} - /******************************************************************* A useful volume label function. ********************************************************************/ -const char *volume_label(struct service *service) +const char *volume_label(struct loadparm_service *service) { const char *ret = lp_volume(service); if (!*ret) @@ -2650,16 +2605,7 @@ bool lp_domain_logons(void) return (lp_server_role() == ROLE_DOMAIN_CONTROLLER); } -/******************************************************************* - Remove a service. -********************************************************************/ - -void lp_remove_service(int snum) -{ - loadparm.ServicePtrs[snum] = NULL; -} - -const char *lp_printername(struct service *service) +const char *lp_printername(struct loadparm_service *service) { const char *ret = _lp_printername(service); if (ret == NULL || (ret != NULL && *ret == '\0')) @@ -2673,9 +2619,9 @@ const char *lp_printername(struct service *service) Return the max print jobs per queue. ********************************************************************/ -int lp_maxprintjobs(int snum) +int lp_maxprintjobs(struct loadparm_service *service) { - int maxjobs = LP_SNUM_OK(snum) ? loadparm.ServicePtrs[snum]->iMaxPrintJobs : sDefault.iMaxPrintJobs; + int maxjobs = (service != NULL) ? service->iMaxPrintJobs : sDefault.iMaxPrintJobs; if (maxjobs <= 0 || maxjobs >= PRINT_MAX_JOBID) maxjobs = PRINT_MAX_JOBID - 1; |