⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fhandler_virtual.cc

📁 cygwin, 著名的在win32下模拟unix操作系统的东东
💻 CC
字号:
/* fhandler_virtual.cc: base fhandler class for virtual filesystems   Copyright 2002 Red Hat, Inc.This file is part of Cygwin.This software is a copyrighted work licensed under the terms of theCygwin license.  Please consult the file "CYGWIN_LICENSE" fordetails. */#include "winsup.h"#include <errno.h>#include <unistd.h>#include <stdlib.h>#include <sys/cygwin.h>#include "cygerrno.h"#include "security.h"#include "fhandler.h"#include "path.h"#include "dtable.h"#include "shared_info.h"#include "cygheap.h"#include <assert.h>#define _COMPILING_NEWLIB#include <dirent.h>fhandler_virtual::fhandler_virtual (DWORD devtype):  fhandler_base (devtype), filebuf (NULL), bufalloc ((size_t) -1),  fileid (-1){}fhandler_virtual::~fhandler_virtual (){  if (filebuf)    free (filebuf);  filebuf = NULL;}voidfhandler_virtual::fixup_after_exec (HANDLE){  if (filebuf)    filebuf = NULL;}DIR *fhandler_virtual::opendir (path_conv& pc){  DIR *dir;  DIR *res = NULL;  size_t len;  if (exists () <= 0)    set_errno (ENOTDIR);  else if ((len = strlen (get_name ())) > MAX_PATH - 3)    set_errno (ENAMETOOLONG);  else if ((dir = (DIR *) malloc (sizeof (DIR))) == NULL)    set_errno (ENOMEM);  else if ((dir->__d_dirname = (char *) malloc (len + 3)) == NULL)    {      free (dir);      set_errno (ENOMEM);    }  else if ((dir->__d_dirent =      (struct dirent *) malloc (sizeof (struct dirent))) == NULL)    {      free (dir);      set_errno (ENOMEM);    }  else    {      strcpy (dir->__d_dirname, get_name ());      dir->__d_dirent->d_version = __DIRENT_VERSION;      cygheap_fdnew fd;      fd = this;      fd->set_nohandle (true);      dir->__d_dirent->d_fd = fd;      dir->__d_u.__d_data.__fh = this;      dir->__d_cookie = __DIRENT_COOKIE;      dir->__d_u.__d_data.__handle = INVALID_HANDLE_VALUE;      dir->__d_position = 0;      dir->__d_dirhash = get_namehash ();      res = dir;    }  syscall_printf ("%p = opendir (%s)", res, get_name ());  return res;}__off64_t fhandler_virtual::telldir (DIR * dir){  return dir->__d_position;}voidfhandler_virtual::seekdir (DIR * dir, __off64_t loc){  dir->__d_position = loc;  return;}voidfhandler_virtual::rewinddir (DIR * dir){  dir->__d_position = 0;  return;}intfhandler_virtual::closedir (DIR * dir){  return 0;}__off64_tfhandler_virtual::lseek (__off64_t offset, int whence){  /*   * On Linux, when you lseek within a /proc file,   * the contents of the file are updated.   */  if (!fill_filebuf ())    return (__off64_t) -1;  switch (whence)    {    case SEEK_SET:      position = offset;      break;    case SEEK_CUR:      position += offset;      break;    case SEEK_END:      position = filesize + offset;      break;    default:      set_errno (EINVAL);      return (__off64_t) -1;    }  return position;}intfhandler_virtual::dup (fhandler_base * child){  int ret = fhandler_base::dup (child);  if (!ret)    {      fhandler_virtual *fhproc_child = (fhandler_virtual *) child;      fhproc_child->filebuf = (char *) malloc (filesize);      fhproc_child->bufalloc = fhproc_child->filesize = filesize;      fhproc_child->position = position;      memcpy (fhproc_child->filebuf, filebuf, filesize);      fhproc_child->set_flags (get_flags ());    }  return ret;}intfhandler_virtual::close (){  if (filebuf)    free (filebuf);  filebuf = NULL;  bufalloc = (size_t) -1;  cygwin_shared->delqueue.process_queue ();  return 0;}intfhandler_virtual::read (void *ptr, size_t len){  if (len == 0)    return 0;  if (openflags & O_DIROPEN)    {      set_errno (EISDIR);      return -1;    }  if (!filebuf)    return 0;  int read = len;  if (read > filesize - position)    read = filesize - position;  if (read < 0)    read = 0;  else    memcpy (ptr, filebuf + position, read);  position += read;  return read;}intfhandler_virtual::write (const void *ptr, size_t len){  set_errno (EACCES);  return -1;}/* low-level open for all proc files */intfhandler_virtual::open (path_conv *, int flags, mode_t mode){  set_r_binary (1);  set_w_binary (1);  set_has_acls (false);  set_isremote (false);  /* what to do about symlinks? */  set_symlink_p (false);  set_execable_p (not_executable);  set_socket_p (false);  set_flags ((flags & ~O_TEXT) | O_BINARY);  return 1;}intfhandler_virtual::exists (){  return 0;}boolfhandler_virtual::fill_filebuf (){  return true;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -