]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/adouble/ad_open.c
Merge 2-2
[netatalk.git] / libatalk / adouble / ad_open.c
index ae49b460869d41d265649461e86fdcdd3e995095..79016b5feac43e1d6fed2110e2d5e320610470e9 100644 (file)
@@ -118,7 +118,7 @@ static int ad_mkrf_osx(const char *path);
 static struct adouble_fops ad_adouble = {
     &ad_path,
     &ad_mkrf,
-    &ad_rebuild_adouble_header,
+    &ad_rebuild_adouble_header_v2,
     &ad_header_read,
     &ad_header_upgrade,
 };
@@ -131,19 +131,11 @@ static struct adouble_fops ad_adouble_ea = {
     &ad_path_osx,
     &ad_mkrf_osx,
 #endif
-    &ad_rebuild_adouble_header,
+    &ad_rebuild_adouble_header_ea,
     &ad_header_read_ea,
     &ad_header_upgrade_ea,
 };
 
-static struct adouble_fops ad_osx = {
-    &ad_path_osx,
-    &ad_mkrf_osx,
-    &ad_rebuild_adouble_header,
-    &ad_header_read,
-    &ad_header_upgrade,
-};
-
 static const struct entry entry_order2[ADEID_NUM_V2 + 1] = {
     {ADEID_NAME,        ADEDOFF_NAME_V2,     ADEDLEN_INIT},
     {ADEID_COMMENT,     ADEDOFF_COMMENT_V2,  ADEDLEN_INIT},
@@ -510,6 +502,44 @@ static int ad_header_read(const char *path _U_, struct adouble *ad, const struct
     return 0;
 }
 
+/* error here means it's not ad ._ adouble:osx file and thus we return 1 */
+int ad_valid_header_osx(const char *path)
+{
+    EC_INIT;
+    int fd = -1;
+    struct adouble      adosx;
+    char                *buf = &adosx.ad_data[0];
+    ssize_t             header_len;
+
+    LOG(log_debug, logtype_afpd, "ad_valid_header_osx(\"%s\"): BEGIN", fullpathname(path));
+
+    EC_NEG1( fd = open(path, O_RDONLY) );
+
+    /* read the header */
+    EC_NEG1( header_len = read(fd, buf, AD_DATASZ_OSX) );
+
+    if (header_len < AD_HEADER_LEN)
+        EC_FAIL;
+
+    memcpy(&adosx.ad_magic, buf, sizeof(adosx.ad_magic));
+    memcpy(&adosx.ad_version, buf + ADEDOFF_VERSION, sizeof(adosx.ad_version));
+    adosx.ad_magic = ntohl(adosx.ad_magic);
+    adosx.ad_version = ntohl(adosx.ad_version);
+
+    if ((adosx.ad_magic != AD_MAGIC) || (adosx.ad_version != AD_VERSION2)) {
+        LOG(log_error, logtype_afpd, "ad_valid_header_osx: not an adouble:ox file");
+        EC_FAIL;
+    }
+
+EC_CLEANUP:
+    LOG(log_debug, logtype_afpd, "ad_valid_header_osx(\"%s\"): END: %d", fullpathname(path), ret);
+    if (fd != -1)
+        close(fd);
+    if (ret != 0)
+        return 1;
+    return 0;
+}
+
 /* Read an ._ file, only uses the resofork, finderinfo is taken from EA */
 static int ad_header_read_osx(const char *path _U_, struct adouble *ad, const struct stat *hst)
 {
@@ -779,111 +809,6 @@ static int ad2openflags(const struct adouble *ad, int adfile, int adflags)
     return oflags;
 }
 
-static char emptyfilad[32] = {0,0,0,0,0,0,0,0,
-                              0,0,0,0,0,0,0,0,
-                              0,0,0,0,0,0,0,0,
-                              0,0,0,0,0,0,0,0};
-
-static char emptydirad[32] = {0,0,0,0,0,0,0,0,
-                              0,0,0,0,0,0,1,0,
-                              0,0,0,0,0,0,0,0,
-                              0,0,0,0,0,0,0,0};
-
-static int ad_conv_v22ea_hf(const char *path, const struct stat *sp, const struct vol *vol)
-{
-    EC_INIT;
-    struct adouble adv2;
-    struct adouble adea;
-    const char *adpath;
-    int adflags;
-    uint32_t ctime, mtime, afpinfo = 0;
-    char *emptyad;
-
-    LOG(log_debug, logtype_default,"ad_conv_v22ea_hf(\"%s\"): BEGIN", fullpathname(path));
-
-    ad_init(&adea, vol);
-    ad_init_old(&adv2, AD_VERSION2, adea.ad_options);
-    adflags = S_ISDIR(sp->st_mode) ? ADFLAGS_DIR : 0;
-
-    /* Open and lock adouble:v2 file */
-    EC_ZERO( ad_open(&adv2, path, adflags | ADFLAGS_HF | ADFLAGS_RDWR) );
-    EC_NEG1_LOG( ad_tmplock(&adv2, ADEID_RFORK, ADLOCK_WR | ADLOCK_FILELOCK, 0, 0, 0) );
-    EC_NEG1_LOG( adv2.ad_ops->ad_header_read(path, &adv2, sp) );
-
-    /* Check if it's a non-empty header */
-    if (S_ISREG(sp->st_mode))
-        emptyad = &emptyfilad[0];
-    else
-        emptyad = &emptydirad[0];
-
-    if (ad_getentrylen(&adv2, ADEID_COMMENT) != 0)
-        goto copy;
-    if (ad_getentryoff(&adv2, ADEID_FINDERI)
-        && (ad_getentrylen(&adv2, ADEID_FINDERI) == ADEDLEN_FINDERI)
-        && (memcmp(ad_entry(&adv2, ADEID_FINDERI), emptyad, ADEDLEN_FINDERI) != 0))
-        goto copy;
-    if (ad_getentryoff(&adv2, ADEID_FILEDATESI)) {
-        EC_ZERO_LOG( ad_getdate(&adv2, AD_DATE_CREATE | AD_DATE_UNIX, &ctime) );
-        EC_ZERO_LOG( ad_getdate(&adv2, AD_DATE_MODIFY | AD_DATE_UNIX, &mtime) );
-        if ((ctime != mtime) || (mtime != sp->st_mtime))
-            goto copy;
-    }
-    if (ad_getentryoff(&adv2, ADEID_AFPFILEI)) {
-        if (memcmp(ad_entry(&adv2, ADEID_AFPFILEI), &afpinfo, ADEDLEN_AFPFILEI) != 0)
-            goto copy;
-    }
-
-    LOG(log_debug, logtype_default,"ad_conv_v22ea_hf(\"%s\"): default adouble", fullpathname(path), ret);
-    goto EC_CLEANUP;
-
-copy:
-    /* Create a adouble:ea meta EA */
-    LOG(log_debug, logtype_default,"ad_conv_v22ea_hf(\"%s\"): copying adouble", fullpathname(path), ret);
-    EC_ZERO_LOG( ad_open(&adea, path, adflags | ADFLAGS_HF | ADFLAGS_RDWR | ADFLAGS_CREATE) );
-    EC_ZERO_LOG( ad_copy_header(&adea, &adv2) );
-    ad_flush(&adea);
-
-EC_CLEANUP:
-    EC_ZERO_LOG( ad_close(&adv2, ADFLAGS_HF | ADFLAGS_SETSHRMD) );
-    EC_ZERO_LOG( ad_close(&adea, ADFLAGS_HF | ADFLAGS_SETSHRMD) );
-    LOG(log_debug, logtype_default,"ad_conv_v22ea_hf(\"%s\"): END: %d", fullpathname(path), ret);
-    EC_EXIT;
-}
-
-static int ad_conv_v22ea_rf(const char *path, const struct stat *sp, const struct vol *vol)
-{
-    EC_INIT;
-    struct adouble adv2;
-    struct adouble adea;
-
-    LOG(log_debug, logtype_default,"ad_conv_v22ea_rf(\"%s\"): BEGIN", fullpathname(path));
-
-    if (S_ISDIR(sp->st_mode))
-        return 0;
-
-    ad_init(&adea, vol);
-    ad_init_old(&adv2, AD_VERSION2, adea.ad_options);
-
-    /* Open and lock adouble:v2 file */
-    EC_ZERO( ad_open(&adv2, path, ADFLAGS_HF | ADFLAGS_RF | ADFLAGS_RDWR) );
-    if (adv2.ad_rlen > 0) {
-        EC_NEG1_LOG( ad_tmplock(&adv2, ADEID_RFORK, ADLOCK_WR | ADLOCK_FILELOCK, 0, 0, 0) );
-
-        /* Create a adouble:ea resource fork */
-        EC_ZERO_LOG( ad_open(&adea, path, ADFLAGS_HF | ADFLAGS_RF | ADFLAGS_RDWR | ADFLAGS_CREATE, 0666) );
-
-        EC_ZERO_LOG( copy_fork(ADEID_RFORK, &adea, &adv2) );
-        adea.ad_rlen = adv2.ad_rlen;
-        ad_flush(&adea);
-    }
-
-EC_CLEANUP:
-    EC_ZERO_LOG( ad_close(&adv2, ADFLAGS_HF | ADFLAGS_RF) );
-    EC_ZERO_LOG( ad_close(&adea, ADFLAGS_HF | ADFLAGS_RF) );
-    LOG(log_debug, logtype_default,"ad_conv_v22ea_rf(\"%s\"): END: %d", fullpathname(path), ret);
-    EC_EXIT;
-}
-
 static int ad_open_df(const char *path, int adflags, mode_t mode, struct adouble *ad)
 {
     EC_INIT;
@@ -1168,7 +1093,8 @@ static int ad_open_hf_ea(const char *path, int adflags, int mode, struct adouble
         LOG(log_debug, logtype_default, "ad_open_hf_ea(\"%s\"): created metadata EA", path);
     }
 
-    ad->ad_mdp->adf_refcount++;
+    if (ad_meta_fileno(ad) != -1)
+        ad->ad_mdp->adf_refcount++;
     (void)ad_reso_size(path, adflags, ad);
 
 EC_CLEANUP:
@@ -1294,7 +1220,7 @@ static int ad_open_rf_ea(const char *path, int adflags, int mode, struct adouble
         goto EC_CLEANUP;
     }
 #ifdef HAVE_EAFD
-    if (ad_meta_fileno(ad) == -1)
+    if (ad_meta_fileno(ad) < 0)
         EC_FAIL;
     if ((ad_reso_fileno(ad) = sys_getxattrfd(ad_meta_fileno(ad), AD_EA_RESO, oflags)) == -1) {
         if (!(adflags & ADFLAGS_CREATE)) {
@@ -1898,33 +1824,6 @@ EC_CLEANUP:
     return ret;
 }
 
-int ad_convert(const char *path, const struct stat *sp, const struct vol *vol)
-{
-    EC_INIT;
-    const char *adpath;
-    int adflags = S_ISDIR(sp->st_mode) ? ADFLAGS_DIR : 0;
-
-    LOG(log_debug, logtype_default,"ad_convert(\"%s\"): BEGIN", fullpathname(path));
-
-    if (!(vol->v_adouble == AD_VERSION_EA) || (vol->v_flags & AFPVOL_NOV2TOEACONV))
-        goto EC_CLEANUP;
-
-    EC_ZERO( ad_conv_v22ea_hf(path, sp, vol) );
-    EC_ZERO( ad_conv_v22ea_rf(path, sp, vol) );
-
-    EC_NULL( adpath = ad_path(path, adflags) );
-    LOG(log_debug, logtype_default,"ad_conv_v22ea_hf(\"%s\"): deleting adouble:v2 file: \"%s\"",
-        path, fullpathname(adpath));
-
-    become_root();
-    EC_ZERO_LOG( unlink(adpath) );
-    unbecome_root();
-
-EC_CLEANUP:
-    LOG(log_debug, logtype_default,"ad_convert(\"%s\"): END: %d", fullpathname(path), ret);
-    EC_EXIT;
-}
-
 /* build a resource fork mode from the data fork mode:
  * remove X mode and extend header to RW if R or W (W if R for locking),
  */