亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? main.c

?? ldd1的源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* -*- C -*- * main.c -- the bare scullc char module * * $Id: _main.c.in,v 1.8 2000/10/16 23:45:48 corbet Exp $ * * Mmap is not available on the Sparc, as pgd_offset etc. are not * yet exported to modules. Nonetheless, I've been able to run this * code by tweaking the loading mechanism. */#ifndef __KERNEL__#  define __KERNEL__#endif#ifndef MODULE#  define MODULE#endif#include <linux/config.h>#include <linux/module.h>#include <linux/version.h>#include <linux/kernel.h> /* printk() */#include <linux/malloc.h> /* kmalloc() */#include <linux/fs.h>     /* everything... */#include <linux/errno.h>  /* error codes */#include <linux/types.h>  /* size_t */#include <linux/proc_fs.h>#include <linux/fcntl.h>        /* O_ACCMODE */#include <asm/system.h>   /* cli(), *_flags */#include "scullc.h"        /* local definitions *//* Kmem caches were not available in 2.0. Disallow compilation in that case */#ifdef LINUX_20#  error "Kmem_cache functions are not available in Linux-2.0"#else#  ifdef LINUX_22     /*      * kmem_cache_destroy is not available (at least in all 2.2 kernels      * up to 2.2.17. So offer an empty substitute to at least allow playing      */  int kmem_cache_destroy(kmem_cache_t *cache)  {      printk(KERN_ERR "scullc: kmem_cache_destroy unavailable\n");      return 0;  }#  endif/* * I don't use static symbols here, because register_symtab is called */int scullc_major =   SCULLC_MAJOR;int scullc_devs =    SCULLC_DEVS;    /* number of bare scullc devices */int scullc_qset =    SCULLC_QSET;int scullc_quantum = SCULLC_QUANTUM;MODULE_PARM(scullc_major, "i");MODULE_PARM(scullc_devs, "i");MODULE_PARM(scullc_qset, "i");MODULE_PARM(scullc_quantum, "i");MODULE_AUTHOR("Alessandro Rubini");ScullC_Dev *scullc_devices; /* allocated in init_module */int scullc_trim(ScullC_Dev *dev);/* declare one cache pointer: use it for all devices */kmem_cache_t *scullc_cache;#ifdef SCULLC_USE_PROC /* don't waste space if unused *//* * The proc filesystem: function to read and entry */void scullc_proc_offset(char *buf, char **start, off_t *offset, int *len){    if (*offset == 0)        return;    if (*offset >= *len) {      /* Not there yet */        *offset -= *len;        *len = 0;    }    else {                      /* We're into the interesting stuff now */        *start = buf + *offset;        *offset = 0;    }}int scullc_read_procmem(char *buf, char **start, off_t offset,                   int count, int *eof, void *data){    int i, j, quantum, qset, len = 0;    int limit = count - 80; /* Don't print more than this */    ScullC_Dev *d;    *start = buf;    for(i=0; i<scullc_devs; i++) {        d=&scullc_devices[i];        if (down_interruptible (&d->sem))                return -ERESTARTSYS;        qset=d->qset;  /* retrieve the features of each device */        quantum=d->quantum;        len += sprintf(buf+len,"\nDevice %i: qset %i, quantum %i, sz %li\n",                       i, qset, quantum, (long)(d->size));        for (; d; d=d->next) { /* scan the list */            len += sprintf(buf+len,"  item at %p, qset at %p\n",d,d->data);            scullc_proc_offset (buf, start, &offset, &len);            if (len > limit) {                up (&scullc_devices[i].sem);                return len;            }            if (d->data && !d->next) /* dump only the last item - save space */                for (j=0; j<qset; j++) {                    if (d->data[j])                        len += sprintf(buf+len,"    % 4i:%8p\n",j,d->data[j]);                    scullc_proc_offset (buf, start, &offset, &len);                    if (len > limit) {                        up (&scullc_devices[i].sem);                        return len;                    }            }        }        up (&scullc_devices[i].sem);    }    *eof = 1;    return len;}#ifdef USE_PROC_REGISTERstatic int scullc_get_info (char *buf, char **start, off_t offset,                int len, int unused){    int eof = 0;    return scullc_read_procmem(buf, start, offset, len, &eof, NULL);}struct proc_dir_entry scullc_proc_entry = {        0,                 /* low_ino: the inode -- dynamic */        9, "scullcmem",     /* len of name and name */        S_IFREG | S_IRUGO, /* mode */        1, 0, 0,           /* nlinks, owner, group */        0, NULL,           /* size - unused; operations -- use default */        scullc_get_info,   /* function used to read data */        /* nothing more */    };static inline void create_proc_read_entry (const char *name, mode_t mode,                struct proc_dir_entry *base, void *read_func, void *data){    proc_register_dynamic (&proc_root, &scullc_proc_entry);}static inline void remove_proc_entry (char *name, void *parent){    proc_unregister (&proc_root, scullc_proc_entry.low_ino);}#endif /* USE_PROC_REGISTER */#endif /* SCULLC_USE_PROC *//* * Open and close */int scullc_open (struct inode *inode, struct file *filp){    int num = MINOR(inode->i_rdev);    ScullC_Dev *dev; /* device information */    /*  check the device number */    if (num >= scullc_devs) return -ENODEV;    dev = &scullc_devices[num];    /* now trim to 0 the length of the device if open was write-only */     if ( (filp->f_flags & O_ACCMODE) == O_WRONLY) {        if (down_interruptible (&dev->sem))            return -ERESTARTSYS;        scullc_trim(dev); /* ignore errors */        up (&dev->sem);    }    /* and use filp->private_data to point to the device data */    filp->private_data = dev;    MOD_INC_USE_COUNT;    return 0;          /* success */}int scullc_release (struct inode *inode, struct file *filp){    MOD_DEC_USE_COUNT;    return 0;}/* * Follow the list  */ScullC_Dev *scullc_follow(ScullC_Dev *dev, int n){    while (n--) {        if (!dev->next) {            dev->next = kmalloc(sizeof(ScullC_Dev), GFP_KERNEL);            memset(dev->next, 0, sizeof(ScullC_Dev));        }        dev = dev->next;        continue;    }    return dev;}/* * Data management: read and write */ssize_t scullc_read (struct file *filp, char *buf, size_t count,                loff_t *f_pos){    ScullC_Dev *dev = filp->private_data; /* the first listitem */    ScullC_Dev *dptr;    int quantum = dev->quantum;    int qset = dev->qset;    int itemsize = quantum * qset; /* how many bytes in the listitem */    int item, s_pos, q_pos, rest;    if (down_interruptible (&dev->sem))            return -ERESTARTSYS;    if (*f_pos > dev->size)         goto nothing;    if (*f_pos + count > dev->size)        count = dev->size - *f_pos;    /* find listitem, qset index, and offset in the quantum */    item = ((long) *f_pos) / itemsize;    rest = ((long) *f_pos) % itemsize;    s_pos = rest / quantum; q_pos = rest % quantum;    /* follow the list up to the right position (defined elsewhere) */    dptr = scullc_follow(dev, item);    if (!dptr->data)        goto nothing; /* don't fill holes */    if (!dptr->data[s_pos])        goto nothing;    if (count > quantum - q_pos)        count = quantum - q_pos; /* read only up to the end of this quantum */    __copy_to_user (buf, dptr->data[s_pos]+q_pos, count);    up (&dev->sem);        *f_pos += count;    return count;  nothing:    up (&dev->sem);    return 0;}ssize_t scullc_write (struct file *filp, const char *buf, size_t count,                loff_t *f_pos){    ScullC_Dev *dev = filp->private_data;    ScullC_Dev *dptr;    int quantum = dev->quantum;    int qset = dev->qset;    int itemsize = quantum * qset;    int item, s_pos, q_pos, rest;    if (down_interruptible (&dev->sem))            return -ERESTARTSYS;    /* find listitem, qset index and offset in the quantum */    item = ((long) *f_pos) / itemsize;    rest = ((long) *f_pos) % itemsize;    s_pos = rest / quantum; q_pos = rest % quantum;    /* follow the list up to the right position */    dptr = scullc_follow(dev, item);    if (!dptr->data) {        dptr->data = kmalloc(qset * sizeof(void *), GFP_KERNEL);        if (!dptr->data)            goto nomem;        memset(dptr->data, 0, qset * sizeof(char *));    }    /* Allocate a quantum using the memory cache */    if (!dptr->data[s_pos]) {        dptr->data[s_pos] =	    kmem_cache_alloc(scullc_cache, GFP_KERNEL);        if (!dptr->data[s_pos])            goto nomem;        memset(dptr->data[s_pos], 0, scullc_quantum);    }    if (count > quantum - q_pos)        count = quantum - q_pos; /* write only up to the end of this quantum */    __copy_from_user (dptr->data[s_pos]+q_pos, buf, count);   *f_pos += count; 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美国产综合色视频| 国产精品素人视频| 国产成人免费av在线| 捆绑变态av一区二区三区| 成人动漫一区二区三区| 久久久久青草大香线综合精品| 偷拍亚洲欧洲综合| 欧美羞羞免费网站| 欧美三级韩国三级日本三斤| 亚洲成人综合视频| 欧美日韩精品免费观看视频 | 亚洲小说欧美激情另类| 久久久精品影视| 久久―日本道色综合久久| 日韩三级电影网址| 精品国产99国产精品| 麻豆91精品视频| 久久电影网电视剧免费观看| 国产综合色精品一区二区三区| 美国一区二区三区在线播放| 青娱乐精品在线视频| 丝袜亚洲另类丝袜在线| 午夜在线成人av| 激情小说欧美图片| 国产精品主播直播| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 91在线一区二区| 在线观看www91| 一本一道综合狠狠老| 欧美在线999| 国产精品久线在线观看| 性感美女久久精品| 秋霞午夜鲁丝一区二区老狼| 一区二区三区日韩欧美精品| 亚洲国产日韩在线一区模特| 免费成人结看片| 欧美videofree性高清杂交| 国产成人在线观看免费网站| 18欧美亚洲精品| 欧美午夜理伦三级在线观看| 亚洲成av人片| 亚洲国产精品传媒在线观看| 在线日韩一区二区| 奇米888四色在线精品| 成人免费在线观看入口| 91精品国产aⅴ一区二区| 欧美系列日韩一区| 久久久久久久综合色一本| 中文字幕综合网| 国产91在线看| 久久国产视频网| 狠狠色丁香九九婷婷综合五月| 激情六月婷婷综合| 欧美网站一区二区| 欧美午夜精品一区二区三区| 一区二区三区在线视频播放| 中文字幕一区二区不卡| 北条麻妃一区二区三区| 欧美精选午夜久久久乱码6080| 亚洲午夜激情网页| 亚洲一级二级三级在线免费观看| 麻豆极品一区二区三区| 不卡欧美aaaaa| 久久一区二区视频| 91色九色蝌蚪| 大桥未久av一区二区三区中文| 美洲天堂一区二卡三卡四卡视频| 色老综合老女人久久久| 国产成人av电影在线观看| 久国产精品韩国三级视频| 极品少妇一区二区三区精品视频 | 欧美日韩一区高清| 亚洲精品自拍动漫在线| 99精品欧美一区| 99久久婷婷国产精品综合| 99久久婷婷国产综合精品电影| caoporn国产精品| 91网站黄www| 精品国产一区二区三区久久影院| 亚洲国产日韩一级| 欧美日韩一区二区三区免费看| 亚洲国产精品久久久久婷婷884| 91豆麻精品91久久久久久| 色婷婷久久综合| 美国毛片一区二区| 国产一区二区三区免费| 曰韩精品一区二区| 久久综合视频网| 欧美日韩国产综合视频在线观看| 不卡视频一二三四| 色综合天天综合色综合av | 免费在线视频一区| 欧美午夜精品久久久| 精品欧美一区二区在线观看| 一区视频在线播放| 人妖欧美一区二区| 色美美综合视频| 国产精品女主播av| 极品尤物av久久免费看| 91小视频在线免费看| 久久久精品黄色| 日韩国产精品大片| 青青国产91久久久久久| 麻豆极品一区二区三区| 成人一区二区三区视频在线观看 | 一区二区三区成人| 国产精品一区二区在线播放| 91精品国产aⅴ一区二区| jlzzjlzz国产精品久久| 国产成人免费视频精品含羞草妖精 | 国产精品成人在线观看| 一区二区三区日本| 久久精品国产网站| 99精品热视频| 91 com成人网| 国产精品乱码一区二区三区软件| 亚洲一区二区在线免费看| 免费成人深夜小野草| av在线一区二区| 欧美一区二区二区| 综合在线观看色| 精品一区在线看| 日本韩国欧美三级| 精品免费99久久| www激情久久| 亚洲国产精品99久久久久久久久 | 国产精品国产三级国产aⅴ中文| 亚洲一本大道在线| 国产精品原创巨作av| 欧美综合在线视频| 欧美高清在线精品一区| 视频一区二区欧美| 99视频精品在线| 久久网站热最新地址| 午夜私人影院久久久久| 99久久伊人久久99| 精品av久久707| 亚洲国产精品一区二区久久恐怖片| 国产真实乱对白精彩久久| 欧美日韩第一区日日骚| 日韩一区在线播放| 国产精品亚洲午夜一区二区三区 | 日韩精品视频网| 色综合天天综合网天天看片| 国产日产欧美一区二区三区| 免费三级欧美电影| 欧美日韩免费一区二区三区视频| 国产精品久久99| 国产成人精品亚洲午夜麻豆| 日韩一区二区三区四区 | 日韩精品国产欧美| 欧洲国产伦久久久久久久| 国产精品第13页| 国产成人av一区| 日本一区二区动态图| 国产伦精一区二区三区| 日韩免费高清视频| 日本欧美在线观看| 欧美日韩电影在线| 无码av免费一区二区三区试看| 在线观看国产91| 亚洲免费观看高清完整版在线观看| 日韩一区二区三区免费看| 亚洲成a人v欧美综合天堂下载| 欧美高清精品3d| 日韩激情一区二区| 精品卡一卡二卡三卡四在线| 韩国一区二区三区| 国产精品欧美综合在线| 欧美日韩在线直播| 狠狠色综合日日| 亚洲主播在线观看| 国产欧美一区二区三区在线老狼| av不卡免费电影| 国产精品综合在线视频| 欧美成人性战久久| 蜜桃传媒麻豆第一区在线观看| 91精品国产入口在线| 视频一区二区国产| 欧美成人女星排行榜| 麻豆成人91精品二区三区| 精品电影一区二区| 国产一区二区三区不卡在线观看| 久久免费看少妇高潮| 成人午夜又粗又硬又大| 一区二区三区在线观看欧美 | 日本一区二区三区国色天香| 夫妻av一区二区| 1区2区3区精品视频| 欧美午夜不卡视频| 麻豆国产欧美日韩综合精品二区| 久久久99精品久久| 色中色一区二区| 日韩av高清在线观看| 久久久99免费| 91国产视频在线观看| 蜜臀a∨国产成人精品| 中文文精品字幕一区二区| 日本乱人伦一区| 久久国产麻豆精品|