#include#include int mknod(sciezka, tryb, nrurz) char *sciezka; /* nazwa pliku char *tryb; /* tryb pliku int nrurz; /* numer urzadzenia /* W przypadku powodzenia zwraca 0, bledu -1 */
W odroznieniu do Unix'a, gdzie funkcja mknod jest wykorzystywana do tworzenia katalogow. W systemie Linux jest zdefiniowana oddzielna funkcja do tworzenia katalogow.
Glowna struktura danych na ktorej dokonywane sa operacje dla funkcji mknod 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_mknod (opisana ponizej) jest wykonywana w trybie
jadra systemu.
DEFINICJA: asmlinkage int sys_mknod(filename, mode, dev)
const char *filename;
int mode;
dev_t dev;
WYNIK: 0 w przypadku sukcesu, -1 wpp.
{
Sprawdz czy plik jest katalogiem
Jezeli tak to blad;
Jezeli plik nie jest kolejka FIFO
i urzytkownik nie jst super urzytkownikiem
to zwroc rowniez blad;
Sprawdz czy typ pliku specjalnego jest dostepny w systemie
(jezeli nie zostanie podany domyslnie przyjmowany jest
jako plik);
Zapisz plik do pamieci jadra systemu;
Wywolaj funkcje do_mknod();
Zwolnij i-wezel katalogu macierzystego;
}
DEFINICJA: int do_mknod(filename, mode, dev)
const char *filename;
int mode;
dev_t dev;
WYNIK: 0 w przypadku sukcesu, -1 wpp.
{
Pobierz i-wezel katalogu macierzystego (funkcja dir_namei);
Sprawdz czy katalog nie jest wylacznie przeznaczony do odczytu (IS_RDONLY());
Sprawdz czy katalog posiada prawa do pisania (MAY_WRITE)
i wykonywania (MAY_EXEC);
Sprawdz czy w systemie plikow katalogu macierzystego jest dostepna operacja
mknod;
Zwieksz licznik dowiazan plikow w katalogu macierzystym;
Blokuj katalog macierzysty (opuszczenie semafora)(down(&dir->i_sem));
Wywolaj funkcje ext2_mknod() (charakterystyczna dla systemu plikow);
Odblokuj katalog macierzysty (up(&dir->i_sem));
Zwolnij i-wezel katalogu macierzystego;
}
DEFINICJA: int ext2_mknod(dir, name, len, mode, rdev)
struct inode *dir;
const char *name;
int len;
int mode;
int rdev;
WYNIK: 0 w przypadku sukcesu, -1 wpp.
{
Szukaj w danym katalogu pliku o poszukiwanej nazwie
(ext2_find_entry). Zwroc znaleziony bufor.
Jezeli znaleziony zwroc blad.
Utworz i inicjuj nowy i-wezel.
W razie bledu zwolnij i-wezel katalogu macierzystego i zwroc blad;
Ustaw identyfikator wlasciciela pliku;
Ustaw prawa do pliku;
Okresl operacje w zaleznosci od pliku specjalnego;
Dodaj plik do danego katalogu (ext2_add_entry).
Jezeli plik jest synchronizowany zapisz informacje z bufora do
urzadzenia;
Zwolnij bufor;
Zwolnij i-wezel katalogu macierzystego;
Zwolnij nowo powstaly i-wezel;
}