diff options
author | Christopher Faylor <me@cgf.cx> | 2001-06-04 01:28:09 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2001-06-04 01:28:09 +0000 |
commit | ac5561f2ed95d2ffcb81723d9556aadc1768ca04 (patch) | |
tree | dcac3dbe7a95d896583c184f7de830ad0b9ddc2f /winsup | |
parent | 9f13167f7789db27d1090a78c847f5a0e81e01f6 (diff) | |
download | newlib-ac5561f2ed95d2ffcb81723d9556aadc1768ca04.zip newlib-ac5561f2ed95d2ffcb81723d9556aadc1768ca04.tar.gz newlib-ac5561f2ed95d2ffcb81723d9556aadc1768ca04.tar.bz2 |
* path.cc (normalize_posix_path): Revert .. check removed by previous changes.
* cygheap.h: Temporarily declare path_prefix_p here.
Diffstat (limited to 'winsup')
-rw-r--r-- | winsup/cygwin/ChangeLog | 6 | ||||
-rw-r--r-- | winsup/cygwin/cygheap.h | 4 | ||||
-rw-r--r-- | winsup/cygwin/dcrt0.cc | 2 | ||||
-rw-r--r-- | winsup/cygwin/path.cc | 49 | ||||
-rw-r--r-- | winsup/cygwin/path.h | 4 |
5 files changed, 39 insertions, 26 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 72dbee5..820c41f 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,9 @@ +Sun Jun 3 20:52:13 2001 Christopher Faylor <cgf@cygnus.com> + + * path.cc (normalize_posix_path): Revert .. check removed by previous + changes. + * cygheap.h: Temporarily declare path_prefix_p here. + Mon Jun 4 0:14:00 2001 Corinna Vinschen <corinna@vinschen.de> * net.cc (wsock_event): Add destructor. diff --git a/winsup/cygwin/cygheap.h b/winsup/cygwin/cygheap.h index cc953a7..6348590 100644 --- a/winsup/cygwin/cygheap.h +++ b/winsup/cygwin/cygheap.h @@ -46,6 +46,9 @@ struct cygheap_root_mount_info unsigned native_pathlen; }; +/* CGF: FIXME This doesn't belong here */ + +int path_prefix_p (const char *path1, const char *path2, int len1) __attribute__ ((regparm (3))); class cygheap_root { /* Root directory information. @@ -55,7 +58,6 @@ class cygheap_root public: bool posix_ok (const char *path) { - extern int path_prefix_p (const char *, const char *, int); if (!m) return 1; return path_prefix_p (m->posix_path, path, m->posix_pathlen); diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 1036feb..cc49869 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -26,9 +26,9 @@ details. */ #include "perprocess.h" #include "fhandler.h" #include "dtable.h" +#include "path.h" #include "cygheap.h" #include "child_info.h" -#include "path.h" #include "perthread.h" #include "shared_info.h" #include "cygwin_version.h" diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 2062991..4f40db8 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -89,7 +89,6 @@ static DWORD available_drives; static int normalize_win32_path (const char *src, char *dst); static void slashify (const char *src, char *dst, int trailing_slash_p); static void backslashify (const char *src, char *dst, int trailing_slash_p); -static int path_prefix_p (const char *path1, const char *path2, int len1); struct symlink_info { @@ -243,6 +242,12 @@ normalize_posix_path (const char *src, char *dst) } else if (src[2] && !isslash (src[2])) break; + else + { + while (dst > dst_start && !isslash (*--dst)) + continue; + src++; + } } *dst++ = '/'; @@ -270,7 +275,7 @@ path_conv::add_ext_from_sym (symlink_info &sym) { known_suffix = path + sym.extn; if (sym.ext_tacked_on) - strcpy (known_suffix, sym.ext_here); + strcpy (known_suffix, sym.ext_here); } } @@ -451,17 +456,17 @@ path_conv::check (const char *src, unsigned opt, if (sym.case_clash) { if (pcheck_case == PCHECK_STRICT) - { + { case_clash = TRUE; error = ENOENT; goto out; } /* If pcheck_case==PCHECK_ADJUST the case_clash is remembered - if the last component is concerned. This allows functions + if the last component is concerned. This allows functions which shall create files to avoid overriding already existing files with another case. */ if (!component) - case_clash = TRUE; + case_clash = TRUE; } if (!(opt & PC_SYM_IGNORE)) @@ -499,15 +504,15 @@ path_conv::check (const char *src, unsigned opt, set_symlink (); // last component of path is a symlink. fileattr = sym.fileattr; if (opt & PC_SYM_CONTENTS) - { + { strcpy (path, sym.contents); goto out; } add_ext_from_sym (sym); if (pcheck_case == PCHECK_RELAXED) - goto out; + goto out; /* Avoid further symlink evaluation. Only case checks are - done now. */ + done now. */ opt |= PC_SYM_IGNORE; } else @@ -617,7 +622,7 @@ out: if (!rootdir (tmp_buf) || !GetVolumeInformation (tmp_buf, NULL, 0, &vol_serial, NULL, - &vol_flags, fs_name, 16)) + &vol_flags, fs_name, 16)) { debug_printf ("GetVolumeInformation(%s) = ERR, this->path(%s), set_has_acls(FALSE)", tmp_buf, this->path, GetLastError ()); @@ -633,11 +638,11 @@ out: if (drive_type == DRIVE_REMOTE || (drive_type == DRIVE_UNKNOWN && (tmp_buf[0] == '\\' && tmp_buf[1] == '\\'))) is_remote_drive = 1; if (!allow_smbntsec && is_remote_drive) - set_has_acls (FALSE); + set_has_acls (FALSE); else - set_has_acls (vol_flags & FS_PERSISTENT_ACLS); + set_has_acls (vol_flags & FS_PERSISTENT_ACLS); /* Known file systems with buggy open calls. Further explanation - in fhandler.cc (fhandler_disk_file::open). */ + in fhandler.cc (fhandler_disk_file::open). */ set_has_buggy_open (strcmp (fs_name, "SUNWNFS") == 0); } @@ -2182,10 +2187,10 @@ cygdrive_getmntent () __small_sprintf (native_path, "%c:\\", drive); if (GetDriveType (native_path) == DRIVE_REMOVABLE || GetFileAttributes (native_path) == (DWORD) -1) - { + { available_drives &= ~mask; continue; - } + } native_path[2] = '\0'; __small_sprintf (posix_path, "%s%c", mount_table->cygdrive, drive); ret = fillout_mntent (native_path, posix_path, mount_table->cygdrive_flags); @@ -2405,7 +2410,7 @@ symlink (const char *topath, const char *frompath) unsigned short len = strlen (topath); unsigned short win_len = strlen (w32topath); success = WriteFile (h, shortcut_header, SHORTCUT_HDR_SIZE, - &written, NULL) + &written, NULL) && written == SHORTCUT_HDR_SIZE && WriteFile (h, &len, sizeof len, &written, NULL) && written == sizeof len @@ -2426,7 +2431,7 @@ symlink (const char *topath, const char *frompath) /* Note that the terminating nul is written. */ success = WriteFile (h, buf, len, &written, NULL) - || written != len; + || written != len; } if (success) @@ -2436,8 +2441,8 @@ symlink (const char *topath, const char *frompath) win32_path.get_win32 (), S_IFLNK | S_IRWXU | S_IRWXG | S_IRWXO); SetFileAttributesA (win32_path.get_win32 (), - allow_winsymlinks ? FILE_ATTRIBUTE_READONLY - : FILE_ATTRIBUTE_SYSTEM); + allow_winsymlinks ? FILE_ATTRIBUTE_READONLY + : FILE_ATTRIBUTE_SYSTEM); res = 0; } else @@ -2678,15 +2683,15 @@ symlink_info::check (char *path, const suffix_info *suffixes, unsigned opt) ext_tacked_on = !!*ext_here; if (pcheck_case != PCHECK_RELAXED && !case_check (path) - || (opt & PC_SYM_IGNORE)) - goto file_not_symlink; + || (opt & PC_SYM_IGNORE)) + goto file_not_symlink; int sym_check; sym_check = 0; if (fileattr & FILE_ATTRIBUTE_DIRECTORY) - goto file_not_symlink; + goto file_not_symlink; /* Windows shortcuts are treated as symlinks. */ if (suffix.lnk_match ()) @@ -2974,7 +2979,7 @@ chdir (const char *dir) if (res == -1) __seterrno (); else if (!path.has_symlinks () && strpbrk (dir, ":\\") == NULL - && pcheck_case == PCHECK_RELAXED) + && pcheck_case == PCHECK_RELAXED) cygheap->cwd.set (path, dir); else cygheap->cwd.set (path, NULL); diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h index ee23d9f..9bc36c0 100644 --- a/winsup/cygwin/path.h +++ b/winsup/cygwin/path.h @@ -167,5 +167,5 @@ has_exec_chars (const char *buf, int len) (buf[0] == 'M' && buf[1] == 'Z')); } -extern int pathmatch (const char *path1, const char *path2); -extern int pathnmatch (const char *path1, const char *path2, 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))); |