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

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

?? smbfs.c

?? Sanos Operating System Kernel ----------------------------- Sanos is an OS kernel for use in PC base
?? C
?? 第 1 頁 / 共 2 頁
字號:
//
// smbfs.c
//
// SMB 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>
#include "smb.h"

int smb_lockfs(struct fs *fs)
{
  struct smb_share *share = (struct smb_share *) fs->data;
  return wait_for_object(&share->server->lock, VFS_LOCK_TIMEOUT);
}

void smb_unlockfs(struct fs *fs)
{
  struct smb_share *share = (struct smb_share *) fs->data;
  release_mutex(&share->server->lock);
}

int smb_format(char *devname, char *opts)
{
  return -ENOSYS;
}

int smb_mount(struct fs *fs, char *opts)
{
  struct ip_addr ipaddr;
  char username[SMB_NAMELEN];
  char password[SMB_NAMELEN];
  char domain[SMB_NAMELEN];
  struct smb_share *share;
  int rc;

  // Get options
  ipaddr.addr = get_num_option(opts, "addr", IP_ADDR_ANY);
  if (ipaddr.addr == IP_ADDR_ANY) return -EINVAL;
  get_option(opts, "user", username, sizeof(username), "");
  get_option(opts, "domain", domain, sizeof(domain), "");
  get_option(opts, "password", password, sizeof(password), "");

  // Check arguments
  if (!fs->mntfrom) return -EINVAL;
  if (strlen(fs->mntfrom) + 1 > SMB_NAMELEN) return -EINVAL;

  if (strlen(password) + 1 + 
      strlen(username) + 1 + 
      strlen(domain) + 1 +
      strlen(SMB_CLIENT_OS) + 1 +
      strlen(SMB_CLIENT_LANMAN) + 1 > SMB_NAMELEN)
  {
    return -EBUF;
  }

  if (strlen(password) + 1 + 
      strlen(fs->mntfrom) + 1 + 
      strlen(SMB_SERVICE_DISK) + 1 > SMB_NAMELEN)
  {
    return -EBUF;
  }

  // Allocate share block
  share = (struct smb_share *) kmalloc(sizeof(struct smb_share));
  if (!share) return -ENOMEM;
  memset(share, 0, sizeof(struct smb_share));
  strcpy(share->sharename, fs->mntfrom);

  // Get connection to server
  rc = smb_get_connection(share, &ipaddr, domain, username, password);
  if (rc < 0)
  {
    kfree(share);
    return rc;
  }

  // Connect to share
  rc = smb_connect_tree(share);
  if (rc == -ECONN || rc == -ERST) rc = smb_reconnect(share);
  if (rc < 0)
  {
    smb_release_connection(share);
    kfree(share);
    return rc;
  }

  fs->data = share;

  return 0;
}

int smb_umount(struct fs *fs)
{
  struct smb_share *share = (struct smb_share *) fs->data;

  // Disconnect from share
  smb_disconnect_tree(share);
  
  // Release server connection
  smb_release_connection(share);

  // Deallocate share block
  kfree(share);

  return 0;
}

int smb_statfs(struct fs *fs, struct statfs *buf)
{
  struct smb_share *share = (struct smb_share *) fs->data;
  struct smb_fsinfo_request req;
  struct smb_info_allocation rsp;
  int rc;
  int rsplen;

  req.infolevel = SMB_INFO_ALLOCATION;
  rsplen = sizeof(rsp);
  rc = smb_trans(share, TRANS2_QUERY_FS_INFORMATION, &req, sizeof(req), NULL, 0, NULL, NULL, &rsp, &rsplen);
  if (rc < 0) return rc;

  buf->bsize = rsp.sector_per_unit * rsp.sectorsize;
  buf->iosize = rsp.sector_per_unit * rsp.sectorsize;
  buf->blocks = rsp.units_total;
  buf->bfree = rsp.units_avail;
  buf->files = -1;
  buf->ffree = -1;
  buf->cachesize = 0;

  return 0;
}

int smb_open(struct file *filp, char *name)
{
  struct smb_share *share = (struct smb_share *) filp->fs->data;
  struct smb *smb;
  struct smb_file *file;
  unsigned long mode;
  unsigned long access;
  int rc;

  // Convert filename
  rc = smb_convert_filename(name);
  if (rc < 0) return rc;

  // Determine open mode
  switch (filp->flags & (O_CREAT | O_EXCL | O_TRUNC))
  {
    case 0:
    case O_EXCL:
      // Open existing file
      mode = SMB_OPEN_EXISTING;
      break;

    case O_CREAT:
      // Open file, create new file if it does not exists
      mode = SMB_OPEN_ALWAYS;
      break;

    case O_CREAT | O_EXCL:
    case O_CREAT | O_TRUNC | O_EXCL:
      // Create new file, fail if it exists
      mode = SMB_CREATE_NEW;
      filp->flags |= F_MODIFIED;
      break;

    case O_TRUNC:
    case O_TRUNC | O_EXCL:
      // Open and truncate existing file
      mode = SMB_TRUNCATE_EXISTING;
      break;

    case O_CREAT | O_TRUNC:
      // Create new file, trunc existing file if it exists
      mode = SMB_CREATE_ALWAYS;
      break;

    default:
      return -EINVAL;
  }

  // Determine file access
  if (filp->flags & O_RDWR)
    access = SMB_ACCESS_GENERIC_READ | SMB_ACCESS_GENERIC_WRITE;
  else if (filp->flags & O_WRONLY)
    access = SMB_ACCESS_GENERIC_WRITE;
  else if (filp->flags & (O_CREAT | O_TRUNC))
    access = SMB_ACCESS_GENERIC_READ | SMB_ACCESS_GENERIC_WRITE;
  else
    access = SMB_ACCESS_GENERIC_READ;

  // Allocate file structure
  file = (struct smb_file *) kmalloc(sizeof(struct smb_file));
  if (!file) return -ENOMEM;
  memset(file, 0, sizeof(struct smb_file));

  // Open/create file
  smb = smb_init(share, 0);
  smb->params.req.create.andx.cmd = 0xFF;
  smb->params.req.create.name_length = strlen(name) + 1;
  smb->params.req.create.desired_access = access;
  smb->params.req.create.ext_file_attributes = SMB_FILE_ATTR_NORMAL;
  smb->params.req.create.share_access = SMB_FILE_SHARE_READ | SMB_FILE_SHARE_WRITE;
  smb->params.req.create.create_disposition = mode;
  smb->params.req.create.impersonation_level = 0x02;

  rc = smb_request(share, smb, SMB_COM_NT_CREATE_ANDX, 24, name, strlen(name) + 1, 1);
  if (rc < 0) 
  {
    kfree(file);
    return rc;
  }

  file->fid = smb->params.rsp.create.fid;
  file->attrs = (unsigned short) smb->params.rsp.create.ext_file_attributes;
  if (file->attrs & SMB_FILE_ATTR_DIRECTORY) file->statbuf.mode |= FS_DIRECTORY;
  file->statbuf.devno = NODEV;
  file->statbuf.nlink = 1;
  file->statbuf.ctime = ft2time(smb->params.rsp.create.creation_time);
  file->statbuf.mtime = ft2time(smb->params.rsp.create.last_write_time);
  file->statbuf.atime = ft2time(smb->params.rsp.create.last_access_time);
  file->statbuf.size = smb->params.rsp.create.end_of_file;

  if (filp->flags & O_APPEND) 
    filp->pos = file->statbuf.quad.size_low;
  else
    filp->pos = 0;

  filp->data = file;

  return 0;
}

int smb_close(struct file *filp)
{
  struct smb_share *share = (struct smb_share *) filp->fs->data;
  struct smb *smb;
  int rc;

  if (filp->flags & F_DIR)
  {
    struct smb_directory *dir = (struct smb_directory *) filp->data;

    if (!dir->eos)
    {
      smb = smb_init(share, 0);
      smb->params.req.findclose.sid = dir->sid;

      rc = smb_request(share, smb, SMB_COM_FIND_CLOSE2, 1, NULL, 0, 0);
      if (rc < 0) return rc;
    }

    kfree(dir);
    filp->data = NULL;
  }
  else
  {
    struct smb_file *file = (struct smb_file *) filp->data;

    smb = smb_init(share, 0);
    smb->params.req.close.fid = file->fid;

    rc = smb_request(share, smb, SMB_COM_CLOSE, 3, NULL, 0, 0);
    if (rc < 0) return rc;

    kfree(file);
    filp->data = NULL;
  }

  smb_clear_cache(share);

  return 0;
}

int smb_flush(struct file *filp)
{
  struct smb_share *share = (struct smb_share *) filp->fs->data;
  struct smb_file *file = (struct smb_file *) filp->data;
  struct smb *smb;
  int rc;

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

  smb = smb_init(share, 0);
  smb->params.req.flush.fid = file->fid;

  rc = smb_request(share, smb, SMB_COM_FLUSH, 1, NULL, 0, 0);
  if (rc < 0) return rc;

  return 0;
}

static int smb_read_raw(struct smb_share *share, struct smb_file *file, void *data, size_t size, loff_t pos)
{
  struct smb *smb;
  unsigned char hdr[4];
  int len;
  int rc;

  smb = smb_init(share, 0);
  smb->params.req.readraw.fid = file->fid;
  smb->params.req.readraw.offset = pos;
  smb->params.req.readraw.max_count = size;

  rc = smb_send(share, smb, SMB_COM_READ_RAW, 8, NULL, 0);
  if (rc < 0) return rc;
  
  rc = recv_fully(share->server->sock, (char *) &hdr, 4, 0);
  if (rc < 0) return rc;

  len = hdr[3] | (hdr[2] << 8) | (hdr[1] << 16) | (hdr[0] << 24);
  if (len == 0) return 0;

  rc = recv_fully(share->server->sock, data, len, 0);
  if (rc < 0) return rc;

  return rc;
}

static int smb_read_normal(struct smb_share *share, struct smb_file *file, void *data, size_t size, loff_t pos)
{
  struct smb *smb;
  int len;
  int rc;

  // Read from file
  smb = smb_init(share, 0);
  smb->params.req.read.andx.cmd = 0xFF;
  smb->params.req.read.fid = file->fid;
  smb->params.req.read.offset = pos;
  smb->params.req.read.max_count = size;
  smb->params.req.read.offset_high = 0;

  rc = smb_request(share, smb, SMB_COM_READ_ANDX, 12, NULL, 0, 0);
  if (rc < 0) return rc;

  len = smb->params.rsp.read.data_length;
  if (len) memcpy(data, (char *) smb + smb->params.rsp.read.data_offset + 4, len);

  return len;
}

int smb_read(struct file *filp, void *data, size_t size)
{
  struct smb_share *share = (struct smb_share *) filp->fs->data;
  struct smb_file *file = (struct smb_file *) filp->data;
  char *p;
  size_t left;
  size_t count;
  int rc;

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

  left = size;
  p = (char *) data;

  if (filp->pos < file->statbuf.quad.size_low)
  {
    // Read data using raw mode
    while (1)
    {
      count = left;
      if (count > SMB_RAW_CHUNKSIZE) count = SMB_RAW_CHUNKSIZE;

      rc = smb_read_raw(share, file, p, count, filp->pos);
      if (rc < 0) return rc;
      if (rc == 0) break;

      filp->pos += rc;
      left -= rc;
      p += rc;

      if (left == 0) return size;
    }
  }

  // Read rest using normal mode
  while (filp->pos < file->statbuf.quad.size_low && left > 0)
  {
    count = left;
    if (count > SMB_NORMAL_CHUNKSIZE) count = SMB_NORMAL_CHUNKSIZE;

    rc = smb_read_normal(share, file, p, count, filp->pos);
    if (rc < 0) return rc;
    if (rc == 0) return size - left;

    filp->pos += rc;
    left -= rc;
    p += rc;
  }

  return size - left;
}

static int smb_write_normal(struct smb_share *share, struct smb_file *file, void *data, size_t size, loff_t pos)
{
  struct smb *smb;
  int rc;

  // Write to file
  smb = smb_init(share, 0);
  smb->params.req.write.andx.cmd = 0xFF;
  smb->params.req.write.fid = file->fid;
  smb->params.req.write.offset = pos;
  smb->params.req.write.data_length = size;
  smb->params.req.write.data_offset = SMB_HEADER_LEN + 14 * 2;
  smb->params.req.write.offset_high = 0;

  rc = smb_request(share, smb, SMB_COM_WRITE_ANDX, 14, data, size, 0);
  if (rc < 0) return rc;

  return smb->params.rsp.write.count;
}

int smb_write(struct file *filp, void *data, size_t size)
{
  struct smb_share *share = (struct smb_share *) filp->fs->data;
  struct smb_file *file = (struct smb_file *) filp->data;
  char *p;
  size_t left;
  size_t count;
  int rc;

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

  left = size;
  p = (char *) data;

  while (left > 0)
  {
    count = left;
    if (count > SMB_NORMAL_CHUNKSIZE) count = SMB_NORMAL_CHUNKSIZE;

    rc = smb_write_normal(share, file, p, count, filp->pos);
    if (rc < 0) return rc;

    filp->pos += rc;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品日韩一区二区三区免费视频| 国产精品久久久久一区二区三区共| 激情另类小说区图片区视频区| 亚洲免费观看高清完整版在线| 精品免费99久久| 亚洲丝袜制服诱惑| 成人免费在线播放视频| 亚洲三级电影全部在线观看高清| 日本亚洲最大的色成网站www| 午夜精品久久久久久久| 日韩av电影一区| 在线视频国产一区| 欧美色大人视频| 91精品国产综合久久精品麻豆| 不卡视频一二三| 一本色道**综合亚洲精品蜜桃冫| 99久久精品国产导航| 91丨九色丨黑人外教| 99国产麻豆精品| 久久精品男人的天堂| 1024成人网| 精品亚洲porn| 99久久伊人久久99| 91精彩视频在线观看| 欧美日韩午夜精品| 亚洲精品成人精品456| 日韩在线一区二区| 国产福利精品一区| 一本色道**综合亚洲精品蜜桃冫 | 成人深夜在线观看| av网站一区二区三区| 国产亚洲自拍一区| 国产乱码字幕精品高清av| 91在线云播放| 亚洲欧洲韩国日本视频| 不卡av在线免费观看| 国产精品视频线看| 亚洲一卡二卡三卡四卡无卡久久| 奇米精品一区二区三区在线观看一| 国产精品一区二区久久不卡| 精品女同一区二区| 国产精品一二三四五| 国产亚洲一区二区在线观看| 国产激情视频一区二区三区欧美| 久久精品视频一区| 99久久婷婷国产精品综合| 亚洲婷婷在线视频| 欧洲色大大久久| 亚洲成人免费av| 国产激情视频一区二区在线观看| 欧美激情中文不卡| 午夜免费久久看| 日韩欧美久久久| 亚洲电影激情视频网站| 91精品久久久久久久久99蜜臂| 日韩在线卡一卡二| 久久婷婷色综合| 日韩激情av在线| 欧美成人欧美edvon| 成人免费电影视频| 一区二区视频免费在线观看| 国产黑丝在线一区二区三区| 日本一区二区三区电影| 激情五月婷婷综合网| 国产欧美1区2区3区| 色偷偷一区二区三区| 天天亚洲美女在线视频| 精品少妇一区二区三区日产乱码| 丁香天五香天堂综合| 久久综合久久综合久久综合| 99视频精品全部免费在线| 日韩精品高清不卡| 国产日韩影视精品| 欧美又粗又大又爽| 亚洲欧洲色图综合| 欧美一级理论片| 免费在线观看日韩欧美| 日本一区二区成人在线| 884aa四虎影成人精品一区| 国产精品系列在线观看| 亚洲一区二三区| 亚洲国产成人一区二区三区| 91精品国产美女浴室洗澡无遮挡| 成人性生交大片免费看在线播放 | 午夜天堂影视香蕉久久| 国产日韩影视精品| 日韩精品一区二区三区三区免费 | 亚洲欧洲日产国码二区| 日韩欧美高清dvd碟片| 91黄视频在线观看| 国产成人亚洲精品青草天美| 秋霞电影网一区二区| 亚洲男人天堂av网| 国产日韩在线不卡| 久久亚洲二区三区| 日韩亚洲电影在线| 欧美精品电影在线播放| 婷婷久久综合九色综合伊人色| 日本一区二区三区国色天香| 精品国产伦理网| 不卡的看片网站| 国产精品影视在线| 韩国一区二区三区| 久久激情五月婷婷| 欧美国产综合色视频| 日韩女优av电影| 9191久久久久久久久久久| 色乱码一区二区三区88| 99精品视频在线免费观看| 国产精品一二二区| 国产风韵犹存在线视精品| 韩国精品主播一区二区在线观看 | 国产最新精品免费| 裸体在线国模精品偷拍| 中文在线免费一区三区高中清不卡| 日韩精品一区二区三区视频播放| 欧美日韩成人在线| 国产在线播放一区三区四| 亚洲免费av高清| 亚洲精品va在线观看| 一级特黄大欧美久久久| 亚洲一区二区在线视频| 五月天亚洲婷婷| 美女尤物国产一区| 国产乱码精品一区二区三| 国产v综合v亚洲欧| 国产乱子伦一区二区三区国色天香| 国产精品综合二区| 高清不卡在线观看av| av中文字幕一区| 一本久久a久久精品亚洲| 在线观看中文字幕不卡| 欧美精品 日韩| 2021国产精品久久精品| 亚洲国产成人午夜在线一区| 亚洲精品国产精华液| 亚洲大型综合色站| 久久91精品久久久久久秒播| 国产精品一区二区x88av| av不卡在线观看| 欧美午夜一区二区三区| 欧美成人福利视频| 国产欧美一区二区精品性色超碰| 椎名由奈av一区二区三区| 亚洲国产日韩a在线播放性色| 国产精品电影一区二区| 亚洲影视在线观看| 精品亚洲porn| 一本高清dvd不卡在线观看| 欧美男女性生活在线直播观看 | 色悠悠亚洲一区二区| 欧美日韩激情在线| 久久久91精品国产一区二区精品| 亚洲三级免费电影| 久久激五月天综合精品| 91麻豆成人久久精品二区三区| 91麻豆精品91久久久久同性| 亚洲国产精品高清| 午夜精品一区在线观看| 成人午夜在线播放| 欧美高清视频在线高清观看mv色露露十八| 久久久久久毛片| 久久久久久麻豆| 亚洲一区二区三区四区五区中文| 精品一区二区三区在线观看国产| 91丝袜美腿高跟国产极品老师 | 日韩欧美一区二区在线视频| 综合网在线视频| 久久精品99国产精品日本| 91丨porny丨国产入口| 精品91自产拍在线观看一区| 一区二区三区久久久| 国产麻豆91精品| 欧美一区二区福利视频| 亚洲综合清纯丝袜自拍| 成人在线视频一区二区| 精品久久久久久综合日本欧美| 一区二区欧美在线观看| 99久久婷婷国产精品综合| 国产丝袜在线精品| 久久精品国产秦先生| 欧美丰满高潮xxxx喷水动漫| 亚洲人午夜精品天堂一二香蕉| 国产精品一区2区| 久久免费看少妇高潮| 日本在线不卡视频一二三区| 在线观看视频91| 亚洲精品亚洲人成人网| a美女胸又www黄视频久久| 欧美国产国产综合| 成人小视频在线| 国产亚洲视频系列| 国产精品一二二区| 久久精品视频一区| 国产成人精品亚洲午夜麻豆| 精品福利一区二区三区免费视频| 日韩**一区毛片| 欧美一区二区三区色| 亚洲成人精品在线观看| 欧美裸体bbwbbwbbw|