]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/unix.c
Add force 2GB conditional at configure time. This will turn off the code in etc...
[netatalk.git] / etc / afpd / unix.c
index f960b59e7fc7504a2bedbf0fadedc583c4033cd5..048dcba08bd34b6855e44c782efd36b41f890139 100644 (file)
@@ -51,11 +51,17 @@ int ustatfs_getvolspace( vol, bfree, btotal, bsize )
     *bsize = sfs.f_frsize;
 #endif ultrix
 
+#if FORCE_2GB
+    // if the volume is over 2GB in size, report
+    // the size as 2GB.
+    // this doesn't seem to work correctly for
+    // 64 bit size descriptors.  
     if ( *bfree > 0x7fffffff / *bsize ) {
         *bfree = 0x7fffffff;
     } else {
         *bfree *= *bsize;
     }
+#endif
 
 #ifdef ultrix
     *btotal = (VolSpace) 
@@ -64,11 +70,16 @@ int ustatfs_getvolspace( vol, bfree, btotal, bsize )
     *btotal = (VolSpace) 
       ( sfs.f_blocks - ( sfs.f_bfree - sfs.f_bavail )) * sfs.f_frsize;
 #endif ultrix
+
+#if FORCE_2GB
+    // see similar block above comments
     if ( *bfree > 0x7fffffff / *bsize ) {
         *bfree = 0x7fffffff;
     } else {
         *bfree *= *bsize;
     }
+#endif
+
     return( AFP_OK );
 }
 
@@ -103,13 +114,7 @@ void utommode( stat, ma )
 
     ma->ma_owner = utombits( mode );
 
-#ifdef ADMIN_GRP
-    if ( uuid == 0 )
-        ma->ma_user = AR_UWRITE | AR_UREAD | AR_USEARCH | AR_UOWN;
-    else
-#endif
-
-    if ( uuid == stat->st_uid ) {
+    if ( (uuid == stat->st_uid) || (uuid == 0)) {
        ma->ma_user = ma->ma_owner | AR_UOWN;
     } else if ( gmem( stat->st_gid )) {
        ma->ma_user = ma->ma_group;
@@ -190,19 +195,19 @@ const mode_t mode;
         seteuid(0);
         if ( retval=chmod( name, (DIRBITS | mode | S_ISVTX)) < 0)
         {
-           syslog( LOG_ERR, "stickydirmode::setdirmode error: chmod %s: %m", name );
-           return(-1);
+           syslog( LOG_ERR, "stickydirmode: chmod %s: %m", name );
+           return(AFP_ACCESS);
         }
         else
         {
-           syslog( LOG_DEBUG, "stickydirmode::setdirmode: chmod %s: %m", name );
+           syslog( LOG_DEBUG, "stickydirmode: chmod \"%s\": %m", name );
            seteuid(uid);
         }
       }
    else 
 #endif DROPKLUDGE
        if ( retval=chmod( name, DIRBITS | mode ) < 0 ) 
-          syslog( LOG_DEBUG, "stickydirmode::setdirmode: chmod %s: %m", name );
+          syslog( LOG_DEBUG, "stickydirmode: chmod \"%s\": %m", name );
    return retval;
 }
 
@@ -305,9 +310,10 @@ int setdirmode( mode, noadouble )
        if (S_ISREG(st.st_mode)) {
            /* XXX: need to preserve special modes */
            if (S_ISDIR(st.st_mode)) {
-              stickydirmode(dirp->d_name, DIRBITS | mode);
-           } else
-              stickydirmode(dirp->d_name, mode);
+              if (stickydirmode(dirp->d_name, DIRBITS | mode) < 0)
+               return (-1);
+           } else if (stickydirmode(dirp->d_name, mode) < 0)
+               return (-1);
        }
     }
     closedir( dir );