X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=etc%2Fafpd%2Fvolume.c;h=53a0bc23ee4c123fd106dc4058e729cf05edf03a;hb=85e784fb876d3cc1e907b49421a15a40ba9adf98;hp=6b9b4213114a4cd0a0093f1925ebc2187a7e343a;hpb=4d67a2836a6b8cc4077001a69ec266833b2fa530;p=netatalk.git diff --git a/etc/afpd/volume.c b/etc/afpd/volume.c index 6b9b4213..53a0bc23 100644 --- a/etc/afpd/volume.c +++ b/etc/afpd/volume.c @@ -1,5 +1,5 @@ /* - * $Id: volume.c,v 1.51.2.7.2.33.2.16 2009-01-13 01:05:53 didg Exp $ + * $Id: volume.c,v 1.51.2.7.2.33.2.19 2009-01-28 05:37:58 didg Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -114,13 +114,13 @@ m=u -> map both ways #define VOLOPT_FORCEUID 19 /* force uid for username x */ #define VOLOPT_FORCEGID 20 /* force gid for group x */ -#define VOLOPT_UMASK 21 -#define VOLOPT_DFLTPERM 22 -#else -#define VOLOPT_UMASK 19 -#define VOLOPT_DFLTPERM 20 #endif /* FORCE_UIDGID */ +#define VOLOPT_UMASK 21 +#define VOLOPT_DPERM 22 /* dperm default directories perms */ +#define VOLOPT_FPERM 23 /* dperm default files perms */ +#define VOLOPT_DFLTPERM 24 /* perm */ + #define VOLOPT_MAX (VOLOPT_DFLTPERM +1) #define VOLOPT_NUM (VOLOPT_MAX + 1) @@ -489,6 +489,10 @@ static void volset(struct vol_option *options, struct vol_option *save, options[VOLOPT_UMASK].i_value = (int)strtol(val +1, NULL, 8); } else if (optionok(tmp, "perm:", val)) { options[VOLOPT_DFLTPERM].i_value = (int)strtol(val+1, NULL, 8); + } else if (optionok(tmp, "dperm:", val)) { + options[VOLOPT_DPERM].i_value = (int)strtol(val+1, NULL, 8); + } else if (optionok(tmp, "fperm:", val)) { + options[VOLOPT_FPERM].i_value = (int)strtol(val+1, NULL, 8); } else if (optionok(tmp, "mapchars:",val)) { setoption(options, save, VOLOPT_MAPCHARS, val); @@ -675,6 +679,8 @@ static int creatvol(AFPObj *obj, struct passwd *pwd, if (options[VOLOPT_UMASK].i_value) volume->v_umask = (mode_t)options[VOLOPT_UMASK].i_value; + if (options[VOLOPT_DPERM].i_value) + if (options[VOLOPT_DFLTPERM].i_value) volume->v_perm = (mode_t)options[VOLOPT_DFLTPERM].i_value; @@ -711,6 +717,8 @@ static int creatvol(AFPObj *obj, struct passwd *pwd, volume->v_root_postexec = volxlate(obj, NULL, MAXPATHLEN, options[VOLOPT_ROOTPOSTEXEC].c_value, pwd, path, name); } } + volume->v_dperm |= volume->v_perm; + volume->v_fperm |= volume->v_perm; initvoladouble(volume); volume->v_next = Volumes; @@ -728,7 +736,7 @@ FILE *fp; int c; p = buf; - while ((EOF != ( c = getc( fp )) ) && ( size > 0 )) { + while ((EOF != ( c = getc( fp )) ) && ( size > 1 )) { if ( c == '\n' || c == '\r' ) { *p++ = '\n'; break; @@ -2321,13 +2329,10 @@ static int savevoloptions (const struct vol *vol) LOG(log_debug, logtype_afpd,"Error writing .volinfo file: buffer too small, %s", buf); - if (write( fd, buf, strlen(buf)) < 0) { + if (write( fd, buf, strlen(buf)) < 0 || ftruncate(fd, strlen(buf)) < 0 ) { LOG(log_debug, logtype_afpd,"Error writing .volinfo file: %s", strerror(errno)); - goto done; } - ftruncate(fd, strlen(buf)); -done: lock.l_type = F_UNLCK; fcntl(fd, F_SETLK, &lock); close (fd);