X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libatalk%2Futil%2Fnetatalk_conf.c;h=c0133edb95c3f7047726a684978e276d1be3997c;hb=3a16f6dfaf832c1e50086579bc7c4f774ed686a9;hp=f86eab67cde240ba9ef2ce7c9611ef316471a408;hpb=f83f282ad91f8b8c3162afbf99836033b4e64c52;p=netatalk.git diff --git a/libatalk/util/netatalk_conf.c b/libatalk/util/netatalk_conf.c index f86eab67..c0133edb 100644 --- a/libatalk/util/netatalk_conf.c +++ b/libatalk/util/netatalk_conf.c @@ -782,6 +782,21 @@ static struct vol *creatvol(AFPObj *obj, 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 @@ -1321,16 +1336,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)) @@ -1339,9 +1372,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)); @@ -1377,7 +1410,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; @@ -1758,6 +1791,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); @@ -1976,6 +2010,8 @@ 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);