This shows you the differences between two versions of the page.
programare:teme_2014:tema5 [2013/12/26 18:25] laura.vasilescu [Funcționarea programului] |
programare:teme_2014:tema5 [2014/01/10 21:49] (current) laura.vasilescu [Trimitere temă] |
||
---|---|---|---|
Line 8: | Line 8: | ||
**Deadline (hard):** joi, 16 ianuarie, ora 23:55 | **Deadline (hard):** joi, 16 ianuarie, ora 23:55 | ||
+ | |||
+ | ** checker: ** [[http://lauravasilescu.ro/5-tar.zip|http://lauravasilescu.ro/5-tar.zip]] [05.01.2014, ora 21:00] | ||
====== Obiective ====== | ====== Obiective ====== | ||
Line 28: | Line 30: | ||
* **usermap.txt** | * **usermap.txt** | ||
* **file_ls** | * **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 == | == usermap.txt == | ||
Line 45: | Line 49: | ||
</code> | </code> | ||
+ | *) 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 == | == file_ls == | ||
Line 55: | Line 60: | ||
-rw-rw-r-- 1 lvasilescu lvasilescu 214200 2013-12-16 17:55:10.190055687 +0200 test | -rw-rw-r-- 1 lvasilescu lvasilescu 214200 2013-12-16 17:55:10.190055687 +0200 test | ||
</code> | </code> | ||
+ | |||
+ | ===== 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 [[http://www.mksxserver.com/docs/man4/tar.4.asp|aici]]. | ||
+ | Practica, structura header-ului ar trebui să fie ceva de genul: | ||
+ | <code> | ||
+ | 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; | ||
+ | }; | ||
+ | </code> | ||
+ | |||
+ | 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. | ||
+ | |||
+ | <note> | ||
+ | Toate valorile trebuie să fie în **octal**. Vedeți în documentație. | ||
+ | </note> | ||
+ | |||
+ | ===== Trimitere temă ===== | ||
+ | |||
+ | |||
+ | |||
+ | * Tema va fi trimisă atât pe [[https://elf.cs.pub.ro/vmchecker/|vmchecker]] cât și pe [[http://cs.curs.pub.ro|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ă. | ||
+ |