/*
- * $Id: unix.c,v 1.43.2.1.2.5 2004-03-12 13:03:19 didg Exp $
+ * $Id: unix.c,v 1.43.2.1.2.6 2004-05-08 22:39:26 didg Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
#include <atalk/logger.h>
#include <atalk/adouble.h>
#include <atalk/afp.h>
+#include <atalk/util.h>
#include "auth.h"
#include "directory.h"
return( mode );
}
-/*
+/* ----------------------------- */
+char *fullpathname(const char *name)
+{
+ static char wd[ MAXPATHLEN + 1];
+
+ if ( getcwd( wd , MAXPATHLEN) ) {
+ strlcat(wd, "/", MAXPATHLEN);
+ strlcat(wd, name, MAXPATHLEN);
+ }
+ else {
+ strlcpy(wd, name, MAXPATHLEN);
+ }
+ return wd;
+}
+
+/* -----------------------------
a dropbox is a folder where w is set but not r eg:
rwx-wx-wx or rwx-wx--
rwx----wx (is not asked by a Mac with OS >= 8.0 ?)
LOG(log_error, logtype_afpd, "stickydirmode: unable to seteuid root: %s", strerror(errno));
}
if ( (retval=chmod( name, ( (DIRBITS | mode | S_ISVTX) & ~default_options.umask) )) < 0) {
- LOG(log_error, logtype_afpd, "stickydirmode: chmod \"%s\": %s", name, strerror(errno) );
+ LOG(log_error, logtype_afpd, "stickydirmode: chmod \"%s\": %s", fullpathname(name), strerror(errno) );
} else {
#ifdef DEBUG
- LOG(log_info, logtype_afpd, "stickydirmode: (debug) chmod \"%s\": %s", name, strerror(retval) );
+ LOG(log_info, logtype_afpd, "stickydirmode: (debug) chmod \"%s\": %s", fullpathname(name), strerror(retval) );
#endif /* DEBUG */
}
seteuid(uid);
* group writable, in which case chmod will fail.
*/
if ( (chmod( name, (DIRBITS | mode) & ~default_options.umask ) < 0) && errno != EPERM) {
- LOG(log_error, logtype_afpd, "stickydirmode: chmod \"%s\": %s",name, strerror(errno) );
+ LOG(log_error, logtype_afpd, "stickydirmode: chmod \"%s\": %s", fullpathname(name), strerror(errno) );
retval = -1;
}
strcat( modbuf, subp->d_name );
/* XXX: need to preserve special modes */
if (stat(modbuf, &st) < 0) {
- LOG(log_error, logtype_afpd, "setdeskmode: stat %s: %s",
- modbuf, strerror(errno) );
+ LOG(log_error, logtype_afpd, "setdeskmode: stat %s: %s",fullpathname(modbuf), strerror(errno) );
continue;
}
if (S_ISDIR(st.st_mode)) {
if ( chmod( modbuf, (DIRBITS | mode) & ~default_options.umask ) < 0 && errno != EPERM ) {
- LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",
- modbuf, strerror(errno) );
+ LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",fullpathname(modbuf), strerror(errno) );
}
} else if ( chmod( modbuf, mode & ~default_options.umask ) < 0 && errno != EPERM ) {
- LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",
- modbuf, strerror(errno) );
+ LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",fullpathname(modbuf), strerror(errno) );
}
}
closedir( sub );
/* XXX: need to preserve special modes */
if ( chmod( deskp->d_name, (DIRBITS | mode) & ~default_options.umask ) < 0 && errno != EPERM ) {
- LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",
- deskp->d_name, strerror(errno) );
+ LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",fullpathname(deskp->d_name), strerror(errno) );
}
}
closedir( desk );
}
/* XXX: need to preserve special modes */
if ( chmod( ".AppleDesktop", (DIRBITS | mode) & ~default_options.umask ) < 0 && errno != EPERM ) {
- LOG(log_error, logtype_afpd, "setdeskmode: chmod .AppleDesktop: %s", strerror(errno) );
+ LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s", fullpathname(".AppleDesktop"),strerror(errno) );
}
return( 0 );
}
int dropbox = (vol->v_flags & AFPVOL_DROPBOX);
if (( dir = opendir( "." )) == NULL ) {
- LOG(log_error, logtype_afpd, "setdirmode: opendir .: %s", strerror(errno) );
+ LOG(log_error, logtype_afpd, "setdirmode: opendir %s: %s", fullpathname("."), strerror(errno) );
return( -1 );
}
continue;
}
if ( stat( dirp->d_name, &st ) < 0 ) {
- LOG(log_error, logtype_afpd, "setdirmode: stat %s: %s",
- dirp->d_name, strerror(errno) );
+ LOG(log_error, logtype_afpd, "setdirmode: stat %s: %s",dirp->d_name, strerror(errno) );
continue;
}
int setmode = (osx && *dirp->d_name == '.')?hf_mode:mode;
if (setfilmode(dirp->d_name, setmode, &st) < 0) {
- LOG(log_error, logtype_afpd, "setdirmode: chmod %s: %s",
- dirp->d_name, strerror(errno) );
+ LOG(log_error, logtype_afpd, "setdirmode: chmod %s: %s",dirp->d_name, strerror(errno) );
return -1;
}
}
if (( dir = opendir( ".AppleDouble" )) == NULL ) {
if (vol_noadouble(vol))
goto setdirmode_noadouble;
- LOG(log_error, logtype_afpd, "setdirmode: opendir .AppleDouble: %s", strerror(errno) );
+ LOG(log_error, logtype_afpd, "setdirmode: opendir %s: %s", fullpathname(".AppleDouble"),strerror(errno) );
return( -1 );
}
strcpy( buf, ".AppleDouble" );
strcat( modbuf, subp->d_name );
/* XXX: add special any uid, ignore group bits */
if ( chown( modbuf, uid, gid ) < 0 && errno != EPERM ) {
- LOG(log_error, logtype_afpd, "setdeskown: chown %s: %s",
- modbuf, strerror(errno) );
+ LOG(log_error, logtype_afpd, "setdeskown: chown %s: %s", fullpathname(modbuf), strerror(errno) );
}
}
closedir( sub );
return -1;
}
if ( chown( ".AppleDesktop", uid, gid ) < 0 && errno != EPERM ) {
- LOG(log_error, logtype_afpd, "setdeskowner: chown .AppleDesktop: %s",
- strerror(errno) );
+ LOG(log_error, logtype_afpd, "setdeskowner: chown %s: %s", fullpathname(".AppleDouble"), strerror(errno) );
}
return( 0 );
}
}
if ( stat( dirp->d_name, &st ) < 0 ) {
LOG(log_error, logtype_afpd, "setdirowner: stat %s: %s",
- dirp->d_name, strerror(errno) );
+ fullpathname(dirp->d_name), strerror(errno) );
continue;
}
if (( st.st_mode & S_IFMT ) == S_IFREG ) {
if ( chown( dirp->d_name, uid, gid ) < 0 && errno != EPERM ) {
LOG(log_debug, logtype_afpd, "setdirowner: chown %s: %s",
- dirp->d_name, strerror(errno) );
+ fullpathname(dirp->d_name), strerror(errno) );
/* return ( -1 ); Sometimes this is okay */
}
}
strcat( buf, dirp->d_name );
if ( chown( buf, uid, gid ) < 0 && errno != EPERM ) {
LOG(log_debug, logtype_afpd, "setdirowner: chown %d/%d %s: %s",
- uid, gid, buf, strerror(errno) );
+ uid, gid, fullpathname(buf), strerror(errno) );
/* return ( -1 ); Sometimes this is okay */
}
}
* We cheat: we know that chown doesn't do anything.
*/
if ( stat( ".AppleDouble", &st ) < 0 ) {
- LOG(log_error, logtype_afpd, "setdirowner: stat .AppleDouble: %s", strerror(errno) );
+ LOG(log_error, logtype_afpd, "setdirowner: stat %s: %s", fullpathname(".AppleDouble"), strerror(errno) );
return( -1 );
}
if ( gid && gid != st.st_gid && chown( ".AppleDouble", uid, gid ) < 0 &&
errno != EPERM ) {
- LOG(log_debug, logtype_afpd, "setdirowner: chown %d/%d .AppleDouble: %s",
- uid, gid, strerror(errno) );
+ LOG(log_debug, logtype_afpd, "setdirowner: chown %d/%d %s: %s",
+ uid, gid,fullpathname(".AppleDouble"), strerror(errno) );
/* return ( -1 ); Sometimes this is okay */
}
}
if ( gid && gid != st.st_gid && chown( ".", uid, gid ) < 0 &&
errno != EPERM ) {
- LOG(log_debug, logtype_afpd, "setdirowner: chown %d/%d .: %s",
- uid, gid, strerror(errno) );
+ LOG(log_debug, logtype_afpd, "setdirowner: chown %d/%d %s: %s",
+ uid, gid, fullpathname("."), strerror(errno) );
}
return( 0 );