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,
};
&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},
struct stat st;
/* read the header */
- if ((header_len = adf_pread( ad->ad_mdp, buf, AD_DATASZ, 0)) < 0) {
+ if ((header_len = adf_pread( ad->ad_mdp, buf, AD_DATASZ2, 0)) < 0) {
return -1;
}
if (header_len < AD_HEADER_LEN) {
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)
{
return oflags;
}
-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;
-
- 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) );
-
- /* Create a adouble:ea meta EA */
- 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) );
- 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) );
- EC_EXIT;
-}
-
static int ad_open_df(const char *path, int adflags, mode_t mode, struct adouble *ad)
{
EC_INIT;
EC_FAIL;
}
ad->ad_data_fork.adf_syml[lsz] = 0;
- ad->ad_data_fork.adf_fd = -2; /* -2 means its a symlink */
+ ad->ad_data_fork.adf_fd = AD_SYMLINK;
break;
default:
EC_FAIL;
oflags = O_NOFOLLOW | (ad2openflags(ad, ADFLAGS_DF, adflags) & ~(O_CREAT | O_TRUNC));
- if (ad_meta_fileno(ad) == -2)
+ if (ad_meta_fileno(ad) == AD_SYMLINK)
/* symlink */
EC_EXIT;
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:
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)) {
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;
-
- 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:
- 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),
*/