]> arthur.barton.de Git - netatalk.git/blobdiff - etc/cnid_dbd/cmd_dbd_scanvol.c
New dbd cleanup option -c
[netatalk.git] / etc / cnid_dbd / cmd_dbd_scanvol.c
index 226f22778c8efe00a4871adb027eef91a9f1b441..d94c2224eeb03eae38a4df1f8d0f6f0afd0e3c3c 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  $Id: cmd_dbd_scanvol.c,v 1.17 2009-12-21 14:41:00 franklahm Exp $
+  $Id: cmd_dbd_scanvol.c,v 1.21 2010-04-11 07:01:23 franklahm Exp $
 
   Copyright (c) 2009 Frank Lahm <franklahm@gmail.com>
 
@@ -155,7 +155,7 @@ static char *mtoupath(char *mpath)
     return( upath );
 }
 
-
+#if 0
 /* 
    Check if "name" is pointing to
    a) an object inside the current volume (return 0)
@@ -163,7 +163,6 @@ static char *mtoupath(char *mpath)
    Then stats the pointed to object and if it is a dir ors ADFLAGS_DIR to *adflags
    Return -1 on any serious error.
  */
-
 static int check_symlink(const char *name, int *adflags)
 {
     int cwd;
@@ -233,7 +232,7 @@ static int check_symlink(const char *name, int *adflags)
     dbd_log( LOGDEBUG, "intra-share symlink '%s/%s', not following", cwdbuf, name);
     return 0;
 }
-
+#endif
 
 /*
   Check for wrong encoding e.g. "." at the beginning is not CAP encoded (:2e) although volume is default !AFPVOL_USEDOTS.
@@ -281,6 +280,9 @@ static int check_adfile(const char *fname, const struct stat *st)
     struct adouble ad;
     char *adname;
 
+    if (dbd_flags & DBD_FLAGS_CLEANUP)
+        return 0;
+
     if (S_ISREG(st->st_mode))
         adflags = 0;
     else
@@ -389,8 +391,7 @@ static int check_eafiles(const char *fname)
     if ((ret = ea_open(&volume, fname, EA_RDWR, &ea)) != 0) {
         if (errno == ENOENT)
             return 0;
-        dbd_log(LOGSTD, "Error calling ea_open for file: %s/%s, removing EA files",
-                cwdbuf, fname);
+        dbd_log(LOGSTD, "Error calling ea_open for file: %s/%s, removing EA files", cwdbuf, fname);
         if ( ! (dbd_flags & DBD_FLAGS_SCAN))
             remove_eafiles(fname, &ea);
         return -1;
@@ -440,6 +441,9 @@ static int check_addir(int volroot)
     struct adouble ad;
     char *mname = NULL;
 
+    if (dbd_flags & DBD_FLAGS_CLEANUP)
+        return 0;
+
     /* Check for ad-dir */
     if ( (addir_ok = access(ADv2_DIRNAME, F_OK)) != 0) {
         if (errno != ENOENT) {
@@ -658,6 +662,10 @@ static cnid_t check_cnid(const char *name, cnid_t did, struct stat *st, int adfi
     if ( (volinfo->v_flags & AFPVOL_CACHE) && ADFILE_OK) {
         ad_init(&ad, volinfo->v_adouble, volinfo->v_ad_options);
         if (ad_open_metadata( name, adflags, O_RDWR, &ad) != 0) {
+            
+            if (dbd_flags & DBD_FLAGS_CLEANUP)
+                return 0;
+
             dbd_log( LOGSTD, "Error opening AppleDouble file for '%s/%s': %s", cwdbuf, name, strerror(errno));
             return 0;
         }
@@ -673,6 +681,8 @@ static cnid_t check_cnid(const char *name, cnid_t did, struct stat *st, int adfi
 
         if (ad_cnid == 0)
             dbd_log( LOGSTD, "Incorrect CNID data in .AppleDouble data for '%s/%s' (bad stamp?)", cwdbuf, name);
+        else
+            dbd_log( LOGDEBUG, "CNID from .AppleDouble file for '%s/%s': %u", cwdbuf, name, ntohl(ad_cnid));
 
         ad_close_metadata(&ad);
     }
@@ -778,7 +788,7 @@ static cnid_t check_cnid(const char *name, cnid_t did, struct stat *st, int adfi
 static int dbd_readdir(int volroot, cnid_t did)
 {
     int cwd, ret = 0, adflags, adfile_ok, addir_ok, encoding_ok;
-    cnid_t cnid;
+    cnid_t cnid = 0;
     const char *name;
     DIR *dp;
     struct dirent *ep;
@@ -835,12 +845,14 @@ static int dbd_readdir(int volroot, cnid_t did)
             adflags = ADFLAGS_DIR;
             break;
         case S_IFLNK:
-            dbd_log(LOGDEBUG, "Checking symlink %s/%s", cwdbuf, ep->d_name);
+            dbd_log(LOGDEBUG, "Ignoring symlink %s/%s", cwdbuf, ep->d_name);
+#if 0
             ret = check_symlink(ep->d_name, &adflags);
             if (ret == 1)
                 break;
             if (ret == -1)
                 dbd_log(LOGSTD, "Error checking symlink %s/%s", cwdbuf, ep->d_name);
+#endif
             continue;
         default:
             dbd_log(LOGSTD, "Bad filetype: %s/%s", cwdbuf, ep->d_name);