return result;
}
+/*!
+ * Get boolean option from volume, default section or global - use default value if not set
+ *
+ * Order of precedence: volume -> default section -> global -> default value
+ *
+ * "vdg" means volume, default section or global
+ *
+ * @param conf (r) config handle
+ * @param vol (r) volume name (must be section name ie wo vars expanded)
+ * @param opt (r) option
+ * @param defsec (r) if "option" is not found in "vol", try to find it in section "defsec"
+ * @param defval (r) if neither "vol" nor "defsec" contain "opt" return "defval"
+ *
+ * @returns const option string from "vol" or "defsec", or "defval" if not found
+ */
+static int vdgoption_bool(const dictionary *conf, const char *vol, const char *opt, const char *defsec, int defval)
+{
+ int result;
+
+ result = atalk_iniparser_getboolean(conf, vol, opt, -1);
+
+ if ((result == -1) && (defsec != NULL))
+ result = atalk_iniparser_getboolean(conf, defsec, opt, -1);
+
+ if (result == -1)
+ result = atalk_iniparser_getboolean(conf, INISEC_GLOBAL, opt, defval);
+
+ return result;
+}
+
/*!
* Create volume struct
*
}
}
+ val = getoption(obj->iniconfig, section, "chmod request", preset, NULL);
+ if (val == NULL) {
+ val = atalk_iniparser_getstring(obj->iniconfig, INISEC_GLOBAL, "chmod request", "preserve");
+ }
+ if (strcasecmp(val, "ignore") == 0) {
+ volume->v_flags |= AFPVOL_CHMOD_IGNORE;
+ } else if (strcasecmp(val, "preserve") == 0) {
+ volume->v_flags |= AFPVOL_CHMOD_PRESERVE_ACL;
+ } else if (strcasecmp(val, "simple") != 0) {
+ LOG(log_warning, logtype_afpd, "unknown 'chmod request' setting: '%s', using default", val);
+ volume->v_flags |= AFPVOL_CHMOD_PRESERVE_ACL;
+ }
+
/*
* Handle read-only behaviour. semantics:
* 1) neither the rolist nor the rwlist exist -> rw
struct vol *tmp;
const struct passwd *pw;
char volname[AFPVOL_U8MNAMELEN + 1];
- char abspath[MAXPATHLEN + 1];
+ char *realabspath = NULL;
char volpath[MAXPATHLEN + 1], *realvolpath = NULL;
char tmpbuf[MAXPATHLEN + 1];
const char *secname, *basedir, *p = NULL, *subpath = NULL, *subpathconfig;
char *user = NULL, *prw;
regmatch_t match[1];
- size_t abspath_len;
LOG(log_debug, logtype_afpd, "getvolbypath(\"%s\")", path);
- if (path[0] != '/') {
- /* relative path, build absolute path */
- EC_NULL_LOG( getcwd(abspath, MAXPATHLEN) );
- strlcat(abspath, "/", MAXPATHLEN);
- strlcat(abspath, path, MAXPATHLEN);
- path = abspath;
- } else {
- strlcpy(abspath, path, MAXPATHLEN);
- path = abspath;
- }
- /* path now points to a copy of path in the abspath buffer */
-
- /*
- * Strip trailing slashes
- */
- abspath_len = strlen(abspath);
- while (abspath[abspath_len - 1] == '/') {
- abspath[abspath_len - 1] = 0;
- abspath_len--;
- }
+ /* build absolute path */
+ EC_NULL( realabspath = realpath_safe(path) );
+ path = realabspath;
for (tmp = Volumes; tmp; tmp = tmp->v_next) { /* (1) */
- if (strcmp(path, tmp->v_path) == 0) {
- LOG(log_debug, logtype_afpd, "getvolbypath: path(\"%s\") == volume(\"%s\")", path, tmp->v_path);
- vol = tmp;
- goto EC_CLEANUP;
+ size_t v_path_len = strlen(tmp->v_path);
+ if (strncmp(path, tmp->v_path, v_path_len) == 0) {
+ if (v_path_len < strlen(path) && path[v_path_len] != '/') {
+ LOG(log_debug, logtype_afpd, "getvolbypath: path(\"%s\") != volume(\"%s\")", path, tmp->v_path);
+ } else {
+ LOG(log_debug, logtype_afpd, "getvolbypath: path(\"%s\") == volume(\"%s\")", path, tmp->v_path);
+ vol = tmp;
+ goto EC_CLEANUP;
+ }
} else {
LOG(log_debug, logtype_afpd, "getvolbypath: path(\"%s\") != volume(\"%s\")", path, tmp->v_path);
}
strlcat(tmpbuf, "/", MAXPATHLEN);
/* (5) */
- p = path + strlen(basedir);
+ p = path + match[0].rm_eo - match[0].rm_so;
while (*p == '/')
p++;
EC_NULL_LOG( user = strdup(p) );
free(user);
if (realvolpath)
free(realvolpath);
+ if (realabspath)
+ free(realabspath);
if (ret != 0)
vol = NULL;
return vol;