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
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->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);