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;
}