-/* --------------------- */
-int setdirmode(const struct vol *vol, const char *name, mode_t mode)
-{
- struct stat st;
- struct dirent *dirp;
- DIR *dir;
- mode_t hf_mode;
-
- mode |= vol->v_dperm;
- hf_mode = ad_hf_mode(mode);
-
- if (dir_rx_set(mode)) {
- /* extending right? dir first */
- if ( stickydirmode(name, DIRBITS | mode, 0, vol->v_umask) < 0 )
- return -1;
- }
-
- if (( dir = opendir( name )) == NULL ) {
- LOG(log_error, logtype_afpd, "setdirmode: opendir: %s", fullpathname(name), strerror(errno) );
- return( -1 );
- }
-
- for ( dirp = readdir( dir ); dirp != NULL; dirp = readdir( dir )) {
- /* FIXME */
- if (*dirp->d_name == '.') {
- continue;
- }
- if ( lstat( dirp->d_name, &st ) < 0 ) {
- LOG(log_error, logtype_afpd, "setdirmode: stat %s: %s",dirp->d_name, strerror(errno) );
- continue;
- }
-
- if (!S_ISDIR(st.st_mode)) {
- if (setfilmode(dirp->d_name, mode, &st, vol->v_umask) < 0) {
- LOG(log_error, logtype_afpd, "setdirmode: chmod %s: %s",dirp->d_name, strerror(errno) );
- return -1;
- }
- }
- }
- closedir( dir );
-
- if (vol->vfs->vfs_setdirmode(vol, name, mode, NULL) < 0 && !vol_noadouble(vol)) {
- return -1 ;
- }
-
- if (!dir_rx_set(mode)) {
- if ( stickydirmode(name, DIRBITS | mode, 0, vol->v_umask) < 0 )
- return -1;
- }
- 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 );
-}
-