From: didg Date: Thu, 2 Jun 2005 12:49:40 +0000 (+0000) Subject: add a default perm option to volume, from Exanet. X-Git-Tag: netatalk-2-0-4-beta1~76 X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=commitdiff_plain;h=282f270eb249c92187254a562d90a2d1d515f890 add a default perm option to volume, from Exanet. --- diff --git a/config/AppleVolumes.default.tmpl b/config/AppleVolumes.default.tmpl index 6c073045..9d8c098d 100644 --- a/config/AppleVolumes.default.tmpl +++ b/config/AppleVolumes.default.tmpl @@ -59,6 +59,8 @@ # maccharset -> specifies the charset to be used as the mac client codepage # e.g. "MAC_ROMAN", "MAC_CYRILLIC" # +# perm -> default permission value OR with the client requested perm +# # miscellaneous options [syntax: options:option1,option2]: # prodos -> make compatible with appleII clients. # crlf -> enable crlf translation for TEXT files. diff --git a/etc/afpd/directory.c b/etc/afpd/directory.c index 9f379850..fae4f508 100644 --- a/etc/afpd/directory.c +++ b/etc/afpd/directory.c @@ -1,5 +1,5 @@ /* - * $Id: directory.c,v 1.71.2.4.2.15.2.5 2005-02-10 01:23:10 didg Exp $ + * $Id: directory.c,v 1.71.2.4.2.15.2.6 2005-06-02 12:49:40 didg Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -1650,7 +1650,7 @@ int setdirparams(const struct vol *vol, u_int16_t bitmap = d_bitmap; u_char finder_buf[32]; u_int32_t upriv; - mode_t mpriv; /* uninitialized, OK 310105 */ + mode_t mpriv = 0; u_int16_t upriv_bit = 0; bit = 0; @@ -1704,7 +1704,7 @@ int setdirparams(const struct vol *vol, ma.ma_world = *buf++; ma.ma_group = *buf++; ma.ma_owner = *buf++; - mpriv = mtoumode( &ma ); + mpriv = mtoumode( &ma ) | vol->v_perm; if (dir_rx_set(mpriv) && setdirmode( vol, upath, mpriv) < 0 ) { err = set_dir_errors(path, "setdirmode", errno); bitmap = 0; @@ -1732,12 +1732,12 @@ int setdirparams(const struct vol *vol, change_parent_mdate = 1; memcpy( &upriv, buf, sizeof( upriv )); buf += sizeof( upriv ); - upriv = ntohl (upriv); + upriv = ntohl (upriv) | vol->v_perm; if (dir_rx_set(upriv)) { /* maybe we are trying to set perms back */ if ( setdirunixmode(vol, upath, upriv) < 0 ) { bitmap = 0; - err = set_dir_errors(path, "setdirmode", errno); + err = set_dir_errors(path, "setdirunixmode", errno); } } else { @@ -1909,7 +1909,7 @@ int setdirparams(const struct vol *vol, } if ( upriv_bit && setdirunixmode(vol, upath, upriv) < 0 ) { - err = set_dir_errors(path, "setdirmode", errno); + err = set_dir_errors(path, "setdirunixmode", errno); goto setdirparam_done; } break; diff --git a/etc/afpd/filedir.c b/etc/afpd/filedir.c index 2f2ca1c6..5ede4df6 100644 --- a/etc/afpd/filedir.c +++ b/etc/afpd/filedir.c @@ -1,5 +1,5 @@ /* - * $Id: filedir.c,v 1.45.2.2.2.14.2.2 2005-02-10 01:23:14 didg Exp $ + * $Id: filedir.c,v 1.45.2.2.2.14.2.3 2005-06-02 12:49:41 didg Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -748,7 +748,7 @@ int ibuflen, *rbuflen; #endif /* DROPKLUDGE */ /* if unix priv don't try to match perm with dest folder */ if (!isdir && !vol_unix_priv(vol)) { - int admode = ad_mode("", 0777); + int admode = ad_mode("", 0777) | vol->v_perm; setfilmode(upath, admode, NULL); setfilmode(vol->ad_path( upath, ADFLAGS_HF ), ad_hf_mode(admode), NULL); diff --git a/etc/afpd/unix.c b/etc/afpd/unix.c index c319412d..b55b530e 100644 --- a/etc/afpd/unix.c +++ b/etc/afpd/unix.c @@ -1,5 +1,5 @@ /* - * $Id: unix.c,v 1.43.2.1.2.10.2.1 2005-05-26 11:49:55 didg Exp $ + * $Id: unix.c,v 1.43.2.1.2.10.2.2 2005-06-02 12:49:41 didg Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -402,6 +402,8 @@ mode_t mode; return -1; } + mode |= vol->v_perm; + if (setfilmode( path->u_name, mode, &path->st) < 0) return -1; /* we need to set write perm if read set for resource fork */ @@ -434,11 +436,12 @@ mode_t mask = S_IRWXU | S_IRWXG | S_IRWXO; /* rwx for owner group and other, by int setdirunixmode( vol, name, mode ) const struct vol *vol; const char *name; -const mode_t mode; +mode_t mode; { char *adouble = vol->ad_path( name, ADFLAGS_DIR ); int dropbox = (vol->v_flags & AFPVOL_DROPBOX); + mode |= vol->v_perm; if (dir_rx_set(mode)) { /* extending right? dir first then .AppleDouble */ @@ -469,19 +472,22 @@ char *adouble = vol->ad_path( name, ADFLAGS_DIR ); int setdirmode( vol, name, mode ) const struct vol *vol; const char *name; -const mode_t mode; +mode_t mode; { char buf[ MAXPATHLEN + 1]; struct stat st; char *m; struct dirent *dirp; DIR *dir; + mode_t hf_mode; int osx = vol->v_adouble == AD_VERSION2_OSX; - int hf_mode = ad_hf_mode(mode); int dropbox = (vol->v_flags & AFPVOL_DROPBOX); char *adouble = vol->ad_path( name, ADFLAGS_DIR ); char *adouble_p = ad_dir(adouble); + mode |= vol->v_perm; + hf_mode = ad_hf_mode(mode); + if (dir_rx_set(mode)) { /* extending right? dir first then .AppleDouble */ if ( stickydirmode(name, DIRBITS | mode, dropbox) < 0 ) diff --git a/etc/afpd/unix.h b/etc/afpd/unix.h index 56bacb6e..603f1d0b 100644 --- a/etc/afpd/unix.h +++ b/etc/afpd/unix.h @@ -1,5 +1,5 @@ /* - * $Id: unix.h,v 1.12.2.1.2.6.2.2 2005-06-01 12:28:26 didg Exp $ + * $Id: unix.h,v 1.12.2.1.2.6.2.3 2005-06-02 12:49:41 didg Exp $ */ #ifndef AFPD_UNIX_H @@ -217,8 +217,8 @@ extern struct afp_options default_options; extern int gmem __P((const gid_t)); extern int setdeskmode __P((const mode_t)); -extern int setdirunixmode __P((const struct vol *, const char *, const mode_t)); -extern int setdirmode __P((const struct vol *, const char *, const mode_t)); +extern int setdirunixmode __P((const struct vol *, const char *, mode_t)); +extern int setdirmode __P((const struct vol *, const char *, mode_t)); extern int setdeskowner __P((const uid_t, const gid_t)); extern int setdirowner __P((const struct vol *, const char *, const uid_t, const gid_t)); extern int setfilmode __P((char *, mode_t , struct stat *)); diff --git a/etc/afpd/volume.c b/etc/afpd/volume.c index 1c927251..a6d3cdb9 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.6 2005-05-26 11:49:55 didg Exp $ + * $Id: volume.c,v 1.51.2.7.2.33.2.7 2005-06-02 12:49:41 didg Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -115,11 +115,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_MAX (VOLOPT_UMASK +1) +#define VOLOPT_MAX (VOLOPT_DFLTPERM +1) #define VOLOPT_NUM (VOLOPT_MAX + 1) @@ -478,7 +480,9 @@ static void volset(struct vol_option *options, struct vol_option *save, setoption(options, save, VOLOPT_DBPATH, val); } else if (optionok(tmp, "umask:", val)) { - options[VOLOPT_UMASK].i_value = (int)strtol(val, (char **)NULL, 8); + 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, "mapchars:",val)) { setoption(options, save, VOLOPT_MAPCHARS, val); @@ -659,6 +663,9 @@ 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_DFLTPERM].i_value) + volume->v_perm = (mode_t)options[VOLOPT_DFLTPERM].i_value; + if (options[VOLOPT_ADOUBLE].i_value) volume->v_adouble = options[VOLOPT_ADOUBLE].i_value; else diff --git a/etc/afpd/volume.h b/etc/afpd/volume.h index 4a69634f..35dcab17 100644 --- a/etc/afpd/volume.h +++ b/etc/afpd/volume.h @@ -1,5 +1,5 @@ /* - * $Id: volume.h,v 1.19.2.5.2.7.2.1 2005-02-10 01:23:16 didg Exp $ + * $Id: volume.h,v 1.19.2.5.2.7.2.2 2005-06-02 12:49:41 didg Exp $ * * Copyright (c) 1990,1994 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -48,6 +48,7 @@ struct vol { struct _cnid_db *v_cdb; char v_stamp[ADEDLEN_PRIVSYN]; mode_t v_umask; + mode_t v_perm; /* default permission value OR with requested perm*/ #ifdef FORCE_UIDGID char *v_forceuid;