Î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.