Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.62 KB | None | 0 0
  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/proc_fs.h>
  4. #include <linux/uaccess.h>
  5.  
  6. #define PROCFS_MAX_SIZE         1024
  7. #define PROCFS_NAME             "test1"
  8.  
  9. static struct proc_dir_entry *Our_Proc_File;
  10. static char procfs_buffer[PROCFS_MAX_SIZE];
  11. static unsigned long procfs_buffer_size = 0;
  12.  
  13. static int Device_Open = 0;
  14. // Обработчик чтения из файла в /proc.
  15. ssize_t procfile_read(struct file *filePointer,char *buffer, size_t buffer_len$
  16. {
  17.         if (*offset >= sizeof(procfs_buffer)) return 0;
  18.         copy_to_user(buffer, procfs_buffer, sizeof(procfs_buffer));
  19.         *offset += buffer_length;
  20.  
  21.     printk(KERN_INFO "leaving /proc/test : procfile_read, wrote %d Bytes\n",(i$
  22.  
  23.     return buffer_length;
  24. }
  25. static ssize_t procfile_write(struct file *file, const char *buff,
  26.                               size_t length, loff_t *offset)
  27. {
  28.         procfs_buffer_size = length;
  29.         if (procfs_buffer_size > PROCFS_MAX_SIZE)
  30.                 procfs_buffer_size = PROCFS_MAX_SIZE;
  31.  
  32.         memset(procfs_buffer, 0, sizeof(procfs_buffer));
  33.         if (copy_from_user(procfs_buffer, buff, procfs_buffer_size))
  34.                 return -EFAULT;
  35.         procfs_buffer[procfs_buffer_size] = '\0';
  36.         printk(KERN_INFO "leaving /proc/test : procfile_write,  %s \n", procfs$
  37.         return procfs_buffer_size;
  38. }
  39. static int procfile_open(struct inode *inode, struct file *file)
  40. {
  41.   static int counter = 1;
  42.   if (Device_Open) return -EBUSY;
  43.   Device_Open++;
  44.   printk(KERN_INFO "procfile_was_opened\n");
  45.   return 0;
  46. }
  47.  
  48. static int procfile_release(struct inode *inode, struct file *file)
  49. {
  50.   printk("Released.\n");
  51.   Device_Open--;                /* Теперь мы готовы обслужить другой процесс */
  52. // Уменьшить счетчик обращений, иначе, после первой же удачной попытки открыть$
  53.  
  54.   return 0;
  55. }
  56. static const struct file_operations proc_fops = {
  57.    .owner = THIS_MODULE,
  58.    .read = procfile_read,
  59.    .write = procfile_write,
  60.    .open = procfile_open,
  61.    .release = procfile_release,
  62. };
  63.  
  64. int init_module()
  65. {
  66.   int rv = 0;
  67.   printk(KERN_INFO "Trying to create /proc/test:\n");
  68.  
  69.   Our_Proc_File = proc_create(PROCFS_NAME, 0644, NULL, &proc_fops);
  70.   if (Our_Proc_File == NULL) {
  71.     rv = -ENOMEM;
  72.     proc_remove(Our_Proc_File);
  73.     printk(KERN_INFO "Error: Could not initialize /proc/test\n");
  74.   }
  75.   else {
  76.     printk(KERN_INFO "Success!\n");
  77.   }
  78.  
  79.   return rv;
  80. }
  81.  
  82.  
  83. void cleanup_module()
  84. {
  85.   proc_remove(Our_Proc_File);
  86.   printk(KERN_INFO "/proc/test removed\n");
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement