uint16_t flags;
const char *val;
char *p, *q;
+ bstring dbpath = NULL;
+ bstring global_path_tmp = NULL;
strlcpy(path, path_in, MAXPATHLEN);
for(i = 0; i < vlen; i++)
if(tmpname[i] == '/') tmpname[i] = ':';
- bstring dbpath;
- EC_NULL( val = atalk_iniparser_getstring(obj->iniconfig, INISEC_GLOBAL, "vol dbpath", _PATH_STATEDIR "CNID/") );
- EC_NULL( dbpath = bformat("%s/%s/", val, tmpname) );
- EC_NULL( volume->v_dbpath = strdup(cfrombstr(dbpath)) );
- bdestroy(dbpath);
+
+ if (atalk_iniparser_getboolean(obj->iniconfig, INISEC_GLOBAL, "vol dbnest", 0)) {
+ EC_NULL( volume->v_dbpath = strdup(path) );
+ } else {
+ 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, tmpname) );
+ }
if ((val = getoption(obj->iniconfig, section, "cnid scheme", preset, NULL)))
EC_NULL( volume->v_cnidscheme = strdup(val) );
volume->v_flags |= AFPVOL_NOV2TOEACONV;
if (getoption_bool(obj->iniconfig, section, "follow symlinks", preset, 0))
volume->v_flags |= AFPVOL_FOLLOWSYM;
+ if (getoption_bool(obj->iniconfig, section, "spotlight", preset, obj->options.flags & OPTION_SPOTLIGHT_VOL)) {
+ volume->v_flags |= AFPVOL_SPOTLIGHT;
+ obj->options.flags |= OPTION_SPOTLIGHT;
+ }
if (getoption_bool(obj->iniconfig, section, "delete veto files", preset, 0))
volume->v_flags |= AFPVOL_DELVETO;
initvol_vfs(volume);
/* get/store uuid from file in afpd master*/
- if (!(pwd) && (volume->v_flags & AFPVOL_TM)) {
- char *uuid = get_vol_uuid(obj, volume->v_localname);
- if (!uuid) {
- LOG(log_error, logtype_afpd, "Volume '%s': couldn't get UUID",
- volume->v_localname);
- } else {
- volume->v_uuid = uuid;
- LOG(log_debug, logtype_afpd, "Volume '%s': UUID '%s'",
- volume->v_localname, volume->v_uuid);
- }
+ become_root();
+ char *uuid = get_vol_uuid(obj, volume->v_localname);
+ unbecome_root();
+ if (!uuid) {
+ LOG(log_error, logtype_afpd, "Volume '%s': couldn't get UUID",
+ volume->v_localname);
+ } else {
+ volume->v_uuid = uuid;
+ LOG(log_debug, logtype_afpd, "Volume '%s': UUID '%s'",
+ volume->v_localname, volume->v_uuid);
}
/* no errors shall happen beyond this point because the cleanup would mess the volume chain up */
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);
/*!
* Initialize volumes and load ini configfile
*
- * Depending on the value of obj->uid either access checks are done (!=0) or skipped (=0)
- *
- * @param obj (r) handle
- * @param delvol_fn (r) callback called for deleted volumes
+ * @param obj (r) handle
+ * @param flags (r) flags controlling volume load behaviour
*/
-int load_volumes(AFPObj *obj)
+int load_volumes(AFPObj *obj, lv_flags_t flags)
{
EC_INIT;
EC_NULL( pwbuf = malloc(bufsize) );
}
- if (obj->uid) {
+ if (!(flags & lv_all) && obj->uid) {
ret = getpwuid_r(obj->uid, &pwent, pwbuf, bufsize, &pwresult);
if (pwresult == NULL) {
LOG(log_error, logtype_afpd, "load_volumes: getpwuid_r: %s", strerror(errno));
options->configfile = AFPObj->cmdlineconfigfile ? strdup(AFPObj->cmdlineconfigfile) : strdup(_PATH_CONFDIR "afp.conf");
options->sigconffile = strdup(_PATH_STATEDIR "afp_signature.conf");
options->uuidconf = strdup(_PATH_STATEDIR "afp_voluuid.conf");
+#ifdef HAVE_TRACKER_SPARQL
+ options->slmod_path = strdup(_PATH_AFPDUAMPATH "slmod_sparql.so");
+#endif
options->flags = OPTION_UUID | AFPObj->cmdlineflags;
if ((config = atalk_iniparser_load(AFPObj->options.configfile)) == NULL)
options->flags |= OPTION_SERVERNOTIF;
if (!atalk_iniparser_getboolean(config, INISEC_GLOBAL, "use sendfile", 1))
options->flags |= OPTION_NOSENDFILE;
+ if (atalk_iniparser_getboolean(config, INISEC_GLOBAL, "recvfile", 0))
+ options->flags |= OPTION_RECVFILE;
if (atalk_iniparser_getboolean(config, INISEC_GLOBAL, "solaris share reservations", 1))
options->flags |= OPTION_SHARE_RESERV;
if (atalk_iniparser_getboolean(config, INISEC_GLOBAL, "afpstats", 0))
options->flags |= OPTION_DBUS_AFPSTATS;
if (atalk_iniparser_getboolean(config, INISEC_GLOBAL, "afp read locks", 0))
options->flags |= OPTION_AFP_READ_LOCK;
+ if (atalk_iniparser_getboolean(config, INISEC_GLOBAL, "spotlight", 0))
+ options->flags |= OPTION_SPOTLIGHT_VOL;
if (atalk_iniparser_getboolean(config, INISEC_GLOBAL, "veto message", 0))
options->flags |= OPTION_VETOMSG;
if (!atalk_iniparser_getboolean(config, INISEC_GLOBAL, "save password", 1))
options->mimicmodel = atalk_iniparser_getstrdup(config, INISEC_GLOBAL, "mimic model", NULL);
options->adminauthuser = atalk_iniparser_getstrdup(config, INISEC_GLOBAL, "admin auth user",NULL);
options->ignored_attr = atalk_iniparser_getstrdup(config, INISEC_GLOBAL, "ignored attributes", NULL);
+ options->cnid_mysql_host = atalk_iniparser_getstrdup(config, INISEC_GLOBAL, "cnid mysql host", NULL);
+ options->cnid_mysql_user = atalk_iniparser_getstrdup(config, INISEC_GLOBAL, "cnid mysql user", NULL);
+ options->cnid_mysql_pw = atalk_iniparser_getstrdup(config, INISEC_GLOBAL, "cnid mysql pw", NULL);
+ options->cnid_mysql_db = atalk_iniparser_getstrdup(config, INISEC_GLOBAL, "cnid mysql db", NULL);
options->connections = atalk_iniparser_getint (config, INISEC_GLOBAL, "max connections",200);
options->passwdminlen = atalk_iniparser_getint (config, INISEC_GLOBAL, "passwd minlen", 0);
options->tickleval = atalk_iniparser_getint (config, INISEC_GLOBAL, "tickleval", 30);
options->fce_fmodwait = atalk_iniparser_getint (config, INISEC_GLOBAL, "fce holdfmod", 60);
options->sleep = atalk_iniparser_getint (config, INISEC_GLOBAL, "sleep time", 10);
options->disconnected = atalk_iniparser_getint (config, INISEC_GLOBAL, "disconnect time",24);
+ options->splice_size = atalk_iniparser_getint (config, INISEC_GLOBAL, "splice size", 64*1024);
p = atalk_iniparser_getstring(config, INISEC_GLOBAL, "map acls", "rights");
if (STRCMP(p, ==, "rights"))
CONFIG_ARG_FREE(obj->options.k5service);
if (obj->options.k5realm)
CONFIG_ARG_FREE(obj->options.k5realm);
+ if (obj->options.k5principal)
+ CONFIG_ARG_FREE(obj->options.k5principal);
if (obj->options.listen)
CONFIG_ARG_FREE(obj->options.listen);
if (obj->options.interfaces)
CONFIG_ARG_FREE(obj->options.fqdn);
if (obj->options.ignored_attr)
CONFIG_ARG_FREE(obj->options.ignored_attr);
+ if (obj->options.slmod_path)
+ CONFIG_ARG_FREE(obj->options.slmod_path);
if (obj->options.unixcodepage)
CONFIG_ARG_FREE(obj->options.unixcodepage);