mirror of
https://github.com/ksherlock/dot_clean.git
synced 2025-02-12 08:30:30 +00:00
win32/linux updates.
This commit is contained in:
parent
35d1946216
commit
e7c146c19d
@ -37,8 +37,6 @@
|
|||||||
|
|
||||||
/* REMINDER: the Motorola 680x0 is a big-endian architecture! */
|
/* REMINDER: the Motorola 680x0 is a big-endian architecture! */
|
||||||
|
|
||||||
typedef uint32_t OSType; /* 32 bit field */
|
|
||||||
|
|
||||||
/* In the QuickDraw coordinate plane, each coordinate is
|
/* In the QuickDraw coordinate plane, each coordinate is
|
||||||
* -32767..32767. Each point is at the intersection of a
|
* -32767..32767. Each point is at the intersection of a
|
||||||
* horizontal grid line and a vertical grid line. Horizontal
|
* horizontal grid line and a vertical grid line. Horizontal
|
||||||
@ -62,8 +60,8 @@ typedef struct Point Point;
|
|||||||
|
|
||||||
struct FInfo /* Finder information */
|
struct FInfo /* Finder information */
|
||||||
{
|
{
|
||||||
OSType fdType; /* File type, 4 ASCII chars */
|
uint32_t fdType; /* File type, 4 ASCII chars */
|
||||||
OSType fdCreator; /* File's creator, 4 ASCII chars */
|
uint32_t fdCreator; /* File's creator, 4 ASCII chars */
|
||||||
uint16_t fdFlags; /* Finder flag bits */
|
uint16_t fdFlags; /* Finder flag bits */
|
||||||
Point fdLocation; /* file's location in folder */
|
Point fdLocation; /* file's location in folder */
|
||||||
uint16_t fdFldr; /* file 's folder (aka window) */
|
uint16_t fdFldr; /* file 's folder (aka window) */
|
||||||
|
@ -30,6 +30,29 @@
|
|||||||
#include <attr/xattr.h>
|
#include <attr/xattr.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#pragma pack(push, 2)
|
||||||
|
struct AFP_Info {
|
||||||
|
uint32_t magic;
|
||||||
|
uint32_t version;
|
||||||
|
uint32_t file_id;
|
||||||
|
uint32_t backup_date;
|
||||||
|
uint8_t finder_info[32];
|
||||||
|
uint16_t prodos_file_type;
|
||||||
|
uint32_t prodos_aux_type;
|
||||||
|
uint8_t reserved[6];
|
||||||
|
};
|
||||||
|
#pragma pack pop
|
||||||
|
|
||||||
|
void init_afp_info(AFP_Info &info) {
|
||||||
|
static_assert(sizeof(AFP_Info) == 60, "Incorrect AFP_Info size");
|
||||||
|
memset(&info, 0, sizeof(info));
|
||||||
|
info.magic = 0x00504641;
|
||||||
|
info.version = 0x00010000;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
std::vector<std::string> unlink_list;
|
std::vector<std::string> unlink_list;
|
||||||
|
|
||||||
|
|
||||||
@ -157,20 +180,21 @@ void one_file(const std::string &data, const std::string &rsrc) noexcept try {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
std::string tmp = data + ":com.apple.ResourceFork";
|
std::string tmp = data + ":AFP_Resource";
|
||||||
int rfd = open(tmp.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0666);
|
int rfd = open(tmp.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0666);
|
||||||
if (rfd < 0) throw_errno("com.apple.ResourceFork");
|
if (rfd < 0) throw_errno("com.apple.ResourceFork");
|
||||||
defer close_fd([rfd](){ close(rfd); });
|
defer close_fd([rfd](){ close(rfd); });
|
||||||
int ok = write(rfd, mf.data() + e.entryOffset, e.entryLength);
|
int ok = write(rfd, mf.data() + e.entryOffset, e.entryLength);
|
||||||
if (ok < 0) throw_errno("com.apple.ResourceFork");
|
if (ok < 0) throw_errno("AFP_Resource");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
int ok = fsetxattr(fd, "user.apple.ResourceFork", mf.data() + e.entryOffset, e.entryLength, 0);
|
int ok = fsetxattr(fd, "user.com.apple.ResourceFork", mf.data() + e.entryOffset, e.entryLength, 0);
|
||||||
if (ok < 0) throw_errno("user.apple.ResourceFork");
|
if (ok < 0) throw_errno("user.com.apple.ResourceFork");
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case AS_FINDERINFO: {
|
case AS_FINDERINFO: {
|
||||||
/* Apple now includes xattr w/ finder info */
|
/* Apple now includes xattr w/ finder info */
|
||||||
if (e.entryLength < 32) {
|
if (e.entryLength < 32) {
|
||||||
@ -188,21 +212,33 @@ void one_file(const std::string &data, const std::string &rsrc) noexcept try {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
std::string tmp = data + ":com.apple.FinderInfo";
|
AFP_Info info;
|
||||||
|
init_afp_info(info);
|
||||||
|
memcpy(info.finder_info, mf.data() + e.entryOffset, 32);
|
||||||
|
|
||||||
|
std::string tmp = data + ":AFP_AfpInfo";
|
||||||
int rfd = openat(tmp.c_str(), O_CREAT | O_TRUNC | O_WRONLY, 0666);
|
int rfd = openat(tmp.c_str(), O_CREAT | O_TRUNC | O_WRONLY, 0666);
|
||||||
if (rfd < 0) throw_errno("com.apple.ResourceFork");
|
if (rfd < 0) throw_errno("AFP_AfpInfo");
|
||||||
defer close_fd([rfd](){ close(rfd); });
|
defer close_fd([rfd](){ close(rfd); });
|
||||||
|
|
||||||
int ok = write(rfd, mf.data() + e.entryOffset, 32);
|
int ok = write(rfd, &info, sizeof(info));
|
||||||
if (ok < 0) throw_errno("com.apple.FinderInfo");
|
if (ok < 0) throw_errno("AFP_AfpInfo");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
int ok = fsetxattr(fd, "user.apple.FinderInfo", mf.data() + e.entryOffset, 32, 0);
|
int ok = fsetxattr(fd, "user.com.apple.FinderInfo", mf.data() + e.entryOffset, 32, 0);
|
||||||
if (ok < 0) throw_errno("user.apple.FinderInfo");
|
if (ok < 0) throw_errno("user.com.apple.FinderInfo");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AS_PRODOSINFO: {
|
||||||
|
if (e.entryLength != 8) {
|
||||||
|
fputs("Warning: Invalid ProDOS Info size.\n", stderr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// for _WIN32, add prodos data to AFP_AfpInfo?
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user