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
path: root/winsup
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2000-05-04 23:46:32 +0400
committerChristopher Faylor <me@cgf.cx>2000-05-04 23:46:32 +0400
commit8e9b0aee252c4b8c055c2bfa290ab80d11a57562 (patch)
tree9355416ac95e34d55c68a1d2db8861de6c5d0787 /winsup
parentcf3eb87bef10617d2437230718a6a037b943b8ed (diff)
* configure.in: Use -gstabs+ as compile debug option. This seems to promote
better handling of symbols. * configure: Regenerate. * delqueue.cc (delqueue_list::process_queue): Allow ERROR_ACCESS_DENIED to indicate that a file is being shared under Windows 95. * syscalls.cc (_unlink): Use full path name. Take special action for Windows 95. Assume that an ERROR_ACCESS_DENIED indicates a sharing violation unless it's on a remote drive. Punt if there is an ERROR_ACCESS_DENIED on a remote drive.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog12
-rw-r--r--winsup/cygwin/delqueue.cc3
-rw-r--r--winsup/cygwin/path.cc6
-rw-r--r--winsup/cygwin/syscalls.cc46
4 files changed, 42 insertions, 25 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index d75ee33b7..a0392cd6a 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,15 @@
+Wed May 3 21:54:11 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * configure.in: Use -gstabs+ as compile debug option. This seems to
+ promote better handling of symbols.
+ * configure: Regenerate.
+ * delqueue.cc (delqueue_list::process_queue): Allow ERROR_ACCESS_DENIED
+ to indicate that a file is being shared under Windows 95.
+ * syscalls.cc (_unlink): Use full path name. Take special action for
+ Windows 95. Assume that an ERROR_ACCESS_DENIED indicates a sharing
+ violation unless it's on a remote drive. Punt if there is an
+ ERROR_ACCESS_DENIED on a remote drive.
+
Wed May 3 18:07:00 2000 Corinna Vinschen <corinna@vinschen.de>
* errno.cc (errmap): Map ERROR_BAD_NETPATH to new errno ENOSHARE.
diff --git a/winsup/cygwin/delqueue.cc b/winsup/cygwin/delqueue.cc
index 17feb6991..08a17fd75 100644
--- a/winsup/cygwin/delqueue.cc
+++ b/winsup/cygwin/delqueue.cc
@@ -85,7 +85,8 @@ delqueue_list::process_queue ()
{
int res = GetLastError ();
empty = 0;
- if (res == ERROR_SHARING_VIOLATION)
+ if (res == ERROR_SHARING_VIOLATION ||
+ (os_being_run != winNT && res == ERROR_ACCESS_DENIED))
{
/* File still inuse, that's ok */
syscall_printf ("Still using %s", name[i]);
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 15194e937..205aae406 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -45,12 +45,6 @@ details. */
paths. Win32 paths in mount table entries may be UNC paths or
standard Win32 paths starting with <drive-letter>:
- In converting from a Win32 to a POSIX pathname, if there is no
- mount point that will allow the conversion to take place, a user
- mount point will be automatically created under
- cygdrive/<drive> and the translation will be redone, this
- time successfully.
-
Text vs Binary issues are not considered here in path style
decisions.
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index 529c7f627..51b37b457 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -47,7 +47,7 @@ _unlink (const char *ourname)
{
int res = -1;
- path_conv win32_name (ourname, SYMLINK_NOFOLLOW);
+ path_conv win32_name (ourname, SYMLINK_NOFOLLOW, 1);
if (win32_name.error)
{
@@ -82,6 +82,9 @@ _unlink (const char *ourname)
break;
}
+ DWORD lasterr;
+ lasterr = GetLastError ();
+
/* FIXME: There's a race here. */
HANDLE h = CreateFile (win32_name, GENERIC_READ,
FILE_SHARE_READ,
@@ -91,7 +94,7 @@ _unlink (const char *ourname)
{
CloseHandle (h);
syscall_printf ("CreateFile/CloseHandle succeeded");
- if (i > 0 || GetFileAttributes (win32_name) == (DWORD) -1)
+ if (os_being_run == winNT || GetFileAttributes (win32_name) == (DWORD) -1)
{
res = 0;
break;
@@ -99,33 +102,40 @@ _unlink (const char *ourname)
}
if (i > 0)
- goto err;
-
- res = GetLastError ();
- syscall_printf ("couldn't delete file, %E");
-
- /* if access denied, chmod to be writable in case it is not
- and try again */
- /* FIXME!!! Should check whether ourname is directory or file
- and only try again if permissions are not sufficient */
- if (res == ERROR_ACCESS_DENIED)
{
- /* chmod file to be writable here */
- if (chmod (win32_name, 0777) == 0)
- continue;
- else
+ DWORD dtype;
+ if (os_being_run == winNT || lasterr != ERROR_ACCESS_DENIED)
goto err;
+
+ char root[MAX_PATH];
+ strcpy (root, win32_name);
+ dtype = GetDriveType (rootdir (root));
+ if (dtype & DRIVE_REMOTE)
+ {
+ syscall_printf ("access denied on remote drive");
+ goto err; /* Can't detect this, unfortunately */
+ }
+ lasterr = ERROR_SHARING_VIOLATION;
}
+ syscall_printf ("i %d, couldn't delete file, %E", i);
+
/* If we get ERROR_SHARING_VIOLATION, the file may still be open -
Windows NT doesn't support deleting a file while it's open. */
- if (res == ERROR_SHARING_VIOLATION)
+ if (lasterr == ERROR_SHARING_VIOLATION)
{
cygwin_shared->delqueue.queue_file (win32_name);
res = 0;
break;
}
+ /* if access denied, chmod to be writable in case it is not
+ and try again */
+ /* FIXME: Should check whether ourname is directory or file
+ and only try again if permissions are not sufficient */
+ if (lasterr == ERROR_ACCESS_DENIED && chmod (win32_name, 0777) == 0)
+ continue;
+
err:
__seterrno ();
res = -1;
@@ -965,7 +975,7 @@ stat_dev (DWORD devn, int unit, unsigned long ino, struct stat *buf)
return 0;
}
-suffix_info stat_suffixes[] =
+suffix_info stat_suffixes[] =
{
suffix_info ("", 1),
suffix_info (".exe", 1),