/* * NAME: node->index() * DESCRIPTION: create an index record from a key and node pointer */ void n_index(const node *np, byte *record, unsigned int *reclen) { const byte *key = HFS_NODEREC(*np, 0); if (np->bt == &np->bt->f.vol->cat) { /* force the key length to be 0x25 */ HFS_SETKEYLEN(record, 0x25); memset(record + 1, 0, 0x25); memcpy(record + 1, key + 1, HFS_RECKEYLEN(key)); } else memcpy(record, key, HFS_RECKEYSKIP(key)); d_putul(HFS_RECDATA(record), np->nnum); if (reclen) *reclen = HFS_RECKEYSKIP(record) + 4; }
/* * NAME: binhx() * DESCRIPTION: auxiliary BinHex routine */ static int binhx(hfsfile *ifile) { hfsdirent ent; unsigned char byte, word[2], lword[4]; if (hfs_fstat(ifile, &ent) == -1) { ERROR(errno, hfs_error); return -1; } byte = strlen(ent.name); if (bh_insert(&byte, 1) == -1 || bh_insert(ent.name, byte + 1) == -1 || bh_insert(ent.u.file.type, 4) == -1 || bh_insert(ent.u.file.creator, 4) == -1) { ERROR(errno, bh_error); return -1; } d_putsw(word, ent.fdflags); if (bh_insert(word, 2) == -1) { ERROR(errno, bh_error); return -1; } d_putul(lword, ent.u.file.dsize); if (bh_insert(lword, 4) == -1) { ERROR(errno, bh_error); return -1; } d_putul(lword, ent.u.file.rsize); if (bh_insert(lword, 4) == -1 || bh_insertcrc() == -1) { ERROR(errno, bh_error); return -1; } if (hfs_setfork(ifile, 0) == -1) { ERROR(errno, hfs_error); return -1; } if (fork_binh(ifile, ent.u.file.dsize) == -1) return -1; if (hfs_setfork(ifile, 1) == -1) { ERROR(errno, hfs_error); return -1; } if (fork_binh(ifile, ent.u.file.rsize) == -1) return -1; return 0; }
/* * NAME: do_macb() * DESCRIPTION: perform copy using MacBinary II translation */ static int do_macb(hfsfile *ifile, int ofile) { hfsdirent ent; unsigned char buf[MACB_BLOCKSZ]; long bytes; if (hfs_fstat(ifile, &ent) == -1) { ERROR(errno, hfs_error); return -1; } memset(buf, 0, MACB_BLOCKSZ); buf[1] = strlen(ent.name); strcpy((char *) &buf[2], ent.name); memcpy(&buf[65], ent.u.file.type, 4); memcpy(&buf[69], ent.u.file.creator, 4); buf[73] = ent.fdflags >> 8; d_putul(&buf[83], ent.u.file.dsize); d_putul(&buf[87], ent.u.file.rsize); d_putul(&buf[91], d_mtime(ent.crdate)); d_putul(&buf[95], d_mtime(ent.mddate)); buf[101] = ent.fdflags & 0xff; buf[122] = buf[123] = 129; d_putuw(&buf[124], crc_macb(buf, 124, 0x0000)); bytes = write(ofile, buf, MACB_BLOCKSZ); if (bytes == -1) { ERROR(errno, "error writing data"); return -1; } else if (bytes != MACB_BLOCKSZ) { ERROR(EIO, "wrote incomplete chunk"); return -1; } if (hfs_setfork(ifile, 0) == -1) { ERROR(errno, hfs_error); return -1; } if (fork_macb(ifile, ofile, ent.u.file.dsize) == -1) return -1; if (hfs_setfork(ifile, 1) == -1) { ERROR(errno, hfs_error); return -1; } if (fork_macb(ifile, ofile, ent.u.file.rsize) == -1) return -1; return 0; }