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, "preexec close", preset, 0))
volume->v_preexec_close = 1;
if (getoption_bool(obj->iniconfig, section, "root preexec close", preset, 0))
volume->v_root_preexec_close = 1;
+ if ((val = getoption(obj->iniconfig, section, "ignored attributes", preset, obj->options.ignored_attr))) {
+ if (strstr(val, "all")) {
+ volume->v_ignattr |= ATTRBIT_NOWRITE | ATTRBIT_NORENAME | ATTRBIT_NODELETE;
+ }
+ if (strstr(val, "nowrite")) {
+ volume->v_ignattr |= ATTRBIT_NOWRITE;
+ }
+ if (strstr(val, "norename")) {
+ volume->v_ignattr |= ATTRBIT_NORENAME;
+ }
+ if (strstr(val, "nodelete")) {
+ volume->v_ignattr |= ATTRBIT_NODELETE;
+ }
+ }
+
/*
* Handle read-only behaviour. semantics:
* 1) neither the rolist nor the rwlist exist -> rw
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 */
int load_volumes(AFPObj *obj)
{
EC_INIT;
- int fd = -1;
- struct passwd *pwent = NULL;
+
+ static long bufsize;
+ static char *pwbuf = NULL;
+
+ int fd = -1;
+ struct passwd pwent;
+ struct passwd *pwresult = NULL;
struct stat st;
- int retries = 0;
- struct vol *vol;
+ int retries = 0;
+ struct vol *vol;
LOG(log_debug, logtype_afpd, "load_volumes: BEGIN");
- if (obj->uid)
- pwent = getpwuid(obj->uid);
+ if (pwbuf == NULL) {
+ bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
+ if (bufsize == -1) /* Value was indeterminate */
+ bufsize = 16384; /* Should be more than enough */
+ EC_NULL( pwbuf = malloc(bufsize) );
+ }
+
+ if (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));
+ EC_FAIL;
+ }
+ pwresult = &pwent;
+ }
if (Volumes) {
if (!volfile_changed(&obj->options))
for (vol = Volumes; vol; vol = vol->v_next) {
vol->v_deleted = 1;
}
- if (obj->uid) {
+ if (obj->uid && pwresult) {
become_root();
- ret = set_groups(obj, pwent);
+ ret = set_groups(obj, pwresult);
unbecome_root();
if (ret != 0) {
LOG(log_error, logtype_afpd, "load_volumes: set_groups: %s", strerror(errno));
LOG(log_debug, logtype_afpd, "load_volumes: loading: %s", obj->options.configfile);
obj->iniconfig = atalk_iniparser_load(obj->options.configfile);
- EC_ZERO_LOG( readvolfile(obj, pwent) );
+ EC_ZERO_LOG( readvolfile(obj, pwresult) );
struct vol *p, *prevvol;
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
+#ifdef HAVE_TRACKER_RDF
+ options->slmod_path = strdup(_PATH_AFPDUAMPATH "slmod_rdf.so");
+#endif
options->flags = OPTION_UUID | AFPObj->cmdlineflags;
if ((config = atalk_iniparser_load(AFPObj->options.configfile)) == NULL)
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, "save password", 1))
options->passwdbits |= PASSWD_NOSAVE;
if (atalk_iniparser_getboolean(config, INISEC_GLOBAL, "set password", 0))
options->ntseparator = atalk_iniparser_getstrdup(config, INISEC_GLOBAL, "nt separator", NULL);
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->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);
CONFIG_ARG_FREE(obj->options.Cnid_port);
if (obj->options.fqdn)
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);