Într-o arhivă tar (numele provine de la "tape archive"), fiecare fişier e precedat de un antet de 512 octeţi (un sector), şi rotunjit în sus la un număr întreg de sectoare, ultimul sector fiind completat cu octeţi nuli. Arhiva se termină cu două sectoare nule.
Programul va fi rulat cu comanda
tar comandă fişier1 fişier2
... fişierN
Primul caracter al comenzii va fi unul din:
c
: crează arhivă
t
: tipăreşte conţinutul arhivei (numele fişierelor şi dimensiunile acestora)
Programul
citeşte / scrie arhiva (de) la intrarea / ieşirea standard. Numele de
fişiere sunt cele ale fişierelor care trebuie arhivate. Comanda t nu necesită nume de fişiere.
Antetul memorat în arhivă pentru fiecare fişier conţine numele fişierului la octetul 0, pe o lungime de max. 100 octeţi, inclusiv terminatorul nul (fişiere cu nume mai lungi nu pot fi arhivate). La deplasamentul 124, pe o lungime de 12 octeţi, se găseşte lungimea fişierului, ca şir de cifre octale, completat la stânga cu cifre 0 şi terminat cu caracterul nul. (Formatul complet e descris în fişierul /usr/include/tar.h).
Pentru început, implementaţi comanda t. Citiţi arhiva secvenţial (de exemplu câte un sector), şi extrageţi
numele şi lungimea fişierelor (fără rotunjire la sectoare
întregi). Puteţi verifica programul pe o arhivă reală creată cu programul UNIX
tar folosind aceeaşi sintaxă. Implementaţi apoi comanda c.
Pentru a afla de la început care e dimensiunea fiecărui fişier de arhivat,
puteţi folosi funcţia fseek cu ultimii doi parametri 0 şi respectiv
SEEK_END şi apoi funcţia ftell odată ce fişierul a fost deschis (după care va trebui să repoziţionaţi indicatorul la început de fişier).
Toate fişierele vor fi deschise în mod binar. Vă veţi putea verifica implementarea lui c doar
cu propria implementare a lui t şi nu cu programul UNIX tar
deoarece varianta simplificată propusă aici nu completează toate câmpurile din
antet.