diff -urN linux-2.0.36-backup/drivers/char/Makefile linux-2.0.36/drivers/char/Makefile --- linux-2.0.36-backup/drivers/char/Makefile Wed Oct 14 04:15:41 1998 +++ linux-2.0.36/drivers/char/Makefile Mon Oct 16 19:12:52 2006 @@ -22,7 +22,7 @@ M_OBJS := L_OBJS := tty_io.o n_tty.o console.o \ tty_ioctl.o pty.o vt.o mem.o vc_screen.o random.o \ - consolemap.o selection.o + consolemap.o selection.o ring.o ifeq ($(CONFIG_SERIAL),y) ifndef CONFIG_SUN_SERIAL diff -urN linux-2.0.36-backup/drivers/char/mem.c linux-2.0.36/drivers/char/mem.c --- linux-2.0.36-backup/drivers/char/mem.c Wed Oct 14 04:15:49 1998 +++ linux-2.0.36/drivers/char/mem.c Mon Oct 16 19:12:52 2006 @@ -394,6 +394,8 @@ NULL /* fsync */ }; +extern void ring_init(void); + int chr_dev_init(void) { if (register_chrdev(MEM_MAJOR,"mem",&memory_fops)) @@ -403,6 +405,7 @@ #ifdef CONFIG_PRINTER lp_init(); #endif + ring_init(); #if defined (CONFIG_BUSMOUSE) || defined(CONFIG_UMISC) || \ defined (CONFIG_PSMOUSE) || defined (CONFIG_MS_BUSMOUSE) || \ defined (CONFIG_ATIXL_BUSMOUSE) || defined(CONFIG_SOFT_WATCHDOG) || \ diff -urN linux-2.0.36-backup/drivers/char/ring.c linux-2.0.36/drivers/char/ring.c --- linux-2.0.36-backup/drivers/char/ring.c Thu Jan 1 01:00:00 1970 +++ linux-2.0.36/drivers/char/ring.c Mon Oct 16 19:16:42 2006 @@ -0,0 +1,110 @@ + +#include +#include +#include +#include +#include +#include + + + +#define BUFFERSIZE 1024 + +static char *buffer; +int buffercount; +int start,end; +int usecount; +struct semaphore sem=MUTEX; +struct wait_queue *read_queue,*write_queue; + +int ring_open(struct inode *inode,struct file *file) +{ + + down(&sem); + usecount++; + if (usecount == 1) { + + // kmalloc moze uspic proces - uwaga na synchronizacje + buffer=kmalloc(BUFFERSIZE,GFP_KERNEL); + buffercount=start=end=0; + } + up(&sem); + return 0; + +} + +void ring_release(struct inode *inode,struct file *file) +{ + usecount--; + if (usecount==0) + kfree(buffer); +} + +int ring_read(struct inode *inode,struct file *file,char *pB,int count) +{ + + int i; + char tmp; + for(i=0;isignal & ~current->blocked) { + if (i==0) + return -ERESTARTSYS; + return i; + } + } + + tmp=buffer[start]; + start++; + if (start==BUFFERSIZE) + start=0; + buffercount--; + wake_up(&write_queue); + put_user(tmp,pB+i); + } + return count; +} + +int ring_write(struct inode *inode,struct file *file,const char *pB,int count) +{ + int i; + char tmp; + for(i=0;isignal & ~current->blocked) { + if (i==0) + return -ERESTARTSYS; + return i; + } + } + buffer[end]=tmp; + buffercount++; + end++; + if (end==BUFFERSIZE) + end=0; + wake_up(&read_queue); + } + return count; +} + + +struct file_operations ring_ops = { + read: ring_read, write:ring_write, + open:ring_open, release:ring_release}; + + +#define RING_MAJOR 60 + +void ring_init(void) { + init_waitqueue(&write_queue); + init_waitqueue(&read_queue); + usecount=0; + register_chrdev(RING_MAJOR,"ring",&ring_ops); + printk("Ring device initialized\n"); +}