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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? procfs.c

?? Sanos Operating System Kernel ----------------------------- Sanos is an OS kernel for use in PC base
?? C
字號(hào):
//
// procfs.c
//
// Kernel Information Filesystem
//
// Copyright (C) 2002 Michael Ringgaard. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 
// 1. Redistributions of source code must retain the above copyright 
//    notice, this list of conditions and the following disclaimer.  
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.  
// 3. Neither the name of the project nor the names of its contributors
//    may be used to endorse or promote products derived from this software
//    without specific prior written permission. 
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
// SUCH DAMAGE.
// 

#include <os/krnl.h>

struct proc_inode *proc_list_head;
struct proc_inode *proc_list_tail;
ino_t next_procino = PROC_ROOT_INODE + 1;

int procfs_open(struct file *filp, char *name);
int procfs_close(struct file *filp);

int procfs_read(struct file *filp, void *data, size_t size);

loff_t procfs_tell(struct file *filp);
loff_t procfs_lseek(struct file *filp, loff_t offset, int origin);

int procfs_fstat(struct file *filp, struct stat *buffer);
int procfs_stat(struct fs *fs, char *name, struct stat *buffer);

int procfs_opendir(struct file *filp, char *name);
int procfs_readdir(struct file *filp, struct dirent *dirp, int count);

struct fsops procfsops =
{
  FSOP_OPEN | FSOP_CLOSE | FSOP_READ | FSOP_TELL | FSOP_LSEEK | FSOP_STAT | FSOP_FSTAT | FSOP_OPENDIR | FSOP_READDIR,

  NULL,
  NULL,

  NULL,
  NULL,
  NULL,

  NULL,

  procfs_open,
  procfs_close,
  NULL,

  procfs_read,
  NULL,
  NULL,

  procfs_tell,
  procfs_lseek,
  NULL,

  NULL,
  NULL,

  procfs_fstat,
  procfs_stat,

  NULL,
  NULL,

  NULL,
  NULL,
  NULL,

  procfs_opendir,
  procfs_readdir
};

static struct proc_inode *find_proc(char *name)
{
  struct proc_inode *inode = proc_list_head;
  int namelen = strlen(name);

  while (inode)
  {
    if (fnmatch(name, namelen, inode->name, inode->namelen)) return inode;
    inode = inode->next;
  }

  return NULL;
}

static void free_proc_file(struct proc_file *pf)
{
  struct proc_blk *blk;
  struct proc_blk *next;

  if (!pf) return;
  blk = pf->blkhead;
  while (blk)
  {
    next = blk->next;
    kfree(blk);
    blk = next;
  }

  kfree(pf);
}

void init_procfs()
{
  register_filesystem("procfs", &procfsops);
}

int register_proc_inode(char *name, proc_t proc, void *arg)
{
  struct proc_inode *inode;

  inode = (struct proc_inode *) kmalloc(sizeof(struct proc_inode));
  if (!inode) return -ENOMEM;

  inode->ino = next_procino++;
  inode->name = name;
  inode->namelen = strlen(name);
  inode->proc = proc;
  inode->arg = arg;
  inode->size = 0;

  if (proc_list_tail)
  {
    proc_list_tail->next = inode;
    proc_list_tail = inode;
  }
  else
    proc_list_head = proc_list_tail = inode;

  return 0;
}

int proc_write(struct proc_file *pf, void *buffer, size_t size)
{
  char *ptr = (char *) buffer;
  size_t left = size;
  struct proc_blk *blk;
  size_t count;

  while (left > 0)
  {
    if (!pf->blktail || pf->blktail->size == PROC_BLKSIZE)
    {
      blk = (struct proc_blk *) kmalloc(sizeof(struct proc_blk));
      if (!blk) return -ENOMEM;

      blk->next = NULL;
      blk->size = 0;

      if (pf->blktail)
      {
	pf->blktail->next = blk;
	pf->blktail = blk;
      }
      else
	pf->blkhead = pf->blktail = blk;
    }
    else
      blk = pf->blktail;

    count = blk->size + left > PROC_BLKSIZE ? (size_t) (PROC_BLKSIZE - blk->size) : left;

    memcpy(blk->data + blk->size, ptr, count);
    blk->size += count;
    ptr += count;
    left -= count;
    pf->size += count;
  }

  return size;
}

int pprintf(struct proc_file *pf, const char *fmt, ...)
{
  va_list args;
  char buffer[1024];
  int len;

  va_start(args, fmt);
  len = vsprintf(buffer, fmt, args);
  va_end(args);
    
  return proc_write(pf, buffer, len);
}

int procfs_open(struct file *filp, char *name)
{
  struct proc_inode *inode;
  struct proc_file *pf;
  int rc;

  if (*name == PS1 || *name == PS2) name++;
  inode = find_proc(name);
  if (!inode) return -ENOENT;

  pf = (struct proc_file *) kmalloc(sizeof(struct proc_file));
  if (!pf) return -ENOMEM;

  pf->inode = inode;
  pf->blkhead = pf->blktail = NULL;
  pf->size = 0;

  rc = inode->proc(pf, inode->arg);
  if (rc < 0)
  {
    free_proc_file(pf);
    return rc;
  }

  inode->size = pf->size;
  filp->data = pf;
  return 0;
}

int procfs_close(struct file *filp)
{
  if (!(filp->flags & F_DIR))
  {
    struct proc_file *pf = filp->data;
    free_proc_file(pf);
  }

  return 0;
}

int procfs_read(struct file *filp, void *data, size_t size)
{
  struct proc_file *pf = filp->data;
  struct proc_blk *blk;
  size_t start = 0;
  char *ptr = (char *) data;
  int left = size;
  int count;
  int offset;

  if (filp->flags & F_DIR) return -EINVAL;
  if (!size) return 0;

  blk = pf->blkhead;
  while (blk && start + blk->size <= filp->pos)
  {
    start += blk->size;
    blk = blk->next;
  }

  if (blk)
  {
    offset = filp->pos - start;

    if (offset < 0 || offset >= PROC_BLKSIZE)
    {
      kprintf("invalid proc blk offset %d\n", offset);
      dbg_break();
    }

    if (left < blk->size - offset)
      count = left;
    else
      count = blk->size - offset;

    memcpy(ptr, blk->data + offset, count);
    ptr += count;
    left -= count;
    blk = blk->next;
  }

  while (left > 0 && blk)
  {
    if (left < blk->size)
      count = left;
    else
      count = blk->size;

    memcpy(ptr, blk->data, count);
    ptr += count;
    left -= count;
    blk = blk->next;
  }

  filp->pos += size - left;
  return size - left;
}

loff_t procfs_tell(struct file *filp)
{
  return filp->pos;
}

loff_t procfs_lseek(struct file *filp, loff_t offset, int origin)
{
  struct proc_file *pf = filp->data;

  if (filp->flags & F_DIR) return -EINVAL;

  switch (origin)
  {
    case SEEK_END:
      offset += pf->size;
      break;

    case SEEK_CUR:
      offset += filp->pos;
  }

  if (offset < 0 || offset > pf->size) return -EINVAL;

  filp->pos = offset;
  return offset;
}

int procfs_fstat(struct file *filp, struct stat *buffer)
{
  struct proc_file *pf = filp->data;

  if (filp->flags & F_DIR)
  {
    if (buffer)
    {
      buffer->mode = FS_DIRECTORY;
      buffer->ino = PROC_ROOT_INODE;
      buffer->nlink = 1;
      buffer->devno = NODEV;
      buffer->atime = buffer->mtime = buffer->ctime = get_time();
      buffer->size = 0;
    }

    return 0;
  }

  if (buffer)
  {
    buffer->mode = 0;
    buffer->mode |= FS_BLKDEV;

    buffer->ino = pf->inode->ino;
    buffer->nlink = 1;
    buffer->devno = NODEV;

    buffer->atime = buffer->mtime = buffer->ctime = get_time();
    buffer->size = pf->size;
  }

  return pf->size;
}

int procfs_stat(struct fs *fs, char *name, struct stat *buffer)
{
  struct proc_inode *inode;

  if (*name == PS1 || *name == PS2) name++;

  if (!*name)
  {
    if (buffer)
    {
      buffer->mode = FS_DIRECTORY;
      buffer->ino = PROC_ROOT_INODE;
      buffer->nlink = 1;
      buffer->devno = NODEV;
      buffer->atime = buffer->mtime = buffer->ctime = get_time();
      buffer->size = 0;
    }

    return 0;
  }

  inode = find_proc(name);
  if (!inode) return -ENOENT;

  if (buffer)
  {
    buffer->mode = 0;
    buffer->mode |= FS_BLKDEV;

    buffer->ino = inode->ino;
    buffer->nlink = 1;
    buffer->devno = NODEV;

    buffer->atime = buffer->mtime = buffer->ctime = get_time();
    buffer->size = inode->size;
  }

  return inode->size;
}

int procfs_opendir(struct file *filp, char *name)
{
  if (*name == PS1 || *name == PS2) name++;
  if (*name) return -ENOENT;

  filp->data = proc_list_head;
  return 0;
}

int procfs_readdir(struct file *filp, struct dirent *dirp, int count)
{
  struct proc_inode *inode = filp->data;

  if (!inode) return 0;

  dirp->ino = inode->ino;
  dirp->namelen = inode->namelen;
  dirp->reclen = sizeof(struct dirent) + dirp->namelen + 1;
  memcpy(dirp->name, inode->name, inode->namelen + 1);

  filp->pos++;
  filp->data = inode->next;
  return 1;
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
2024国产精品| 国产精品伦理在线| 99久久伊人网影院| 青娱乐精品在线视频| 国产精品久久久久久久蜜臀 | 性感美女久久精品| 国产欧美一区二区在线观看| 欧美亚洲动漫另类| www.日韩在线| 狠狠狠色丁香婷婷综合久久五月| 亚洲日本青草视频在线怡红院| 精品日韩一区二区三区免费视频| 色爱区综合激月婷婷| 国产91精品入口| 免费高清成人在线| 亚洲国产另类精品专区| 国产精品丝袜一区| 久久网这里都是精品| 欧美私人免费视频| 91在线看国产| 成人av在线网站| 国产毛片精品视频| 六月婷婷色综合| 午夜精品久久久久久久久久久| 成人免费在线视频观看| 国产亚洲精品aa| 久久综合九色综合欧美98 | 欧美艳星brazzers| 91在线免费看| 99免费精品在线| 懂色av中文一区二区三区| 韩国午夜理伦三级不卡影院| 日日夜夜免费精品| 亚洲综合男人的天堂| 亚洲免费资源在线播放| 国产日韩影视精品| 欧美激情一区二区| 中文幕一区二区三区久久蜜桃| 精品99999| 精品国产污网站| 精品国产成人系列| 欧美r级电影在线观看| 欧美成va人片在线观看| 日韩欧美一区中文| 精品精品国产高清一毛片一天堂| 日韩欧美一区在线观看| 日韩欧美不卡在线观看视频| 欧美一区二区三区免费在线看| 欧美熟乱第一页| 欧美精品久久久久久久多人混战 | 成人免费在线观看入口| 国产精品理论在线观看| 国产精品网曝门| 中文字幕一区不卡| 亚洲色图欧洲色图| 亚洲一二三四在线| 亚洲成人手机在线| 蜜桃精品视频在线| 国产精品自拍三区| av中文字幕在线不卡| 91蜜桃在线免费视频| 欧美色图免费看| 欧美一区二区三区免费| 亚洲精品在线三区| 亚洲欧洲色图综合| 亚洲国产精品人人做人人爽| 亚洲国产美女搞黄色| 蜜臀av性久久久久蜜臀aⅴ四虎| 九九热在线视频观看这里只有精品| 麻豆精品在线播放| 国产.欧美.日韩| 欧洲一区二区三区在线| 日韩欧美一级二级三级 | 亚洲自拍另类综合| 视频一区二区不卡| 国产精品一区二区91| 91亚洲精品久久久蜜桃| 欧美绝品在线观看成人午夜影视| 欧美一区二区在线看| 国产欧美1区2区3区| 一片黄亚洲嫩模| 精一区二区三区| av电影一区二区| 亚洲欧洲精品成人久久奇米网| 亚洲综合自拍偷拍| 久久爱www久久做| 91视频在线看| 日韩欧美一区二区视频| 国产精品美女久久久久久2018| 亚洲va欧美va人人爽午夜| 国产精品影视天天线| 欧美亚洲禁片免费| 国产人妖乱国产精品人妖| 夜夜爽夜夜爽精品视频| 国产在线观看免费一区| 在线精品视频一区二区| 久久人人爽爽爽人久久久| 亚洲综合色噜噜狠狠| 国产高清亚洲一区| 欧美精品aⅴ在线视频| 国产日韩欧美在线一区| 日韩激情一二三区| 91啦中文在线观看| 久久精品人人做人人综合| 亚洲成人综合网站| 91在线精品一区二区三区| 欧美大片一区二区三区| 亚洲线精品一区二区三区 | 国产·精品毛片| 欧美一级欧美三级在线观看 | 久久av中文字幕片| 欧美无砖砖区免费| 专区另类欧美日韩| 高清国产一区二区三区| 欧美一级免费观看| 性久久久久久久久| 色猫猫国产区一区二在线视频| 久久久噜噜噜久久中文字幕色伊伊| 亚洲成a人片在线观看中文| 91在线免费看| 国产精品 日产精品 欧美精品| 欧美精品久久99| 亚洲国产一区二区三区青草影视| 北条麻妃一区二区三区| 久久久激情视频| 伦理电影国产精品| 欧美一级二级三级蜜桃| 日韩国产欧美在线视频| 欧美日韩免费在线视频| 亚洲地区一二三色| 欧美在线免费播放| 有坂深雪av一区二区精品| heyzo一本久久综合| 国产精品免费视频网站| 国产91清纯白嫩初高中在线观看| 久久免费午夜影院| 国产综合色视频| 久久免费美女视频| 国产一区二区日韩精品| 精品国产麻豆免费人成网站| 老色鬼精品视频在线观看播放| 欧美一级精品在线| 久久99精品久久久久久| 亚洲精品一区二区三区四区高清| 激情图片小说一区| 久久新电视剧免费观看| 国产成人8x视频一区二区| 国产欧美一区二区精品性 | 欧美乱熟臀69xxxxxx| 天天影视网天天综合色在线播放| 欧美视频一区二区三区四区| 亚洲国产成人av好男人在线观看| 欧美日韩一卡二卡三卡| 免费不卡在线观看| 久久影视一区二区| 成人激情小说乱人伦| 亚洲乱码中文字幕综合| 欧美三级在线播放| 美女网站视频久久| 久久久99精品免费观看| av午夜一区麻豆| 亚洲午夜国产一区99re久久| 777色狠狠一区二区三区| 精品亚洲国产成人av制服丝袜| 国产亚洲精品中文字幕| 91美女片黄在线| 婷婷久久综合九色国产成人| 精品福利在线导航| 99久久国产综合精品色伊| 亚洲福利电影网| 欧美精品一区二区三区很污很色的| 国产成人午夜电影网| 亚洲六月丁香色婷婷综合久久| 欧美人狂配大交3d怪物一区| 精品在线免费视频| 中文字幕日韩一区| 91麻豆精品国产91久久久久久| 国内外成人在线| 1024国产精品| 欧美一级生活片| 成人在线视频一区| 图片区小说区区亚洲影院| 久久综合色鬼综合色| 91丨九色丨国产丨porny| 日本不卡视频在线| 中文字幕亚洲电影| 日韩一区二区三区四区| www.日韩在线| 久久精品国产亚洲一区二区三区| 国产精品毛片a∨一区二区三区| 欧美日韩一区二区在线观看视频 | 色狠狠一区二区| 91精品国产福利| 91小视频免费看| 老司机精品视频线观看86| 日韩毛片一二三区| 久久久久久免费毛片精品| 欧美视频在线观看一区| 国产一区二区在线视频| 亚洲成人av电影|