From 3ba92f3ac4d809fc68f0fac21fc50dd8d672f2d3 Mon Sep 17 00:00:00 2001 From: didg Date: Sat, 3 Jan 2004 22:21:08 +0000 Subject: [PATCH] add nodev volume option (always use 0 for device number). --- etc/afpd/directory.c | 12 +++++++++--- etc/afpd/file.c | 9 ++++++--- etc/afpd/volume.c | 12 ++++++++---- etc/afpd/volume.h | 13 +++++++++++-- include/atalk/adouble.h | 6 +++--- include/atalk/cnid.h | 14 ++++++++++---- libatalk/adouble/ad_attr.c | 8 ++++---- libatalk/cnid/cnid.c | 9 +++++++-- libatalk/cnid/dbd/cnid_dbd.c | 20 ++++++++++++++------ 9 files changed, 72 insertions(+), 31 deletions(-) diff --git a/etc/afpd/directory.c b/etc/afpd/directory.c index d92345db..cbdfcd84 100644 --- a/etc/afpd/directory.c +++ b/etc/afpd/directory.c @@ -1,5 +1,5 @@ /* - * $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. @@ -1929,7 +1929,10 @@ setdirparam_done: 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 ); @@ -2024,7 +2027,10 @@ int ibuflen, *rbuflen; 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 ); diff --git a/etc/afpd/file.c b/etc/afpd/file.c index 42bc242f..68afe4ef 100644 --- a/etc/afpd/file.c +++ b/etc/afpd/file.c @@ -1,5 +1,5 @@ /* - * $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. @@ -192,7 +192,10 @@ char stamp[ADEDLEN_PRIVSYN]; 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; } @@ -224,7 +227,7 @@ char stamp[ADEDLEN_PRIVSYN]; /* 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 diff --git a/etc/afpd/volume.c b/etc/afpd/volume.c index 86248a75..c2cc051b 100644 --- a/etc/afpd/volume.c +++ b/etc/afpd/volume.c @@ -1,5 +1,5 @@ /* - * $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. @@ -447,6 +447,8 @@ static void volset(struct vol_option *options, struct vol_option *save, 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, ","); } @@ -1360,9 +1362,11 @@ int static stat_vol(u_int16_t bitmap, struct vol *vol, char *rbuf, int *rbuflen) *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 ); @@ -1646,9 +1650,9 @@ int ibuflen, *rbuflen; 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); diff --git a/etc/afpd/volume.h b/etc/afpd/volume.h index b1270aa0..e82d5352 100644 --- a/etc/afpd/volume.h +++ b/etc/afpd/volume.h @@ -1,5 +1,5 @@ /* - * $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. @@ -48,6 +48,7 @@ struct vol { 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; @@ -106,8 +107,13 @@ this is going away. */ #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) @@ -164,6 +170,9 @@ int wincheck(const struct vol *vol, const char *path); #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)); diff --git a/include/atalk/adouble.h b/include/atalk/adouble.h index 5bf88f88..320714bb 100644 --- a/include/atalk/adouble.h +++ b/include/atalk/adouble.h @@ -1,5 +1,5 @@ /* - * $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. * @@ -419,9 +419,9 @@ extern int ad_setattr __P((const struct adouble *, const u_int16_t)); 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 diff --git a/include/atalk/cnid.h b/include/atalk/cnid.h index 490d0997..93b086d9 100644 --- a/include/atalk/cnid.h +++ b/include/atalk/cnid.h @@ -1,5 +1,5 @@ /* - * $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 @@ -32,6 +32,7 @@ #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 @@ -49,8 +50,9 @@ struct _cnid_db { 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); @@ -84,7 +86,7 @@ typedef struct _cnid_module cnid_module; 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); @@ -110,7 +112,11 @@ void cnid_close(struct _cnid_db *db); /* * $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. * diff --git a/libatalk/adouble/ad_attr.c b/libatalk/adouble/ad_attr.c index 725286cf..77c73492 100644 --- a/libatalk/adouble/ad_attr.c +++ b/libatalk/adouble/ad_attr.c @@ -1,5 +1,5 @@ /* - * $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 @@ -48,15 +48,15 @@ int ad_setattr(const struct adouble *ad, const u_int16_t attr) * 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)); diff --git a/libatalk/cnid/cnid.c b/libatalk/cnid/cnid.c index 1962b8ef..c97b625d 100644 --- a/libatalk/cnid/cnid.c +++ b/libatalk/cnid/cnid.c @@ -1,5 +1,5 @@ /* - * $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 @@ -86,7 +86,7 @@ static int cnid_dir(const char *dir, mode_t mask) } /* 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; @@ -105,6 +105,7 @@ struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type) 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(); @@ -122,6 +123,10 @@ struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type) } 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); diff --git a/libatalk/cnid/dbd/cnid_dbd.c b/libatalk/cnid/dbd/cnid_dbd.c index 129a7b83..136497e0 100644 --- a/libatalk/cnid/dbd/cnid_dbd.c +++ b/libatalk/cnid/dbd/cnid_dbd.c @@ -1,5 +1,5 @@ /* - * $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. @@ -350,7 +350,11 @@ cnid_t cnid_dbd_add(struct _cnid_db *cdb, const struct stat *st, 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; @@ -510,7 +514,11 @@ cnid_t cnid_dbd_lookup(struct _cnid_db *cdb, const struct stat *st, const cnid_t 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; @@ -564,7 +572,9 @@ int cnid_dbd_update(struct _cnid_db *cdb, const cnid_t id, const struct stat *st 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; @@ -644,7 +654,6 @@ int cnid_dbd_getstamp(struct _cnid_db *cdb, void *buffer, const int len) RQST_RESET(&rqst); rqst.op = CNID_DBD_OP_GETSTAMP; - memset(buffer, 0, len); rply.name = buffer; @@ -665,7 +674,6 @@ int cnid_dbd_getstamp(struct _cnid_db *cdb, void *buffer, const int len) default: abort(); } - return 0; } -- 2.39.2