237 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			237 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
	
/* mount.h: mount definitions.
 | 
						|
 | 
						|
   Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
 | 
						|
   2008, 2009, 2010, 2011, 2012, 2013, 2014 Red Hat, Inc.
 | 
						|
 | 
						|
This file is part of Cygwin.
 | 
						|
 | 
						|
This software is a copyrighted work licensed under the terms of the
 | 
						|
Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
 | 
						|
details. */
 | 
						|
 | 
						|
#ifndef _MOUNT_H
 | 
						|
#define _MOUNT_H
 | 
						|
 | 
						|
enum disk_type
 | 
						|
{
 | 
						|
  DT_NODISK,
 | 
						|
  DT_CDROM,
 | 
						|
  DT_FLOPPY,
 | 
						|
  DT_HARDDISK,
 | 
						|
  DT_SHARE_SMB,
 | 
						|
  DT_SHARE_NFS
 | 
						|
};
 | 
						|
 | 
						|
disk_type get_disk_type (LPCWSTR);
 | 
						|
 | 
						|
/* Don't add new fs types without adding them to fs_names in mount.cc!
 | 
						|
   Don't reorder without reordering fs_names in mount.cc! */
 | 
						|
enum fs_info_type
 | 
						|
{
 | 
						|
  none = 0,
 | 
						|
  fat,
 | 
						|
  ntfs,
 | 
						|
  refs,
 | 
						|
  samba,
 | 
						|
  nfs,
 | 
						|
  netapp,
 | 
						|
  cdrom,
 | 
						|
  udf,
 | 
						|
  csc_cache,
 | 
						|
  sunwnfs,
 | 
						|
  unixfs,
 | 
						|
  mvfs,
 | 
						|
  cifs,
 | 
						|
  nwfs,
 | 
						|
  ncfsd,
 | 
						|
  afs,
 | 
						|
  /* Always last. */
 | 
						|
  max_fs_type
 | 
						|
};
 | 
						|
 | 
						|
extern struct fs_names_t {
 | 
						|
    const char *name;
 | 
						|
    bool block_device;
 | 
						|
} fs_names[];
 | 
						|
 | 
						|
#define IMPLEMENT_FS_FLAG(type) \
 | 
						|
  bool is_##type (bool val) { if (val) status.fs_type = type; return val; } \
 | 
						|
  bool is_##type () const   { return status.fs_type == type; }
 | 
						|
 | 
						|
class fs_info
 | 
						|
{
 | 
						|
  struct status_flags
 | 
						|
  {
 | 
						|
    ULONG flags;		/* Volume flags */
 | 
						|
    ULONG samba_version;	/* Samba version if available */
 | 
						|
    ULONG name_len;		/* MaximumComponentNameLength */
 | 
						|
    fs_info_type fs_type;	/* Filesystem type */
 | 
						|
    unsigned is_remote_drive		: 1;
 | 
						|
    unsigned has_acls			: 1;
 | 
						|
    unsigned hasgood_inode		: 1;
 | 
						|
    unsigned caseinsensitive		: 1;
 | 
						|
    unsigned has_buggy_open		: 1;
 | 
						|
    unsigned has_buggy_reopen		: 1;
 | 
						|
    unsigned has_buggy_fileid_dirinfo	: 1;
 | 
						|
    unsigned has_buggy_basic_info	: 1;
 | 
						|
    unsigned has_dos_filenames_only	: 1;
 | 
						|
  } status;
 | 
						|
  ULONG sernum;			/* Volume Serial Number */
 | 
						|
  char fsn[80];			/* Windows filesystem name */
 | 
						|
 | 
						|
 public:
 | 
						|
  void clear ()
 | 
						|
  {
 | 
						|
    memset (&status, 0 , sizeof status);
 | 
						|
    sernum = 0UL;
 | 
						|
    fsn[0] = '\0';
 | 
						|
  }
 | 
						|
  fs_info () { clear (); }
 | 
						|
 | 
						|
  IMPLEMENT_STATUS_FLAG (ULONG, flags)
 | 
						|
  IMPLEMENT_STATUS_FLAG (ULONG, samba_version)
 | 
						|
  IMPLEMENT_STATUS_FLAG (ULONG, name_len)
 | 
						|
  IMPLEMENT_STATUS_FLAG (bool, is_remote_drive)
 | 
						|
  IMPLEMENT_STATUS_FLAG (bool, has_acls)
 | 
						|
  IMPLEMENT_STATUS_FLAG (bool, hasgood_inode)
 | 
						|
  IMPLEMENT_STATUS_FLAG (bool, caseinsensitive)
 | 
						|
  IMPLEMENT_STATUS_FLAG (bool, has_buggy_open)
 | 
						|
  IMPLEMENT_STATUS_FLAG (bool, has_buggy_reopen)
 | 
						|
  IMPLEMENT_STATUS_FLAG (bool, has_buggy_fileid_dirinfo)
 | 
						|
  IMPLEMENT_STATUS_FLAG (bool, has_buggy_basic_info)
 | 
						|
  IMPLEMENT_STATUS_FLAG (bool, has_dos_filenames_only)
 | 
						|
  IMPLEMENT_FS_FLAG (fat)
 | 
						|
  IMPLEMENT_FS_FLAG (ntfs)
 | 
						|
  IMPLEMENT_FS_FLAG (refs)
 | 
						|
  IMPLEMENT_FS_FLAG (samba)
 | 
						|
  IMPLEMENT_FS_FLAG (nfs)
 | 
						|
  IMPLEMENT_FS_FLAG (netapp)
 | 
						|
  IMPLEMENT_FS_FLAG (cdrom)
 | 
						|
  IMPLEMENT_FS_FLAG (udf)
 | 
						|
  IMPLEMENT_FS_FLAG (csc_cache)
 | 
						|
  IMPLEMENT_FS_FLAG (sunwnfs)
 | 
						|
  IMPLEMENT_FS_FLAG (unixfs)
 | 
						|
  IMPLEMENT_FS_FLAG (mvfs)
 | 
						|
  IMPLEMENT_FS_FLAG (cifs)
 | 
						|
  IMPLEMENT_FS_FLAG (nwfs)
 | 
						|
  IMPLEMENT_FS_FLAG (ncfsd)
 | 
						|
  IMPLEMENT_FS_FLAG (afs)
 | 
						|
  fs_info_type what_fs () const { return status.fs_type; }
 | 
						|
  bool got_fs () const { return status.fs_type != none; }
 | 
						|
 | 
						|
  ULONG serial_number () const { return sernum; }
 | 
						|
 | 
						|
  const char *fsname () const { return fsn[0] ? fsn : "unknown"; }
 | 
						|
 | 
						|
  bool __reg3 update (PUNICODE_STRING, HANDLE);
 | 
						|
  bool inited () const { return !!status.flags; }
 | 
						|
};
 | 
						|
 | 
						|
/* Mount table entry */
 | 
						|
 | 
						|
class mount_item
 | 
						|
{
 | 
						|
 public:
 | 
						|
  /* FIXME: Nasty static allocation.  Need to have a heap in the shared
 | 
						|
     area [with the user being able to configure at runtime the max size].  */
 | 
						|
  /* Win32-style mounted partition source ("C:\foo\bar").
 | 
						|
     native_path[0] == 0 for unused entries.  */
 | 
						|
  char native_path[CYG_MAX_PATH];
 | 
						|
  int native_pathlen;
 | 
						|
 | 
						|
  /* POSIX-style mount point ("/foo/bar") */
 | 
						|
  char posix_path[CYG_MAX_PATH];
 | 
						|
  int posix_pathlen;
 | 
						|
 | 
						|
  unsigned flags;
 | 
						|
 | 
						|
  void init (const char *dev, const char *path, unsigned flags);
 | 
						|
 | 
						|
  struct mntent *getmntent ();
 | 
						|
  int build_win32 (char *, const char *, unsigned *, unsigned);
 | 
						|
};
 | 
						|
 | 
						|
/* Warning: Decreasing this value will cause cygwin.dll to ignore existing
 | 
						|
   higher numbered registry entries.  Don't change this number willy-nilly.
 | 
						|
   What we need is to have a more dynamic allocation scheme, but the current
 | 
						|
   scheme should be satisfactory for a long while yet.  */
 | 
						|
#define MAX_MOUNTS 64
 | 
						|
 | 
						|
class reg_key;
 | 
						|
struct device;
 | 
						|
 | 
						|
/* NOTE: Do not make gratuitous changes to the names or organization of the
 | 
						|
   below class.  The layout is checksummed to determine compatibility between
 | 
						|
   different cygwin versions. */
 | 
						|
class mount_info
 | 
						|
{
 | 
						|
 public:
 | 
						|
  int nmounts;
 | 
						|
  mount_item mount[MAX_MOUNTS];
 | 
						|
 | 
						|
  static bool got_usr_bin;
 | 
						|
  static bool got_usr_lib;
 | 
						|
  static int root_idx;
 | 
						|
 | 
						|
  /* cygdrive_prefix is used as the root of the path automatically
 | 
						|
     prepended to a path when the path has no associated mount.
 | 
						|
     cygdrive_flags are the default flags for the cygdrives. */
 | 
						|
  char cygdrive[CYG_MAX_PATH];
 | 
						|
  size_t cygdrive_len;
 | 
						|
  unsigned cygdrive_flags;
 | 
						|
 private:
 | 
						|
  int posix_sorted[MAX_MOUNTS];
 | 
						|
  int native_sorted[MAX_MOUNTS];
 | 
						|
 | 
						|
 public:
 | 
						|
  void init (bool);
 | 
						|
  int add_item (const char *dev, const char *path, unsigned flags);
 | 
						|
  int del_item (const char *path, unsigned flags);
 | 
						|
 | 
						|
  unsigned set_flags_from_win32_path (const char *path);
 | 
						|
  int conv_to_win32_path (const char *src_path, char *dst, device&,
 | 
						|
			  unsigned *flags = NULL);
 | 
						|
  int conv_to_posix_path (PWCHAR src_path, char *posix_path,
 | 
						|
			  int keep_rel_p);
 | 
						|
  int conv_to_posix_path (const char *src_path, char *posix_path,
 | 
						|
			  int keep_rel_p);
 | 
						|
  struct mntent *getmntent (int x);
 | 
						|
 | 
						|
  int write_cygdrive_info (const char *cygdrive_prefix, unsigned flags);
 | 
						|
  int get_cygdrive_info (char *user, char *system, char* user_flags,
 | 
						|
			 char* system_flags);
 | 
						|
  void cygdrive_posix_path (const char *src, char *dst, int trailing_slash_p);
 | 
						|
  int get_mounts_here (const char *parent_dir, int,
 | 
						|
		       PUNICODE_STRING mount_points,
 | 
						|
		       PUNICODE_STRING cygd);
 | 
						|
 | 
						|
 private:
 | 
						|
  void sort ();
 | 
						|
  void mount_slash ();
 | 
						|
  void create_root_entry (const PWCHAR root);
 | 
						|
 | 
						|
  bool from_fstab_line (char *line, bool user);
 | 
						|
  bool from_fstab (bool user, WCHAR [], PWCHAR);
 | 
						|
 | 
						|
  int cygdrive_win32_path (const char *src, char *dst, int& unit);
 | 
						|
};
 | 
						|
 | 
						|
class dos_drive_mappings
 | 
						|
{
 | 
						|
  struct mapping
 | 
						|
  {
 | 
						|
    mapping *next;
 | 
						|
    size_t doslen;
 | 
						|
    size_t ntlen;
 | 
						|
    wchar_t *dospath;
 | 
						|
    wchar_t *ntdevpath;
 | 
						|
  };
 | 
						|
  mapping *mappings;
 | 
						|
 | 
						|
public:
 | 
						|
  dos_drive_mappings ();
 | 
						|
  ~dos_drive_mappings ();
 | 
						|
  wchar_t *fixup_if_match (wchar_t *path);
 | 
						|
};
 | 
						|
#endif
 |