This shows you the differences between two versions of the page.
programare:teme_2014:tema5 [2013/12/26 18:04] laura.vasilescu [Enunţul temei] |
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 16: | Line 18: | ||
* să creeze fișiere binare respectând o anumită specificație | * să creeze fișiere binare respectând o anumită specificație | ||
- | ====== Enunţul temei ====== | + | ====== 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. | 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. | ||
Line 22: | Line 24: | ||
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. | 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 [[http://www.mksxserver.com/docs/man4/tar.4.asp|o specificație]] a formatului. Așa că au nevoie de ajutorul vostru pentru a îi face pe plac Moșului. | + | 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 [[http://www.mksxserver.com/docs/man4/tar.4.asp|o specificație]] a formatului. Așa că au nevoie de ajutorul vostru pentru a îi face pe plac Moșului. :) |
- | ===== Cerința temei ===== | + | ===== 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: | ||
+ | <code> | ||
+ | [...] | ||
+ | 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 | ||
+ | </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 == | ||
+ | |||
+ | 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: | ||
+ | <code> | ||
+ | -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 | ||
+ | </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ă. | ||