Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/path.h')
-rw-r--r--winsup/cygwin/path.h85
1 files changed, 61 insertions, 24 deletions
diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h
index 1052debda..c8bb7cead 100644
--- a/winsup/cygwin/path.h
+++ b/winsup/cygwin/path.h
@@ -1,6 +1,6 @@
/* path.h: path data structures
- Copyright 1996, 1997, 1998, 2000 Red Hat, Inc.
+ Copyright 1996, 1997, 1998, 2000, 2001, 2002 Red Hat, Inc.
This file is part of Cygwin.
@@ -23,7 +23,8 @@ enum pathconv_arg
PC_SYM_CONTENTS = 0x0008,
PC_FULL = 0x0010,
PC_NULLEMPTY = 0x0020,
- PC_CHECK_EA = 0x0040
+ PC_CHECK_EA = 0x0040,
+ PC_POSIX = 0x0080
};
enum case_checking
@@ -43,10 +44,11 @@ enum path_types
PATH_SYMLINK = MOUNT_SYMLINK,
PATH_BINARY = MOUNT_BINARY,
PATH_EXEC = MOUNT_EXEC,
+ PATH_NOTEXEC = MOUNT_NOTEXEC,
PATH_CYGWIN_EXEC = MOUNT_CYGWIN_EXEC,
PATH_ALL_EXEC = (PATH_CYGWIN_EXEC | PATH_EXEC),
+ PATH_TEXT = 0x02000000,
PATH_ISDISK = 0x04000000,
- PATH_NOTEXEC = 0x08000000,
PATH_HAS_SYMLINKS = 0x10000000,
PATH_HASBUGGYOPEN = 0x20000000,
PATH_SOCKET = 0x40000000,
@@ -54,18 +56,23 @@ enum path_types
};
class symlink_info;
-class path_conv
+struct fs_info
{
- char path[MAX_PATH];
+ char name[MAX_PATH];
char root_dir[MAX_PATH];
- char fs_name[MAX_PATH];
- DWORD fs_flags;
- DWORD fs_serial;
+ DWORD flags;
+ DWORD serial;
DWORD sym_opt; /* additional options to pass to symlink_info resolver */
- void add_ext_from_sym (symlink_info&);
- void update_fs_info (const char*);
+ DWORD is_remote_drive;
DWORD drive_type;
- bool is_remote_drive;
+ bool update (const char *);
+};
+class path_conv
+{
+ char path[MAX_PATH];
+ DWORD fileattr;
+ fs_info fs;
+ void add_ext_from_sym (symlink_info&);
public:
unsigned path_flags;
@@ -73,20 +80,27 @@ class path_conv
int error;
DWORD devn;
int unit;
- DWORD fileattr;
BOOL case_clash;
+ char *normalized_path;
int isdisk () const { return path_flags & PATH_ISDISK;}
- int isremote () const {return is_remote_drive;}
+ int isremote () const {return fs.is_remote_drive;}
int has_acls () const {return path_flags & PATH_HASACLS;}
int has_symlinks () const {return path_flags & PATH_HAS_SYMLINKS;}
int hasgood_inode () const {return path_flags & PATH_HASACLS;} // Not strictly correct
int has_buggy_open () const {return path_flags & PATH_HASBUGGYOPEN;}
- int isbinary () const {return path_flags & PATH_BINARY;}
+ int binmode () const
+ {
+ if (path_flags & PATH_BINARY)
+ return O_BINARY;
+ if (path_flags & PATH_TEXT)
+ return O_TEXT;
+ return 0;
+ }
int issymlink () const {return path_flags & PATH_SYMLINK;}
int issocket () const {return path_flags & PATH_SOCKET;}
int iscygexec () const {return path_flags & PATH_CYGWIN_EXEC;}
- bool exists () const {return fileattr != (DWORD) -1;}
+ bool exists () const {return fileattr != INVALID_FILE_ATTRIBUTES;}
bool has_attribute (DWORD x) const {return exists () && (fileattr & x);}
int isdir () const {return has_attribute (FILE_ATTRIBUTE_DIRECTORY);}
executable_states exec_state ()
@@ -124,18 +138,28 @@ class path_conv
check (src, opt | PC_NULLEMPTY, suffixes);
}
- path_conv (): path_flags (0), known_suffix (NULL), error (0), devn (0), unit (0), fileattr (0xffffffff) {path[0] = '\0';}
+ path_conv (): fileattr (INVALID_FILE_ATTRIBUTES), path_flags (0),
+ known_suffix (NULL), error (0), devn (0), unit (0),
+ normalized_path (NULL) {path[0] = '\0';}
inline char *get_win32 () { return path; }
- operator char *() {return path; }
- operator DWORD &() {return fileattr; }
+ operator char *() {return path;}
+ operator const char *() {return path;}
+ operator DWORD &() {return fileattr;}
operator int &() {return (int) fileattr; }
+ char operator [](int i) const {return path[i];}
BOOL is_device () {return devn != FH_BAD && devn != FH_DISK;}
DWORD get_devn () {return devn == FH_BAD ? (DWORD) FH_DISK : devn;}
short get_unitn () {return devn == FH_BAD ? 0 : unit;}
DWORD file_attributes () {return fileattr;}
- DWORD get_drive_type () {return drive_type;}
- BOOL fs_fast_ea () {return sym_opt & PC_CHECK_EA;}
+ DWORD drive_type () {return fs.drive_type;}
+ BOOL fs_fast_ea () {return fs.sym_opt & PC_CHECK_EA;}
+ void set_path (const char *p) {strcpy (path, p);}
+ char *return_and_clear_normalized_path ();
+ const char * root_dir () { return fs.root_dir; }
+ DWORD volser () { return fs.serial; }
+ const char *volname () {return fs.name; }
+ void fillin (HANDLE h);
};
/* Symlink marker */
@@ -146,14 +170,25 @@ class path_conv
/* Socket marker */
#define SOCKET_COOKIE "!<socket >"
+/* The sizeof header written to a shortcut by Cygwin or U/WIN. */
+#define SHORTCUT_HDR_SIZE 76
+
/* Maximum depth of symlinks (after which ELOOP is issued). */
#define MAX_LINK_DEPTH 10
-
-int __stdcall get_device_number (const char *name, int &unit, BOOL from_conv = FALSE) __attribute__ ((regparm(3)));
int __stdcall slash_unc_prefix_p (const char *path) __attribute__ ((regparm(1)));
-const char * __stdcall find_exec (const char *name, path_conv& buf, const char *winenv = "PATH=",
- int null_if_notfound = 0, const char **known_suffix = NULL) __attribute__ ((regparm(3)));
+enum fe_types
+{
+ FE_NADA = 0, /* Nothing special */
+ FE_NNF = 1, /* Return NULL if not found */
+ FE_NATIVE = 2, /* Return native path in path_conv struct */
+ FE_CWD = 4 /* Search CWD for program */
+};
+const char * __stdcall find_exec (const char *name, path_conv& buf,
+ const char *winenv = "PATH=",
+ unsigned opt = FE_NADA,
+ const char **known_suffix = NULL)
+ __attribute__ ((regparm(3)));
/* Common macros for checking for invalid path names */
#define isdrive(s) (isalpha (*(s)) && (s)[1] == ':')
@@ -169,3 +204,5 @@ has_exec_chars (const char *buf, int len)
int pathmatch (const char *path1, const char *path2) __attribute__ ((regparm (2)));
int pathnmatch (const char *path1, const char *path2, int len) __attribute__ ((regparm (2)));
+
+int path_prefix_p (const char *path1, const char *path2, int len1) __attribute__ ((regparm (3)));