/*
+ * $Id: unix.c,v 1.22 2001-10-09 04:03:33 jmarcus Exp $
+ *
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
-#endif
+#endif /* HAVE_CONFIG_H */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
+#include <errno.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <dirent.h>
#include <limits.h>
#include <atalk/afp.h>
+
+/* STDC check */
+#if STDC_HEADERS
#include <string.h>
+#else /* STDC_HEADERS */
+#ifndef HAVE_STRCHR
+#define strchr index
+#define strrchr index
+#endif /* HAVE_STRCHR */
+char *strchr (), *strrchr ();
+#ifndef HAVE_MEMCPY
+#define memcpy(d,s,n) bcopy ((s), (d), (n))
+#define memmove(d,s,n) bcopy ((s), (d), (n))
+#endif /* ! HAVE_MEMCPY */
+#endif /* STDC_HEADERS */
+
+#ifdef HAVE_FCNTL_H
#include <fcntl.h>
+#endif /* HAVE_FCNTL_H */
#include "auth.h"
#include "directory.h"
#include "volume.h"
#ifdef ultrix
*bfree = (VolSpace) sfs.fd_req.bfreen;
*bsize = 1024;
-#else
+#else /* !ultrix */
*bfree = (VolSpace) sfs.f_bavail;
*bsize = sfs.f_frsize;
-#endif ultrix
+#endif /* ultrix */
if ( *bfree > maxVolSpace / *bsize ) {
*bfree = maxVolSpace;
#ifdef ultrix
*btotal = (VolSpace)
( sfs.fd_req.btot - ( sfs.fd_req.bfree - sfs.fd_req.bfreen ));
-#else ultrix
+#else /* !ultrix */
*btotal = (VolSpace)
( sfs.f_blocks - ( sfs.f_bfree - sfs.f_bavail ));
-#endif ultrix
+#endif /* ultrix */
// see similar block above comments
if ( *btotal > maxVolSpace / *bsize ) {
* Calculate the mode for a directory using Posix access() calls to
* estimate permission, a la mdw.
*/
-accessmode( path, ma, dir )
+void accessmode( path, ma, dir )
char *path;
struct maccess *ma;
struct dir *dir;
ma->ma_owner |= AR_UWRITE;
}
}
-
- return;
}
int gmem( gid )
const mode_t mode;
const int dropbox;
{
- int uid, retval;
-
+ int retval;
+#ifdef DROPKLUDGE
+ int uid;
+#endif /* DROPKLUDGE */
+
/* Turn on the sticky bit if this is a drop box, also turn off the setgid bit */
retval=0;
#ifdef DROPKLUDGE
} else {
#ifdef DEBUG
syslog( LOG_INFO, "stickydirmode: (debug) chmod \"%s\": %m", name );
-#endif
+#endif /* DEBUG */
seteuid(uid);
} /* 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 ) {
- syslog( LOG_ERR, "stickydirmode: chmod \"%s\": %m", name );
+#endif /* DROPKLUDGE */
+
+ /*
+ * Ignore EPERM errors: We may be dealing with a directory that is
+ * group writable, in which case chmod will fail.
+ */
+ if ( chmod( name, DIRBITS | mode ) < 0 && errno != EPERM) {
+ syslog( LOG_ERR, "stickydirmode: chmod \"%s\": %s",
+ name, strerror(errno) );
+ retval = -1;
}
#ifdef DROPKLUDGE
} /* end if not mode */
}
if (( desk = opendir( "." )) == NULL ) {
if ( chdir( wd ) < 0 ) {
- syslog( LOG_ERR, "setdeskmode: chdir %s: %m", wd );
+ syslog( LOG_ERR, "setdeskmode: chdir %s: %s", wd, strerror(errno) );
}
return( -1 );
}
strcat( modbuf, subp->d_name );
/* XXX: need to preserve special modes */
if (stat(modbuf, &st) < 0) {
- syslog( LOG_ERR, "setdeskmode: stat %s: %m", modbuf );
+ syslog( LOG_ERR, "setdeskmode: stat %s: %s",
+ modbuf, strerror(errno) );
continue;
}
if (S_ISDIR(st.st_mode)) {
- if ( chmod( modbuf, DIRBITS | mode ) < 0 ) {
- syslog( LOG_ERR, "setdeskmode: chmod %s: %m", modbuf );
+ if ( chmod( modbuf, DIRBITS | mode ) < 0 && errno != EPERM ) {
+ syslog( LOG_ERR, "setdeskmode: chmod %s: %s",
+ modbuf, strerror(errno) );
}
- } else if ( chmod( modbuf, mode ) < 0 ) {
- syslog( LOG_ERR, "setdeskmode: chmod %s: %m", modbuf );
+ } else if ( chmod( modbuf, mode ) < 0 && errno != EPERM ) {
+ syslog( LOG_ERR, "setdeskmode: chmod %s: %s",
+ modbuf, strerror(errno) );
}
}
closedir( sub );
/* XXX: need to preserve special modes */
- if ( chmod( deskp->d_name, DIRBITS | mode ) < 0 ) {
- syslog( LOG_ERR, "setdeskmode: chmod %s: %m", deskp->d_name );
+ if ( chmod( deskp->d_name, DIRBITS | mode ) < 0 && errno != EPERM ) {
+ syslog( LOG_ERR, "setdeskmode: chmod %s: %s",
+ deskp->d_name, strerror(errno) );
}
}
closedir( desk );
if ( chdir( wd ) < 0 ) {
- syslog( LOG_ERR, "setdeskmode: chdir %s: %m", wd );
+ syslog( LOG_ERR, "setdeskmode: chdir %s: %s", wd, strerror(errno) );
return -1;
}
/* XXX: need to preserve special modes */
- if ( chmod( ".AppleDesktop", DIRBITS | mode ) < 0 ) {
- syslog( LOG_ERR, "setdeskmode: chmod .AppleDesktop: %m" );
+ if ( chmod( ".AppleDesktop", DIRBITS | mode ) < 0 && errno != EPERM ) {
+ syslog( LOG_ERR, "setdeskmode: chmod .AppleDesktop: %s", strerror(errno) );
}
return( 0 );
}
DIR *dir;
if (( dir = opendir( "." )) == NULL ) {
- syslog( LOG_ERR, "setdirmode: opendir .: %m" );
+ syslog( LOG_ERR, "setdirmode: opendir .: %s", strerror(errno) );
return( -1 );
}
continue;
}
if ( stat( dirp->d_name, &st ) < 0 ) {
- syslog( LOG_ERR, "setdirmode: stat %s: %m", dirp->d_name );
+ syslog( LOG_ERR, "setdirmode: stat %s: %s",
+ dirp->d_name, strerror(errno) );
continue;
}
if (( dir = opendir( ".AppleDouble" )) == NULL ) {
if (noadouble)
goto setdirmode_noadouble;
- syslog( LOG_ERR, "setdirmode: opendir .AppleDouble: %m" );
+ syslog( LOG_ERR, "setdirmode: opendir .AppleDouble: %s", strerror(errno) );
return( -1 );
}
strcpy( buf, ".AppleDouble" );
strcat( buf, dirp->d_name );
if ( stat( buf, &st ) < 0 ) {
- syslog( LOG_ERR, "setdirmode: stat %s: %m", buf );
+ syslog( LOG_ERR, "setdirmode: stat %s: %s", buf, strerror(errno) );
continue;
}
}
if (( desk = opendir( "." )) == NULL ) {
if ( chdir( wd ) < 0 ) {
- syslog( LOG_ERR, "setdeskowner: chdir %s: %m", wd );
+ syslog( LOG_ERR, "setdeskowner: chdir %s: %s", wd, strerror(errno) );
}
return( -1 );
}
*m = '\0';
strcat( modbuf, subp->d_name );
/* XXX: add special any uid, ignore group bits */
- if ( chown( modbuf, uid, gid ) < 0 ) {
- syslog( LOG_ERR, "setdeskown: chown %s: %m", modbuf );
+ if ( chown( modbuf, uid, gid ) < 0 && errno != EPERM ) {
+ syslog( LOG_ERR, "setdeskown: chown %s: %s",
+ modbuf, strerror(errno) );
}
}
closedir( sub );
/* XXX: add special any uid, ignore group bits */
- if ( chown( deskp->d_name, uid, gid ) < 0 ) {
- syslog( LOG_ERR, "setdeskowner: chown %s: %m", deskp->d_name );
+ if ( chown( deskp->d_name, uid, gid ) < 0 && errno != EPERM ) {
+ syslog( LOG_ERR, "setdeskowner: chown %s: %s",
+ deskp->d_name, strerror(errno) );
}
}
closedir( desk );
if ( chdir( wd ) < 0 ) {
- syslog( LOG_ERR, "setdeskowner: chdir %s: %m", wd );
+ syslog( LOG_ERR, "setdeskowner: chdir %s: %s", wd, strerror(errno) );
return -1;
}
- if ( chown( ".AppleDesktop", uid, gid ) < 0 ) {
- syslog( LOG_ERR, "setdeskowner: chown .AppleDesktop: %m" );
+ if ( chown( ".AppleDesktop", uid, gid ) < 0 && errno != EPERM ) {
+ syslog( LOG_ERR, "setdeskowner: chown .AppleDesktop: %s",
+ strerror(errno) );
}
return( 0 );
}
continue;
};
if ( stat( dirp->d_name, &st ) < 0 ) {
- syslog( LOG_ERR, "setdirowner: stat %s: %m", dirp->d_name );
+ syslog( LOG_ERR, "setdirowner: stat %s: %s",
+ dirp->d_name, strerror(errno) );
continue;
}
if (( st.st_mode & S_IFMT ) == S_IFREG ) {
- if ( chown( dirp->d_name, uid, gid ) < 0 ) {
- syslog( LOG_DEBUG, "setdirowner: chown %s: %m", dirp->d_name );
+ if ( chown( dirp->d_name, uid, gid ) < 0 && errno != EPERM ) {
+ syslog( LOG_DEBUG, "setdirowner: chown %s: %s",
+ dirp->d_name, strerror(errno) );
/* return ( -1 ); Sometimes this is okay */
}
}
}
*m = '\0';
strcat( buf, dirp->d_name );
- if ( chown( buf, uid, gid ) < 0 ) {
- syslog( LOG_DEBUG, "setdirowner: chown %d/%d %s: %m",
- uid, gid, buf );
+ if ( chown( buf, uid, gid ) < 0 && errno != EPERM ) {
+ syslog( LOG_DEBUG, "setdirowner: chown %d/%d %s: %s",
+ uid, gid, buf, strerror(errno) );
/* return ( -1 ); Sometimes this is okay */
}
}
* We cheat: we know that chown doesn't do anything.
*/
if ( stat( ".AppleDouble", &st ) < 0 ) {
- syslog( LOG_ERR, "setdirowner: stat .AppleDouble: %m" );
+ syslog( LOG_ERR, "setdirowner: stat .AppleDouble: %s", strerror(errno) );
return( -1 );
}
- if ( gid && gid != st.st_gid && chown( ".AppleDouble", uid, gid ) < 0 ) {
- syslog( LOG_DEBUG, "setdirowner: chown %d/%d .AppleDouble: %m",
- uid, gid);
+ if ( gid && gid != st.st_gid && chown( ".AppleDouble", uid, gid ) < 0 &&
+ errno != EPERM ) {
+ syslog( LOG_DEBUG, "setdirowner: chown %d/%d .AppleDouble: %s",
+ uid, gid, strerror(errno) );
/* return ( -1 ); Sometimes this is okay */
}
if ( stat( ".", &st ) < 0 ) {
return( -1 );
}
- if ( gid && gid != st.st_gid && chown( ".", uid, gid ) < 0 ) {
- syslog( LOG_DEBUG, "setdirowner: chown %d/%d .: %m",
- uid, gid);
+ if ( gid && gid != st.st_gid && chown( ".", uid, gid ) < 0 &&
+ errno != EPERM ) {
+ syslog( LOG_DEBUG, "setdirowner: chown %d/%d .: %s",
+ uid, gid, strerror(errno) );
}
return( 0 );