From a6fc3d689fcb3a97ed8e5a3f409e05dd04187361 Mon Sep 17 00:00:00 2001 From: rufustfirefly Date: Wed, 28 Feb 2001 16:53:23 +0000 Subject: [PATCH] added dropbox as a volume option when DROPKLUDGE is compiled in --- ChangeLog | 10 +++++- etc/afpd/directory.c | 3 +- etc/afpd/file.c | 8 +++-- etc/afpd/filedir.c | 7 ++-- etc/afpd/unix.c | 51 +++++++++++++++------------- etc/afpd/unix.h | 2 +- etc/afpd/volume.c | 7 ++++ etc/afpd/volume.h | 3 ++ man/man5/AppleVolumes.default.5.tmpl | 6 +++- 9 files changed, 66 insertions(+), 31 deletions(-) diff --git a/ChangeLog b/ChangeLog index 965141ad..174db22b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,12 @@ -($Id: ChangeLog,v 1.12 2001-02-27 21:32:26 rufustfirefly Exp $) +($Id: ChangeLog,v 1.13 2001-02-28 16:53:23 rufustfirefly Exp $) + +2001-02-28 jeff b + + * etc/afpd/directory.c, etc/afpd/file.c, etc/afpd/filedir.c, + etc/afpd/unix.c, etc/afpd/unix.h, etc/afpd/volume.h, + etc/afpd/volume.c, man/man5/AppleVolumes.default.5.tmpl: added + "dropbox" to available option if DROPKLUDGE is used during + compile 2001-02-27 jeff b diff --git a/etc/afpd/directory.c b/etc/afpd/directory.c index eb91a13b..92c4f549 100644 --- a/etc/afpd/directory.c +++ b/etc/afpd/directory.c @@ -1297,7 +1297,8 @@ int setdirparams(vol, path, bitmap, buf ) } #endif - if ( setdirmode( mtoumode( &ma ), vol_noadouble(vol)) < 0 ) { + if ( setdirmode( mtoumode( &ma ), vol_noadouble(vol), + (vol->v_flags & AFPVOL_DROPBOX)) < 0 ) { switch ( errno ) { case EPERM : case EACCES : diff --git a/etc/afpd/file.c b/etc/afpd/file.c index d68fac2e..b96bc2f2 100644 --- a/etc/afpd/file.c +++ b/etc/afpd/file.c @@ -445,7 +445,9 @@ int afp_createfile(obj, ibuf, ibuflen, rbuf, rbuflen ) createfile_done: #ifdef DROPKLUDGE - retvalue=matchfile2dirperms(upath, vol, did); + if (vol->v_flags & AFPVOL_DROPBOX) { + retvalue=matchfile2dirperms(upath, vol, did); + } #endif DROPKLUDGE setvoltime(obj, vol ); @@ -885,7 +887,9 @@ int afp_copyfile(obj, ibuf, ibuflen, rbuf, rbuflen ) setvoltime(obj, vol ); #ifdef DROPKLUDGE - retvalue=matchfile2dirperms(newname, vol, sdid); + if (vol->v_flags & AFPVOL_DROPBOX) { + retvalue=matchfile2dirperms(newname, vol, sdid); + } #endif DROPKLUDGE #ifdef DEBUG diff --git a/etc/afpd/filedir.c b/etc/afpd/filedir.c index 367e94b4..e57bfc15 100644 --- a/etc/afpd/filedir.c +++ b/etc/afpd/filedir.c @@ -674,8 +674,11 @@ int afp_moveandrename(obj, ibuf, ibuflen, rbuf, rbuflen ) } #ifdef DROPKLUDGE - if (retvalue=matchfile2dirperms (newname, vol, did) != AFP_OK) - return retvalue; + if (vol->v_flags & AFPVOL_DROPBOX) { + if (retvalue=matchfile2dirperms (newname, vol, did) != AFP_OK) { + return retvalue; + } + } #endif DROPKLUDGE if ( rc == AFP_OK ) { diff --git a/etc/afpd/unix.c b/etc/afpd/unix.c index 707a56d0..d8378f63 100644 --- a/etc/afpd/unix.c +++ b/etc/afpd/unix.c @@ -208,39 +208,43 @@ mode_t mtoumode( ma ) return( mode ); } -inline int stickydirmode(name, mode) -char * name; -const mode_t mode; +inline int stickydirmode(name, mode, dropbox) + char * name; + const mode_t mode; + const int dropbox; { int uid, retval; /* Turn on the sticky bit if this is a drop box, also turn off the setgid bit */ retval=0; #ifdef DROPKLUDGE - if (mode & S_IWOTH) + if (dropbox) { + if (mode & S_IWOTH) { if (mode & S_IROTH); - else /* if S_IWOTH and not S_IROTH */ - { + else { /* if S_IWOTH and not S_IROTH */ uid=geteuid(); - if ( seteuid(0) < 0) + if ( seteuid(0) < 0) { syslog( LOG_ERR, "stickydirmode: unable to seteuid root: %m"); - if ( retval=chmod( name, ( DIRBITS | mode | S_ISVTX) ) < 0) - { + } + if ( retval=chmod( name, ( DIRBITS | mode | S_ISVTX) ) < 0) { syslog( LOG_ERR, "stickydirmode: chmod \"%s\": %m", name ); return(AFPERR_ACCESS); - } - else - { + } else { #ifdef DEBUG syslog( LOG_INFO, "stickydirmode: (debug) chmod \"%s\": %m", name ); #endif seteuid(uid); - } - } - else + } /* end getting retval */ + } /* end if not & S_IROTH */ + } else { /* end if S_IWOTH and not S_IROTH */ #endif DROPKLUDGE - if ( retval=chmod( name, DIRBITS | mode ) < 0 ) + if ( retval=chmod( name, DIRBITS | mode ) < 0 ) { syslog( LOG_ERR, "stickydirmode: chmod \"%s\": %m", name ); + } +#ifdef DROPKLUDGE + } /* end if not mode */ + } /* end checking for "dropbox" */ +#endif /* DROPKLUDGE */ return retval; } @@ -316,9 +320,10 @@ int setdeskmode( mode ) return( 0 ); } -int setdirmode( mode, noadouble ) +int setdirmode( mode, noadouble, dropbox ) const mode_t mode; const int noadouble; + const int dropbox; { char buf[ MAXPATHLEN + 1]; struct stat st; @@ -343,9 +348,9 @@ int setdirmode( mode, noadouble ) if (S_ISREG(st.st_mode)) { /* XXX: need to preserve special modes */ if (S_ISDIR(st.st_mode)) { - if (stickydirmode(dirp->d_name, DIRBITS | mode) < 0) + if (stickydirmode(dirp->d_name, DIRBITS | mode, dropbox) < 0) return (-1); - } else if (stickydirmode(dirp->d_name, mode) < 0) + } else if (stickydirmode(dirp->d_name, mode, dropbox) < 0) return (-1); } } @@ -373,21 +378,21 @@ int setdirmode( mode, noadouble ) } if (S_ISDIR(st.st_mode)) { - stickydirmode( buf, DIRBITS | mode ); + stickydirmode( buf, DIRBITS | mode, dropbox ); } else - stickydirmode( buf, mode ); + stickydirmode( buf, mode, dropbox ); } /* end for */ closedir( dir ); /* XXX: use special bits to tag directory permissions */ /* XXX: need to preserve special modes */ - if ( stickydirmode(".AppleDouble", DIRBITS | mode) < 0 ) + if ( stickydirmode(".AppleDouble", DIRBITS | mode, dropbox) < 0 ) return( -1 ); setdirmode_noadouble: /* XXX: need to preserve special modes */ - if ( stickydirmode(".", DIRBITS | mode) < 0 ) + if ( stickydirmode(".", DIRBITS | mode, dropbox) < 0 ) return( -1 ); return( 0 ); } diff --git a/etc/afpd/unix.h b/etc/afpd/unix.h index 79ce68f0..f6b29945 100644 --- a/etc/afpd/unix.h +++ b/etc/afpd/unix.h @@ -93,7 +93,7 @@ extern int uquota_getvolspace __P((const struct vol *, VolSpace *, VolSpace *, extern int gmem __P((const gid_t)); extern int setdeskmode __P((const mode_t)); -extern int setdirmode __P((const mode_t, const int)); +extern int setdirmode __P((const mode_t, const int, const int)); extern int setdeskowner __P((const uid_t, const gid_t)); extern int setdirowner __P((const uid_t, const gid_t, const int)); diff --git a/etc/afpd/volume.c b/etc/afpd/volume.c index 6c286851..5da659af 100644 --- a/etc/afpd/volume.c +++ b/etc/afpd/volume.c @@ -1,4 +1,6 @@ /* + * $Id: volume.c,v 1.5 2001-02-28 16:53:24 rufustfirefly Exp $ + * * Copyright (c) 1990,1993 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. */ @@ -327,6 +329,11 @@ static void volset(struct vol_option *options, char *volname, int vlen, options[VOLOPT_FLAGS].i_value |= AFPVOL_USEDOTS; else if (strcasecmp(p, "limitsize") == 0) options[VOLOPT_FLAGS].i_value |= AFPVOL_LIMITSIZE; + /* support for either "dropbox" or "dropkludge" */ + else if (strcasecmp(p, "dropbox") == 0) + options[VOLOPT_FLAGS].i_value |= AFPVOL_DROPBOX; + else if (strcasecmp(p, "dropkludge") == 0) + options[VOLOPT_FLAGS].i_value |= AFPVOL_DROPBOX; p = strtok(NULL, ","); } diff --git a/etc/afpd/volume.h b/etc/afpd/volume.h index 67ac2d0b..4c4dc0b1 100644 --- a/etc/afpd/volume.h +++ b/etc/afpd/volume.h @@ -1,4 +1,6 @@ /* + * $Id: volume.h,v 1.3 2001-02-28 16:53:24 rufustfirefly Exp $ + * * Copyright (c) 1990,1994 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. */ @@ -83,6 +85,7 @@ typedef u_int64_t VolSpace; #define AFPVOL_USEDOTS (1 << 11) /* use real dots */ #define AFPVOL_LIMITSIZE (1 << 12) /* limit size for older macs */ #define AFPVOL_MAPASCII (1 << 13) /* map the ascii range as well */ +#define AFPVOL_DROPBOX (1 << 14) /* dropkludge dropbox support */ /* FPGetSrvrParms options */ #define AFPSRVR_CONFIGINFO (1 << 0) diff --git a/man/man5/AppleVolumes.default.5.tmpl b/man/man5/AppleVolumes.default.5.tmpl index 2b361f75..b31d78c0 100644 --- a/man/man5/AppleVolumes.default.5.tmpl +++ b/man/man5/AppleVolumes.default.5.tmpl @@ -1,4 +1,4 @@ -.\" $Id: AppleVolumes.default.5.tmpl,v 1.1 2000-09-22 15:18:44 arichard Exp $ +.\" $Id: AppleVolumes.default.5.tmpl,v 1.2 2001-02-28 16:53:24 rufustfirefly Exp $ .TH AppleVolumes.default 5 "20 September 2000" "netatalk 1.5" .UC 4 .SH NAME @@ -76,6 +76,10 @@ The available options are: \fBcrlf\fR - Enables crlf translation for TEXT files. +\fBdropbox\fR - Allows a volume to be declared as being a "dropbox." Note +that netatalk must be compiled with dropkludge support for this to +function. + \fBlimitsize\fR - Hack for older Macintoshes using newer Appleshare clients to limit the disk size reporting to 2 GB. -- 2.39.2