+ -
当前位置:首页 → 问答吧 → 怎么从文件描述符知道文件路径??

怎么从文件描述符知道文件路径??

时间:2010-07-15

来源:互联网

拦截系统调用的操作
如果是OPEN:
asmlinkage long sys_open(const char __user *filename,int flags, int mode);
有filename这个参数,我代码里直接if(filename判断一下是不是等于某个指定文件),就可以做到指定文件打不开。
但是现在想要做打的开可以看不能写,我发现
asmlinkage long sys_write(unsigned int fd, const char __user *buf,size_t count);
这里面只有fd,我怎么能从fd判断是不是一个指定文件呢?

作者: zonelight   发布时间: 2010-07-15

通过文件描述符获得对应的文件结构体指针,然后利用d_path函数就可以了

作者: superhappy1   发布时间: 2010-07-15



QUOTE:
通过文件描述符获得对应的文件结构体指针,然后利用d_path函数就可以了
superhappy1 发表于 2010-07-15 15:51


求具体的做法
char * d_path (        const struct path *          path,
        char *          buf,
        int          buflen);
我查到这个,但是怎么用啊?如何去“获得对应的文件结构体指针”?

作者: zonelight   发布时间: 2010-07-15

本帖最后由 kgn28 于 2010-07-15 18:10 编辑

回复 zonelight


    current->files->fd_array[fd]->f_dentry->d_name :
  1. #include <linux/kernel.h>
  2. #include <linux/module.h>
  3. #include <linux/init.h>
  4. #include <linux/fs.h>
  5. #include <linux/string.h>
  6. #include <linux/mm.h>
  7. #include <linux/syscalls.h>
  8. #include <asm/unistd.h>

  9. MODULE_LICENSE("GPL");

  10. #define MY_FILE "/"

  11. char filename[1000];

  12. int print_dentry(struct dentry *den, char *p)
  13. {
  14.         int len;
  15.         if(den == den->d_parent){
  16.                 return 0;
  17.         }
  18.         len = print_dentry(den->d_parent, p);
  19.         sprintf(p+len, "/%s", den->d_name.name);
  20.         return len + strlen(den->d_name.name) + 1;
  21. }

  22. int __init mem_module_init(void)
  23. {
  24.         struct file *f = NULL;
  25.         struct dentry *den = NULL;

  26.         printk("module init\n");
  27.         f = filp_open("/root/program/test/simple/hello.c", O_RDWR | O_APPEND | O_CREAT, 0644);
  28. //        f = filp_open(MY_FILE, O_RDONLY | O_DIRECTORY, 0644);
  29.         if (IS_ERR(f)) {
  30.                 printk("error occured while opening file %s, exiting...\n", MY_FILE);
  31.                 return 0;
  32.         }
  33.         den = f->f_dentry;
  34.         print_dentry(den, filename);
  35.         printk("%s\n", filename);
  36.        
  37.         return 0;
  38. }

  39. void __exit mem_module_exit(void)
  40. {

  41.         printk("hello modle exit\n");
  42. }

  43. module_init(mem_module_init);
  44. module_exit(mem_module_exit);
复制代码

作者: kgn28   发布时间: 2010-07-15

http://linux.chinaunix.net/bbs/thread-1166566-1-5.html

作者: zyr-linux   发布时间: 2010-07-16

你先查看下文件描述符的结构体

作者: linux初学三月   发布时间: 2010-07-16

热门下载

更多