int unlink(sciezka) char *sciezka; /* nazwa pliku /* W przypadku powodzenia zwraca 0, bledu -1 */
Glowna struktura danych na ktorej dokonywane sa operacje dla funkcji unlink jest sturktura i-wezla (inode).
Oto dokladna definicja struktury inode z pliku include/linux/fs.h:
struct inode { kdev_t i_dev; unsigned long i_ino; umode_t i_mode; nlink_t i_nlink; uid_t i_uid; gid_t i_gid; kdev_t i_rdev; off_t i_size; time_t i_atime; time_t i_mtime; time_t i_ctime; unsigned long i_blksize; unsigned long i_blocks; unsigned long i_version; unsigned long i_nrpages; struct semaphore i_sem; struct inode_operations *i_op; struct super_block *i_sb; struct wait_queue *i_wait; struct file_lock *i_flock; struct vm_area_struct *i_mmap; struct page *i_pages; struct dquot *i_dquot[MAXQUOTAS]; struct inode *i_next, *i_prev; struct inode *i_hash_next, *i_hash_prev; struct inode *i_bound_to, *i_bound_by; struct inode *i_mount; unsigned short i_count; unsigned short i_flags; unsigned char i_lock; unsigned char i_dirt; unsigned char i_pipe; unsigned char i_sock; unsigned char i_seek; unsigned char i_update; unsigned short i_writecount; union { struct pipe_inode_info pipe_i; struct minix_inode_info minix_i; struct ext_inode_info ext_i; struct ext2_inode_info ext2_i; struct hpfs_inode_info hpfs_i; struct msdos_inode_info msdos_i; struct umsdos_inode_info umsdos_i; struct iso_inode_info isofs_i; struct nfs_inode_info nfs_i; struct xiafs_inode_info xiafs_i; struct sysv_inode_info sysv_i; struct affs_inode_info affs_i; struct ufs_inode_info ufs_i; struct socket socket_i; void * generic_ip; } u; };
Kod zrodlowy tej funkcji znajduje sie w pliku linux/fs/namei.c,
a czesc zalezaca bezposrednio od konkretnego systemu plikow w jednym
z podkatalogow w katalogu lunux/fs. Opisany nizej algorytm
opiera sie na systemie plikow ext2. I algorytm jest zdefiniowany
w pliku linux/fs/ext2/namei.c.
Procedura sys_unlink (opisana ponizej) jest wykonywana w trybie
jadra systemu.
DEFINICJA: asmlinkage int sys_unlink(pathname) const char *pathname; WYNIK: 0 w przypadku sukcesu, -1 wpp.
{ Kopiuj plik do wolnej przestrzeni adresowej jadra; Wywolaj funkcje do_unlink(); Zwolnij zarezerwowane strony przestrzeni jadra systemu; }
DEFINICJA: int do_unlink(name) const char *name; WYNIK: 0 w przypadku sukcesu, -1 wpp.
{ Zwroc i-wezel katalogu macierzystego danego pliku(dir_namei); Sprawdz czy plik nie jest tylko do odczyty(IS_RDONLY); Sprawdz czy w katalogu jest prawo do pisania(MAY_WRITE) i wykonywania(MAY_EXEC); Sprawdz czy i-wezel katalogu moze byc modyfikowany(IS_APPEND); Sprawdz czy dostepna jest operacja unlink; Wywolaj funkcje charakterystyczna dla systemu plikow (w naszym przypadku ext2_unlink); }
DEFINICJA: int ext2_unlink(dir, name, len) struct inode *dir; const char *name; int len; WYNIK: 0 w przypadku sukcesu, -1 wpp.
{ Powtarzaj: Znajdz plik o poszukiwanej nazwie i zwroc bufor; Pobierz i-wezel katalogu macierzystego znalezionego pliku; Sprawdz czy katalog lub urzytkownik ma prawo do usuniecia dowiazania; Sprawdz czy mozna modyfikowac i-wezel lub czy jest modyfikowany jezeli tak zwroc blad; Jezeli i-wezel katalogu znalezionego pliku jest rozny od i-wezla katalogu macierzystego szukanego pliku to wroc do Powtarzaj Sprawdz czy jezeli urzytkownik bierzacy nie ma praw do usuniecia dowiazania i urzytkownik nie jest superurzytkownikiem, to czy jest wlascicielem pliku lub katalogu macirzystego; Usun dane o pliku z tablicy plikow; Zapisz informacje z bufora na plik i czekaj az operacja sie zakonczy; Zmien czas zmian w i-wezle katalogu bierzacym; Zmien czas zmian w i-wezle pliku na ustalony wczesniej dla katalogu; Zwolnij bufor; Zwolnij i-wezel pliku; Zwolnij i-wezel katalogu; }