Signed-off-by: Ralph Boehme <rb@sernet.de>
(default: no), FR #94
* UPD: afpd: FCE version 2 with new event types and new config options
"fce ignore names" and "fce notify script"
(default: no), FR #94
* UPD: afpd: FCE version 2 with new event types and new config options
"fce ignore names" and "fce notify script"
+* UPD: afpd: check for modified included config file, FR #95.
Changes in 3.1.3
================
Changes in 3.1.3
================
char *cnid_mysql_pw;
char *cnid_mysql_db;
struct afp_volume_name volfile;
char *cnid_mysql_pw;
char *cnid_mysql_db;
struct afp_volume_name volfile;
+ struct afp_volume_name includefile;
uint64_t sparql_limit;
};
uint64_t sparql_limit;
};
break ;
case LINE_VALUE:
if (strcmp(key, "include") == 0) {
break ;
case LINE_VALUE:
if (strcmp(key, "include") == 0) {
+ errs = atalkdict_set(dict, section, key, val);
+ if (errs < 0) {
+ LOG(log_error, logtype_default, "iniparser: memory allocation failure");
+ }
if ((include = fopen(val, "r")) == NULL) {
LOG(log_error, logtype_default, "iniparser: cannot open \"%s\"", val);
continue;
if ((include = fopen(val, "r")) == NULL) {
LOG(log_error, logtype_default, "iniparser: cannot open \"%s\"", val);
continue;
/* ----------------------
*/
/* ----------------------
*/
-static int volfile_changed(struct afp_options *p)
+static int volfile_changed(AFPObj *obj)
+ struct afp_options *p = &obj->options;
+ int result;
+ const char *includefile;
+
+ result = stat(p->configfile, &st);
+ if (result != 0) {
+ LOG(log_debug, logtype_afpd, "where is the config file %s ?",
+ p->configfile);
+ /*
+ * We return 1 which means "config file changed". The caller
+ * will re-read config and fail too which is what we want.
+ */
+ return 1;
+ }
- if (!stat(p->configfile, &st) && st.st_mtime > p->volfile.mtime) {
+ if (st.st_mtime > p->volfile.mtime) {
p->volfile.mtime = st.st_mtime;
return 1;
}
p->volfile.mtime = st.st_mtime;
return 1;
}
+
+ includefile = atalk_iniparser_getstring(obj->iniconfig, INISEC_GLOBAL,
+ "include", NULL);
+ if (includefile) {
+ result = stat(includefile, &st);
+ if (result != 0) {
+ LOG(log_debug, logtype_afpd, "where is the include file %s ?",
+ includefile);
+ return 1;
+ }
+
+ if (st.st_mtime > p->includefile.mtime) {
+ p->includefile.mtime = st.st_mtime;
+ return 1;
+ }
+ }
+
struct stat st;
int retries = 0;
struct vol *vol;
struct stat st;
int retries = 0;
struct vol *vol;
LOG(log_debug, logtype_afpd, "load_volumes: BEGIN");
LOG(log_debug, logtype_afpd, "load_volumes: BEGIN");
- if (!volfile_changed(&obj->options))
+ if (!volfile_changed(obj))
goto EC_CLEANUP;
have_uservol = 0;
for (vol = Volumes; vol; vol = vol->v_next) {
goto EC_CLEANUP;
have_uservol = 0;
for (vol = Volumes; vol; vol = vol->v_next) {
LOG(log_debug, logtype_afpd, "load_volumes: no volumes yet");
EC_ZERO_LOG( lstat(obj->options.configfile, &st) );
obj->options.volfile.mtime = st.st_mtime;
LOG(log_debug, logtype_afpd, "load_volumes: no volumes yet");
EC_ZERO_LOG( lstat(obj->options.configfile, &st) );
obj->options.volfile.mtime = st.st_mtime;
+
+ includefile = atalk_iniparser_getstring(obj->iniconfig, INISEC_GLOBAL,
+ "include", NULL);
+ if (includefile) {
+ EC_ZERO_LOG( stat(includefile, &st) );
+ obj->options.includefile.mtime = st.st_mtime;
+ }
}
/* try putting a read lock on the volume file twice, sleep 1 second if first attempt fails */
}
/* try putting a read lock on the volume file twice, sleep 1 second if first attempt fails */