2011-02-10 13 views
7

Sto iniziando a chiedermi se questo è possibile anche se più ricerche su SO, Google, Bing e linuxquestions.org non hanno trovato nulla.Come si scrive un modello di prova di file magico in modo che corrisponda alla fine di un file?

Sono interessato ad estendere i motivi magici situati in /usr/share/magic (utilizzato dall'utilità file(1)) per riconoscere i file in base ai dati alla fine del file o vicino. Sono stato in grado di farlo all'inizio di un file, così come per gli offset arbitrari nel file dall'inizio.

La pagina man fa un buon lavoro illustrando alcuni casi di utilizzo standard; sfortunatamente, non sembra che ci sia un modo per indicizzare dalla fine piuttosto che all'inizio. L'unica soluzione alternativa che ho trovato è stata quella di adottare un approccio basato su script utilizzando tac e/o lreverse ma ritenere che questi dati potrebbero non essere adatti ai dati binari.

Inoltre, volevo evitare qualsiasi altra elaborazione basata su script - credo che questo dovrebbe essere fattibile con il file magico giusto. Qualche idea?

risposta

5

Non è possibile. file(1) è progettato per funzionare anche con i tubi. Non è possibile utilizzare lseek(2) sulle pipe per arrivare alla fine del file. Leggere l'intero file fino alla fine sarebbe molto lento (e lo file(1) tenta di essere veloce) e se effettivamente sta leggendo da una pipe, potrebbe non incontrare mai la fine del file, il che sarebbe anche peggio.

Per quanto riguarda la documentazione, nel caso di software open source, il codice sorgente stesso è la documentazione definitiva. Se rimani bloccato in un caso come questo, è sempre una buona idea dare un'occhiata. La funzione file_or_fd() in src/magic.c fornisce l'indizio. Usa la fonte, Luca! ;-)

Nel tuo caso specifico, vorrei dare una seconda occhiata al formato del file in questione, e se davvero non può essere analizzato da file(1), quindi un breve script Perl o Python dovrebbe fare il trucco. In bocca al lupo!

+0

Mack, grazie per questa spiegazione chiara e concisa. Non so perché, ma non mi è mai venuto in mente di guardare il codice sorgente. Questo è forse il miglior consiglio che avrei potuto ricevere! Grazie ancora, -Arj – jayce

+0

@Ari: prego! –

Problemi correlati