Exemple #1
0
/* -------------------
 * 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;
}
Exemple #2
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);
}
Exemple #3
0
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++;
    }
}
Exemple #4
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_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;
}
Exemple #5
0
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);
}