.\" -*- coding: UTF-8 -*-
.\" $File: magic.man,v 1.110 2024/11/27 15:37:00 christos Exp $
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.Dd 27 listopada 2024 r.
.Dt MAGIC 5
.Os
.\" install as magic.4 on USG, magic.5 on V7, Berkeley and Linux systems.
.Sh NAZWA
.Nm magic
.Nd plik wzorców magicznych polecenia file
.Sh OPIS
Ta strona podręcznika systemowego opisuje format pliku magicznego, używanego
przez polecenie
.Xr file 1
w wersji 5.46. Polecenie
.Xr file 1
rozpoznaje typ pliku, korzystając (poza innymi metodami) z testu,
polegającego na sprawdzeniu, czy plik nie rozpoczyna się od pewnego
\[Bq]wzorca magicznego\[rq]. Baza \[Bq]wzorców magicznych\[rq] znajduje się
zwykle w pliku binarnym
.Pa /usr/share/misc/magic.mgc
lub w katalogu z
plikami zawierającymi fragmenty źródłowe tekstów wzorców magicznych
.Pa /usr/share/misc/magic .
Baza określa jakie wzorce sprawdzać i jakie
komunikaty lub typy MIME wypisywać w przypadku znalezienia określonego
wzorca magicznego oraz dodatkowe dane, które mają zostać pobrane z pliku.
.Pp
Format plików z fragmentami źródeł służącymi do zbudowania tej bazy danych
jest następujący: Każdy wiersz pliku fragmentarycznego określa test, które
ma być wykonany. Test porównuje dane, rozpoczynające się przy określonym
przesunięciu względem początku pliku z wartością bajtową, numeryczną lub
łańcuchem. Jeśli test zakończy się pomyślnie, wypisywany jest
komunikat. Wiersz składa się z następujących pól:
.Bl -tag -width ".Dv message"
.It Dv offset
Liczba, określająca przesunięcie (w bajtach) względem początku pliku, przy
którym należy szukać testowanych danych. Przesunięcie może być liczbą
ujemną, jeśli jest:
.Bl -bullet -compact
.It 
Pierwszym bezpośrednim przesunięciem wpisu magicznego (na poziomie
kontynuacji 0), wówczas jest interpretowane jako przesunięcie liczone od
końca pliku. Działa to tylko, gdy dostępny jest deskryptor danego pliku i
jest to zwykły plik.
.It 
Przesunięcie kontynuacji względem końca ostatniego pola wyższego poziomu
.Dv ( \*[Am] ) .
.El
Jeśli przesunięcie zaczyna się od symbolu \[Bq]+\[rq], to wszystkie
przesunięcia interpretowane są jako przesunięcia od początku pliku
(domyślnie).
.It Dv type
Typ testowanych danych. Dopuszczalne wartości to:
.Bl -tag -width ".Dv lestring16"
.It Dv byte
Wartość jednobajtowa.
.It Dv short
Wartość dwubajtowa w natywnej kolejności bajtów tego komputera.
.It Dv long
Wartość czterobajtowa w natywnej kolejności bajtów tego komputera.
.It Dv quad
Wartość ośmiobajtowa w natywnej kolejności bajtów tego komputera.
.It Dv float
32-bitowa liczba zmiennoprzecinkowa o pojedynczej precyzji IEEE, w natywnej
dla tego komputera kolejności bajtów.
.It Dv double
64-bitowa liczba zmiennoprzecinkowa o podwójnej precyzji IEEE, w natywnej
dla tego komputera kolejności bajtów.
.It Dv string
Łańcuch bajtów. Po określeniu typu łańcucha może opcjonalnie wystąpić opcja
/<szerokość> oraz opcjonalnie zestaw flag /[bCcftTtWw]*. Szerokość
ogranicza liczbę znaków do skopiowania. Zero oznacza wszystkie
znaki. Obsługiwane są poniższe flagi:
.Bl -tag -width B -compact -offset XXXX
.It b
Wymusza test pliku binarnego.
.It C
Używa dopasowania niewrażliwego na wielkość wielkich liter: wielkie litery w
magii dopasują zarówno małe jak i wielkie litery w celu, natomiast małe
litery w magii dopasują jedynie małe litery w celu.
.It c
Używa dopasowania niewrażliwego na wielkość małych liter: małe litery w
magii dopasują zarówno małe jak i wielkie litery w celu, natomiast wielkie
litery w magii dopasują jedynie wielkie litery w celu. Aby uzyskać
dopasowanie całkowicie niewrażliwe na wielkość liter, należy podać zarówno
\[Bq]c\[rq] jak i \[Bq]C\[rq].
.It f
Wymaga, aby dopasowany łańcuch był pełnym słowem, a nie dopasowaniem części
słowa.
.It T
Przycina łańcuch, tzn. początkowe i końcowe białe znaki
.It t
Wymusza test pliku tekstowego
.It W
Kompaktuje białe znaki w celu, który musi zawierać przynajmniej jeden biały
znak. Jeśli magia ma
.Dv n
kolejnych białych znaków, cel musi mieć
przynajmniej
.Dv n
kolejnych białych znaków, aby zostać dopasowanym.
.It w
Traktuje każdą spację w magii jako opcjonalną. Jest ona usuwana przed
wypisaniem łańcucha.
.El
.It Dv pstring
Łańcuch w stylu Pascala, gdzie pierwszy bajt/liczba typu short/liczba typu
int jest interpretowany jako długość bez znaku. Domyślną długością jest bajt
i można go określić jako modyfikator. Obsługiwane są następujące
modyfikatory:
.Bl -tag -width B -compact -offset XXXX
.It B
Długość bajtu (domyślnie).
.It H
Długość 2 bajtów big endian.
.It h
Długość 2 bajtów little endian.
.It L
Długość 4 bajtów big endian.
.It l
Długość 4 bajtów little endian.
.It J
Długość zawierająca się w swej liczebności.
.El
Łańcuch nie kończy się znakiem NUL. Zamiast bardziej wartościowego
\[Bq]I\[rq] używane jest \[Bq]J\[Bq], ponieważ ten typ długości jest cechą
formatu JPEG.
.It Dv date
Czterobajtowa wartość, interpretowana jako data uniksowa.
.It Dv qdate
Ośmiobajtowa wartość, interpretowana jako data uniksowa.
.It Dv ldate
Czterobajtowa wartość, interpretowana jako data w stylu uniksowym, ale
interpretowana jako czas lokalny, a nie UTC.
.It Dv qldate
Ośmiobajtowa wartość, interpretowana jako data w stylu uniksowym, ale
interpretowana jako czas lokalny, a nie UTC.
.It Dv qwdate
Ośmiobajtowa wartość interpretowana jako data w stylu windowsowym.
.It Dv msdosdate
Dwubajtowa wartość interpretowana jako data w stylu FAT/DOS.
.It Dv msdostime
Dwubajtowa wartość interpretowana jako czas w stylu FAT/DOS.
.It Dv beid3
32-bitowa długość ID3 w kolejności bajtów big-endian
.It Dv beshort
Wartość dwubajtowa w kolejności bajtów big-endian.
.It Dv belong
Wartość czterobajtowa w kolejności bajtów big-endian.
.It Dv bequad
Wartość ośmiobajtowa w kolejności bajtów big-endian.
.It Dv befloat
32-bitowa liczba zmiennoprzecinkowa o pojedynczej precyzji IEEE, w
kolejności bajtów big-endian.
.It Dv bedouble
64-bitowa liczba zmiennoprzecinkowa o podwójnej precyzji IEEE, w kolejności
bajtów big-endian.
.It Dv bedate
Czterobajtowa wartość w kolejności bajtów big-endian, interpretowana jako
data uniksowa.
.It Dv beqdate
Ośmiobajtowa wartość w kolejności bajtów big-endian, interpretowana jako
data uniksowa.
.It Dv beldate
Czterobajtowa wartość w kolejności bajtów big-endian, interpretowana jako
data w stylu uniksowym, ale interpretowana jako czas lokalny, a nie UTC.
.It Dv beqldate
Ośmiobajtowa wartość w kolejności bajtów big-endian, interpretowana jako
data w stylu uniksowym, ale interpretowana jako czas lokalny, a nie UTC.
.It Dv beqwdate
Ośmiobajtowa wartość w kolejności bajtów big-endian, interpretowana jako
data w stylu windowsowym.
.It Dv bemsdosdate
Dwubajtowa wartość w kolejności bajtów big-endian, interpretowana jako data
w stylu FAT/DOS.
.It Dv bemsdostime
Dwubajtowa wartość w kolejności bajtów big-endian, interpretowana jako czas
w stylu FAT/DOS.
.It Dv bestring16
Dwubajtowy łańcuch unikodu (UCS16), w kolejności bajtów big-endian.
.It Dv leid3
32-bitowa długość ID3 w kolejności bajtów little-endian
.It Dv leshort
Wartość dwubajtowa w kolejności bajtów little-endian.
.It Dv lelong
Wartość czterobajtowa w kolejności bajtów little-endian.
.It Dv lequad
Wartość ośmiobajtowa w kolejności bajtów little-endian.
.It Dv lefloat
32-bitowa liczba zmiennoprzecinkowa o pojedynczej precyzji IEEE, w
kolejności bajtów little-endian.
.It Dv ledouble
64-bitowa liczba zmiennoprzecinkowa o podwójnej precyzji IEEE, w kolejności
bajtów little-endian.
.It Dv ledate
Czterobajtowa wartość w kolejności bajtów little-endian, interpretowana jako
data uniksowa.
.It Dv leqdate
Ośmiobajtowa wartość w kolejności bajtów little-endian, interpretowana jako
data uniksowa.
.It Dv leldate
Czterobajtowa wartość w kolejności bajtów little-endian, interpretowana jako
data w stylu uniksowym, ale interpretowana jako czas lokalny, a nie UTC.
.It Dv leqldate
Ośmiobajtowa wartość w kolejności bajtów little-endian, interpretowana jako
data w stylu uniksowym, ale interpretowana jako czas lokalny, a nie UTC.
.It Dv leqwdate
Ośmiobajtowa wartość w kolejności bajtów little-endian, interpretowana jako
data w stylu windowsowym.
.It Dv lemsdosdate
Dwubajtowa wartość w kolejności bajtów big-endian, interpretowana jako data
w stylu FAT/DOS.
.It Dv lemsdostime
Dwubajtowa wartość w kolejności bajtów big-endian, interpretowana jako czas
w stylu FAT/DOS.
.It Dv lestring16
Dwubajtowy łańcuch unikodu (UCS16), w kolejności bajtów little-endian.
.It Dv melong
Wartość czterobajtowa w kolejności bajtów middle-endian (PDP-11).
.It Dv medate
Czterobajtowa wartość w kolejności bajtów middle-endian (PDP-11),
interpretowana jako data uniksowa.
.It Dv meldate
Czterobajtowa wartość w kolejności bajtów middle-endian (PDP-11),
interpretowana jako data w stylu uniksowym, ale interpretowana jako czas
lokalny, a nie UTC.
.It Dv indirect
Poczynając od podanego przesunięcia, sprawdza ponownie bazę danych
magii. Przesunięcie magii
.Dv indirect
jest domyślnie przesunięciem
absolutnym w pliku, ale można podać
.Dv /r
aby wskazać, że przesunięcie
jest względne wobec początku wpisu.
.It Dv name
Definiuje \[Bq]nazwane\[rq] wystąpienie magii, które można wywołać z innego
wpisu magii
.Dv use ,
jak wywołanie podfunkcji. Przesunięcia nazwanych
wystąpień bezpośrednich magii są względem przesunięcia poprzednio
dopasowanego wpisu, natomiast niebezpośrednie przesunięcia są liczone
względem początku pliku, jak zwykle. Nazwane wpisy magii są zawsze
dopasowywane.
.It Dv use
Rekurencyjne wywołuje nazwaną magię poczynając od bieżącego
przesunięcia. Jeśli nazwa odniesienia rozpoczyna się od
.Dv ^ ,
to
zamieniana jest kolejność bajtów magii; jeśli magia wspominała np.
.Dv leshort ,
jest traktowana jako
.Dv beshort
i na odwrót. Jest to
przydatne, aby uniknąć duplikowania reguł dla różnych kolejności bajtów.
.It Dv regex
Wyrażenie regularne w składni rozszerzonych wyrażeń regularnych POSIX (jak
egrep). Przetworzenie wyrażeń regularnych może zająć wykładniczo więcej
czasu i ciężko przewidzieć ich wydajność, zatem odradza się ich używania. W
środowiskach produkcyjnych należy uważnie sprawdzić ich wydajność. Należy
też ograniczyć rozmiar łańcucha do przeszukania, podając
.Dv /<długość> ,
aby uniknąć problemów z wydajnością przy skanowaniu
długich plików. Po określeniu typu można opcjonalnie dodać
.Dv /[c][s][l] .
Flaga \[Bq]c\[rq] czyni dopasowanie niewrażliwym na wielkość
znaków, natomiast \[Bq]s\[rq] aktualizuje przesunięcie na początek
przesunięcia dopasowania, zamiast jego koniec. Modyfikator \[Bq]l\[rq]
zmienia limit długości, aby oznaczał on liczbę wierszy zamiast liczbę
bajtów. Wiersze są rozgraniczane przez ogranicznik zależny od platformy. Gdy
poda się liczbę wierszy, obliczana jest też niejawnie liczba bajtów
zakładając, że każdy wiersz ma 80 znaków. Jeśli nie poda się liczby bajtów
ani wierszy, wyszukiwanie jest automatycznie ograniczane do 8KiB.
.Dv ^
i
.Dv $
dopasowują początek i koniec poszczególnych wierszy, a nie początek
i koniec pliku.
.It Dv search
Dosłowny łańcuch szukany od podanego przesunięcia. Można korzystać z tych
samych flag modyfikujących jak przy wzorcach łańcuchowych. Wyszukiwane
wyrażenie musi zawierać zakres w postaci
.Dv /liczba,
tj. liczbę pozycji,
na której dokonane będą próby dopasowania, zaczynając od początkowego
przesunięcia. Jest to właściwe przy wyszukiwaniu większych wyrażeń binarnych
z różnymi przesunięciami, korzystając z cytowania znaków specjalnych za
pomocą
.Dv \e .
Kolejność modyfikatorów i liczb nie ma znaczenia.
.It Dv default
Zaprojektowane do użycia z testem
.Em x
(zawsze prawdziwym); nie ma
typu. Dopasowuje, gdy inne testy na tym poziomie kontynuacji nic wcześniej
nie dopasowały. Za pomocą testu
.Dv clear
można wyczyścić dopasowane
testy dla poziomu kontynuacji.
.It Dv clear
Ten test jest zawsze prawdziwy i czyści flagę dopasowania dla danego poziomu
kontynuacji. Zaprojektowany do użycia z testem
.Dv default .
.It Dv der
Przetwarza plik jako plik certyfikatu DER. Pole testowe służy jako typ der,
który musi być dopasowany. Występują następujące typy DER:
.Dv eoc ,
.Dv bool ,
.Dv int ,
.Dv bit_str ,
.Dv octet_str ,
.Dv null ,
.Dv obj_id ,
.Dv obj_desc ,
.Dv ext ,
.Dv real ,
.Dv enum ,
.Dv embed ,
.Dv utf8_str ,
.Dv rel_oid ,
.Dv time ,
.Dv res2 ,
.Dv seq ,
.Dv set ,
.Dv num_str ,
.Dv prt_str ,
.Dv t61_str ,
.Dv vid_str ,
.Dv ia5_str ,
.Dv utc_time ,
.Dv gen_time ,
.Dv gr_str ,
.Dv vis_str ,
.Dv gen_str ,
.Dv univ_str ,
.Dv char_str ,
.Dv bmp_str ,
.Dv date ,
.Dv tod ,
.Dv datetime ,
.Dv duration ,
.Dv oid-iri ,
.Dv rel-oid-iri .
Po typach tych może wystąpić opcjonalny
rozmiar numeryczny, który oznacza szerokość pola w bajtach.
.It Dv guid
Globalnie unikalny identyfikator (ang. Globally Unique Identifier \[en]
GUID), przetwarzany i wypisywany jako
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Jest to format łańcuchowy.
.It Dv offset
Jest to wartość typu quad wskazująca aktualne przesunięcie pliku. Może
służyć do określenia rozmiaru pliku lub bufora magicznego. Przykładowe wpisy
magiczne:
.Bd -literal -offset indent
-0	offset	x	ten plik ma %lld bajtów
-0	offset	<=100	musi mieć więcej niż 100 \e
    bajtów, a ma tylko %lld
.Ed
.It Dv octal
Łańcuch oznaczający liczbę ósemkową.
.El
.Pp
Ze względu ma kompatybilność z Single
.Ux
Standard, określenia typu
.Dv dC
i
.Dv d1
są równoważne
.Dv byte ,
określenia typu
.Dv uC
i
.Dv u1
są równoważne
.Dv ubyte ,
określenia typu
.Dv dS
i
.Dv d2
są
równoważne
.Dv short ,
określenia typu
.Dv uS
i
.Dv u2
są równoważne
.Dv ushort ,
określenia typu
.Dv dI ,
.Dv dL ,
i
.Dv d4
są
równoważne
.Dv long ,
określenia typu
.Dv uI ,
.Dv uL ,
i
.Dv u4
są
równoważne
.Dv ulong ,
określenie typu
.Dv d8
jest równoważne
.Dv quad ,
określenie typu
.Dv u8
jest równoważne
.Dv uquad ,
a określenie
typu
.Dv s
jest równoważne
.Dv string .
Dodatkowo określenie typu
.Dv dQ
jest równoważne
.Dv quad ,
a określenie typu
.Dv uQ
jest równoważne
.Dv uquad .
.Pp
Każdy wzorzec magiczny najwyższego poziomu (poniżej wyjaśniono znaczenie
poziomów) jest klasyfikowany jako tekstowy lub binarny, w zależności od
użytego typu. Typy \[Bq]regex\[rq] i \[Bq]search\[rq] są klasyfikowane jako
tekstowe, chyba że we wzorcu użyto znaków niedrukowalnych. Wszystkie inne
testy są klasyfikowane jako binarne. Wzorzec najwyższego poziomu uważa się
za test tekstowy, jeśli wszystkie jego wzorce są wzorcami tekstowymi; w
innym przypadku jest uważany za wzorzec binarny. Przy dopasowywaniu pliku,
jako pierwsze próbowane są wzorce binarne; jeśli żaden nie zostanie
dopasowany, a plik wygląda na tekstowy, to określane jest jego kodowanie i
próbowane są wzorce tekstowe.
.Pp
Po typach numerycznych może opcjonalnie wystąpić
.Dv \*[Am]
i wartość
numeryczna aby określić, że wartość ma być zsumowana (AND) z wartością
numeryczną przed dokonaniem jakiegokolwiek porównania. Wstawienie
.Dv u
przed typem oznacza, że uszeregowane porównania mają być dokonywane bez
względu na znak.
.It Dv test
Wartość, które ma być porównywana z wartością z pliku. Jeśli typ jest
numeryczny, to wartość jest podawana w postaci zgodnej z językiem C; jeśli
typ jest łańcuchowy, to wartość jest podawana jako łańcuch języka C z
dozwolonymi znakami specjalnymi (np. \en dla nowego wiersza).
.Pp
Wartości numeryczne mogą być poprzedzone znakami określającymi operację,
jaka ma zostać wykonana. Znakiem operacji może być
.Dv = ,
określający, że
wartość z pliku musi się równać wartości podanej,
.Dv \*[Lt] ,
określający, że wartość z pliku musi być mniejsza od podanej,
.Dv \*[Gt] ,
określający, że wartość z pliku musi być większa od podanej,
.Dv \*[Am] ,
określający, że wartość z pliku musi mieć wszystkie bity, które są ustawione
w podanej wartości,
.Dv ^ ,
określający, że wartość z pliku musi mieć
wyzerowane wszystkie bity, które są ustawione w podanej wartości, lub
.Dv ~ ,
określający, że podana wartość ma zostać zanegowana przed
przetestowaniem.
.Dv x ,
określa, że pasować może dowolna wartość. Jeśli
znak operacji jest pominięty, używany jest
.Dv = .
Operatory
.Dv \*[Am] ,
.Dv ^
i
.Dv ~
nie działają z liczbami zmiennoprzecinkowymi i
typu double. Operator
.Dv !\&
określa, że wiersz zostanie dopasowany
jeśli test
.Em nie
powiedzie się.
.Pp
Wartości numeryczne są podawane w postaci zgodnej z językiem C, np.
.Dv 13
to liczba dziesiętna,
.Dv 013
to liczba ósemkowa, a
.Dv 0x13
to
liczba szesnastkowa.
.Pp
Operacje numeryczne nie są przeprowadzane na typach daty; wartość numeryczna
jest zamiast tego interpretowana jako przesunięcie.
.Pp
Dla wartości łańcuchowych, łańcuch z pliku musi odpowiadać podanemu
łańcuchowi. Do łańcuchów mogą być stosowane operatory
.Dv = ,
.Dv \*[Lt]
i
.Dv \*[Gt]
(lecz nie
.Dv \*[Am] ) .
Długość, używana do
porównywania jest długością argumentu łańcuchowego z pliku
magicznego. Znaczy to, że wiersz można dopasować do dowolnego niepustego
łańcucha (zwykle używane do późniejszego wypisania łańcucha), stosując
.Em \*[Gt]\e0
(ponieważ wszystkie łańcuchy są większe od łańcucha zerowego).
.Pp
Daty są traktowane jako wartości numeryczne w odpowiedniej wewnętrznej
reprezentacji.
.Pp
Specjalny test
.Em x
zawsze daje prawdę.
.It Dv message
Komunikat do wypisania, jeśli porównanie powiedzie się. Jeśli łańcuch
zawiera określenie formatu
.Xr printf 3 ,
to wartość z pliku (po dokonaniu
ewentualnego podanego przekształcenia) jest wypisywana korzystając z
komunikatu jako łańcucha formatu. Jeśli łańcuch zaczyna się od
\[Bq]\eb\[rq], wypisywany komunikat jest resztą łańcucha bez dodanej przed
nim spacji: wielokrotne dopasowania są zwykle rozdzielone pojedynczą spacją.
.El
.Pp
Twórcę i typ APPLE w formacie 4+4 znaków można podać jako:
.Bd -literal -offset indent
!:apple	CREATYPE
.Ed
.Pp
Listę powszechnych rozszerzeń plików, rozdzieloną ukośnikiem, można podać
jako:
.Bd -literal -offset indent
!:ext	rozsz[/rozsz...]
.Ed
.Pp
tj. jako dosłowny łańcuch
.Dq !:ext ,
po którym następuje lista
powszechnych rozszerzeń plików, rozdzielona ukośnikiem; np. dla obrazów
JPEG:
.Bd -literal -offset indent
!:ext jpeg/jpg/jpe/jfif
.Ed
.Pp
Typ MIME jest podawany w osobnym wierszu, który musi wystąpić jako następny
niepusty wiersz niebędący komentarzem po wierszu magii identyfikującym typ
pliku; ma on następujący format:
.Bd -literal -offset indent
!:mime	TYPMIME
.Ed
.Pp
tj. dosłowny łańcuch
.Dq !:mime ,
po którym następuje typ MIME.
.Pp
W osobnym wierszu można podać opcjonalną siłę, która odnosi się do
aktualnego opisu magii; korzysta z następującego formatu:
.Bd -literal -offset indent
!:strength ARG WARTOŚĆ
.Ed
.Pp
Argumentem
.Dv ARG
może być:
.Dv + ,
.Dv - ,
.Dv *
lub
.Dv / ;
natomiast
.Dv WARTOŚĆ
jest stałą z przedziału 0-255. Na aktualnie
obliczonej domyślnej sile magii przeprowadzane jest działanie podane w
argumencie, którego drugim elementem jest podana stała.
.Pp
Niektóre formaty pliku zawierają dodatkowe informacje, które będą wypisane
razem z typem pliku lub wymagają dodatkowych testów aby określić prawdziwy
typ pliku. Te dodatkowe testy są wprowadzane za pomocą jednego lub wielu
znaków
.Em \*[Gt]
poprzedzających przesunięcie. Liczba znaków
.Em \*[Gt]
w wierszu określa poziom testu; wiersz bez
.Em \*[Gt]
na początku
jest na poziomie 0. Testy są ułożone w hierarchii drzewiastej: jeśli test w
wierszu na poziomie
.Em n
powiedzie się, wykonywane są wszystkie kolejne
testy na poziomie
.Em n+1 ,
a komunikaty są wypisywane jeśli testy powiodą
się, do momentu pojawienia się wiersza na poziomie
.Em n
(lub niższym). W
przypadku bardziej złożonych plików, można używać pustych komunikatów, aby
uzyskać efektywną składnię \[Bq]jeżeli/to\[rq], w następującej postaci:
.Bd -literal -offset indent
0      string    MZ
\*[Gt]0x18  uleshort  \*[Lt]0x40   pl. wykonywalny MS-DOS
\*[Gt]0x18  uleshort  \*[Gt]0x3f   rozsz. pl. wyk. PC (np. MS Windows)
.Ed
.Pp
Przesunięcia nie muszą być stałe, mogą być też odczytywane ze sprawdzanego
pliku. Jeśli pierwszym znakiem po ostatnim
.Em \*[Gt]
jest
.Em \&(
to
łańcuch po nawiasie jest interpretowany jako niebezpośrednie
przesunięcie. Oznacza to, że liczba po nawiasie jest używana jako
przesunięcie w pliku. Wartość na jakiej przesunięcie jest odczytane, jest
używana ponownie jako przesunięcie w pliku. Przesunięcia niebezpośrednie
mają postać
.Em ( x [[.,][bBcCeEfFgGhHiIlmosSqQ]][+\-][ y ]) .
Wartość
.Em x
służy jako przesunięcie w pliku. Bajt, długości id3 short lub long
jest odczytywany na tym przesunięciu, w zależności od określenia typu
.Em [bBcCeEfFgGhHiIlLmsSqQ] .
Wartość jest traktowana jako ze znakiem, jeśli
podano \[Bq],\[rq] lub bez znaku, jeśli podano \[Bq].\[rq]. Typy pisane
wielką literą są interpretowane jako wartość big endian, a małe litery
reprezentują wartość liczbową little endian; typ
.Em m
interpretuje
liczbę jako wartość middle endian (PDP-11). Do tej liczby dodawana jest
wartość
.Em y ,
a wynik służy jako przesunięcie w pliku. Domyślnym typem,
jeśli się go nie określi, jest long. Rozpoznawane są poniższe typy:
.Bl -column -offset indent Type Half/Short Little Size
.It Sy "Typ	" Sy "Skrót od	" Sy "Kol. baj." Sy Rozmiar
.It "bcBC	Byte/Char	N/A	1"
.It "efg	Double	Little	8"
.It "EFG	Double	Big	8"
.It "hs	Half/Short	Little	2"
.It "HS	Half/Short	Big	2"
.It "i	ID3	Little	4"
.It "I	ID3	Big	4"
.It "l	Long	Little	4"
.It "L	Long	Big	4"
.It "m	Middle	Middle	4"
.It "o	Octal	Tekstowa	Zmienny"
.It "q	Quad	Little	8"
.It "Q	Quad	Big	8"
.El
.Pp
W ten sposób można sprawdzić struktury o zmiennej długości:
.Bd -literal -offset indent
# Pliki wykonywalne MS Windows są też prawidłowymi pl. wyk. MS-DOS
0           string   MZ
\*[Gt]0x18       uleshort \*[Lt]0x40  Wykonywalny MZ (MS-DOS)
# pomiń poniższy blok, jeśli nie jest rozszerzonym pl. wykonywalnym
\*[Gt]0x18       uleshort \*[Gt]0x3f
\*[Gt]\*[Gt](0x3c.l)  string   PE\e0\e0 Wykonywalny PE (MS-Windows)
\*[Gt]\*[Gt](0x3c.l)  string   LX\e0\e0 Wykonywalny LX (OS/2)
.Ed
.Pp
Ten sposób ma swoje wady: trzeba się upewnić, że na końcu coś się wypisze
albo użytkownicy mogą otrzymać puste wyjście (np. gdy w powyższym
przykładzie nie jest to ani PE\e0\e0 ani LE\e0\e0).
.Pp
Jeśli nie da się bezpośrednio zastosować tego niebezpośredniego
przesunięcia, możliwe są proste obliczenia: dołączenie
.Em [+-*/%\*[Am]|^]liczba
wewnątrz nawiasów pozwala na modyfikację wartości
odczytanej z pliku, zanim zostanie użyta jako przesunięcie:
.Bd -literal -offset indent
# Pliki wykonywalne MS Windows są też prawidłowymi pl. wyk. MS-DOS
0           string   MZ
# czasem, wartość na 0x18 ma mniej niż 0x40 lecz wciąż jest to rozsz.
# plik wykonywalny, zatem po prostu dodajemy do pliku
\*[Gt]0x18       uleshort \*[Lt]0x40
\*[Gt]\*[Gt](4.s*512) leshort  0x014c  Wykonywalny COFF (MS-DOS, DJGPP)
\*[Gt]\*[Gt](4.s*512) leshort  !0x014c Wykonywalny MZ (MS-DOS)
.Ed
.Pp
Czasem dokładne przesunięcie nie jest znane, ponieważ zależy ono od długości
lub pozycji (tam gdzie wcześniej używano przesunięć niebezpośrednich)
poprzednich pól. Można podać przesunięcie względem końca ostatniego pola
wyższego poziomu za pomocą
.Sq \*[Am]
stosowanego jako przedrostek
przesunięcia:
.Bd -literal -offset indent
0           string   MZ
\*[Gt]0x18       uleshort \*[Gt]0x3f
\*[Gt]\*[Gt](0x3c.l)  string   PE\e0\e0    Wykonywalny PE (MS-Windows)
# po którym występuje podpis PE będący typem procesora
\*[Gt]\*[Gt]\*[Gt]\*[Am]0       leshort  0x14c     dla Intel 80386
\*[Gt]\*[Gt]\*[Gt]\*[Am]0       leshort  0x8664    dla x86-64
\*[Gt]\*[Gt]\*[Gt]\*[Am]0       leshort  0x184     dla DEC Alpha
.Ed
.Pp
Przesunięcia niebezpośrednie i względne można łączyć:
.Bd -literal -offset indent
0             string   MZ
\*[Gt]0x18         uleshort \*[Lt]0x40
\*[Gt]\*[Gt](4.s*512)   leshort  !0x014c Wykonywalny MZ (MS-DOS)
# jeśli to nie COFF, cofnij się o 512 bajtów i dodaj przesunięcie
# z bajtu 2/3, które stanowi inny sposób znalezienia początku
# rozszerzonego pliku wykonywalnego
\*[Gt]\*[Gt]\*[Gt]\*[Am](2.s-514) string   LE      Wykonywalny LE (ster. MS Windows VxD)
.Ed
.Pp
Lub na odwrót:
.Bd -literal -offset indent
0                 string   MZ
\*[Gt]0x18             uleshort \*[Gt]0x3f
\*[Gt]\*[Gt](0x3c.l)        string   LE\e0\e0  Wykonywalny LE (MS-Windows)
# na przesunięciu 0x80 (-4, ponieważ przesun. względne zaczynają się od
# końca dopasowania wyższego poziomu) wewnątrz nagłówka LE, znajdujemy
# absolutne przes. do kodu obszaru, gdzie szukamy określonego podpisu
\*[Gt]\*[Gt]\*[Gt](\*[Am]0x7c.l+0x26) string   UPX     \eb, skompresowany UPX
.Ed
.Pp
Lub podać oba!
.Bd -literal -offset indent
0                string   MZ
\*[Gt]0x18            uleshort \*[Gt]0x3f
\*[Gt]\*[Gt](0x3c.l)       string   LE\e0\e0 Wykonywalny LE (MS-Windows)
# na przesunięciu 0x58 w nagłówku LE, znajdujemy przesunięcie względne do
# obszaru danych, gdzie szukamy określonego podpisu
\*[Gt]\*[Gt]\*[Gt]\*[Am](\*[Am]0x54.l-3)  string   UNACE  \eb, samorozp. się archiwum ACE
.Ed
.Pp
Jeśli w pliku zachodzi konieczność radzenia sobie z duetami
przesunięcie/długość, z samego pliku można pobrać nawet drugą wartość w
wyrażeniu w nawiasie, za pomocą kolejnego zestawu nawiasów. Proszę zauważyć,
że to dodatkowe przesunięcie niebezpośrednie jest zawsze względem początku
głównego przesunięcia niebezpośredniego.
.Bd -literal -offset indent
0                 string       MZ
\*[Gt]0x18             uleshort     \*[Gt]0x3f
\*[Gt]\*[Gt](0x3c.l)        string       PE\e0\e0 Wykonywalny PE (MS-Windows)
# szukamy sekcji PE o nazwie ".idata"...
\*[Gt]\*[Gt]\*[Gt]\*[Am]0xf4          search/0x140 .idata
# ...i przechodzimy na jej koniec, obliczony jako początek+długość;
# są one zlokalizowane 14 i 10 bajtów po nazwie sekcji
\*[Gt]\*[Gt]\*[Gt]\*[Gt](\*[Am]0xe.l+(-4)) string       PK\e3\e4 \eb, archiwum samorozp. ZIP
.Ed
.Pp
Jeśli ma się listę znanych wartości na określonym poziomie kontynuacji i
chce się udostępnić domyślny przypadek w postaci przełącznikowej:
.Bd -literal -offset indent
# wyczyść dopasowania danego poziomu kontynuacji
\*[Gt]18	clear	x
\*[Gt]18	lelong	1	jeden
\*[Gt]18	lelong	2	dwa
\*[Gt]18	default	x
# wypisz domyślne dopasowanie
\*[Gt]\*[Gt]18	lelong	x	niedopasowane 0x%x
.Ed
.Sh ZOBACZ TAKŻE
.Xr file 1
\- polecenie odczytujące ten plik.
.Sh USTERKI
Formaty
.Dv long ,
.Dv belong ,
.Dv lelong ,
.Dv melong ,
.Dv short ,
.Dv beshort
i
.Dv leshort
nie zależą od długość typów danych C
.Dv short
i
.Dv long
na platformie, choć Single
.Ux
Specification
implikuje, że zależą. Jednak ponieważ OS X Mountain Lion przeszedł zestaw
walidacji Single
.Ux
Specification i dostarcza wersję
.Xr file 1
w
której brak jest zależności od rozmiarów typów danych C oraz która jest
zbudowana dla środowiska 64-bitowego, w którym
.Dv long
ma 8 bajtów, a
nie 4, być może zestaw walidujący nie sprawdza czy np.
.Dv long
odnosi
się to elementu o tym samym rozmiarze, co typ danych C
.Dv long .
Prawdopodobnie powinny występować nazwy
.Dv type
takie jak
.Dv int8 ,
.Dv uint8 ,
.Dv int16 ,
.Dv uint16 ,
.Dv int32 ,
.Dv uint32 ,
.Dv int64
i
.Dv uint64
oraz warianty o określonej kolejności
bajtów tychże, aby było jasne, że typy te mają określoną szerokość.
.\"
.\" From: guy@sun.uucp (Guy Harris)
.\" Newsgroups: net.bugs.usg
.\" Subject: /etc/magic's format isn't well documented
.\" Message-ID: <2752@sun.uucp>
.\" Date: 3 Sep 85 08:19:07 GMT
.\" Organization: Sun Microsystems, Inc.
.\" Lines: 136
.\"
.\" Here's a manual page for the format accepted by the "file" made by adding
.\" the changes I posted to the S5R2 version.
.\"
.\" Modified for Ian Darwin's version of the file command.
.\"
.\" For emacs editor
.\" Local Variables:
.\" eval: (add-hook 'before-save-hook 'time-stamp)
.\" time-stamp-start: ".Dd "
.\" time-stamp-end: "$"
.\" time-stamp-format: "%:B %02d, %:Y"
.\" time-stamp-time-zone: "UTC0"
.\" system-time-locale: "C"
.\" eval:(setq compile-command (concat "groff -Tlatin1 -m man " (buffer-file-name)) )
.\" End:
.\"
.Pp
.Sh TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika:
Przemek Borys <pborys@dione.ids.pl>,
Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>
i
Michał Kułach <michal.kulach@gmail.com>
.
.Pp
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach
licencji można uzyskać zapoznając się z
.Lk https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License w wersji 3
lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
.Pp
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy
dyskusyjnej
.Mt manpages-pl-list@lists.sourceforge.net
.Me .
