#include #include #include #include #include namespace BPrivate { status_t unflatten_dano_message(uint32 magic, BDataIO& stream, BMessage& message); size_t dano_message_size(const char* buffer); } extern const char* __progname; static const uint32 kMessageFormat = 'FOB2'; static const uint32 kMessageFormatSwapped = '2BOF'; int main(int argc, char** argv) { if (argc < 2) { fprintf(stderr, "usage: %s \n", __progname); return -1; } for (int32 i = 1; i < argc; i++) { BFile file(argv[i], B_READ_ONLY); if (file.InitCheck() != B_OK) { fprintf(stderr, "Could not open message \"%s\": %s\n", argv[i], strerror(file.InitCheck())); continue; } off_t size; if (file.GetSize(&size) != B_OK) continue; uint32 magic; if (file.Read(&magic, sizeof(uint32)) != sizeof(uint32)) continue; if (magic != kMessageFormat && magic != kMessageFormatSwapped) { fprintf(stderr, "Not a dano message \"%s\"\n", argv[i]); continue; } BMessage message; status_t status = BPrivate::unflatten_dano_message(magic, file, message); if (status == B_OK) message.PrintToStream(); else fprintf(stderr, "Could not unflatten message: %s\n", strerror(status)); } return 0; }