Advertisement
orzechtbg

zadanie1.lab4.SO

Apr 19th, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.14 KB | None | 0 0
  1. #include<linux/module.h>
  2. #include<asm/uaccess.h>
  3. #include<linux/proc_fs.h>
  4. #include<linux/seq_file.h>
  5.  
  6. static struct proc_dir_entry *directory_entry_pointer, *file_entry_pointer; // deklaracja dwoch wskaznikow na strukture typu struct proc_dir_example
  7. static char *directory_name = "procfs_test", *file_name = "procfs_file"; // zmienne wskazujace na lancuch(podkatalog i plik)
  8. static char file_buffer[PAGE_SIZE]; //bufor na dane pliku(4KiB)
  9.  
  10. static int procfsmod_show(struct seq_file *seq, void *data)
  11. {  
  12.     char *notice = (char *)data;
  13.     seq_printf(seq, "Pierwszy znak w pliku tekstowym o nazwie %s:  to: %c \n",*file_name, file_buffer[0]);
  14.     return 0;
  15. }
  16.  
  17. static void *procfsmod_seq_start(struct seq_file *s, loff_t *position)
  18. {
  19.     loff_t buffer_index = *position;
  20.     return (buffer_index<PAGE_SIZE && file_buffer[buffer_index]!='\0')?(void *)&file_buffer[buffer_index]:NULL;
  21. }
  22.  
  23. static void *procfsmod_seq_next(struct seq_file *s, void *data, loff_t *position)
  24. {
  25.     loff_t next_element_index = ++*position;
  26.     return (next_element_index<PAGE_SIZE && file_buffer[next_element_index]!='\0')?(void *)&file_buffer[next_element_index]:NULL;
  27. }
  28.  
  29. static void procfsmod_seq_stop(struct seq_file *s, void *data) // funkcja pusta bo nie potrzba stosowac zadnych finalizacji iteratora(poniewaz buffor ma pamiec jest zrobiony statycznie i nie trzeba zwalniac na niego pamieci)
  30. {
  31. }
  32.  
  33. static struct seq_operations procfsmod_seq_operations = {
  34.     .start = procfsmod_seq_start,
  35.     .next = procfsmod_seq_next,
  36.     .stop = procfsmod_seq_stop,
  37.     .show = procfsmod_show
  38. };
  39.  
  40. static int procfsmod_open(struct inode *inode, struct file *file)
  41. {
  42.     return single_open(file, procfsmod_show, NULL); // zamiennik dla funkcji seq_open(), uzywana do odzczytania pojedynczej wartosci
  43. }
  44.  
  45. static ssize_t procfsmod_write(struct file *file, const char __user *buffer, size_t count, loff_t *position)
  46. {
  47.     int length = count;
  48.     if(count>PAGE_SIZE)
  49.         length=PAGE_SIZE-1;
  50.     if(copy_from_user(file_buffer,buffer,length))
  51.         return -EFAULT; //zwrocony odpowiedni numer wyjatku, gdy kopiowanie sie nie powiedzie
  52.     file_buffer[length]='\0';
  53.     return length;
  54. }
  55.  
  56. static struct file_operations procfsmod_fops = {
  57.     .owner = THIS_MODULE,
  58.     .open = procfsmod_open,
  59.     .read = seq_read,
  60.     .write = procfsmod_write,
  61.     .llseek = seq_lseek,
  62.     .release = single_release
  63. };
  64.  
  65. static int __init procfsmod_init(void)
  66. {
  67.     directory_entry_pointer = proc_mkdir(directory_name, NULL);
  68.     if(IS_ERR(directory_entry_pointer)) {
  69.         pr_alert("Error creating procfs directory: %s. Error code: %ld\n",directory_name,PTR_ERR(directory_entry_pointer));
  70.         return -1;
  71.     }
  72.     file_entry_pointer = proc_create_data(file_name,0666,directory_entry_pointer,&procfsmod_fops,(void *)file_buffer);
  73.     if(IS_ERR(file_entry_pointer)) {
  74.         pr_alert("Error creating procfs file: %s. Error code: %ld\n",file_name,PTR_ERR(file_entry_pointer));
  75.         proc_remove(directory_entry_pointer);
  76.         return -1;
  77.     }
  78.    
  79.     return 0;
  80. }
  81.  
  82. static void __exit procfsmod_exit(void)
  83. {
  84.     if(file_entry_pointer)
  85.         proc_remove(file_entry_pointer);
  86.     if(directory_entry_pointer)
  87.         proc_remove(directory_entry_pointer);
  88. }
  89.  
  90. module_init(procfsmod_init);
  91. module_exit(procfsmod_exit);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement