#include <atalk/netatalk_conf.h>
#include <atalk/unix.h>
#include <atalk/bstrlib.h>
+#include <atalk/errchk.h>
#include "volume.h"
#include "directory.h"
#include "desktop.h"
#include "mangle.h"
+#define EXEC_MODE (S_IXGRP | S_IXUSR | S_IXOTH)
+
+int setdeskmode(const struct vol *vol, const mode_t mode)
+{
+ EC_INIT;
+ char wd[ MAXPATHLEN + 1];
+ struct stat st;
+ char modbuf[ 12 + 1], *m;
+ struct dirent *deskp, *subp;
+ DIR *desk, *sub;
+
+ if (!dir_rx_set(mode)) {
+ /* want to remove read and search access to owner it will screw the volume */
+ return -1 ;
+ }
+ if ( getcwd( wd , MAXPATHLEN) == NULL ) {
+ return( -1 );
+ }
+
+ bstring dtpath = bfromcstr(vol->v_dbpath);
+ bcatcstr(dtpath, "/" APPLEDESKTOP);
+
+ EC_NEG1( chdir(bdata(dtpath)) );
+
+ if (( desk = opendir( "." )) == NULL ) {
+ if ( chdir( wd ) < 0 ) {
+ LOG(log_error, logtype_afpd, "setdeskmode: chdir %s: %s", wd, strerror(errno) );
+ }
+ EC_FAIL;
+ }
+ for ( deskp = readdir( desk ); deskp != NULL; deskp = readdir( desk )) {
+ if ( strcmp( deskp->d_name, "." ) == 0 ||
+ strcmp( deskp->d_name, ".." ) == 0 || strlen( deskp->d_name ) > 2 ) {
+ continue;
+ }
+ strcpy( modbuf, deskp->d_name );
+ strcat( modbuf, "/" );
+ m = strchr( modbuf, '\0' );
+ if (( sub = opendir( deskp->d_name )) == NULL ) {
+ continue;
+ }
+ for ( subp = readdir( sub ); subp != NULL; subp = readdir( sub )) {
+ if ( strcmp( subp->d_name, "." ) == 0 ||
+ strcmp( subp->d_name, ".." ) == 0 ) {
+ continue;
+ }
+ *m = '\0';
+ strcat( modbuf, subp->d_name );
+ /* XXX: need to preserve special modes */
+ if (lstat(modbuf, &st) < 0) {
+ LOG(log_error, logtype_afpd, "setdeskmode: stat %s: %s",fullpathname(modbuf), strerror(errno) );
+ continue;
+ }
+
+ if (S_ISDIR(st.st_mode)) {
+ if ( chmod_acl( modbuf, (DIRBITS | mode)) < 0 && errno != EPERM ) {
+ LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",fullpathname(modbuf), strerror(errno) );
+ }
+ } else if ( chmod_acl( modbuf, mode & ~EXEC_MODE ) < 0 && errno != EPERM ) {
+ LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",fullpathname(modbuf), strerror(errno) );
+ }
+
+ }
+ closedir( sub );
+ /* XXX: need to preserve special modes */
+ if ( chmod_acl( deskp->d_name, (DIRBITS | mode)) < 0 && errno != EPERM ) {
+ LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",fullpathname(deskp->d_name), strerror(errno) );
+ }
+ }
+ closedir( desk );
+ if ( chdir( wd ) < 0 ) {
+ LOG(log_error, logtype_afpd, "setdeskmode: chdir %s: %s", wd, strerror(errno) );
+ EC_FAIL;
+ }
+ /* XXX: need to preserve special modes */
+ if ( chmod_acl(bdata(dtpath), (DIRBITS | mode)) < 0 && errno != EPERM ) {
+ LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s", bdata(dtpath), strerror(errno));
+ }
+
+EC_CLEANUP:
+ bdestroy(dtpath);
+ EC_EXIT;
+}
+
+int setdeskowner(const struct vol *vol, uid_t uid, gid_t gid)
+{
+ EC_INIT;
+ char wd[ MAXPATHLEN + 1];
+ char modbuf[12 + 1], *m;
+ struct dirent *deskp, *subp;
+ DIR *desk, *sub;
+
+ if ( getcwd( wd, MAXPATHLEN ) == NULL ) {
+ return( -1 );
+ }
+
+ bstring dtpath = bfromcstr(vol->v_dbpath);
+ bcatcstr(dtpath, "/" APPLEDESKTOP);
+
+ EC_NEG1( chdir(bdata(dtpath)) );
+
+ if (( desk = opendir( "." )) == NULL ) {
+ if ( chdir( wd ) < 0 ) {
+ LOG(log_error, logtype_afpd, "setdeskowner: chdir %s: %s", wd, strerror(errno) );
+ }
+ EC_FAIL;
+ }
+ for ( deskp = readdir( desk ); deskp != NULL; deskp = readdir( desk )) {
+ if ( strcmp( deskp->d_name, "." ) == 0 ||
+ strcmp( deskp->d_name, ".." ) == 0 ||
+ strlen( deskp->d_name ) > 2 ) {
+ continue;
+ }
+ strcpy( modbuf, deskp->d_name );
+ strcat( modbuf, "/" );
+ m = strchr( modbuf, '\0' );
+ if (( sub = opendir( deskp->d_name )) == NULL ) {
+ continue;
+ }
+ for ( subp = readdir( sub ); subp != NULL; subp = readdir( sub )) {
+ if ( strcmp( subp->d_name, "." ) == 0 ||
+ strcmp( subp->d_name, ".." ) == 0 ) {
+ continue;
+ }
+ *m = '\0';
+ 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", fullpathname(modbuf), strerror(errno) );
+ }
+ }
+ closedir( sub );
+ /* XXX: add special any uid, ignore group bits */
+ if ( chown( deskp->d_name, uid, gid ) < 0 && errno != EPERM ) {
+ LOG(log_error, logtype_afpd, "setdeskowner: chown %s: %s",
+ deskp->d_name, strerror(errno) );
+ }
+ }
+ closedir( desk );
+ if ( chdir( wd ) < 0 ) {
+ LOG(log_error, logtype_afpd, "setdeskowner: chdir %s: %s", wd, strerror(errno) );
+ EC_FAIL;
+ }
+ if (chown(bdata(dtpath), uid, gid ) < 0 && errno != EPERM ) {
+ LOG(log_error, logtype_afpd, "setdeskowner: chown %s: %s", fullpathname(".AppleDouble"), strerror(errno) );
+ }
+
+EC_CLEANUP:
+ bdestroy(dtpath);
+ EC_EXIT;
+}
+
static void create_appledesktop_folder(const struct vol * vol)
{
bstring olddtpath = NULL, dtpath = NULL;
extern char *mtoupath (const struct vol *, char *, cnid_t, int utf8);
extern char *utompath (const struct vol *, char *, cnid_t, int utf8);
+extern int setdeskmode(const struct vol *vol, const mode_t mode);
+extern int setdeskowner(const struct vol *vol, uid_t uid, gid_t gid);
+
/* FP functions */
int afp_opendt (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen);
int afp_addcomment (AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf, size_t *rbuflen);
break;
case DIRPBIT_UID : /* What kind of loser mounts as root? */
if ( (dir->d_did == DIRDID_ROOT) &&
- (setdeskowner( ntohl(owner), -1 ) < 0)) {
+ (setdeskowner(vol, ntohl(owner), -1 ) < 0)) {
err = set_dir_errors(path, "setdeskowner", errno);
if (isad && err == AFPERR_PARAM) {
err = AFP_OK; /* ???*/
break;
case DIRPBIT_GID :
if (dir->d_did == DIRDID_ROOT)
- setdeskowner( -1, ntohl(group) );
+ setdeskowner(vol, -1, ntohl(group) );
if ( setdirowner(vol, upath, -1, ntohl(group) ) < 0 ) {
err = set_dir_errors(path, "setdirowner", errno);
goto setdirparam_done;
if (err == AFP_OK) {
if (set_maccess == true) {
if (dir->d_did == DIRDID_ROOT) {
- setdeskmode(mpriv);
+ setdeskmode(vol, mpriv);
if (!dir_rx_set(mpriv)) {
/* we can't remove read and search for owner on volume root */
err = AFPERR_ACCESS;
err = AFPERR_ACCESS;
goto setprivdone;
}
- setdeskowner(-1, ntohl(group));
- setdeskmode(upriv);
+ setdeskowner(vol, -1, ntohl(group));
+ setdeskmode(vol, upriv);
}
if (setdirowner(vol, upath, -1, ntohl(group)) < 0) {
return( mode );
}
-#define EXEC_MODE (S_IXGRP | S_IXUSR | S_IXOTH)
-
-int setdeskmode(const mode_t mode)
-{
- char wd[ MAXPATHLEN + 1];
- struct stat st;
- char modbuf[ 12 + 1], *m;
- struct dirent *deskp, *subp;
- DIR *desk, *sub;
-
- if (!dir_rx_set(mode)) {
- /* want to remove read and search access to owner it will screw the volume */
- return -1 ;
- }
- if ( getcwd( wd , MAXPATHLEN) == NULL ) {
- return( -1 );
- }
- if ( chdir( ".AppleDesktop" ) < 0 ) {
- return( -1 );
- }
- if (( desk = opendir( "." )) == NULL ) {
- if ( chdir( wd ) < 0 ) {
- LOG(log_error, logtype_afpd, "setdeskmode: chdir %s: %s", wd, strerror(errno) );
- }
- return( -1 );
- }
- for ( deskp = readdir( desk ); deskp != NULL; deskp = readdir( desk )) {
- if ( strcmp( deskp->d_name, "." ) == 0 ||
- strcmp( deskp->d_name, ".." ) == 0 || strlen( deskp->d_name ) > 2 ) {
- continue;
- }
- strcpy( modbuf, deskp->d_name );
- strcat( modbuf, "/" );
- m = strchr( modbuf, '\0' );
- if (( sub = opendir( deskp->d_name )) == NULL ) {
- continue;
- }
- for ( subp = readdir( sub ); subp != NULL; subp = readdir( sub )) {
- if ( strcmp( subp->d_name, "." ) == 0 ||
- strcmp( subp->d_name, ".." ) == 0 ) {
- continue;
- }
- *m = '\0';
- strcat( modbuf, subp->d_name );
- /* XXX: need to preserve special modes */
- if (lstat(modbuf, &st) < 0) {
- LOG(log_error, logtype_afpd, "setdeskmode: stat %s: %s",fullpathname(modbuf), strerror(errno) );
- continue;
- }
-
- if (S_ISDIR(st.st_mode)) {
- if ( chmod_acl( modbuf, (DIRBITS | mode)) < 0 && errno != EPERM ) {
- LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",fullpathname(modbuf), strerror(errno) );
- }
- } else if ( chmod_acl( modbuf, mode & ~EXEC_MODE ) < 0 && errno != EPERM ) {
- LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",fullpathname(modbuf), strerror(errno) );
- }
-
- }
- closedir( sub );
- /* XXX: need to preserve special modes */
- if ( chmod_acl( deskp->d_name, (DIRBITS | mode)) < 0 && errno != EPERM ) {
- LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s",fullpathname(deskp->d_name), strerror(errno) );
- }
- }
- closedir( desk );
- if ( chdir( wd ) < 0 ) {
- LOG(log_error, logtype_afpd, "setdeskmode: chdir %s: %s", wd, strerror(errno) );
- return -1;
- }
- /* XXX: need to preserve special modes */
- if ( chmod_acl( ".AppleDesktop", (DIRBITS | mode)) < 0 && errno != EPERM ) {
- LOG(log_error, logtype_afpd, "setdeskmode: chmod %s: %s", fullpathname(".AppleDesktop"),strerror(errno) );
- }
- return( 0 );
-}
-
/* --------------------- */
int setfilunixmode (const struct vol *vol, struct path* path, mode_t mode)
{
return 0;
}
-/* ----------------------------- */
-int setdeskowner(const uid_t uid, const gid_t gid)
-{
- char wd[ MAXPATHLEN + 1];
- char modbuf[12 + 1], *m;
- struct dirent *deskp, *subp;
- DIR *desk, *sub;
-
- if ( getcwd( wd, MAXPATHLEN ) == NULL ) {
- return( -1 );
- }
- if ( chdir( ".AppleDesktop" ) < 0 ) {
- return( -1 );
- }
- if (( desk = opendir( "." )) == NULL ) {
- if ( chdir( wd ) < 0 ) {
- LOG(log_error, logtype_afpd, "setdeskowner: chdir %s: %s", wd, strerror(errno) );
- }
- return( -1 );
- }
- for ( deskp = readdir( desk ); deskp != NULL; deskp = readdir( desk )) {
- if ( strcmp( deskp->d_name, "." ) == 0 ||
- strcmp( deskp->d_name, ".." ) == 0 ||
- strlen( deskp->d_name ) > 2 ) {
- continue;
- }
- strcpy( modbuf, deskp->d_name );
- strcat( modbuf, "/" );
- m = strchr( modbuf, '\0' );
- if (( sub = opendir( deskp->d_name )) == NULL ) {
- continue;
- }
- for ( subp = readdir( sub ); subp != NULL; subp = readdir( sub )) {
- if ( strcmp( subp->d_name, "." ) == 0 ||
- strcmp( subp->d_name, ".." ) == 0 ) {
- continue;
- }
- *m = '\0';
- 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", fullpathname(modbuf), strerror(errno) );
- }
- }
- closedir( sub );
- /* XXX: add special any uid, ignore group bits */
- if ( chown( deskp->d_name, uid, gid ) < 0 && errno != EPERM ) {
- LOG(log_error, logtype_afpd, "setdeskowner: chown %s: %s",
- deskp->d_name, strerror(errno) );
- }
- }
- closedir( desk );
- if ( chdir( wd ) < 0 ) {
- LOG(log_error, logtype_afpd, "setdeskowner: chdir %s: %s", wd, strerror(errno) );
- return -1;
- }
- if ( chown( ".AppleDesktop", uid, gid ) < 0 && errno != EPERM ) {
- LOG(log_error, logtype_afpd, "setdeskowner: chown %s: %s", fullpathname(".AppleDouble"), strerror(errno) );
- }
- return( 0 );
-}
-
/* ----------------------------- */
int setfilowner(const struct vol *vol, const uid_t uid, const gid_t gid, struct path* path)
{
extern struct afp_options default_options;
-extern int setdeskmode (const mode_t);
extern int setdirunixmode (const struct vol *, const char *, mode_t);
extern int setdirmode (const struct vol *, const char *, mode_t);
-extern int setdeskowner (const uid_t, const gid_t);
extern int setdirowner (const struct vol *, const char *, const uid_t, const gid_t);
extern int setfilunixmode (const struct vol *, struct path*, const mode_t);
extern int setfilowner (const struct vol *, const uid_t, const gid_t, struct path*);