/*   zilch.c  - loadable /dev/zilch device
**
**   Time-stamp: <1998-02-11 20:04:50 root>
**   Touched: Tue Feb 10 10:58:10 1998 <madhu@cs.unm.edu>
**   Cflags: -O -DMODULE -D__KERNEL__ 
**
*/ 

#include <linux/config.h>

#ifdef MODULE
#include <linux/module.h>
#include <linux/version.h>
#else
#define MOD_INC_USE_COUNT
#define MOD_DEC_USE_COUNT
#endif

#include <linux/types.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/errno.h>
/* #include <asm/uaccess.h> */
#include <asm/segment.h>

#include "zilch.h"

static int zilch_major;


static int 
read_zilch(struct inode *node, struct file *file, char *buf, int count)
{
  int left;

  if (verify_area(VERIFY_WRITE, buf, count) == -EFAULT) {
    return -EFAULT;
  }

  for (left = count; left > 0; left--) {
    put_user_byte(0, buf);
    buf++;
  }

  return count;
}


static int 
write_zilch(struct inode *inode, struct file *file, char *buf, int count)
{
  return count;
}


static int 
lseek_zilch(struct inode *inode, struct file *file, off_t offset, int orig)
{
  return file->f_pos = 0;
}


static int 
open_zilch(struct inode *inode, struct file *file) 
{
  MOD_INC_USE_COUNT;
  return 0;
}


static void 
release_zilch(struct inode *inode, struct file *file) 
{
  MOD_DEC_USE_COUNT;
}


static struct file_operations zilch_fops = {
  lseek_zilch,
  read_zilch,
  write_zilch,
  NULL,				/* readdir_zilch */
  NULL,				/* select_zilch */
  NULL,				/* ioctl_zilch */
  NULL,				/* mmap_zilch */
  open_zilch,
  release_zilch,
  NULL,				/* fsync */
  NULL,				/* fasync */
  NULL,				/* check_media_change */
  NULL,				/* revalidate */
};


#ifndef MODULE
long 
zilch_init(long mem_start, long mem_end) 
{
  if (zilch_major = register_chrdev(0, "zilch", &zilch_fops)) {
    printk("unable to get major for zilch device\n");
  }
  printk("device /dev/zilch has major %d\n", zilch_major);
  return mem_start;
}
#else
int init_module(void)
{
  if ((zilch_major = register_chrdev(0, "zilch", &zilch_fops)) == -EBUSY) {
    printk("unable to get major for zilch device\n");
    return -EIO;
  }
  return 0;
}

void cleanup_module(void)
{
  unregister_chrdev(zilch_major, "zilch");
}
#endif


  


 
