* cygerrno.h: New file. Use this throughout whenever errno manipulation is

required.
* errno.cc: Use DWORD to hold Windows errors.
(geterrno_from_win_error): New function.
(seterrno_from_win_error): Use geterrno_from_win_error to convert supplied
windows error (suggested by Corinna Vinschen).
* path.cc (symlink_info): Add error element.
* path.cc (path_conv::check): Remove errno setting.  Use new symlink_info errno
element to set path_conv error, where appropriate.
(symlink_info::check): Set error element rather than attempting to manipulate
errno.  Add more checks for trailing / and /..  even though they are currently
useless.  Avoid setting EINVAL.
* path.cc (normalize_posix_path): Correct check for trailing /.
This commit is contained in:
Christopher Faylor
2000-08-22 03:58:47 +00:00
parent 6b85369f82
commit 9e2baf8dfa
45 changed files with 202 additions and 132 deletions

View File

@@ -12,6 +12,7 @@ details. */
#define _REENT_ONLY
#include <stdio.h>
#include <errno.h>
#include "cygerrno.h"
/* Table to map Windows error codes to Errno values. */
/* FIXME: Doing things this way is a little slow. It's trivial to change
@@ -21,7 +22,7 @@ details. */
static const struct
{
int w; /* windows version of error */
DWORD w; /* windows version of error */
const char *s; /* text of windows version */
int e; /* errno version of error */
}
@@ -108,34 +109,33 @@ errmap[] =
{ 0, NULL, 0}
};
int __stdcall
geterrno_from_win_error (DWORD code, int deferrno)
{
for (int i = 0; errmap[i].w != 0; ++i)
if (code == errmap[i].w)
{
syscall_printf ("windows error %u == errno %d", code, errmap[i].e);
return errmap[i].e;
}
syscall_printf ("unknown windows error %u, setting errno to %d", code,
deferrno);
return deferrno; /* FIXME: what's so special about EACCESS? */
}
/* seterrno_from_win_error: Given a Windows error code, set errno
as appropriate. */
void
seterrno_from_win_error (const char *file, int line, int code)
void __stdcall
seterrno_from_win_error (const char *file, int line, DWORD code)
{
int i;
for (i = 0; errmap[i].w != 0; ++i)
if (code == errmap[i].w)
break;
if (errmap[i].w != 0)
{
if (strace.active)
strace.prntf (_STRACE_SYSCALL, NULL, "%s:%d seterrno: %d (%s) -> %d",
file, line, code, errmap[i].s, errmap[i].e);
set_errno (errmap[i].e);
}
else
{
if (strace.active)
strace.prntf (_STRACE_SYSCALL, NULL, "%s:%d seterrno: unknown error %d", file, line, code);
set_errno (EACCES);
}
syscall_printf ("%s:%d \b");
set_errno (geterrno_from_win_error (code, EACCES));
return;
}
/* seterrno: Set `errno' based on GetLastError (). */
void
void __stdcall
seterrno (const char *file, int line)
{
seterrno_from_win_error (file, line, GetLastError ());
@@ -672,4 +672,3 @@ strerror (int errnum)
include files. */
return (char *) error;
}