/*      $NetBSD: compat_linux.h,v 1.7 2019/10/28 15:26:09 tsutsui Exp $ */
/*      $OpenBSD: compat_linux.h,v 1.5 2006/01/15 17:58:27 deraadt Exp $        */

/*
* Copyright (c) 2005 Uwe Stuehler <[email protected]>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

/*
* Declare the things that we need from the Linux headers.
*/

#define IS_ERR(ptr)     ((unsigned long)(ptr) > (unsigned long)-1000L)

#define MKDEV(ma,mi)    ((ma)<<8 | (mi))

#define S_IFBLK         0060000
#define S_IFCHR         0020000

struct file;
struct inode;

typedef long loff_t;

struct file_operations {
       struct module *owner;
       void (*llseek) (void);
       ssize_t (*read) (struct file *, char *, size_t, loff_t *);
       ssize_t (*write) (struct file *, const char *, size_t, loff_t *);
       void (*readdir) (void);
       void (*poll) (void);
       void (*ioctl) (void);
       void (*mmap) (void);
       int (*open) (struct inode *, struct file *);
       void (*flush) (void);
       int (*release) (struct inode *, struct file *);
       void (*fsync) (void);
       void (*fasync) (void);
       void (*lock) (void);
       void (*readv) (void);
       void (*writev) (void);
       void (*sendpage) (void);
       void (*get_unmapped_area)(void);
#ifdef MAGIC_ROM_PTR
       void (*romptr) (void);
#endif /* MAGIC_ROM_PTR */
};

extern  struct file *open_exec(const char *);
extern  int kernel_read(struct file *, unsigned long, char *, unsigned long);
extern  int memcmp(const void *, const void *, size_t);
extern  int register_chrdev(unsigned int, const char *, struct file_operations *);
extern  int unregister_chrdev(unsigned int, const char *);
extern  void printk(const char *, ...) __printflike(1, 2);
extern  void *memcpy(void *, const void *, size_t);
extern  void *memset(void *, int, size_t);

/* procfs support */
struct proc_dir_entry {
       unsigned short low_ino;
       unsigned short namelen;
       const char *name;
       unsigned short mode;
       unsigned short nlink;
       unsigned short uid;
       unsigned short gid;
       unsigned long size;
       void *proc_iops; /* inode operations */
       struct file_operations * proc_fops;
       void *get_info;
       struct module *owner;
       struct proc_dir_entry *next, *parent, *subdir;
       void *data;
       void *read_proc;
       void *write_proc;
       volatile int count;
       int deleted;
       unsigned short rdev;
};
extern  struct proc_dir_entry proc_root;
extern  struct proc_dir_entry *proc_mknod(const char*, unsigned short,
   struct proc_dir_entry*, unsigned short);
extern  void remove_proc_entry(const char *, struct proc_dir_entry *);