06 - Proc

msys.c

msys.c
#include <linux/module.h>
#include <linux/kernel.h>
 
#include <linux/sysctl.h>
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Marcin Bis");
MODULE_DESCRIPTION("Przyklad uzycia /proc/sys");
 
static struct ctl_table_header * test_sysctl_header;
 
/* Zmienne, ktorych wartości są udostępniane
   przez pliki w /proc/sys */
static int value1 = 0;
static int value2 = 1;
/* Ograniczenia wartości, które mogą zostać przypisane do tych zmiennych */
static int min = 10;
static int max = 20;
 
/* Tablica opsująca pliki */
static ctl_table test_table[] = {
	{
		.ctl_name	= CTL_UNNUMBERED,
		.procname	= "value1",
		.data		= &value1,
		.maxlen		= sizeof(int),
		.mode		= 0644,
		.proc_handler	= &proc_dointvec_minmax,
		.strategy	= &sysctl_intvec,
		.extra1         = &min,
		.extra2         = &max
	},
	{
		.ctl_name	= CTL_UNNUMBERED,
		.procname	= "value2",
		.data		= &value2,
		.maxlen		= sizeof(int),
		.mode		= 0644,
		.proc_handler	= &proc_dointvec_minmax,
		.strategy	= &sysctl_intvec,
		.extra1         = &min,
		.extra2         = &max
	},
	{ .ctl_name = 0 }
};
 
/* Tablica opisująca katalog znajdujący się w głównym */
static ctl_table test_root_table[] = {
	{
		.ctl_name	= CTL_UNNUMBERED,
		.procname	= "test",
		.mode		= 0555,
		.child		= test_table
	},
	{ .ctl_name = 0 }
};
 
static int __init msys_init(void)
{
  printk(KERN_INFO "Msys loaded.\n");
  test_sysctl_header = register_sysctl_table(test_root_table);
  return 0;
}
module_init(msys_init);
 
static void __exit msys_exit(void)
{
  printk(KERN_INFO "Msys unloading.\n");
  unregister_sysctl_table(test_sysctl_header);
}
module_exit(msys_exit);

proc_file.c

proc_file.c
#include <linux/module.h>
#include <linux/kernel.h>
 
#include <linux/proc_fs.h>
#include <linux/vmalloc.h>
#include <linux/uaccess.h>
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Marcin Bis");
MODULE_DESCRIPTION("Przyklad obsługi pliku w /proc");
 
static struct proc_dir_entry *my_proc_file = NULL;
 
int my_proc_read(char *page, char **start, off_t offset, int count, int *eof, void *data)
{
    /* Przygotowujemy dane wyjsciowe */
    int len = 0;
    len += sprintf(page + len, "pierwsza linia danych\n" );
    len += sprintf(page + len, "druga linia danych\n" );
 
    /* Jeżeli danych do wysłania jest mniej niż rozmiar bufora przygotowaneg przez aplikację,
       ustaw flagę eof (koniec pliku) */
    if( len <= count + offset )
        *eof = 1;
 
    *start = page + offset; 
    len -= offset;
    if( len > count )
        len = count; 
    if( len < 0 )
        len = 0;
 
    return len;
}
 
int my_proc_write(struct file *file, const char __user *buffer, unsigned long count, void *data )
{
    char *page;
    int size = sizeof(int); /* Używamy bufora o rozmiarze liczby całkowitej */
    int my_data = 0;
    /* Alokacja pamięci */
    page = (char *) vmalloc(size);
    if (!page)
       return -ENOMEM;   
 
    /* Kopiowanie danych od użytkownika - być może jest ich mniej niż przygotowany bufor */ 
    if (count < size)
       size = count;
 
    if (copy_from_user(page, buffer, size)) {
       vfree(page);
       return -EFAULT;
    }
 
    /* Wpisana przez użytkonika liczba trafia do bufora komunikatów jądra */
    sscanf(page,"%d",&my_data);
    printk(KERN_INFO "Uzytkownik ustawil wartosc: %d\n", my_data);
 
    vfree(page); 
 
    return count;
}
 
static int __init proc_file_init(void)
{
  printk(KERN_INFO "Proc File loaded.\n");
  my_proc_file = create_proc_entry("my_file", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH, NULL);
  if (my_proc_file)
  {
    my_proc_file->read_proc = my_proc_read;
    my_proc_file->write_proc = my_proc_write;
  }
  return 0;
}
module_init(proc_file_init);
 
static void __exit proc_file_exit(void)
{
  printk(KERN_INFO "Proc File unloading.\n");
  remove_proc_entry("my_file", NULL);
}
module_exit(proc_file_exit);

Makefile

Makefile
obj-m += msys.o
obj-m += proc_file.o
 
all:
	make -C /lib/modules/$(shell uname -r)/build \
		SUBDIRS=$(shell pwd) modules
 
clean:
	make -C /lib/modules/$(shell uname -r)/build \
		SUBDIRS=$(shell pwd) clean
ostatnio zmienione: 2011/06/16 15:49