2011-11-23 12 views
13

Potrzebuję uzyskać nazwę pliku z danego deskryptora pliku, wewnątrz małego modułu jądra Linuxa, który napisałem. Próbowałem rozwiązania podanego pod Getting Filename from file descriptor in C, ale z jakiegoś powodu wypisuje wartości śmieci (przy użyciu readlink na /proc/self/fd/NNN, jak wspomniano w roztworze). Jak mogę to zrobić?Jak mogę uzyskać nazwę pliku z deskryptora pliku wewnątrz modułu jądra?

+0

możliwy duplikat [sys_readlink nie działa EFAULT - alternatywa] (http://stackoverflow.com/questions/8216871/sys-readlink-fails-efault-alternative) – ephemient

Odpowiedz

21

Nie dzwoń pod numer SYS_readlink - używaj tej samej metody, którą robi procfs po odczytaniu jednego z tych linków. Zacznij od kodu w proc_pid_readlink() i proc_fd_link() w fs/proc/base.c.

Ogólnie, podać int fd i struct files_struct *files od zadania jesteś zainteresowany (które miały odniesienie do), chcesz zrobić:

char *tmp; 
char *pathname; 
struct file *file; 
struct path *path; 

spin_lock(&files->file_lock); 
file = fcheck_files(files, fd); 
if (!file) { 
    spin_unlock(&files->file_lock); 
    return -ENOENT; 
} 

path = &file->f_path; 
path_get(path); 
spin_unlock(&files->file_lock); 

tmp = (char *)__get_free_page(GFP_KERNEL); 

if (!tmp) { 
    path_put(path); 
    return -ENOMEM; 
} 

pathname = d_path(path, tmp, PAGE_SIZE); 
path_put(path); 

if (IS_ERR(pathname)) { 
    free_page((unsigned long)tmp); 
    return PTR_ERR(pathname); 
} 

/* do something here with pathname */ 

free_page((unsigned long)tmp); 

Jeśli kod jest uruchomiony w proces- kontekst (np. wywoływany przez syscall) i deskryptor pliku pochodzi z bieżącego procesu, możesz użyć current->files dla bieżącego zadania struct files_struct *.

+0

Nice. To się udało. Dzięki! Szybkie pytanie. Do czego służą wywołania 'path_get' i' path_put' (ponieważ ich usunięcie nie ma większego wpływu na mój program)? Ponadto, każdy pomysł, dlaczego nie "sys_readlink" działa? – Siddhant

+1

@Siddhant: Wywołania 'path_get()' i 'path_put()' są wymagane dla poprawności, ponieważ przypinają ścieżkę, aby nie zniknęła podczas próby pracy z nią (wszystkie ścieżki 'struct path' zawiera parę wskaźników, do 'struct vfsmount' i' struct dentry'). – caf

+0

Aha. Dzięki jeszcze raz! – Siddhant

Powiązane problemy