/*
- * $Id: directory.c,v 1.71.2.4.2.5 2003-11-15 00:00:30 bfernhomberg Exp $
+ * $Id: directory.c,v 1.71.2.4.2.6 2004-01-03 22:21:08 didg Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
if ( isad ) {
if (path->st_valid && !path->st_errno) {
- ad_setid(&ad, &path->st, curdir->d_did, vol->v_stamp);
+ struct stat *st = &path->st;
+
+ ad_setid(&ad,(vol->v_flags & AFPVOL_NODEV)?0:st->st_dev,
+ st->st_ino, curdir->d_did, vol->v_stamp);
}
ad_flush( &ad, ADFLAGS_HF );
ad_setentrylen( &ad, ADEID_NAME, strlen( s_path->m_name ));
memcpy( ad_entry( &ad, ADEID_NAME ), s_path->m_name,
ad_getentrylen( &ad, ADEID_NAME ));
- ad_setid( &ad, &s_path->st, dir->d_did, vol->v_stamp);
+
+ ad_setid( &ad, (vol->v_flags & AFPVOL_NODEV)?0:s_path->st.st_dev,
+ s_path->st.st_ino, dir->d_did, vol->v_stamp);
+
ad_flush( &ad, ADFLAGS_HF );
ad_close( &ad, ADFLAGS_HF );
/*
- * $Id: file.c,v 1.92.2.2.2.8 2004-01-02 18:14:52 didg Exp $
+ * $Id: file.c,v 1.92.2.2.2.9 2004-01-03 22:21:08 didg Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
if (sizeof(stamp) == ad_getentrylen(adp,ADEID_PRIVSYN)) {
memcpy(stamp, ad_entry(adp, ADEID_PRIVSYN), sizeof(stamp));
- if (dev == st->st_dev && ino == st->st_ino && !memcmp(vol->v_stamp, stamp, sizeof(stamp))) {
+ if ( ((vol->v_flags & AFPVOL_NODEV) || dev == st->st_dev)
+ && ino == st->st_ino &&
+ !memcmp(vol->v_stamp, stamp, sizeof(stamp)) )
+ {
memcpy(&aint, ad_entry(adp, ADEID_DID), sizeof(aint));
return aint;
}
/* update the ressource fork
* for a folder adp is always null
*/
- ad_setid(adp, st, aint, vol->v_stamp);
+ ad_setid(adp,(vol->v_flags & AFPVOL_NODEV)?0:st->st_dev, st->st_ino, aint, vol->v_stamp);
ad_flush(adp, ADFLAGS_HF);
}
#endif
/*
- * $Id: volume.c,v 1.51.2.7.2.14 2003-12-17 17:19:20 lenneis Exp $
+ * $Id: volume.c,v 1.51.2.7.2.15 2004-01-03 22:21:09 didg Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
options[VOLOPT_ROOTPREEXEC].i_value = 1;
else if (strcasecmp(p, "upriv") == 0)
options[VOLOPT_FLAGS].i_value |= AFPVOL_UNIX_PRIV;
+ else if (strcasecmp(p, "nodev") == 0)
+ options[VOLOPT_FLAGS].i_value |= AFPVOL_NODEV;
p = strtok(NULL, ",");
}
*rbuflen = 0;
return( AFPERR_PARAM );
}
+ /* save the volume device number */
+ vol->v_dev = st.st_dev;
buflen = *rbuflen - sizeof( bitmap );
- if (( ret = getvolparams(bitmap, vol, &st,
+ if (( ret = getvolparams( bitmap, vol, &st,
rbuf + sizeof( bitmap ), &buflen )) != AFP_OK ) {
*rbuflen = 0;
return( ret );
volume->v_path);
}
if (volume->v_dbpath)
- volume->v_cdb = cnid_open (volume->v_dbpath, volume->v_umask, volume->v_cnidscheme);
+ volume->v_cdb = cnid_open (volume->v_dbpath, volume->v_umask, volume->v_cnidscheme, (volume->v_flags & AFPVOL_NODEV));
else
- volume->v_cdb = cnid_open (volume->v_path, volume->v_umask, volume->v_cnidscheme);
+ volume->v_cdb = cnid_open (volume->v_path, volume->v_umask, volume->v_cnidscheme, (volume->v_flags & AFPVOL_NODEV));
if (volume->v_cdb == NULL) {
LOG(log_error, logtype_afpd, "Fatal error: cannot open CNID or invalid CNID backend for %s: %s",
volume->v_path, volume->v_cnidscheme);
/*
- * $Id: volume.h,v 1.19.2.5.2.4 2003-11-15 00:00:37 bfernhomberg Exp $
+ * $Id: volume.h,v 1.19.2.5.2.5 2004-01-03 22:21:09 didg Exp $
*
* Copyright (c) 1990,1994 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
char *v_cnidscheme;
char *v_dbpath;
+ dev_t v_dev; /* Unix volume device */
struct _cnid_db *v_cdb;
char v_stamp[ADEDLEN_PRIVSYN];
mode_t v_umask;
#define AFPVOL_MAPASCII (1 << 13) /* map the ascii range as well */
#define AFPVOL_DROPBOX (1 << 14) /* dropkludge dropbox support */
#define AFPVOL_NOFILEID (1 << 15) /* don't advertise createid resolveid and deleteid calls */
-#define AFPVOL_NOSTAT (1 << 16) /* unix name are in UTF8 */
+#define AFPVOL_NOSTAT (1 << 16) /* advertise the volume even if we can't stat() it
+ * maybe because it will be mounted later in preexec */
#define AFPVOL_UNIX_PRIV (1 << 17) /* support unix privileges */
+#define AFPVOL_NODEV (1 << 18) /* always use 0 for device number in cnid calls
+ * help if device number is notconsistent across reboot
+ * NOTE symlink to a different device will return an ACCESS error
+ */
/* FPGetSrvrParms options */
#define AFPSRVR_CONFIGINFO (1 << 0)
#else
#define utf8_encoding() (0)
#endif
+
+#define vol_nodev(vol) (((vol)->v_flags & AFPVOL_NODEV) ? 1 : 0)
+
#define vol_unix_priv(vol) (afp_version >= 30 && ((vol)->v_flags & AFPVOL_UNIX_PRIV))
extern struct vol *getvolbyvid __P((const u_int16_t));
/*
- * $Id: adouble.h,v 1.21.6.3 2003-11-25 05:05:43 didg Exp $
+ * $Id: adouble.h,v 1.21.6.4 2004-01-03 22:21:09 didg Exp $
* Copyright (c) 1990,1991 Regents of The University of Michigan.
* All Rights Reserved.
*
extern int ad_getattr __P((const struct adouble *, u_int16_t *));
#if AD_VERSION == AD_VERSION2
-extern int ad_setid __P((struct adouble *, const struct stat *, const u_int32_t, const void *));
+extern int ad_setid __P((struct adouble *, const dev_t dev,const ino_t ino, const u_int32_t, const void *));
#else
-#define ad_setid(a, b, c, d)
+#define ad_setid(a, b, c)
#endif
#ifdef WITH_SENDFILE
/*
- * $Id: cnid.h,v 1.9.6.1 2003-09-09 16:42:20 didg Exp $
+ * $Id: cnid.h,v 1.9.6.2 2004-01-03 22:21:09 didg Exp $
*
* Copyright (c) 2003 the Netatalk Team
* Copyright (c) 2003 Rafal Lewczuk <rlewczuk@pronet.pl>
#define CNID_FLAG_MANGLING 0x02 /* This backend has name mangling feature. */
#define CNID_FLAG_SETUID 0x04 /* Set db owner to parent folder owner. */
#define CNID_FLAG_BLOCK 0x08 /* block signals in update. */
+#define CNID_FLAG_NODEV 0x10 /* don't use device number only inode */
#define CNID_INVALID 0
u_int32_t flags; /* Flags describing some CNID backend aspects. */
char *volpath; /* Volume path this particular CNID db refers to. */
void *_private; /* back-end speficic data */
+#if 0
char *stamp[ADEDLEN_PRIVSYN];
-
+#endif
/* */
cnid_t (*cnid_add)(struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
const char *name, const int len, cnid_t hint);
void cnid_register(struct _cnid_module *module);
/* This function opens a CNID database for selected volume. */
-struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type);
+struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type, int flags);
cnid_t cnid_add(struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
const char *name, const int len, cnid_t hint);
/*
* $Log: cnid.h,v $
- * Revision 1.9.6.1 2003-09-09 16:42:20 didg
+ * Revision 1.9.6.2 2004-01-03 22:21:09 didg
+ *
+ * add nodev volume option (always use 0 for device number).
+ *
+ * Revision 1.9.6.1 2003/09/09 16:42:20 didg
*
* big merge for db frontend and unicode.
*
/*
- * $Id: ad_attr.c,v 1.4.8.1 2003-09-09 16:42:21 didg Exp $
+ * $Id: ad_attr.c,v 1.4.8.2 2004-01-03 22:21:09 didg Exp $
*/
#ifdef HAVE_CONFIG_H
* save file/folder ID in AppleDoubleV2 netatalk private parameters
*/
#if AD_VERSION == AD_VERSION2
-int ad_setid (struct adouble *adp, const struct stat *st, const u_int32_t id, const void *stamp)
+int ad_setid (struct adouble *adp, const dev_t dev, const ino_t ino , const u_int32_t id, const void *stamp)
{
if (adp->ad_flags == AD_VERSION2 && sizeof(dev_t) == ADEDLEN_PRIVDEV && sizeof(ino_t) == ADEDLEN_PRIVINO)
{
ad_setentrylen( adp, ADEID_PRIVDEV, sizeof(dev_t));
- memcpy(ad_entry( adp, ADEID_PRIVDEV ), &st->st_dev, sizeof(dev_t));
+ memcpy(ad_entry( adp, ADEID_PRIVDEV ), &dev, sizeof(dev_t));
ad_setentrylen( adp, ADEID_PRIVINO, sizeof(ino_t));
- memcpy(ad_entry( adp, ADEID_PRIVINO ), &st->st_ino, sizeof(ino_t));
+ memcpy(ad_entry( adp, ADEID_PRIVINO ), &ino, sizeof(ino_t));
ad_setentrylen( adp, ADEID_DID, sizeof(id));
memcpy(ad_entry( adp, ADEID_DID ), &id, sizeof(id));
/*
- * $Id: cnid.c,v 1.1.4.6 2003-11-12 16:00:08 didg Exp $
+ * $Id: cnid.c,v 1.1.4.7 2004-01-03 22:21:09 didg Exp $
*
* Copyright (c) 2003 the Netatalk Team
* Copyright (c) 2003 Rafal Lewczuk <rlewczuk@pronet.pl>
}
/* Opens CNID database using particular back-end */
-struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type)
+struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type, int flags)
{
struct _cnid_db *db;
cnid_module *mod = NULL;
LOG(log_error, logtype_afpd, "Cannot find module named [%s] in registered module list!", type);
return NULL;
}
+
if ((mod->flags & CNID_FLAG_SETUID)) {
uid = geteuid();
gid = getegid();
}
db = mod->cnid_open(volpath, mask);
+ /* FIXME should module know about it ? */
+ if (flags) {
+ db->flags |= CNID_FLAG_NODEV;
+ }
if ((mod->flags & CNID_FLAG_SETUID)) {
seteuid(0);
/*
- * $Id: cnid_dbd.c,v 1.1.4.8 2003-11-25 00:41:31 lenneis Exp $
+ * $Id: cnid_dbd.c,v 1.1.4.9 2004-01-03 22:21:09 didg Exp $
*
* Copyright (C) Joerg Lenneis 2003
* All Rights Reserved. See COPYRIGHT.
RQST_RESET(&rqst);
rqst.op = CNID_DBD_OP_ADD;
- rqst.dev = st->st_dev;
+
+ if (!(cdb->flags & CNID_FLAG_NODEV)) {
+ rqst.dev = st->st_dev;
+ }
+
rqst.ino = st->st_ino;
rqst.type = S_ISDIR(st->st_mode)?1:0;
rqst.did = did;
RQST_RESET(&rqst);
rqst.op = CNID_DBD_OP_LOOKUP;
- rqst.dev = st->st_dev;
+
+ if (!(cdb->flags & CNID_FLAG_NODEV)) {
+ rqst.dev = st->st_dev;
+ }
+
rqst.ino = st->st_ino;
rqst.type = S_ISDIR(st->st_mode)?1:0;
rqst.did = did;
RQST_RESET(&rqst);
rqst.op = CNID_DBD_OP_UPDATE;
rqst.cnid = id;
- rqst.dev = st->st_dev;
+ if (!(cdb->flags & CNID_FLAG_NODEV)) {
+ rqst.dev = st->st_dev;
+ }
rqst.ino = st->st_ino;
rqst.type = S_ISDIR(st->st_mode)?1:0;
rqst.did = did;
RQST_RESET(&rqst);
rqst.op = CNID_DBD_OP_GETSTAMP;
-
memset(buffer, 0, len);
rply.name = buffer;
default:
abort();
}
-
return 0;
}