1b6cee71dSXin LI 2b6cee71dSXin LI#------------------------------------------------------------------------------ 3*58a0f0d0SEitan Adler# $File: gnu,v 1.20 2018/02/24 16:11:23 christos Exp $ 4b6cee71dSXin LI# gnu: file(1) magic for various GNU tools 5b6cee71dSXin LI# 6b6cee71dSXin LI# GNU nlsutils message catalog file format 7b6cee71dSXin LI# 8b6cee71dSXin LI# GNU message catalog (.mo and .gmo files) 9b6cee71dSXin LI 10*58a0f0d0SEitan Adler# Update: Joerg Jenderek 11*58a0f0d0SEitan Adler# URL: https://www.gnu.org/software/gettext/manual/html_node/MO-Files.html 12*58a0f0d0SEitan Adler# Reference: ftp://ftp.gnu.org/pub/gnu/gettext/gettext-0.19.8.tar.gz/ 13*58a0f0d0SEitan Adler# gettext-0.19.8.1/gettext-runtime/intl/gmo.h 14*58a0f0d0SEitan Adler# Note: maybe call it like "GNU translation gettext machine object" 15b6cee71dSXin LI0 string \336\22\4\225 GNU message catalog (little endian), 16*58a0f0d0SEitan Adler#0 ulelong 0x950412DE GNU-format message catalog data 17*58a0f0d0SEitan Adler# TODO: write lines in such a way that code can also be called for big endian variant 18*58a0f0d0SEitan Adler#>0 use gettext-object 19*58a0f0d0SEitan Adler#0 name gettext-object 20*58a0f0d0SEitan Adler>4 ulelong x revision 21*58a0f0d0SEitan Adler!:mime application/x-gettext-translation 22*58a0f0d0SEitan Adler# mo extension is also used for Easeus Partition Master PE32 executable module 23*58a0f0d0SEitan Adler# like ConvertFatToNTFS.mo 24*58a0f0d0SEitan Adler!:ext gmo/mo 25*58a0f0d0SEitan Adler# only found three revision combinations 0.0 0.1 1.1 as unsigned 32-bit 26*58a0f0d0SEitan Adler# major revision 27*58a0f0d0SEitan Adler>4 ulelong/0xFFff x %u. 28*58a0f0d0SEitan Adler# minor revision 29*58a0f0d0SEitan Adler>4 ulelong&0x0000FFff x \b%u 30*58a0f0d0SEitan Adler>>8 ulelong x \b, %u message 31*58a0f0d0SEitan Adler# plural s 32*58a0f0d0SEitan Adler>>8 ulelong >1 \bs 33*58a0f0d0SEitan Adler# size of hashing table 34*58a0f0d0SEitan Adler#>20 ulelong x \b, %u hash 35*58a0f0d0SEitan Adler#>20 ulelong >1 \bes 36*58a0f0d0SEitan Adler#>24 ulelong x at 0x%x 37*58a0f0d0SEitan Adler# for revsion x.0 offset of table with originals is 1Ch if directly after header 38*58a0f0d0SEitan Adler>4 ulelong&0x0000FFff =0 39*58a0f0d0SEitan Adler>>12 ulelong !0x1C \b, at 0x%x string table 40*58a0f0d0SEitan Adler# but for x.1 table offset i found is 30h. That means directly after bigger header 41*58a0f0d0SEitan Adler>4 ulelong&0x0000FFff >0 42*58a0f0d0SEitan Adler>>12 ulelong !0x30 \b, at 0x%x string table 43*58a0f0d0SEitan Adler# The following variables are only used in .mo files with minor revision >= 1 44*58a0f0d0SEitan Adler# number of system dependent segments 45*58a0f0d0SEitan Adler#>>28 ulelong x \b, %u segment 46*58a0f0d0SEitan Adler#>>28 ulelong >1 \bs 47*58a0f0d0SEitan Adler# offset of table describing system dependent segments 48*58a0f0d0SEitan Adler#>>32 ulelong x at 0x%x 49*58a0f0d0SEitan Adler# number of system dependent strings pairs 50*58a0f0d0SEitan Adler>>36 ulelong x \b, %u sysdep message 51*58a0f0d0SEitan Adler>>36 ulelong >1 \bs 52*58a0f0d0SEitan Adler# offset of table with start offsets of original sysdep strings 53*58a0f0d0SEitan Adler#>>40 ulelong x \b, at 0x%x sysdep strings 54*58a0f0d0SEitan Adler# offset of table with start offsets of translated sysdep strings 55*58a0f0d0SEitan Adler#>>44 ulelong x \b, at 0x%x sysdep translations 56*58a0f0d0SEitan Adler# >>(44.l) ulelong x 0x%x chars 57*58a0f0d0SEitan Adler# >>>&0 ulelong x at 0x%x 58*58a0f0d0SEitan Adler# >>>>(&-4) string x "%s" 59*58a0f0d0SEitan Adler# string table after big header 60*58a0f0d0SEitan Adler#>>48 ubequad x \b, string table 0x%llx 61*58a0f0d0SEitan Adler# 62*58a0f0d0SEitan Adler# 0th string length seems to be always 0 63*58a0f0d0SEitan Adler#>(12.l) ulelong x \b, %u chars 64*58a0f0d0SEitan Adler#>>&0 ulelong x at 0x%x 65*58a0f0d0SEitan Adler# if 1st string length positiv inspect offset and string 66*58a0f0d0SEitan Adler#>(12.l+8) ulelong >0 \b, %u chars 67*58a0f0d0SEitan Adler#>>&0 ulelong x at 0x%x 68*58a0f0d0SEitan Adler# if 2nd string length positiv inspect offset and string 69*58a0f0d0SEitan Adler# >(12.l+16) ulelong >0 \b, %u chars 70*58a0f0d0SEitan Adler# >>&0 ulelong x at 0x%x 71*58a0f0d0SEitan Adler# skip newline byte 72*58a0f0d0SEitan Adler#>>>(&-4) ubyte =0x0A 73*58a0f0d0SEitan Adler#>>>>&0 string x "%s" 74*58a0f0d0SEitan Adler#>>>(&-4) ubyte !0x0A 75*58a0f0d0SEitan Adler#>>>>&-1 string x '%s' 76*58a0f0d0SEitan Adler# offset of table with translation strings 77*58a0f0d0SEitan Adler#>16 ulelong x \b, at 0x%x translation table 78*58a0f0d0SEitan Adler# check translation 0 length and offset 79*58a0f0d0SEitan Adler>(16.l) ulelong >0 80*58a0f0d0SEitan Adler>>&0 ulelong x 81*58a0f0d0SEitan Adler# translation 0 seems to be often Project-Id with name and version 82*58a0f0d0SEitan Adler>>>(&-4) string x \b, %s 83*58a0f0d0SEitan Adler# trans. 1 with bytes >= 1 unlike icoutils-0.31.0\po\en@boldquot.gmo with 1 NL 84*58a0f0d0SEitan Adler>(16.l+8) ulelong >1 85*58a0f0d0SEitan Adler>>&0 ulelong x 86*58a0f0d0SEitan Adler>>>(&-4) ubyte !0x0A 87*58a0f0d0SEitan Adler>>>>&-1 string x '%s' 88*58a0f0d0SEitan Adler# 1 New Line like in tar-1.29\po\de.gmo 89*58a0f0d0SEitan Adler>>>(&-4) ubyte =0x0A 90*58a0f0d0SEitan Adler>>>>&0 ubyte !0x0A 91*58a0f0d0SEitan Adler>>>>>&-1 string x '%s' 92*58a0f0d0SEitan Adler# 2nd New Line like in parted-3.1\po\de.gmo 93*58a0f0d0SEitan Adler>>>>&0 ubyte =0x0A 94*58a0f0d0SEitan Adler>>>>>&0 string x '%s' 95b6cee71dSXin LI 96b6cee71dSXin LI0 string \225\4\22\336 GNU message catalog (big endian), 97*58a0f0d0SEitan Adler#0 ubelong 0x950412DE GNU-format message catalog data 98*58a0f0d0SEitan Adler!:mime application/x-gettext-translation 99*58a0f0d0SEitan Adler!:ext gmo/mo 100*58a0f0d0SEitan Adler# TODO: for big endian use same code as for little endian 101*58a0f0d0SEitan Adler#>0 use \^gettext-object 102*58a0f0d0SEitan Adler# DEBUG code 103*58a0f0d0SEitan Adler#>16 ubelong x \b, at 0x%x translation table 104*58a0f0d0SEitan Adler#>(16.L) ubelong x 0x%x chars 105*58a0f0d0SEitan Adler#>>&0 ubelong x at 0x%x 106*58a0f0d0SEitan Adler# unexpected value HERE! 107*58a0f0d0SEitan Adler#>>>(&-4) ubequad x 0x%llx 108*58a0f0d0SEitan Adler# 109b6cee71dSXin LI>4 beshort x revision %d. 110b6cee71dSXin LI>6 beshort >0 \b%d, 111b6cee71dSXin LI>>8 belong x %d messages, 112b6cee71dSXin LI>>36 belong x %d sysdep messages 113b6cee71dSXin LI>6 beshort =0 \b%d, 114b6cee71dSXin LI>>8 belong x %d messages 115b6cee71dSXin LI 116b6cee71dSXin LI 117b6cee71dSXin LI# GnuPG 118b6cee71dSXin LI# The format is very similar to pgp 119b6cee71dSXin LI0 string \001gpg GPG key trust database 120b6cee71dSXin LI>4 byte x version %d 121b6cee71dSXin LI# Note: magic.mime had 0x8501 for the next line instead of 0x8502 122b6cee71dSXin LI0 beshort 0x8502 GPG encrypted data 123b6cee71dSXin LI!:mime text/PGP # encoding: data 124b6cee71dSXin LI 125*58a0f0d0SEitan Adler# Update: Joerg Jenderek 126*58a0f0d0SEitan Adler# Note: PGP and GPG use same data structure. 127*58a0f0d0SEitan Adler# So recognition is now done by ./pgp with start test for byte 0x99 128b6cee71dSXin LI# This magic is not particularly good, as the keyrings don't have true 129b6cee71dSXin LI# magic. Nevertheless, it covers many keyrings. 130*58a0f0d0SEitan Adler# 0 ubeshort-0x9901 <2 131*58a0f0d0SEitan Adler# >3 byte 4 132*58a0f0d0SEitan Adler# >>4 bedate x GPG key public ring, created %s 133*58a0f0d0SEitan Adler# !:mime application/x-gnupg-keyring 134a5d223e6SXin LI 135b6cee71dSXin LI# Symmetric encryption 136b6cee71dSXin LI0 leshort 0x0d8c 137b6cee71dSXin LI>4 leshort 0x0203 138b6cee71dSXin LI>>2 leshort 0x0204 GPG symmetrically encrypted data (3DES cipher) 139b6cee71dSXin LI>>2 leshort 0x0304 GPG symmetrically encrypted data (CAST5 cipher) 140b6cee71dSXin LI>>2 leshort 0x0404 GPG symmetrically encrypted data (BLOWFISH cipher) 141b6cee71dSXin LI>>2 leshort 0x0704 GPG symmetrically encrypted data (AES cipher) 142b6cee71dSXin LI>>2 leshort 0x0804 GPG symmetrically encrypted data (AES192 cipher) 143b6cee71dSXin LI>>2 leshort 0x0904 GPG symmetrically encrypted data (AES256 cipher) 144b6cee71dSXin LI>>2 leshort 0x0a04 GPG symmetrically encrypted data (TWOFISH cipher) 145b6cee71dSXin LI>>2 leshort 0x0b04 GPG symmetrically encrypted data (CAMELLIA128 cipher) 146b6cee71dSXin LI>>2 leshort 0x0c04 GPG symmetrically encrypted data (CAMELLIA192 cipher) 147b6cee71dSXin LI>>2 leshort 0x0d04 GPG symmetrically encrypted data (CAMELLIA256 cipher) 148b6cee71dSXin LI 149b6cee71dSXin LI 150b6cee71dSXin LI# GnuPG Keybox file 151b6cee71dSXin LI# <http://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=blob;f=kbx/keybox-blob.c;hb=HEAD> 152b6cee71dSXin LI# From: Philipp Hahn <hahn@univention.de> 153b6cee71dSXin LI0 belong 32 154b6cee71dSXin LI>4 byte 1 155b6cee71dSXin LI>>8 string KBXf GPG keybox database 156b6cee71dSXin LI>>>5 byte 1 version %d 157b6cee71dSXin LI>>>16 bedate x \b, created-at %s 158b6cee71dSXin LI>>>20 bedate x \b, last-maintained %s 159b6cee71dSXin LI 160b6cee71dSXin LI 161b6cee71dSXin LI# Gnumeric spreadsheet 162b6cee71dSXin LI# This entry is only semi-helpful, as Gnumeric compresses its files, so 163b6cee71dSXin LI# they will ordinarily reported as "compressed", but at least -z helps 164b6cee71dSXin LI39 string =<gmr:Workbook Gnumeric spreadsheet 165b6cee71dSXin LI 166b6cee71dSXin LI# From: James Youngman <jay@gnu.org> 167b6cee71dSXin LI# gnu find magic 168b6cee71dSXin LI0 string \0LOCATE GNU findutils locate database data 169b6cee71dSXin LI>7 string >\0 \b, format %s 170b6cee71dSXin LI>7 string 02 \b (frcode) 171b6cee71dSXin LI 172b6cee71dSXin LI# Files produced by GNU gettext 173b6cee71dSXin LI 174b6cee71dSXin LI# gettext message catalogue 1755f0216bdSXin LI0 search/1024 \nmsgid 1765f0216bdSXin LI>&0 search/1024 \nmsgstr GNU gettext message catalogue text 1775f0216bdSXin LI!:strength +100 178b6cee71dSXin LI!:mime text/x-po 179