Tema de casă 5 - Arhivator tar

În această temă veţi implementa un arhivator minimal, compatibil tar

Responsabil: Laura Vasilescu

Publicarea temei: joi, 9 ianuarie, ora 23:56

Deadline (hard): joi, 16 ianuarie, ora 23:55

checker: http://lauravasilescu.ro/5-tar.zip [05.01.2014, ora 21:00]

Obiective

În urma realizării acestei teme, studentul va fi capabil:

  • să lucreze cu fișiere text
  • să parseze un text pentru a extrage diferite informații
  • să creeze fișiere binare respectând o anumită specificație

Enunțul temei

Mihai și Ilinca s-au distrat foarte mult cu ocazia sărbătorilor. Pentru că au fost copii cuminți, au primit o vizită de la Moș Crăciun cu care au făcut foooarte multe poze.

Moșul i-a rugat pe cei doi să îi trimită o arhivă tar cu pozele făcute, deoarece clientul său de mail nu suportă decât un singur fișier ca atașament.

Cei doi sunt foarte încântanți să îi trimită mail-ul, însă nu au găsit un utilitar care să îi ajute să realizeze arhiva. Tot ce au găsit este o specificație a formatului. Așa că au nevoie de ajutorul vostru pentru a îi face pe plac Moșului. :)

Funcționarea programului

Implementarea voastră trebuie să genereze un executabil numit my_tar. Acesta primește comenzi de la standard input și se folosește de 2 fișiere adiționale, al căror nume este predefinit, și care trebuie să se afle în același director cu executabilul:

  • usermap.txt
  • file_ls

Programul vostru trebuie să fie capabil de a verificat existența celor două fișiere. Acesta poate presupune că informația găsită în interior, este una corectă.

usermap.txt

Conține output-ul comenzii cat /etc/passwd. Exemplu:

[...]
sshd:x:114:65534::/var/run/sshd:/usr/sbin/nologin
[...]
admin:x:1003:118::/home/admin:/bin/sh
[...]
mysql:x:116:127:MySQL Server,,,:/nonexistent:/bin/false
[...]
ntp:x:121:135::/home/ntp:/bin/false
[...]
lvasilescu:x:1008:1008:Laura Vasilescu,,,:/home/lvasilescu:/bin/bash

*) Am folosit […] pentru a simboliza faptul că mai existau și alte linii; Fișierul /etc/passwd este, de regulă, destul de lung, dar nu avea sens postarea lui integrală aici.

file_ls

Se obține din output-ul generat de comanda ls -la –time-style=full-iso în directorul în care se află fișierele pe care dorim să le arhivăm.

Se păstrează doar linile care fac referire la fișierele pe care dorim să le includem în arhivă. Exemplu:

-rw-rw-r-- 1 lvasilescu lvasilescu      8 2013-12-16 17:55:15.882089310 +0200 a
-rw-rw-r-- 1 lvasilescu lvasilescu 214200 2013-12-16 17:55:10.190055687 +0200 test

Comenzi de intrare

După cum spuneam, programul acceptă comenzi de la standard input.

Fiecare comandă reprezintă o linie. Puteți presupune că o linie are maximum 511 caractere.

Mai jos sunt descrise comenzile pe care trebuie să le recunoască programul vostru:

load archivename

Această comandă creează arhiva, folosindu-se de informații extrase din usermap.txt și file_ls.

archivename reprezintă numele arhivei ce va fi creată.

În urma acestei comenzi trebuie să se obțină o arhivă cu numele cerut, care să conțină toate fişierele (fără directoare) enumerate în file_ls.

list archivename

Comanda va lista în consolă numele fișierelor din arhivă. Câte unul pe linie.

get archivename filename

Comanda va extrage din arhivă conținutul fișierului filename și îl va afișa în consolă.

În urma acestei comenzi, conținutul arhivei rămâne identic.

quit

Închide programul.

Formatul arhivei tar

Mai multe detalii găsiți aici. Practica, structura header-ului ar trebui să fie ceva de genul:

union record {
        char charptr[512];
        struct header {
                char name[100];
                char mode[8];
                char uid[8];
                char gid[8];
                char size[12];
                char mtime[12];
                char chksum[8];
                char typeflag;
                char linkname[100];
                char magic[8];
                char uname[32];
                char gname[32];
                char devmajor[8];
                char devminor[8];
        } header;
};

Câmpurile name, mode, uid, gid, size, mtime, uname, gname vor fi determinate din fișierele usermap.txt și/sau file_ls.

chksum se compltează făcând suma între toți octeții ce alcătuiesc headerul.

typeflag va fi 0.

linkname reprezintă numele fișierului.

magic o să fie string-ul “GNUtar ” (atenție, e un spațiu la final!)

devmajor și devminor o să fie 0.

Toate valorile trebuie să fie în octal. Vedeți în documentație.

Trimitere temă

  • Tema va fi trimisă atât pe vmchecker cât și pe moodle, sub forma unei arhive ZIP.
  • Arhiva va trebui să conţină în directorul rădăcină doar următoarele:
    • Codul sursă al programului vostru (fişierele .c şi eventual .h).
    • Un fişier Makefile care să conţină regulile build şi clean. Regula build va compila programul într-un executabil cu numele my_tar. Regula clean va şterge executabilul şi eventual toate binarele intermediare (fişiere obiect) generate de voi.
    • Un fişier README care să conţină prezentarea implementării alese de voi.
  • O temă care nu compilează nu va primi nici un punct.
  • Criteriile de notare sunt următoarele:
    • 90 puncte - testele automate din arhiva de testare.
    • 10 puncte - calitatea şi eficienţa implementării, explicaţiile din README şi aspectul codului sursă.
programare/teme_2014/tema5.txt · Last modified: 2014/01/10 21:49 by laura.vasilescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0