X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=blobdiff_plain;f=libatalk%2Futil%2Fnetatalk_conf.c;h=d6fb4a17c03a8a681e3644a558bc8b687cd18dac;hp=fdc80d6333d3c692b7e9adc5034a54e3990ef804;hb=4021b76ce3f3e51756e9d59b4a5a045ad6398dc8;hpb=09d3cf365f085e35c311956d973b6f0b449f1881 diff --git a/libatalk/util/netatalk_conf.c b/libatalk/util/netatalk_conf.c index fdc80d63..d6fb4a17 100644 --- a/libatalk/util/netatalk_conf.c +++ b/libatalk/util/netatalk_conf.c @@ -232,7 +232,7 @@ static int check_vol_acl_support(const struct vol *vol) { int ret = 0; -#ifdef HAVE_SOLARIS_ACLS +#ifdef HAVE_NFSV4_ACLS ace_t *aces = NULL; ret = 1; if (get_nfsv4_acl(vol->v_path, &aces) == -1) @@ -245,7 +245,7 @@ static int check_vol_acl_support(const struct vol *vol) ret = 0; #endif -#ifdef HAVE_SOLARIS_ACLS +#ifdef HAVE_NFSV4_ACLS if (aces) free(aces); #endif #ifdef HAVE_POSIX_ACLS @@ -772,12 +772,33 @@ static struct vol *creatvol(AFPObj *obj, 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; 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 @@ -918,16 +939,16 @@ static struct vol *creatvol(AFPObj *obj, 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 */ @@ -1317,16 +1338,34 @@ int load_charset(struct vol *vol) 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)) @@ -1335,9 +1374,9 @@ int load_volumes(AFPObj *obj) 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)); @@ -1373,7 +1412,7 @@ int load_volumes(AFPObj *obj) 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; @@ -1694,6 +1733,9 @@ int afp_config_parse(AFPObj *AFPObj, char *processname) 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) @@ -1723,6 +1765,10 @@ int afp_config_parse(AFPObj *AFPObj, char *processname) 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->passwdbits |= PASSWD_NOSAVE; if (atalk_iniparser_getboolean(config, INISEC_GLOBAL, "set password", 0)) @@ -1746,6 +1792,7 @@ int afp_config_parse(AFPObj *AFPObj, char *processname) 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); @@ -1964,6 +2011,10 @@ void afp_config_free(AFPObj *obj) 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);