#include "rsync.h"
#include "ifuncs.h"
-#define PTR_DIFF(p1, p2) ((ptrdiff_t)(((char *)(p1)) - (char *)(p2)))
+
+extern item_list dparam_list;
+
#define strequal(a, b) (strcasecmp(a, b)==0)
#define BOOLSTR(b) ((b) ? "Yes" : "No")
-typedef char pstring[1024];
-#define pstrcpy(a, b) strlcpy((a), (b), sizeof (pstring))
#ifndef LOG_DAEMON
#define LOG_DAEMON 0
/* the following are used by loadparm for option lists */
typedef enum {
- P_BOOL, P_BOOLREV, P_CHAR, P_INTEGER, P_OCTAL,
- P_PATH, P_STRING, P_GSTRING, P_ENUM, P_SEP
+ P_BOOL, P_BOOLREV, P_CHAR, P_INTEGER,
+ P_OCTAL, P_PATH, P_STRING, P_ENUM
} parm_type;
typedef enum {
- P_LOCAL, P_GLOBAL, P_SEPARATOR, P_NONE
+ P_LOCAL, P_GLOBAL, P_NONE
} parm_class;
struct enum_list {
/* some helpful bits */
#define iSECTION(i) ((section*)section_list.items)[i]
#define LP_SNUM_OK(i) ((i) >= 0 && (i) < (int)section_list.count)
+#define SECTION_PTR(s, p) (((char*)(s)) + (ptrdiff_t)(((char *)(p)) - (char *)&sDefault))
/*
* This structure describes global (ie., server-wide) parameters.
for (i = 0; parm_table[i].label; i++) {
if (parm_table[i].ptr && parm_table[i].class == P_LOCAL) {
void *def_ptr = parm_table[i].ptr;
- void *src_ptr = ((char *)psectionSource) + PTR_DIFF(def_ptr, &sDefault);
- void *dest_ptr = ((char *)psectionDest) + PTR_DIFF(def_ptr, &sDefault);
+ void *src_ptr = SECTION_PTR(psectionSource, def_ptr);
+ void *dest_ptr = SECTION_PTR(psectionDest, def_ptr);
switch (parm_table[i].type) {
case P_BOOL:
static BOOL do_parameter(char *parmname, char *parmvalue)
{
int parmnum, i;
- void *parm_ptr=NULL; /* where we are going to store the result */
- void *def_ptr=NULL;
+ void *parm_ptr; /* where we are going to store the result */
+ void *def_ptr;
char *cp;
parmnum = map_parameter(parmname);
rprintf(FLOG, "Global parameter %s found in module section!\n", parmname);
return True;
}
- parm_ptr = ((char *)&iSECTION(iSectionIndex)) + PTR_DIFF(def_ptr, &sDefault);
+ parm_ptr = SECTION_PTR(&iSECTION(iSectionIndex), def_ptr);
}
/* now switch on the type of variable it is */
string_set(parm_ptr, parmvalue);
break;
- case P_GSTRING:
- strlcpy((char *)parm_ptr, parmvalue, sizeof (pstring));
- break;
-
case P_ENUM:
- for (i=0;parm_table[parmnum].enum_list[i].name;i++) {
+ for (i=0; parm_table[parmnum].enum_list[i].name; i++) {
if (strequal(parmvalue, parm_table[parmnum].enum_list[i].name)) {
*(int *)parm_ptr = parm_table[parmnum].enum_list[i].value;
break;
*(int *)parm_ptr = atoi(parmvalue);
}
break;
- case P_SEP:
- break;
}
return True;
isglobal = strwicmp(sectionname, GLOBAL_NAME) == 0;
/* if we were in a global section then do the local inits */
- if (bInGlobalSection && !isglobal)
+ if (bInGlobalSection && !isglobal) {
+ if (!section_list.count)
+ set_dparams(0);
init_locals();
+ }
/* if we've just struck a global section, note the fact. */
bInGlobalSection = isglobal;
* False on failure. */
int lp_load(char *pszFname, int globals_only)
{
- pstring n2;
-
bInGlobalSection = True;
init_globals();
- pstrcpy(n2, pszFname);
-
/* We get sections first, so have to start 'behind' to make up. */
iSectionIndex = -1;
- return pm_process(n2, globals_only ? NULL : do_section, do_parameter);
+ return pm_process(pszFname, globals_only ? NULL : do_section, do_parameter);
+}
+
+BOOL set_dparams(int syntax_check_only)
+{
+ char *equal, *val, **params = dparam_list.items;
+ unsigned j;
+
+ for (j = 0; j < dparam_list.count; j++) {
+ equal = strchr(params[j], '='); /* options.c verified this */
+ *equal = '\0';
+ if (syntax_check_only) {
+ if (map_parameter(params[j]) < 0) {
+ rprintf(FERROR, "Unknown parameter \"%s\"\n", params[j]);
+ *equal = '=';
+ return False;
+ }
+ } else {
+ for (val = equal+1; isSpace(val); val++) {}
+ do_parameter(params[j], val);
+ }
+ *equal = '=';
+ }
+
+ return True;
}
/* Return the max number of modules (sections). */