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

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

?? smbfs.c

?? Sanos Operating System Kernel ----------------------------- Sanos is an OS kernel for use in PC base
?? C
?? 第 1 頁 / 共 2 頁
字號:
    filp->flags |= F_MODIFIED;
    left -= rc;
    p += rc;

    if (filp->pos > file->statbuf.quad.size_low) file->statbuf.quad.size_low = filp->pos;
  }

  return size;
}

int smb_ioctl(struct file *filp, int cmd, void *data, size_t size)
{
  return -ENOSYS;
}

loff_t smb_tell(struct file *filp)
{
  if (filp->flags & F_DIR) return -EBADF;

  return filp->pos;
}

loff_t smb_lseek(struct file *filp, loff_t offset, int origin)
{
  struct smb_file *file = (struct smb_file *) filp->data;

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

  switch (origin)
  {
    case SEEK_END:
      offset += file->statbuf.quad.size_low;
      break;

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

  if (offset < 0) return -EINVAL;

  filp->pos = offset;
  return offset;
}

int smb_chsize(struct file *filp, loff_t size)
{
  struct smb_share *share = (struct smb_share *) filp->fs->data;
  struct smb_file *file = (struct smb_file *) filp->data;
  struct smb_set_fileinfo_request req;
  struct smb_file_end_of_file_info info;
  struct smb_set_fileinfo_response rsp;
  int rc;
  int rsplen;

  memset(&req, 0, sizeof(req));
  req.fid = file->fid;
  req.infolevel = 0x104;

  info.end_of_file = size;

  rsplen = sizeof(rsp);
  rc = smb_trans(share, TRANS2_SET_FILE_INFORMATION, &req, sizeof(req), &info, sizeof(info), &rsp, &rsplen, NULL, NULL);
  if (rc < 0) return rc;

  if (filp->pos > size) filp->pos = size;
  return 0;
}

int smb_futime(struct file *filp, struct utimbuf *times)
{
  struct smb_share *share = (struct smb_share *) filp->fs->data;
  struct smb_file *file = (struct smb_file *) filp->data;
  struct smb_set_fileinfo_request req;
  struct smb_file_basic_info info;
  struct smb_set_fileinfo_response rsp;
  int rc;
  int rsplen;

  memset(&req, 0, sizeof(req));
  req.fid = file->fid;
  req.infolevel = 0x101;

  info.creation_time = time2ft(times->ctime == -1 ? file->statbuf.ctime : times->ctime);
  info.last_access_time = time2ft(times->atime == -1 ? file->statbuf.atime : times->atime);
  info.last_write_time = time2ft(times->mtime == -1 ? file->statbuf.mtime : times->mtime);
  info.change_time = time2ft(times->mtime == -1 ? file->statbuf.mtime : times->mtime);
  info.attributes = file->attrs;

  rsplen = sizeof(rsp);
  rc = smb_trans(share, TRANS2_SET_FILE_INFORMATION, &req, sizeof(req), &info, sizeof(info), &rsp, &rsplen, NULL, NULL);
  if (rc < 0) return rc;

  if (times->ctime != -1) file->statbuf.ctime = times->ctime;
  if (times->mtime != -1) file->statbuf.mtime = times->mtime;
  if (times->atime != -1) file->statbuf.atime = times->atime;

  return 0;
}

int smb_utime(struct fs *fs, char *name, struct utimbuf *times)
{
  struct file filp;
  int rc;

  memset(&filp, 0, sizeof(struct file));
  filp.fs = fs;

  rc = smb_open(&filp, name);
  if (rc < 0) return rc;

  rc = smb_futime(&filp, times);
  
  smb_close(&filp);
  return rc;
}

int smb_fstat(struct file *filp, struct stat *buffer)
{
  struct smb_file *file = (struct smb_file *) filp->data;

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

  if (buffer) memcpy(buffer, &file->statbuf, sizeof(struct stat));

  return file->statbuf.quad.size_low;
}

int smb_stat(struct fs *fs, char *name, struct stat *buffer)
{
  struct smb_share *share = (struct smb_share *) fs->data;
  struct smb_pathinfo_request req;
  struct smb_file_basic_info rspb;
  struct smb_file_standard_info rsps;
  struct smb_dentry *dentry;
  int rsplen;
  short dummy;
  int dummylen;
  int rc;

  rc = smb_convert_filename(name);
  if (rc < 0) return rc;

  // Handle root mount point
  if (!*name)
  {
    if (buffer)
    {
      memset(buffer, 0, sizeof(struct stat));
      buffer->atime = time(0);
      buffer->ctime = share->mounttime;
      buffer->mtime = share->mounttime;
      buffer->mode = FS_DIRECTORY;
      buffer->nlink = 1;
      return 0;
    }
  }

  // Look in cache
  dentry = smb_find_in_cache(share, name);
  if (dentry != NULL)
  {
    if (buffer) memcpy(buffer, &dentry->statbuf, sizeof(struct stat));
    return dentry->statbuf.quad.size_low;
  }

  // Query server for file information
  if (buffer)
  {
    req.infolevel = SMB_QUERY_FILE_BASIC_INFO;
    req.reserved = 0;
    strcpy(req.filename, name);

    rsplen = sizeof(rspb);
    dummylen = sizeof(dummy);
    rc = smb_trans(share, TRANS2_QUERY_PATH_INFORMATION, &req, sizeof(req) - MAXPATH + strlen(name) + 1, NULL, 0, &dummy, &dummylen, &rspb, &rsplen);
    if (rc < 0) return rc;
  }

  req.infolevel = SMB_QUERY_FILE_STANDARD_INFO;
  req.reserved = 0;
  strcpy(req.filename, name);

  rsplen = sizeof(rsps);
  dummylen = sizeof(dummy);
  rc = smb_trans(share, TRANS2_QUERY_PATH_INFORMATION, &req, sizeof(req) - MAXPATH + strlen(name) + 1, NULL, 0, &dummy, &dummylen, &rsps, &rsplen);
  if (rc < 0) return rc;

  if (buffer)
  {
    buffer->mode = 0;
    buffer->ino = 0;
    buffer->nlink = rsps.number_of_links;
    buffer->devno = NODEV;
    buffer->atime = ft2time(rspb.last_access_time);
    buffer->mtime = ft2time(rspb.last_write_time);
    buffer->ctime = ft2time(rspb.creation_time);
    buffer->size = rsps.end_of_file;
    if (rspb.attributes & SMB_FILE_ATTR_DIRECTORY) buffer->mode |= FS_DIRECTORY;
  }

  return (int) rsps.end_of_file;
}

int smb_mkdir(struct fs *fs, char *name)
{
  struct smb_share *share = (struct smb_share *) fs->data;
  struct smb *smb;
  char namebuf[MAXPATH + 1 + 1];
  char *p;
  int rc;

  rc = smb_convert_filename(name);
  if (rc < 0) return rc;

  // Make directory
  smb = smb_init(share, 0);

  p = namebuf;
  *p++ = 4;
  p = addstrz(p, name);

  rc = smb_request(share, smb, SMB_COM_CREATE_DIRECTORY, 0, namebuf, p - namebuf, 1);
  if (rc < 0) return rc;

  return 0;
}

int smb_rmdir(struct fs *fs, char *name)
{
  struct smb_share *share = (struct smb_share *) fs->data;
  struct smb *smb;
  char namebuf[MAXPATH + 1 + 1];
  char *p;
  int rc;

  rc = smb_convert_filename(name);
  if (rc < 0) return rc;

  // Delete directory
  smb = smb_init(share, 0);

  p = namebuf;
  *p++ = 4;
  p = addstrz(p, name);

  rc = smb_request(share, smb, SMB_COM_DELETE_DIRECTORY, 0, namebuf, p - namebuf, 1);
  if (rc < 0) return rc;

  return 0;
}

int smb_rename(struct fs *fs, char *oldname, char *newname)
{
  struct smb_share *share = (struct smb_share *) fs->data;
  struct smb *smb;
  char namebuf[(MAXPATH + 1 + 1) * 2];
  char *p;
  int rc;

  rc = smb_convert_filename(oldname);
  if (rc < 0) return rc;

  rc = smb_convert_filename(newname);
  if (rc < 0) return rc;

  // Rename file
  smb = smb_init(share, 0);

  p = namebuf;
  *p++ = 4;
  p = addstrz(p, oldname);
  *p++ = 4;
  p = addstrz(p, newname);

  rc = smb_request(share, smb, SMB_COM_RENAME, 1, namebuf, p - namebuf, 1);
  if (rc < 0) return rc;

  return 0;
}

int smb_link(struct fs *fs, char *oldname, char *newname)
{
  return -ENOSYS;
}

int smb_unlink(struct fs *fs, char *name)
{
  struct smb_share *share = (struct smb_share *) fs->data;
  struct smb *smb;
  char namebuf[MAXPATH + 1 + 1];
  char *p;
  int rc;

  rc = smb_convert_filename(name);
  if (rc < 0) return rc;

  // Delete file
  smb = smb_init(share, 0);

  p = namebuf;
  *p++ = 4;
  p = addstrz(p, name);

  rc = smb_request(share, smb, SMB_COM_DELETE, 1, namebuf, p - namebuf, 1);
  if (rc < 0) return rc;

  return 0;
}

int smb_opendir(struct file *filp, char *name)
{
  struct smb_share *share = (struct smb_share *) filp->fs->data;
  struct smb_findfirst_request req;
  struct smb_findfirst_response rsp;
  struct smb_directory *dir;
  int rsplen;
  int buflen;
  int rc;

  rc = smb_convert_filename(name);
  if (rc < 0) return rc;

  dir = (struct smb_directory *) kmalloc(sizeof(struct smb_directory));
  if (!dir) return -ENOMEM;

  memset(&req, 0, sizeof(req));
  req.search_attributes = SMB_FILE_ATTR_SYSTEM | SMB_FILE_ATTR_HIDDEN | SMB_FILE_ATTR_DIRECTORY;
  req.flags = SMB_CLOSE_IF_END;
  req.infolevel = 0x101;
  req.search_count = 512;
  strcpy(req.filename, name);
  if (*name) strcat(req.filename, "\\*");

  rsplen = sizeof(rsp);
  buflen = SMB_DIRBUF_SIZE;
  rc = smb_trans(share, TRANS2_FIND_FIRST2, &req, 12 + strlen(req.filename) + 1, NULL, 0, &rsp, &rsplen, dir->buffer, &buflen);
  if (rc < 0) 
  {
    kfree(dir);
    return rc;
  }

  dir->sid = rsp.sid;
  dir->eos = rsp.end_of_search;
  dir->entries_left = rsp.search_count;
  dir->fi = (struct smb_file_directory_info *) dir->buffer;
  strcpy(dir->path, name);

  filp->data = dir;
  return 0;
}

int smb_readdir(struct file *filp, struct dirent *dirp, int count)
{
  struct smb_share *share = (struct smb_share *) filp->fs->data;
  struct smb_directory *dir = (struct smb_directory *) filp->data;
  struct stat statbuf;

  if (count != 1) return -1;

again:
  if (dir->entries_left == 0)
  {
    struct smb_findnext_request req;
    struct smb_findnext_response rsp;
    int rsplen;
    int buflen;
    int rc;

    if (dir->eos) return 0;

    memset(&req, 0, sizeof(req));
    req.sid = dir->sid;
    req.flags = SMB_CONTINUE_BIT | SMB_CLOSE_IF_END;
    req.infolevel = 0x101;
    req.search_count = 512;

    rsplen = sizeof(rsp);
    buflen = SMB_DIRBUF_SIZE;
    rc = smb_trans(share, TRANS2_FIND_NEXT2, &req, sizeof(req), NULL, 0, &rsp, &rsplen, dir->buffer, &buflen);
    if (rc < 0) return rc;

    dir->eos = rsp.end_of_search;
    dir->entries_left = rsp.search_count;
    dir->fi = (struct smb_file_directory_info *) dir->buffer;

    if (dir->entries_left == 0) return 0;
  }

  if (dir->fi->filename[0] == '.' && (dir->fi->filename[1] == 0 || (dir->fi->filename[1] == '.' && dir->fi->filename[2] == 0))) 
  {
    dir->entries_left--;
    dir->fi = (struct smb_file_directory_info *) ((char *) dir->fi + dir->fi->next_entry_offset);
    goto again;
  }

  memset(&statbuf, 0, sizeof(struct stat));
  statbuf.nlink = 1;
  statbuf.ctime = ft2time(dir->fi->creation_time);
  statbuf.mtime = ft2time(dir->fi->last_write_time);
  statbuf.atime = ft2time(dir->fi->last_access_time);
  statbuf.size = dir->fi->end_of_file;
  if (dir->fi->ext_file_attributes & SMB_FILE_ATTR_DIRECTORY) statbuf.mode |= FS_DIRECTORY;

  smb_add_to_cache(share, dir->path, dir->fi->filename, &statbuf);

  dirp->ino = 0;
  dirp->namelen = strlen(dir->fi->filename);
  dirp->reclen = sizeof(struct dirent) - MAXPATH + dirp->namelen + 1;
  strcpy(dirp->name, dir->fi->filename);

  dir->entries_left--;
  dir->fi = (struct smb_file_directory_info *) ((char *) dir->fi + dir->fi->next_entry_offset);

  return 1;
}

struct fsops smbfsops =
{
  0,

  smb_lockfs,
  smb_unlockfs,

  smb_format,
  smb_mount,
  smb_umount,

  smb_statfs,

  smb_open,
  smb_close,
  smb_flush,

  smb_read,
  smb_write,
  smb_ioctl,

  smb_tell,
  smb_lseek,
  smb_chsize,

  smb_futime,
  smb_utime,

  smb_fstat,
  smb_stat,

  smb_mkdir,
  smb_rmdir,

  smb_rename,
  smb_link,
  smb_unlink,

  smb_opendir,
  smb_readdir
};

void init_smbfs()
{
  register_filesystem("smbfs", &smbfsops);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美a一区二区| 亚洲嫩草精品久久| 免费在线看成人av| 日韩欧美www| 国内精品第一页| 久久午夜国产精品| 成人三级在线视频| 亚洲免费成人av| 欧美视频在线一区| 蜜桃视频在线一区| 久久久另类综合| 91啪亚洲精品| 午夜不卡av在线| 久久久综合激的五月天| 波多野结衣的一区二区三区| 亚洲人成电影网站色mp4| 欧美亚洲自拍偷拍| 激情另类小说区图片区视频区| 久久久亚洲综合| 一本到不卡精品视频在线观看 | 日韩无一区二区| 国产一区亚洲一区| 亚洲人妖av一区二区| 欧美人动与zoxxxx乱| 国产伦精一区二区三区| 亚洲欧洲综合另类| 日韩欧美视频一区| 成人一区二区三区在线观看| 亚洲一区二区三区国产| 日韩免费一区二区| 91网址在线看| 激情图区综合网| 亚洲影视在线观看| 久久蜜桃av一区精品变态类天堂| av在线综合网| 美国欧美日韩国产在线播放| 国产精品久久久久久久久快鸭| 欧美日韩视频在线一区二区| 国产精品一区二区三区四区| 亚洲综合在线观看视频| 久久老女人爱爱| 欧美日韩第一区日日骚| 成人一区在线看| 国产乱一区二区| 一区二区三区中文在线观看| 精品福利一区二区三区免费视频| 99久久精品一区二区| 久久99精品久久久久| 亚洲欧美日韩久久| 国产亚洲精品精华液| 欧美日韩一区二区三区高清| 成人av午夜电影| 美女网站在线免费欧美精品| 亚洲精品国产视频| 国产女人aaa级久久久级| 91精品中文字幕一区二区三区| av午夜精品一区二区三区| 久久爱另类一区二区小说| 亚洲成人久久影院| 亚洲一区二区四区蜜桃| 国产精品毛片久久久久久久| www国产成人免费观看视频 深夜成人网| 欧美无人高清视频在线观看| av不卡免费电影| 国产91丝袜在线观看| 国产一区二区网址| 久久超碰97人人做人人爱| 天堂va蜜桃一区二区三区漫画版 | 成人午夜激情影院| 国产在线不卡视频| 久久99精品久久只有精品| 五月天婷婷综合| 午夜精品免费在线观看| 亚洲伊人伊色伊影伊综合网| 一区二区三区在线视频观看58| 国产精品久久久久久亚洲毛片 | 国产偷v国产偷v亚洲高清| 欧美一区午夜视频在线观看 | 99热99精品| 成人激情av网| 99久久国产综合精品色伊 | 欧美xxxxxxxx| 777a∨成人精品桃花网| 欧美精品色综合| 宅男在线国产精品| 日韩精品一区二区在线| 精品理论电影在线| 国产欧美日韩一区二区三区在线观看 | 欧美一级欧美三级在线观看| 在线电影欧美成精品| 3d动漫精品啪啪一区二区竹菊| 91.成人天堂一区| 精品国产一区二区国模嫣然| 精品粉嫩超白一线天av| 国产精品午夜在线观看| 亚洲天堂av一区| 亚洲一区二区影院| 美女久久久精品| 国产精品一区久久久久| 成人免费va视频| 在线视频你懂得一区| 欧美精品777| 久久综合色鬼综合色| 中文字幕精品一区二区精品绿巨人| 国产精品理伦片| 亚洲国产精品久久不卡毛片| 日本美女一区二区三区| 国产风韵犹存在线视精品| 91尤物视频在线观看| 91精品国产综合久久久久久久| 精品美女一区二区| 亚洲三级在线播放| 秋霞影院一区二区| 粉嫩绯色av一区二区在线观看| 色又黄又爽网站www久久| 制服丝袜在线91| 欧美激情在线一区二区| 亚洲永久免费av| 国产成人在线网站| 欧美综合一区二区三区| 久久亚洲精华国产精华液 | 欧美视频在线一区| 精品国产乱码久久久久久久| 亚洲人成亚洲人成在线观看图片| 天堂一区二区在线免费观看| 国产v综合v亚洲欧| 色综合中文字幕| 欧美一二区视频| 国产精品久久一卡二卡| 久久精品水蜜桃av综合天堂| 中文字幕日本乱码精品影院| 国产精品一卡二卡在线观看| 精品国精品自拍自在线| 蜜臀av性久久久久蜜臀av麻豆| 欧美日韩激情一区二区三区| 亚洲动漫第一页| 欧美丝袜自拍制服另类| 亚洲成人激情自拍| 69堂成人精品免费视频| 日本女人一区二区三区| 日韩亚洲欧美成人一区| 久久国产日韩欧美精品| 精品久久国产97色综合| 激情综合色综合久久| 久久精品视频在线免费观看 | 五月激情六月综合| 国产精品免费aⅴ片在线观看| 国产在线国偷精品免费看| 久久亚洲影视婷婷| 国产精品一区二区无线| 国产精品乱子久久久久| 99re成人在线| 亚洲成在人线免费| 欧美一级二级在线观看| 狠狠色丁香久久婷婷综合_中 | 亚洲自拍偷拍av| 欧美久久一二三四区| 日韩av午夜在线观看| 精品欧美乱码久久久久久1区2区| 国产在线精品不卡| 亚洲丝袜另类动漫二区| 欧美日韩一区二区欧美激情| 免费在线视频一区| 国产欧美日韩视频在线观看| 色网站国产精品| 青青草原综合久久大伊人精品优势 | 国产在线视频一区二区三区| 国产免费久久精品| 91黄色激情网站| 蜜臀久久99精品久久久久久9| 国产亚洲一区二区三区在线观看| 97久久精品人人澡人人爽| 亚洲午夜视频在线观看| 精品国产凹凸成av人导航| 成人午夜电影久久影院| 性久久久久久久久久久久| 精品入口麻豆88视频| av成人免费在线| 免费在线观看一区二区三区| 国产欧美一区二区三区鸳鸯浴 | 亚洲特黄一级片| 91精品国产aⅴ一区二区| 成人综合婷婷国产精品久久蜜臀 | 成人性生交大片免费看在线播放 | 777奇米成人网| 国产91精品精华液一区二区三区| 亚洲最色的网站| 久久久噜噜噜久久人人看 | 免费成人av在线播放| 中文字幕在线观看一区二区| 在线成人av影院| av亚洲精华国产精华精华| 麻豆国产91在线播放| 亚洲激情成人在线| 久久精品一区八戒影视| 欧美欧美欧美欧美首页| 91浏览器在线视频| 极品美女销魂一区二区三区 | 国产欧美日本一区二区三区| 欧美日韩一本到|