]> arthur.barton.de Git - netatalk.git/commitdiff
add nodev volume option (always use 0 for device number).
authordidg <didg>
Sat, 3 Jan 2004 22:21:08 +0000 (22:21 +0000)
committerdidg <didg>
Sat, 3 Jan 2004 22:21:08 +0000 (22:21 +0000)
etc/afpd/directory.c
etc/afpd/file.c
etc/afpd/volume.c
etc/afpd/volume.h
include/atalk/adouble.h
include/atalk/cnid.h
libatalk/adouble/ad_attr.c
libatalk/cnid/cnid.c
libatalk/cnid/dbd/cnid_dbd.c

index d92345dbac283d26f380920861643964f4101137..cbdfcd844ca12a7f747b3904b52be208075cef7c 100644 (file)
@@ -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 );
 
index 42bc242ffb87eeb604916287ec1da0e76003ba0e..68afe4ef577a020c257c473777a9d8f4ba865e86 100644 (file)
@@ -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    
index 86248a75a57b0ed2e0b0c97f9a0dfeb01e8f60b9..c2cc051bd3f8e0c92ceb668dae2c8ca6fc9ba6cf 100644 (file)
@@ -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);
index b1270aa0df1e209892fd7df5f01860139d8e4823..e82d535277966883b702435ab6c3c6736eccb5ea 100644 (file)
@@ -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));
index 5bf88f889f0ca15d5b431326013f4e5e862a1f01..320714bbc75704726c014837c5ed5e8c81279a27 100644 (file)
@@ -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
index 490d09977c8214a4ae6a103bdfca26e296cb085e..93b086d9351d0c9c4fe4c794603cbeb9de2c46f3 100644 (file)
@@ -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 <rlewczuk@pronet.pl>
@@ -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.
  *
index 725286cf8e572ff08d8c50afaab810b11e8b6f33..77c734927c760d0051218ccea43c0aa8521b06f1 100644 (file)
@@ -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));
index 1962b8ef588411324da8d2ef2f8bd2a7a4f96846..c97b625de1020bb19d5eb97e119dee8eab1163b2 100644 (file)
@@ -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 <rlewczuk@pronet.pl>
@@ -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);
index 129a7b83fc16e2086ece7804ba8656a5997a7132..136497e08b41dac6dda3ce9943d775da09132a3a 100644 (file)
@@ -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;
 }