/* ------------------- * XXX copy only header with same size or comment * doesn't work well for adouble with different version. * */ int ad_copy_header(struct adouble *add, struct adouble *ads) { u_int32_t eid; u_int32_t len; for ( eid = 0; eid < ADEID_MAX; eid++ ) { if ( ads->ad_eid[ eid ].ade_off == 0 ) { continue; } if ( add->ad_eid[ eid ].ade_off == 0 ) { continue; } len = ads->ad_eid[ eid ].ade_len; if (!len) { continue; } if (eid != ADEID_COMMENT && add->ad_eid[ eid ].ade_len != len ) { continue; } ad_setentrylen( add, eid, len ); memcpy( ad_entry( add, eid ), ad_entry( ads, eid ), len ); } add->ad_rlen = ads->ad_rlen; return 0; }
static void change_type(char *path, afpvol_t *vol, const struct stat *st, struct adouble *ad, char *new_type) { char *FinderInfo; if ((FinderInfo = ad_entry(ad, ADEID_FINDERI))) memcpy(FinderInfo, new_type, 4); }
static void change_label(char *path, afpvol_t *vol, const struct stat *st, struct adouble *ad, char *new_label) { char *FinderInfo; const char **color = &labels[0]; uint16_t FinderFlags; unsigned char color_count = 0; if ((FinderInfo = ad_entry(ad, ADEID_FINDERI)) == NULL) return; while (*color) { if (strcasecmp(*color, new_label) == 0) { /* get flags */ memcpy(&FinderFlags, FinderInfo + 8, 2); FinderFlags = ntohs(FinderFlags); /* change value */ FinderFlags &= ~FINDERINFO_COLOR; FinderFlags |= color_count << 1; /* copy it back */ FinderFlags = ntohs(FinderFlags); memcpy(FinderInfo + 8, &FinderFlags, 2); break; } color++; color_count++; } }
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_LOGSTR( ad_open(&adea, path, adflags | ADFLAGS_HF | ADFLAGS_RDWR | ADFLAGS_CREATE), "ad_conv_v22ea_hf(\"%s\"): error creating metadata EA: %s", fullpathname(path), strerror(errno)); 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 void change_flags(char *path, afpvol_t *vol, const struct stat *st, struct adouble *ad, char *new_flags) { char *FinderInfo; uint16_t FinderFlags; if ((FinderInfo = ad_entry(ad, ADEID_FINDERI)) == NULL) return; memcpy(&FinderFlags, FinderInfo + 8, 2); FinderFlags = ntohs(FinderFlags); if (S_ISREG(st->st_mode)) { if (strchr(new_flags, 'M')) FinderFlags |= FINDERINFO_ISHARED; if (strchr(new_flags, 'm')) FinderFlags &= ~FINDERINFO_ISHARED; if (strchr(new_flags, 'N')) FinderFlags |= FINDERINFO_HASNOINITS; if (strchr(new_flags, 'n')) FinderFlags &= ~FINDERINFO_HASNOINITS; if (strchr(new_flags, 'T')) FinderFlags |= FINDERINFO_ISSTATIONNERY; if (strchr(new_flags, 't')) FinderFlags &= ~FINDERINFO_ISSTATIONNERY; } if (strchr(new_flags, 'D')) FinderFlags |= FINDERINFO_ISONDESK; if (strchr(new_flags, 'd')) FinderFlags &= ~FINDERINFO_ISONDESK; if (strchr(new_flags, 'E')) FinderFlags |= FINDERINFO_HIDEEXT; if (strchr(new_flags, 'e')) FinderFlags &= ~FINDERINFO_HIDEEXT; if (strchr(new_flags, 'I')) FinderFlags |= FINDERINFO_HASBEENINITED; if (strchr(new_flags, 'i')) FinderFlags &= ~FINDERINFO_HASBEENINITED; if (strchr(new_flags, 'C')) FinderFlags |= FINDERINFO_HASCUSTOMICON; if (strchr(new_flags, 'c')) FinderFlags &= ~FINDERINFO_HASCUSTOMICON; if (strchr(new_flags, 'S')) FinderFlags |= FINDERINFO_NAMELOCKED; if (strchr(new_flags, 's')) FinderFlags &= ~FINDERINFO_NAMELOCKED; if (strchr(new_flags, 'B')) FinderFlags |= FINDERINFO_HASBUNDLE; if (strchr(new_flags, 'b')) FinderFlags &= ~FINDERINFO_HASBUNDLE; if (strchr(new_flags, 'V')) FinderFlags |= FINDERINFO_INVISIBLE; if (strchr(new_flags, 'v')) FinderFlags &= ~FINDERINFO_INVISIBLE; if (strchr(new_flags, 'A')) FinderFlags |= FINDERINFO_ISALIAS; if (strchr(new_flags, 'a')) FinderFlags &= ~FINDERINFO_ISALIAS; FinderFlags = ntohs(FinderFlags); memcpy(FinderInfo + 8, &FinderFlags, 2); }