Revista Do Linux
 
EDIÇÃO DO MÊS
 CD do Mês

 Capa
 Estudo de Caso
 Entrevista
 Corporativo
 Software
 Desenvolvimento
 Iniciantes
 Hardware
 Distro
 Tutorial
 Segurança
 Sistema
 Banco de Dados
 
 
 
 
Mágica e Adivinhações
 
Como as aplicações Linux reconhecem os inúmeros tipos de arquivos existentes
 
Nos últimos meses, conhecemos diversos arquivos de configuração do Linux. Vimos como configurar uma rede, mudar a aparência do console, criar usuários e grupos, mudar configurações da inicialização do sistema, entre outras situações. Este mês, vamos conhecer um pouco mais sobre o sistema Linux, compreendendo como o sistema faz para reconhecer os tipos de arquivos. Como de costume, todas as edições de arquivos terão de ser feitas pelo usuário root, de forma que todo o cuidado é pouco.
 
Um dos primeiros aspectos de um sistema Linux, que um novo usuário vindo de outros sistemas operacionais percebem, é a falta de extensões nos arquivos. Acostumados a aplicativos que reconhecem arquivos apenas pelos seus nomes, muitos se perguntam como é possível saber qual o tipo de um arquivo, já que todos parecem ser idênticos.
 
Bem, o sistema tem de fazer uso de um pouco de mágica e um pouco de adivinhação. Como se fosse aquele jogo onde um participante faz mímicas e o outro tem de adivinhar o que é, o Linux tem um sistema que faz uso de pequenos sinais para adivinhar o tipo de arquivo.
 
É virtualmente impossível reconhecer o tipo de arquivo pelo seu nome (não se engane, um arquivo .sh pode ser tanto um script shell quanto uma imagem jpeg) no Linux. Por outro lado, o sistema, assim como as aplicações, deve reconhecer o que é um arquivo. Como fazer isso? É neste ponto que o jogo de adivinhações entra em cena. O sistema pega o arquivo e examina seu conteúdo para ver se reconhece o arquivo, da mesma forma como qualquer um de nós tenta reconhecer uma mímica. Enquanto nós seres humanos usamos nosso reconhecimento de padrões e nossa memória, o sistema Linux usa um arquivo texto para tentar reconhecer o arquivo. Este arquivo texto é chamado de /etc/mime-magic.
 
O mime-magic contém padrões conhecidos que podem ajudar a reconhecer um tipo de arquivo. A "mágica" é feita por pequenos padrões únicos que cada tipo de arquivo contém. Por exemplo, um arquivo Tar contém a string "ustar" na posição 257. O sistema procura esta string e, se achar, considera o arquivo como sendo um arquivo Tar. A linha equivalente aos arquivos Tar no mime-magic é:
 
257 string ustar\0 application/x-tar
 
O formato do arquivo mime-magic consiste de quatro campos:
 
* Offset: é a posição no arquivo onde o padrão de reconhecimento pode ser encontrado. Na grande maioria dos arquivos, este offset é no byte zero, ou seja, no início do arquivo;
* Tipo: identifica que tipo de padrão estaremos procurando. Pode ser:
# string: trata-se de uma seqüência de caracteres. Por exemplo, temos o próprio Tar que contém a string "ustar"
# short: é um número do tipo "short". Por exemplo, um arquivo CPIO é identificado pelo short 070707 na posição zero.
#long: um número do tipo "long". Por exemplo, arquivos compilados LISP podem ser reconhecidos por um long 0x020c010c no início do arquivo.
# leshort: um número do tipo "short" em notação little-endian. Por exemplo, o compactador ARJ cria arquivos que contém o leshort 0xea60 na posição zero.
# beshort: um número do tipo "short" em notação big-endian. Um exemplo são as bibliotecas compartilhadas que contém o beshort 0x0104 no início do arquivo.
# lelong: um número do tipo "long" em notação little-endian. Um exemplo são os arquivos core do Linux/i386.
# belong: um número do tipo "long" em notação big-endian. Um exemplo são os arquivos de vídeo MPEG. Além destes, existem mais alguns que são, na realidade, operações lógicas sobre um dos tipos mencionados acima. Por exemplo, os arquivos MP3 são reconhecidos fazendo-se a operação lógica AND entre um belong, encontrado na posição zero, e o número 0xfff0.
* valor: é o próprio padrão a ser encontrado. Este valor deve ser do tipo especificado.
* identificador: é uma string representando o tipo do arquivos.
 
A string identificadora de arquivo tem sempre a forma categoria/tipo. Por exemplo, um arquivo de vídeo MPEG é identificado como video/mpeg. Algumas das categorias são:
application: arquivos desta categoria são geralmente documentos gerados por alguma aplicação bem específica como um processador de textos ou planilha eletrônica.
video: arquivos de diversos tipos de vídeo.
audio: arquivos de sons de diversos formatos.
text: arquivos plain text em geral como HTML, SGML, etc.
image: arquivos de imagens como JPEG, PNG, etc.
 
Já o tipo do arquivo identifica especificamente qual o tipo do arquivo. Por exemplo, um arquivo HTML é identificado como text/html, ou seja, sua categoria é text e seu tipo html. Simples e fácil. Nada que um pouco de mágica e adivinhação não resolvam.
 
Como, aparentemente, na vida nada é padrão, existem algumas aplicações que fogem ao padrão descrito acima. Por exemplo, um arquivo C gerado pelo Lex será identificado como "C program text (from lex)". Vá entender.
 
De toda a forma, quando um aplicativo precisa saber o tipo de arquivo, ele faz uma chamada de sistema que lhe retornará a string identificadora do tipo de arquivo. Por isso, não só é possível, mas relativamente fácil saber o tipo de um arquivo.
 
Como nós seres humanos ainda não fomos geneticamente alterados para fazermos chamadas ao sistema e eventualmente queremos saber o tipo de um arquivo, podemos apelar para o comando file.
 
O comando file é um programa bastante simples que apenas usa o mime-magic para reconhecer um tipo de arquivo e imprimir esta informação na tela.
 
maragato@estacao.conectiva:~ > file ssh.tar
ssh.tar: GNU tar archive
maragato@estacao.conectiva:~ > file xpenguins-2.1-1.i386.rpm
xpenguins-2.1-1.i386.rpm: RPM v3 bin i386 xpenguins-2.1-1
 
Como se pode ver, o comando file pode nos informar exatamente o tipo do arquivo especificado como parâmetro. Às vezes, um tipo pode não ser tão fácil de achar, mas o file descobre. Por exemplo, este artigo foi gerado com o KWord. Para quem não conhece, o formato do KWord é comprimido com gzip. Assim, num primeiro momento, se esperaria que o comando file simplesmente reconhecesse este arquivo como um arquivo gzip, mas este não é o caso:
 
maragato@estacao.conectiva:~/revista > file sistema-agosto-2001.kwd
sistema-agosto-2001.kwd: gzip compressed data, deflated, original filename, `KOffice application/x-kword', last modified: Thu Aug 23 17:12:29 2001, os: Unix
 
Note que o comando file detectou o arquivo como comprimido e ainda retornou o tipo do arquivo original ("application/x-kword"). Isto torna o file um comando útil em scripts shell.
 
Roberto Teixeira
maragato@conectiva.com.br
 
 
 
 
 
 

A Revista do Linux é editada pela Conectiva S/A
Todos os Direitos Reservados.

Política de Privacidade
Anuncie na Revista do Linux