From 9528990149433080bcd6c206d8c66f18b5523ee3 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Mon, 17 Mar 2014 11:08:57 +0100 Subject: [PATCH] Option "vol dbpath" was broken in 3.1.1 Signed-off-by: Ralph Boehme --- NEWS | 4 ++++ doc/manpages/man5/afp.conf.5.xml | 4 ++-- libatalk/util/netatalk_conf.c | 30 ++++++++++++++++++++++++++---- man/man5/afp.conf.5.in | 4 ++-- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/NEWS b/NEWS index ef669714..823f9529 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,7 @@ +Changes in 3.1.2 +================ +* FIX: Option "vol dbpath" was broken in 3.1.1 + Changes in 3.1.1 ================ * FIX: Add asprint() compatibility function for systems lacking it diff --git a/doc/manpages/man5/afp.conf.5.xml b/doc/manpages/man5/afp.conf.5.xml index 8f398334..cc46ce99 100644 --- a/doc/manpages/man5/afp.conf.5.xml +++ b/doc/manpages/man5/afp.conf.5.xml @@ -1017,13 +1017,13 @@ vol dbpath = path - (G) + (G)/(V) Sets the database information to be stored in path. You have to specify a writable location, even if the volume is read only. The default is - @localstatedir@/netatalk/CNID/. + @localstatedir@/netatalk/CNID/$v/. diff --git a/libatalk/util/netatalk_conf.c b/libatalk/util/netatalk_conf.c index 78c8f331..4b4bcf6b 100644 --- a/libatalk/util/netatalk_conf.c +++ b/libatalk/util/netatalk_conf.c @@ -575,6 +575,8 @@ static struct vol *creatvol(AFPObj *obj, uint16_t flags; const char *val; char *p, *q; + bstring dbpath = NULL; + bstring global_path_tmp = NULL; strlcpy(path, path_in, MAXPATHLEN); @@ -671,16 +673,32 @@ static struct vol *creatvol(AFPObj *obj, if (atalk_iniparser_getboolean(obj->iniconfig, INISEC_GLOBAL, "vol dbnest", 0)) { EC_NULL( volume->v_dbpath = strdup(path) ); } else { - bstring dbpath; - val = atalk_iniparser_getstring(obj->iniconfig, section, "vol dbpath", NULL); + char *global_path; + val = getoption(obj->iniconfig, section, "vol dbpath", preset, NULL); + if (val == NULL) { + /* check global option */ + global_path = atalk_iniparser_getstring(obj->iniconfig, + INISEC_GLOBAL, + "vol dbpath", + NULL); + if (global_path) { + /* check for pre 3.1.1 behaviour without variable */ + if (strchr(global_path, '$') == NULL) { + global_path_tmp = bformat("%s/%s/", global_path, tmpname); + val = cfrombstr(global_path_tmp); + } else { + val = global_path; + } + } + } + if (val == NULL) { EC_NULL( dbpath = bformat("%s/%s/", _PATH_STATEDIR "CNID/", tmpname) ); } else { EC_NULL( dbpath = bfromcstr(val)); } EC_NULL( volume->v_dbpath = volxlate(obj, NULL, MAXPATHLEN + 1, - cfrombstr(dbpath), pwd, NULL, NULL) ); - bdestroy(dbpath); + cfrombstr(dbpath), pwd, NULL, tmpname) ); } if ((val = getoption(obj->iniconfig, section, "cnid scheme", preset, NULL))) @@ -968,6 +986,10 @@ static struct vol *creatvol(AFPObj *obj, EC_CLEANUP: LOG(log_debug, logtype_afpd, "createvol: END: %d", ret); + if (dbpath) + bdestroy(dbpath); + if (global_path_tmp) + bdestroy(global_path_tmp); if (ret != 0) { if (volume) volume_free(volume); diff --git a/man/man5/afp.conf.5.in b/man/man5/afp.conf.5.in index a375d44a..e90e4014 100644 --- a/man/man5/afp.conf.5.in +++ b/man/man5/afp.conf.5.in @@ -643,10 +643,10 @@ veto message = \fIBOOLEAN\fR (default: \fIno\fR) \fB(G)\fR Send optional AFP messages for vetoed files\&. Then whenever a client tries to access any file or directory with a vetoed name, it will be sent an AFP message indicating the name and the directory\&. .RE .PP -vol dbpath = \fIpath\fR \fB(G)\fR +vol dbpath = \fIpath\fR \fB(G)/(V)\fR .RS 4 Sets the database information to be stored in path\&. You have to specify a writable location, even if the volume is read only\&. The default is -@localstatedir@/netatalk/CNID/\&. +@localstatedir@/netatalk/CNID/$v/\&. .RE .PP vol dbnest = \fIBOOLEAN\fR (default: \fIno\fR) \fB(G)\fR -- 2.39.2