/*
- * $Id: directory.c,v 1.27 2002-03-13 19:29:14 srittau Exp $
+ * $Id: directory.c,v 1.41.2.2 2002-11-07 17:10:02 srittau Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
#include "globals.h"
#include "unix.h"
-#ifdef FORCE_UIDGID
-#include "uid.h"
-#endif /* FORCE_UIDGID */
-
struct dir *curdir;
#define SENTINEL (&sentinel)
return NULL;
}
+/* -----------------------------------------
+ * if did is not in the cache resolve it with cnid
+ *
+ */
+struct dir *
+ dirlookup( vol, did )
+ const struct vol *vol;
+u_int32_t did;
+{
+#ifdef CNID_DB
+ struct dir *ret;
+ char *upath;
+ u_int32_t id;
+ static char path[MAXPATHLEN + 1];
+ int len;
+ int pathlen;
+ char *ptr;
+ static char buffer[12 + MAXPATHLEN + 1];
+ int buflen = 12 + MAXPATHLEN + 1;
+ char *mpath;
+
+ ret = dirsearch(vol, did);
+ if (ret != NULL)
+ return ret;
+
+ id = did;
+ if ((upath = cnid_resolve(vol->v_db, &id, buffer, buflen)) == NULL) {
+ return NULL;
+ }
+ ptr = path + MAXPATHLEN;
+ mpath = utompath(vol, upath);
+ len = strlen(mpath);
+ pathlen = len; /* no 0 in the last part */
+ len++;
+ strcpy(ptr - len, mpath);
+ ptr -= len;
+ while (1) {
+ ret = dirsearch(vol,id);
+ if (ret != NULL) {
+ break;
+ }
+ if ((upath = cnid_resolve(vol->v_db, &id, buffer, buflen)) == NULL)
+ return NULL;
+ mpath = utompath(vol, upath);
+ len = strlen(mpath) + 1;
+ pathlen += len;
+ if (pathlen > 255)
+ return NULL;
+ strcpy(ptr - len, mpath);
+ ptr -= len;
+ }
+ /* fill the cache */
+ ptr--;
+ *ptr = (unsigned char)pathlen;
+ ptr--;
+ *ptr = 2;
+ /* cname is not efficient */
+ if (cname( vol, ret, &ptr ) == NULL )
+ return NULL;
+#endif
+ return dirsearch(vol, did);
+}
+/* --------------------------- */
/* rotate the tree to the left */
static void dir_leftrotate(vol, dir)
struct vol *vol;
#endif /* ! REMOVE_NODES */
}
+/* ---------------------------------------
+ * remove the node and its childs from the tree
+ *
+ * FIXME what about opened forks with refs to it?
+ * it's an afp specs violation because you can't delete
+ * an opened forks. Now afpd doesn't care about forks opened by other
+ * process. It's fixable within afpd if fnctl_lock, doable with smb and
+ * next to impossible for nfs and local filesystem access.
+ */
+
+static void dir_invalidate( vol, dir )
+const struct vol *vol;
+struct dir *dir;
+{
+ if (curdir == dir) {
+ /* v_root can't be deleted */
+ if (movecwd(vol, vol->v_root) < 0)
+ printf("Yuup cant change dir to v_root\n");
+ }
+ /* FIXME */
+ dirchildremove(dir->d_parent, dir);
+ dir_remove( vol, dir );
+}
+/* ------------------------------------ */
static struct dir *dir_insert(vol, dir)
const struct vol *vol;
struct dir *dir;
struct dir *cdir;
static char path[ MAXPATHLEN + 1];
char *data, *p;
+ char *u;
int extend = 0;
int len;
-
+ int olen = 0;
+
data = *cpath;
if ( *data++ != 2 ) { /* path type */
return( NULL );
len = (unsigned char) *data++;
*cpath += len + 2;
*path = '\0';
+ u = NULL;
for ( ;; ) {
if ( len == 0 ) {
if ( !extend && movecwd( vol, dir ) < 0 ) {
- return( NULL );
+ /* it's tricky:
+ movecwd failed so dir is not there anymore.
+ FIXME Is it true with other errors?
+ if path == '\0' ==> the cpath parameter is that dir,
+ and maybe we are trying to recreate it! So we can't
+ fail here.
+
+ */
+ if ( dir->d_did == DIRDID_ROOT_PARENT)
+ return NULL;
+ cdir = dir->d_parent;
+ dir_invalidate(vol, dir);
+ if (*path != '\0' || u == NULL) {
+ /* FIXME: if path != '\0' then extend != 0 ?
+ * u == NUL ==> cpath is something like:
+ * toto\0\0\0
+ */
+ return NULL;
+ }
+ if (movecwd(vol, cdir) < 0) {
+ printf("can't change to parent\n");
+ return NULL; /* give up the whole tree is out of synch*/
+ }
+ /* restore the previous token */
+ strncpy(path, u, olen);
+ path[olen] = '\0';
}
return( path );
}
data++;
len--;
}
+ u = NULL;
while ( *data == '\0' && len > 0 ) {
if ( dir->d_parent == NULL ) {
/* would this be faster with strlen + strncpy? */
p = path;
+ if (len > 0) {
+ u = data;
+ olen = len;
+ }
while ( *data != '\0' && len > 0 ) {
*p++ = *data++;
len--;
if ( !extend ) {
cdir = dir->d_child;
while (cdir) {
- if ( strcasecmp( cdir->d_name, path ) == 0 ) {
+ if ( strcmp( cdir->d_name, path ) == 0 ) {
break;
}
cdir = (cdir == dir->d_child->d_prev) ? NULL :
}
if ( cdir == NULL ) {
++extend;
+ /* if dir == curdir it always succeed,
+ even if curdir is deleted.
+ it's not a pb because it will failed in extenddir
+ */
if ( movecwd( vol, dir ) < 0 ) {
+ /* dir is not valid anymore
+ we delete dir from the cache and abort.
+ */
+ if ( dir->d_did != DIRDID_ROOT_PARENT)
+ dir_invalidate(vol, dir);
return( NULL );
}
cdir = extenddir( vol, dir, path );
}
} else {
- dir = cdir;
+ dir = cdir;
*path = '\0';
}
}
int bit = 0, isad = 1;
u_int32_t aint;
u_int16_t ashort;
-#ifdef FORCE_UIDGID
- uidgidset *uidgid;
- memset(&uidgid, 0, sizeof(uidgid));
-#endif /* FORCE_UIDGID */
memset(&ad, 0, sizeof(ad));
-#ifdef FORCE_UIDGID
- save_uidgid ( &uidgid );
- set_uidgid ( vol );
-#endif /* FORCE_UIDGID */
-
if ( ad_open( upath, ADFLAGS_HF|ADFLAGS_DIR, O_RDONLY,
DIRBITS | 0777, &ad) < 0 ) {
isad = 0;
ashort = htons(ATTRBIT_INVISIBLE);
} else
ashort = 0;
+ ashort |= htons(ATTRBIT_SHARED);
memcpy( data, &ashort, sizeof( ashort ));
data += sizeof( ashort );
break;
break;
case DIRPBIT_ACCESS :
- utommode( st, &ma );
-#ifndef SENDFILE_FLAVOR_LINUX /* ignore this section if it's linux */
-#ifdef HAVE_ACCESS
- accessmode( upath, &ma, dir );
-#endif /* HAVE_ACCESS */
-#endif /* SENDFILE_FLAVOR_LINUX */
-#ifdef AFS /* If only AFS defined, access() works only for AFS filesystems */
- afsmode( upath, &ma, dir );
-#endif /* AFS */
+ accessmode( upath, &ma, dir , st);
+
*data++ = ma.ma_user;
*data++ = ma.ma_world;
*data++ = ma.ma_group;
if ( isad ) {
ad_close( &ad, ADFLAGS_HF );
}
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFPERR_BITMAP );
}
bitmap = bitmap>>1;
memcpy( &did, ibuf, sizeof( did ));
ibuf += sizeof( int );
- if (( dir = dirsearch( vol, did )) == NULL ) {
+ if (( dir = dirlookup( vol, did )) == NULL ) {
return( AFPERR_NOOBJ );
}
return( AFPERR_NOOBJ );
}
+ if ( *path != '\0' ) {
+ return( AFPERR_BADTYPE ); /* not a directory */
+ }
+
/*
* If ibuf is odd, make it even.
*/
return( rc );
}
-int setdirparams(const struct vol *vol,
+/*
+ * cf AFP3.0.pdf page 244 for change_mdate and change_parent_mdate logic
+ *
+ * assume path == '\0' eg. it's a directory in canonical form
+*/
+int setdirparams(const struct vol *vol,
char *path, u_int16_t bitmap, char *buf )
{
struct maccess ma;
struct adouble ad;
struct utimbuf ut;
+ struct timeval tv;
+
char *upath;
int bit = 0, aint, isad = 1;
u_int16_t ashort, bshort;
int err = AFP_OK;
-#ifdef FORCE_UIDGID
- uidgidset *uidgid;
-
- memset(&uidgid, 0, sizeof(uidgid));
-#endif /* FORCE_UIDGID */
+ int change_mdate = 0;
+ int change_parent_mdate = 0;
+ int newdate = 0;
upath = mtoupath(vol, path);
memset(&ad, 0, sizeof(ad));
-#ifdef FORCE_UIDGID
- save_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
+
if (ad_open( upath, vol_noadouble(vol)|ADFLAGS_HF|ADFLAGS_DIR,
O_RDWR|O_CREAT, 0666, &ad) < 0) {
/*
if (!vol_noadouble(vol) && (bitmap &
~((1<<DIRPBIT_ACCESS)|(1<<DIRPBIT_UID)|(1<<DIRPBIT_GID)|
(1<<DIRPBIT_MDATE)|(1<<DIRPBIT_PDINFO)))) {
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return AFPERR_ACCESS;
}
switch( bit ) {
case DIRPBIT_ATTR :
+ change_mdate = 1;
if (isad) {
memcpy( &ashort, buf, sizeof( ashort ));
ad_getattr(&ad, &bshort);
bshort &= ~ashort;
}
ad_setattr(&ad, bshort);
+ if ((ashort & htons(ATTRBIT_INVISIBLE)))
+ change_parent_mdate = 1;
}
buf += sizeof( ashort );
break;
case DIRPBIT_CDATE :
+ change_mdate = 1;
if (isad) {
memcpy(&aint, buf, sizeof(aint));
ad_setdate(&ad, AD_DATE_CREATE, aint);
break;
case DIRPBIT_MDATE :
- memcpy(&aint, buf, sizeof(aint));
- if (isad)
- ad_setdate(&ad, AD_DATE_MODIFY, aint);
- ut.actime = ut.modtime = AD_DATE_TO_UNIX(aint);
- utime(upath, &ut);
- buf += sizeof( aint );
+ memcpy(&newdate, buf, sizeof(newdate));
+ buf += sizeof( newdate );
break;
case DIRPBIT_BDATE :
+ change_mdate = 1;
if (isad) {
memcpy(&aint, buf, sizeof(aint));
ad_setdate(&ad, AD_DATE_BACKUP, aint);
break;
case DIRPBIT_FINFO :
+ change_mdate = 1;
/*
* Alright, we admit it, this is *really* sick!
* The 4 bytes that we don't copy, when we're dealing
break;
case DIRPBIT_UID : /* What kind of loser mounts as root? */
+ change_parent_mdate = 1;
memcpy( &aint, buf, sizeof(aint));
buf += sizeof( aint );
if ( (curdir->d_did == DIRDID_ROOT) &&
goto setdirparam_done;
break;
default :
- LOG(log_error, logtype_default, "setdirparam: setdeskowner: %s",
+ LOG(log_error, logtype_afpd, "setdirparam: setdeskowner: %s",
strerror(errno) );
if (!isad) {
err = AFPERR_PARAM;
goto setdirparam_done;
break;
default :
- LOG(log_error, logtype_default, "setdirparam: setdirowner: %s",
+ LOG(log_error, logtype_afpd, "setdirparam: setdirowner: %s",
strerror(errno) );
break;
}
}
break;
case DIRPBIT_GID :
+ change_parent_mdate = 1;
memcpy( &aint, buf, sizeof( aint ));
buf += sizeof( aint );
if (curdir->d_did == DIRDID_ROOT)
goto setdirparam_done;
break;
default :
- LOG(log_error, logtype_default, "setdirparam: setdeskowner: %m" );
+ LOG(log_error, logtype_afpd, "setdirparam: setdeskowner: %m" );
if (!isad) {
err = AFPERR_PARAM;
goto setdirparam_done;
goto setdirparam_done;
break;
default :
- LOG(log_error, logtype_default, "setdirparam: setdirowner: %s",
+ LOG(log_error, logtype_afpd, "setdirparam: setdirowner: %s",
strerror(errno) );
break;
}
break;
case DIRPBIT_ACCESS :
+ change_mdate = 1;
+ change_parent_mdate = 1;
ma.ma_user = *buf++;
ma.ma_world = *buf++;
ma.ma_group = *buf++;
err = AFPERR_VLOCK;
goto setdirparam_done;
default :
- LOG(log_error, logtype_default, "setdirparam: setdeskmode: %s",
+ LOG(log_error, logtype_afpd, "setdirparam: setdeskmode: %s",
strerror(errno) );
break;
err = AFPERR_PARAM;
goto setdirparam_done;
}
- }
#endif /* 0 */
- if ( setdirmode( mtoumode( &ma ), vol_noadouble(vol),
+ if ( setdirmode( mtoumode( &ma ), vol_noadouble(vol),
(vol->v_flags & AFPVOL_DROPBOX)) < 0 ) {
- switch ( errno ) {
- case EPERM :
- case EACCES :
- err = AFPERR_ACCESS;
- goto setdirparam_done;
- case EROFS :
- err = AFPERR_VLOCK;
- goto setdirparam_done;
- default :
- LOG(log_error, logtype_default, "setdirparam: setdirmode: %s",
- strerror(errno) );
- err = AFPERR_PARAM;
- goto setdirparam_done;
+ switch ( errno ) {
+ case EPERM :
+ case EACCES :
+ err = AFPERR_ACCESS;
+ goto setdirparam_done;
+ case EROFS :
+ err = AFPERR_VLOCK;
+ goto setdirparam_done;
+ default :
+ LOG(log_error, logtype_afpd, "setdirparam: setdirmode: %s",
+ strerror(errno) );
+ err = AFPERR_PARAM;
+ goto setdirparam_done;
+ }
}
- }
- break;
+ break;
/* Ignore what the client thinks we should do to the
ProDOS information block. Skip over the data and
report nothing amiss. <shirsch@ibm.net> */
- case DIRPBIT_PDINFO :
- buf += 6;
- break;
+ case DIRPBIT_PDINFO :
+ buf += 6;
+ break;
- default :
- err = AFPERR_BITMAP;
- goto setdirparam_done;
- break;
+ default :
+ err = AFPERR_BITMAP;
+ goto setdirparam_done;
+ break;
+ }
+
+ bitmap = bitmap>>1;
+ bit++;
}
- bitmap = bitmap>>1;
- bit++;
-}
+setdirparam_done:
+ if (change_mdate && newdate == 0 && gettimeofday(&tv, NULL) == 0) {
+ newdate = AD_DATE_FROM_UNIX(tv.tv_sec);
+ }
+ if (newdate) {
+ if (isad)
+ ad_setdate(&ad, AD_DATE_MODIFY, newdate);
+ ut.actime = ut.modtime = AD_DATE_TO_UNIX(newdate);
+ utime(upath, &ut);
+ }
+ if ( isad ) {
+ ad_flush( &ad, ADFLAGS_HF );
+ ad_close( &ad, ADFLAGS_HF );
+ }
-setdirparam_done:
-if ( isad ) {
- ad_flush( &ad, ADFLAGS_HF );
- ad_close( &ad, ADFLAGS_HF );
-}
+ if (change_parent_mdate && curdir->d_did != DIRDID_ROOT
+ && gettimeofday(&tv, NULL) == 0) {
+ if (!movecwd(vol, curdir->d_parent)) {
+ newdate = AD_DATE_FROM_UNIX(tv.tv_sec);
+ bitmap = 1<<DIRPBIT_MDATE;
+ setdirparams(vol, "", bitmap, (char *)&newdate);
+ /* should we reset curdir ?*/
+ }
+ }
-#ifdef FORCE_UIDGID
-restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
-return err;
+ return err;
}
int afp_createdir(obj, ibuf, ibuflen, rbuf, rbuflen )
char *path, *upath;
u_int32_t did;
u_int16_t vid;
-#ifdef FORCE_UIDGID
- uidgidset *uidgid;
-
- memset(&uidgid, 0, sizeof(uidgid));
-#endif /* FORCE_UIDGID */
*rbuflen = 0;
ibuf += 2;
memcpy( &did, ibuf, sizeof( did ));
ibuf += sizeof( did );
- if (( dir = dirsearch( vol, did )) == NULL ) {
+ if (( dir = dirlookup( vol, did )) == NULL ) {
return( AFPERR_NOOBJ );
}
switch( errno ) {
case EACCES:
return( AFPERR_ACCESS );
- case EEXIST:
+ case EEXIST: /* FIXME this on is impossible? */
return( AFPERR_EXIST );
default:
return( AFPERR_NOOBJ );
}
}
-
+ /* FIXME check done elswhere? cname was able to move curdir to it! */
+ if (*path == '\0')
+ return AFPERR_EXIST;
upath = mtoupath(vol, path);
-
- /* check for illegal bits in the unix filename */
- if (!wincheck(vol, upath))
- return AFPERR_PARAM;
-
- if ((vol->v_flags & AFPVOL_NOHEX) && strchr(upath, '/'))
- return AFPERR_PARAM;
-
- if (!validupath(vol, upath))
- return AFPERR_EXIST;
-
- /* check for vetoed filenames */
- if (veto_file(vol->v_veto, upath))
- return AFPERR_EXIST;
-
-#ifdef FORCE_UIDGID
- save_uidgid ( &uidgid );
- set_uidgid ( vol );
-#endif /* FORCE_UIDGID */
+ {
+ int ret;
+ if (0 != (ret = check_name(vol, upath))) {
+ return ret;
+ }
+ }
if ( ad_mkdir( upath, DIRBITS | 0777 ) < 0 ) {
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
switch ( errno ) {
case ENOENT :
return( AFPERR_NOOBJ );
}
if (stat(upath, &st) < 0) {
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return AFPERR_MISC;
}
if ((dir = adddir( vol, curdir, path, strlen( path ), upath,
strlen(upath), &st)) == NULL) {
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return AFPERR_MISC;
}
if ( movecwd( vol, dir ) < 0 ) {
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFPERR_PARAM );
}
O_RDWR|O_CREAT, 0666, &ad ) < 0) {
if (vol_noadouble(vol))
goto createdir_done;
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFPERR_ACCESS );
}
memcpy( rbuf, &dir->d_did, sizeof( u_int32_t ));
*rbuflen = sizeof( u_int32_t );
setvoltime(obj, vol );
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFP_OK );
}
renamedir_done:
if ((buf = (char *) realloc( dir->d_name, len + 1 )) == NULL ) {
- LOG(log_error, logtype_default, "renamedir: realloc: %s", strerror(errno) );
+ LOG(log_error, logtype_afpd, "renamedir: realloc: %s", strerror(errno) );
return AFPERR_MISC;
}
dir->d_name = buf;
struct stat st;
struct dir *fdir;
DIR *dp;
-#ifdef FORCE_UIDGID
- uidgidset *uidgid;
-
- memset(&uidgid, 0, sizeof(uidgid));
-#endif /* FORCE_UIDGID */
+ struct adouble ad;
+ u_int16_t ashort;
if ( curdir->d_parent == NULL ) {
return( AFPERR_ACCESS );
fdir = curdir;
-#ifdef FORCE_UIDGID
- save_uidgid ( &uidgid );
- set_uidgid ( vol );
-#endif /* FORCE_UIDGID */
+ memset(&ad, 0, sizeof(ad));
+ if ( ad_open( ".", ADFLAGS_HF|ADFLAGS_DIR, O_RDONLY,
+ DIRBITS | 0777, &ad) == 0 ) {
+
+ ad_getattr(&ad, &ashort);
+ ad_close( &ad, ADFLAGS_HF );
+ if ((ashort & htons(ATTRBIT_NODELETE))) {
+ return AFPERR_OLOCK;
+ }
+ }
/* delete stray .AppleDouble files. this happens to get .Parent files
as well. */
* note: this will not fail with dangling symlinks */
if (stat(de->d_name, &st) == 0) {
closedir(dp);
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return AFPERR_DIRNEMPT;
}
switch (errno) {
case EPERM:
case EACCES :
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFPERR_ACCESS );
case EROFS:
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return AFPERR_VLOCK;
case ENOENT :
continue;
default :
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFPERR_PARAM );
}
}
case ENOENT :
break;
case ENOTEMPTY :
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFPERR_DIRNEMPT );
case EROFS:
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return AFPERR_VLOCK;
case EPERM:
case EACCES :
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFPERR_ACCESS );
default :
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFPERR_PARAM );
}
}
/* bail if it's not a symlink */
if ((lstat(de->d_name, &st) == 0) && !S_ISLNK(st.st_mode)) {
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return AFPERR_DIRNEMPT;
}
switch (errno) {
case EPERM:
case EACCES :
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFPERR_ACCESS );
case EROFS:
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return AFPERR_VLOCK;
case ENOENT :
continue;
default :
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFPERR_PARAM );
}
}
}
if ( movecwd( vol, curdir->d_parent ) < 0 ) {
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFPERR_NOOBJ );
}
if ( rmdir(mtoupath(vol, fdir->d_name)) < 0 ) {
switch ( errno ) {
case ENOENT :
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFPERR_NOOBJ );
case ENOTEMPTY :
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFPERR_DIRNEMPT );
case EPERM:
case EACCES :
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFPERR_ACCESS );
case EROFS:
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return AFPERR_VLOCK;
default :
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFPERR_PARAM );
}
}
#endif /* CNID_DB */
dir_remove( vol, fdir );
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return( AFP_OK );
}
memcpy( &did, ibuf, sizeof( did ));
ibuf += sizeof( did );
- if (( dir = dirsearch( vol, did )) == NULL ) {
+ if (( dir = dirlookup( vol, did )) == NULL ) {
return( AFPERR_PARAM );
}
char *path, *upath;
u_int32_t did;
u_int16_t vid;
-#ifdef FORCE_UIDGID
- uidgidset *uidgid;
-
- memset(&uidgid, 0, sizeof(uidgid));
-#endif /* FORCE_UIDGID */
*rbuflen = 0;
ibuf += 2;
memcpy(&did, ibuf, sizeof(did));
ibuf += sizeof(did);
- if (( parentdir = dirsearch( vol, did )) == NULL ) {
+ if (( parentdir = dirlookup( vol, did )) == NULL ) {
return( AFPERR_NOOBJ );
}
dir = (dir == parentdir->d_child->d_prev) ? NULL : dir->d_next;
}
-#ifdef FORCE_UIDGID
- save_uidgid ( &uidgid );
- set_uidgid ( vol );
-#endif /* FORCE_UIDGID */
-
/* we don't already have a did. add one in. */
if ((dir = adddir(vol, parentdir, path, strlen(path),
upath, strlen(upath), &st)) == NULL) {
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return AFPERR_MISC;
}
memcpy(rbuf, &dir->d_did, sizeof(dir->d_did));
*rbuflen = sizeof(dir->d_did);
-#ifdef FORCE_UIDGID
- restore_uidgid ( &uidgid );
-#endif /* FORCE_UIDGID */
return AFP_OK;
}