summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/param/loadparm.c164
1 files changed, 80 insertions, 84 deletions
diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
index 8888c45933..2aa24b8d10 100644
--- a/source3/param/loadparm.c
+++ b/source3/param/loadparm.c
@@ -86,10 +86,8 @@ pstring global_scope = "";
#endif
/* some helpful bits */
-#define pSERVICE(i) ServicePtrs[i]
-#define iSERVICE(i) (*pSERVICE(i))
-#define LP_SNUM_OK(iService) (((iService) >= 0) && ((iService) < iNumServices) && iSERVICE(iService).valid)
-#define VALID(i) iSERVICE(i).valid
+#define LP_SNUM_OK(i) (((i) >= 0) && ((i) < iNumServices) && ServicePtrs[(i)]->valid)
+#define VALID(i) ServicePtrs[i]->valid
int keepalive = DEFAULT_KEEPALIVE;
BOOL use_getwd_cache = True;
@@ -1418,13 +1416,13 @@ static char *lp_string(const char *s)
int fn_name(void) {return(*(int *)(ptr));}
#define FN_LOCAL_STRING(fn_name,val) \
- char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i)&&pSERVICE(i)->val)?pSERVICE(i)->val : sDefault.val));}
+ char *fn_name(int i) {return(lp_string((LP_SNUM_OK(i) && ServicePtrs[(i)]->val) ? ServicePtrs[(i)]->val : sDefault.val));}
#define FN_LOCAL_BOOL(fn_name,val) \
- BOOL fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
+ BOOL fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
#define FN_LOCAL_CHAR(fn_name,val) \
- char fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
+ char fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
#define FN_LOCAL_INTEGER(fn_name,val) \
- int fn_name(int i) {return(LP_SNUM_OK(i)? pSERVICE(i)->val : sDefault.val);}
+ int fn_name(int i) {return(LP_SNUM_OK(i)? ServicePtrs[(i)]->val : sDefault.val);}
FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
@@ -1740,8 +1738,6 @@ static void free_service(service * pservice)
pservice->copymap = NULL;
}
- pservice->valid = False;
-
for (i = 0; parm_table[i].label; i++)
if ((parm_table[i].type == P_STRING ||
parm_table[i].type == P_USTRING) &&
@@ -1749,6 +1745,8 @@ static void free_service(service * pservice)
string_free((char **)
(((char *)pservice) +
PTR_DIFF(parm_table[i].ptr, &sDefault)));
+
+ ZERO_STRUCTP(pservice);
}
/***************************************************************************
@@ -1773,7 +1771,7 @@ static int add_a_service(service * pservice, char *name)
/* find an invalid one */
for (i = 0; i < iNumServices; i++)
- if (!pSERVICE(i)->valid)
+ if (!ServicePtrs[i]->valid)
break;
/* if not, then create one */
@@ -1784,24 +1782,24 @@ static int add_a_service(service * pservice, char *name)
sizeof(service *) *
num_to_alloc);
if (ServicePtrs)
- pSERVICE(iNumServices) =
+ ServicePtrs[iNumServices] =
(service *) malloc(sizeof(service));
- if (!ServicePtrs || !pSERVICE(iNumServices))
+ if (!ServicePtrs || !ServicePtrs[iNumServices])
return (-1);
iNumServices++;
}
else
- free_service(pSERVICE(i));
+ free_service(ServicePtrs[i]);
- pSERVICE(i)->valid = True;
+ ServicePtrs[i]->valid = True;
- init_service(pSERVICE(i));
- copy_service(pSERVICE(i), &tservice, NULL);
+ init_service(ServicePtrs[i]);
+ copy_service(ServicePtrs[i], &tservice, NULL);
if (name)
{
- string_set(&iSERVICE(i).szService, name);
+ string_set(&ServicePtrs[i]->szService, name);
}
return (i);
}
@@ -1812,23 +1810,23 @@ from service ifrom. homename must be in DOS codepage.
***************************************************************************/
BOOL lp_add_home(char *pszHomename, int iDefaultService, char *pszHomedir)
{
- int i = add_a_service(pSERVICE(iDefaultService), pszHomename);
+ int i = add_a_service(ServicePtrs[iDefaultService], pszHomename);
if (i < 0)
return (False);
- if (!(*(iSERVICE(i).szPath))
- || strequal(iSERVICE(i).szPath, lp_pathname(-1)))
- string_set(&iSERVICE(i).szPath, pszHomedir);
- if (!(*(iSERVICE(i).comment)))
+ if (!(*(ServicePtrs[i]->szPath))
+ || strequal(ServicePtrs[i]->szPath, lp_pathname(-1)))
+ string_set(&ServicePtrs[i]->szPath, pszHomedir);
+ if (!(*(ServicePtrs[i]->comment)))
{
pstring comment;
slprintf(comment, sizeof(comment) - 1,
"Home directory of %s", pszHomename);
- string_set(&iSERVICE(i).comment, comment);
+ string_set(&ServicePtrs[i]->comment, comment);
}
- iSERVICE(i).bAvailable = sDefault.bAvailable;
- iSERVICE(i).bBrowseable = sDefault.bBrowseable;
+ ServicePtrs[i]->bAvailable = sDefault.bAvailable;
+ ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
DEBUG(3,
("adding home directory %s at %s\n", pszHomename, pszHomedir));
@@ -1841,7 +1839,7 @@ add a new service, based on an old one. pszService must be in DOS codepage.
***************************************************************************/
int lp_add_service(char *pszService, int iDefaultService)
{
- return (add_a_service(pSERVICE(iDefaultService), pszService));
+ return (add_a_service(ServicePtrs[iDefaultService], pszService));
}
@@ -1859,18 +1857,18 @@ static BOOL lp_add_ipc(char *ipc_name, BOOL guest_ok)
slprintf(comment, sizeof(comment) - 1,
"IPC Service (%s)", Globals.szServerString);
- string_set(&iSERVICE(i).szPath, tmpdir());
- string_set(&iSERVICE(i).szUsername, "");
- string_set(&iSERVICE(i).comment, comment);
- string_set(&iSERVICE(i).fstype, "IPC");
- iSERVICE(i).status = False;
- iSERVICE(i).iMaxConnections = 0;
- iSERVICE(i).bAvailable = True;
- iSERVICE(i).bRead_only = True;
- iSERVICE(i).bGuest_only = False;
- iSERVICE(i).bGuest_ok = guest_ok;
- iSERVICE(i).bPrint_ok = False;
- iSERVICE(i).bBrowseable = sDefault.bBrowseable;
+ string_set(&ServicePtrs[i]->szPath, tmpdir());
+ string_set(&ServicePtrs[i]->szUsername, "");
+ string_set(&ServicePtrs[i]->comment, comment);
+ string_set(&ServicePtrs[i]->fstype, "IPC");
+ ServicePtrs[i]->status = False;
+ ServicePtrs[i]->iMaxConnections = 0;
+ ServicePtrs[i]->bAvailable = True;
+ ServicePtrs[i]->bRead_only = True;
+ ServicePtrs[i]->bGuest_only = False;
+ ServicePtrs[i]->bGuest_ok = guest_ok;
+ ServicePtrs[i]->bPrint_ok = False;
+ ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
DEBUG(3, ("adding IPC service\n"));
@@ -1885,7 +1883,7 @@ printername must be in DOS codepage.
BOOL lp_add_printer(char *pszPrintername, int iDefaultService)
{
char *comment = "From Printcap";
- int i = add_a_service(pSERVICE(iDefaultService), pszPrintername);
+ int i = add_a_service(ServicePtrs[iDefaultService], pszPrintername);
if (i < 0)
return (False);
@@ -1896,17 +1894,17 @@ BOOL lp_add_printer(char *pszPrintername, int iDefaultService)
/* entry (if/when the 'available' keyword is implemented!). */
/* the printer name is set to the service name. */
- string_set(&iSERVICE(i).szPrintername, pszPrintername);
- string_set(&iSERVICE(i).comment, comment);
- iSERVICE(i).bBrowseable = sDefault.bBrowseable;
+ string_set(&ServicePtrs[i]->szPrintername, pszPrintername);
+ string_set(&ServicePtrs[i]->comment, comment);
+ ServicePtrs[i]->bBrowseable = sDefault.bBrowseable;
/* Printers cannot be read_only. */
- iSERVICE(i).bRead_only = False;
+ ServicePtrs[i]->bRead_only = False;
/* No share modes on printer services. */
- iSERVICE(i).bShareModes = False;
+ ServicePtrs[i]->bShareModes = False;
/* No oplocks on printer services. */
- iSERVICE(i).bOpLocks = False;
+ ServicePtrs[i]->bOpLocks = False;
/* Printer services must be printable. */
- iSERVICE(i).bPrint_ok = True;
+ ServicePtrs[i]->bPrint_ok = True;
DEBUG(3, ("adding printer service %s\n", pszPrintername));
@@ -1971,12 +1969,10 @@ static int getservicebyname(char *pszServiceName, service * pserviceDest)
for (iService = iNumServices - 1; iService >= 0; iService--)
if (VALID(iService) &&
- strwicmp(iSERVICE(iService).szService,
- pszServiceName) == 0)
+ strwicmp(ServicePtrs[iService]->szService, pszServiceName) == 0)
{
if (pserviceDest != NULL)
- copy_service(pserviceDest, pSERVICE(iService),
- NULL);
+ copy_service(pserviceDest, ServicePtrs[iService], NULL);
break;
}
@@ -2059,7 +2055,7 @@ static BOOL service_ok(int iService)
BOOL bRetval;
bRetval = True;
- if (iSERVICE(iService).szService[0] == '\0')
+ if (ServicePtrs[iService]->szService[0] == '\0')
{
DEBUG(0,
("The following message indicates an internal error:\n"));
@@ -2069,31 +2065,31 @@ static BOOL service_ok(int iService)
/* The [printers] entry MUST be printable. I'm all for flexibility, but */
/* I can't see why you'd want a non-printable printer service... */
- if (strwicmp(iSERVICE(iService).szService, PRINTERS_NAME) == 0) {
- if (!iSERVICE(iService).bPrint_ok) {
+ if (strwicmp(ServicePtrs[iService]->szService, PRINTERS_NAME) == 0) {
+ if (!ServicePtrs[iService]->bPrint_ok) {
DEBUG(0,
("WARNING: [%s] service MUST be printable!\n",
- iSERVICE(iService).szService));
- iSERVICE(iService).bPrint_ok = True;
+ ServicePtrs[iService]->szService));
+ ServicePtrs[iService]->bPrint_ok = True;
}
/* [printers] service must also be non-browsable. */
- if (iSERVICE(iService).bBrowseable)
- iSERVICE(iService).bBrowseable = False;
+ if (ServicePtrs[iService]->bBrowseable)
+ ServicePtrs[iService]->bBrowseable = False;
}
- if (iSERVICE(iService).szPath[0] == '\0' &&
- strwicmp(iSERVICE(iService).szService, HOMES_NAME) != 0)
+ if (ServicePtrs[iService]->szPath[0] == '\0' &&
+ strwicmp(ServicePtrs[iService]->szService, HOMES_NAME) != 0)
{
DEBUG(0,
("No path in service %s - using %s\n",
- iSERVICE(iService).szService, tmpdir()));
- string_set(&iSERVICE(iService).szPath, tmpdir());
+ ServicePtrs[iService]->szService, tmpdir()));
+ string_set(&ServicePtrs[iService]->szPath, tmpdir());
}
/* If a service is flagged unavailable, log the fact at level 0. */
- if (!iSERVICE(iService).bAvailable)
+ if (!ServicePtrs[iService]->bAvailable)
DEBUG(1, ("NOTE: Service %s is flagged unavailable.\n",
- iSERVICE(iService).szService));
+ ServicePtrs[iService]->szService));
return (bRetval);
}
@@ -2439,9 +2435,9 @@ static BOOL handle_copy(char *pszParmValue, char **ptr)
}
else
{
- copy_service(pSERVICE(iServiceIndex),
+ copy_service(ServicePtrs[iServiceIndex],
&serviceTemp,
- iSERVICE(iServiceIndex).copymap);
+ ServicePtrs[iServiceIndex]->copymap);
bRetval = True;
}
}
@@ -2538,7 +2534,7 @@ static void init_copymap(service * pservice)
***************************************************************************/
void *lp_local_ptr(int snum, void *ptr)
{
- return (void *)(((char *)pSERVICE(snum)) + PTR_DIFF(ptr, &sDefault));
+ return (void *)(((char *)ServicePtrs[snum]) + PTR_DIFF(ptr, &sDefault));
}
/***************************************************************************
@@ -2583,20 +2579,20 @@ BOOL lp_do_parameter(int snum, char *pszParmName, char *pszParmValue)
return (True);
}
parm_ptr =
- ((char *)pSERVICE(snum)) + PTR_DIFF(def_ptr,
+ ((char *)ServicePtrs[snum]) + PTR_DIFF(def_ptr,
&sDefault);
}
if (snum >= 0)
{
- if (!iSERVICE(snum).copymap)
- init_copymap(pSERVICE(snum));
+ if (!ServicePtrs[snum]->copymap)
+ init_copymap(ServicePtrs[snum]);
/* this handles the aliases - set the copymap for other entries with
the same data pointer */
for (i = 0; parm_table[i].label; i++)
if (parm_table[i].ptr == parm_table[parmnum].ptr)
- iSERVICE(snum).copymap[i] = False;
+ ServicePtrs[snum]->copymap[i] = False;
}
/* if it is a special case then go ahead */
@@ -2931,7 +2927,7 @@ BOOL lp_is_default(int snum, struct parm_struct *parm)
int pdiff = PTR_DIFF(parm->ptr, &sDefault);
return equal_parameter(parm->type,
- ((char *)pSERVICE(snum)) + pdiff,
+ ((char *)ServicePtrs[snum]) + pdiff,
((char *)&sDefault) + pdiff);
}
@@ -3005,7 +3001,7 @@ struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters)
}
else
{
- service *pService = pSERVICE(snum);
+ service *pService = ServicePtrs[snum];
for (; parm_table[*i].label; (*i)++)
{
@@ -3067,7 +3063,7 @@ Return TRUE if the passed service number is within range.
***************************************************************************/
BOOL lp_snum_ok(int iService)
{
- return (LP_SNUM_OK(iService) && iSERVICE(iService).bAvailable);
+ return (LP_SNUM_OK(iService) && ServicePtrs[iService]->bAvailable);
}
@@ -3117,9 +3113,9 @@ void lp_add_one_printer(char *name, char *comment)
lp_add_printer(name, printers);
if ((i = lp_servicenumber(name)) >= 0)
{
- string_set(&iSERVICE(i).comment, comment);
- unix_to_dos(iSERVICE(i).comment, True);
- iSERVICE(i).autoloaded = True;
+ string_set(&ServicePtrs[i]->comment, comment);
+ unix_to_dos(ServicePtrs[i]->comment, True);
+ ServicePtrs[i]->autoloaded = True;
}
}
}
@@ -3145,8 +3141,8 @@ void lp_killunused(BOOL (*snumused) (int))
if (!snumused || !snumused(i))
{
- iSERVICE(i).valid = False;
- free_service(pSERVICE(i));
+ ServicePtrs[i]->valid = False;
+ free_service(ServicePtrs[i]);
}
}
}
@@ -3159,8 +3155,8 @@ void lp_killservice(int iServiceIn)
{
if (VALID(iServiceIn))
{
- iSERVICE(iServiceIn).valid = False;
- free_service(pSERVICE(iServiceIn));
+ ServicePtrs[iServiceIn]->valid = False;
+ free_service(ServicePtrs[iServiceIn]);
}
}
@@ -3364,9 +3360,9 @@ void lp_dump_one(FILE * f, BOOL show_defaults, int snum, char *(*dos_to_ext)(cha
{
if (VALID(snum))
{
- if (iSERVICE(snum).szService[0] == '\0')
+ if (ServicePtrs[snum]->szService[0] == '\0')
return;
- dump_a_service(pSERVICE(snum), f, dos_to_ext);
+ dump_a_service(ServicePtrs[snum], f, dos_to_ext);
}
}
@@ -3531,7 +3527,7 @@ remove a service
********************************************************************/
void lp_remove_service(int snum)
{
- pSERVICE(snum)->valid = False;
+ ServicePtrs[snum]->valid = False;
}
/*******************************************************************