* cygheap.cc (cfree): Remove malloc debugging probe.
* dlmalloc.c (errprint): Remove abort() call which causes interesting error message printing to abort prematurely. * environ.cc: Sprinkle MALLOC_CHECKs liberally throughout. (_addenv): Allocate two empty elements at end of environ to (apparently) work around problems with some buggy applications. (winenv): Avoid calling alloca if no forced environment variable is present. * exceptions.cc (open_stackdumpfile): Don't print "Dumping stack trace to..." when running in a cygwin environment (i.e., the parent is a cygwin process). * dtable.cc (dtable::init_std_file_from_handle): Move device type detection code from build_fhandler here since it is only used by this function. (dtable::build_fhandler_from_name): New method. Renamed from dtable::build_fhandler. (dtable::build_fhandler): Use build_fhandler_from_name. (cygwin_attach_handle_to_fd): Ditto. * syscalls.cc (_open): Ditto. (stat_worker): Ditto. * dtable.h (dtable::build_fhandler_from_name): Rename declaration from dtable::build_fhandler.
This commit is contained in:
parent
b519ee2a4e
commit
ebd645e7e6
@ -1,6 +1,29 @@
|
|||||||
Tue Oct 2 22:25:23 2001 Robert Collins <rbtcollins@hotmail.com>
|
Tue Oct 2 23:49:18 2001 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
* how-fhandlers-work.txt: New file.
|
* cygheap.cc (cfree): Remove malloc debugging probe.
|
||||||
|
* dlmalloc.c (errprint): Remove abort() call which causes interesting
|
||||||
|
error message printing to abort prematurely.
|
||||||
|
* environ.cc: Sprinkle MALLOC_CHECKs liberally throughout.
|
||||||
|
(_addenv): Allocate two empty elements at end of environ to
|
||||||
|
(apparently) work around problems with some buggy applications.
|
||||||
|
(winenv): Avoid calling alloca if no forced environment variable is
|
||||||
|
present.
|
||||||
|
|
||||||
|
* exceptions.cc (open_stackdumpfile): Don't print "Dumping stack trace
|
||||||
|
to..." when running in a cygwin environment (i.e., the parent is a
|
||||||
|
cygwin process).
|
||||||
|
|
||||||
|
* dtable.cc (dtable::init_std_file_from_handle): Move device type
|
||||||
|
detection code from build_fhandler here since it is only used by this
|
||||||
|
function.
|
||||||
|
(dtable::build_fhandler_from_name): New method. Renamed from
|
||||||
|
dtable::build_fhandler.
|
||||||
|
(dtable::build_fhandler): Use build_fhandler_from_name.
|
||||||
|
(cygwin_attach_handle_to_fd): Ditto.
|
||||||
|
* syscalls.cc (_open): Ditto.
|
||||||
|
(stat_worker): Ditto.
|
||||||
|
* dtable.h (dtable::build_fhandler_from_name): Rename declaration from
|
||||||
|
dtable::build_fhandler.
|
||||||
|
|
||||||
Mon Oct 1 16:52:23 2001 Christopher Faylor <cgf@cygnus.com>
|
Mon Oct 1 16:52:23 2001 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
|
@ -322,7 +322,6 @@ crealloc (void *s, DWORD n)
|
|||||||
extern "C" void __stdcall
|
extern "C" void __stdcall
|
||||||
cfree (void *s)
|
cfree (void *s)
|
||||||
{
|
{
|
||||||
MALLOC_CHECK;
|
|
||||||
assert (!inheap (s));
|
assert (!inheap (s));
|
||||||
(void) _cfree (tocygheap (s));
|
(void) _cfree (tocygheap (s));
|
||||||
MALLOC_CHECK;
|
MALLOC_CHECK;
|
||||||
|
@ -28,6 +28,29 @@
|
|||||||
* malloc_usable_size(P) is equivalent to realloc(P, malloc_usable_size(P))
|
* malloc_usable_size(P) is equivalent to realloc(P, malloc_usable_size(P))
|
||||||
*
|
*
|
||||||
* $Log$
|
* $Log$
|
||||||
|
* Revision 1.5 2001/10/03 03:49:25 cgf
|
||||||
|
* * cygheap.cc (cfree): Remove malloc debugging probe.
|
||||||
|
* * dlmalloc.c (errprint): Remove abort() call which causes interesting error
|
||||||
|
* message printing to abort prematurely.
|
||||||
|
* * environ.cc: Sprinkle MALLOC_CHECKs liberally throughout.
|
||||||
|
* (_addenv): Allocate two empty elements at end of environ to
|
||||||
|
* (apparently) work around problems with some buggy applications.
|
||||||
|
* (winenv): Avoid calling alloca if no forced environment variable is present.
|
||||||
|
*
|
||||||
|
* * exceptions.cc (open_stackdumpfile): Don't print "Dumping stack trace to..."
|
||||||
|
* when running in a cygwin environment (i.e., the parent is a cygwin process).
|
||||||
|
*
|
||||||
|
* * dtable.cc (dtable::init_std_file_from_handle): Move device type detection
|
||||||
|
* code from build_fhandler here since it is only used by this function.
|
||||||
|
* (dtable::build_fhandler_from_name): New method. Renamed from
|
||||||
|
* dtable::build_fhandler.
|
||||||
|
* (dtable::build_fhandler): Use build_fhandler_from_name.
|
||||||
|
* (cygwin_attach_handle_to_fd): Ditto.
|
||||||
|
* * syscalls.cc (_open): Ditto.
|
||||||
|
* (stat_worker): Ditto.
|
||||||
|
* * dtable.h (dtable::build_fhandler_from_name): Rename declaration from
|
||||||
|
* dtable::build_fhandler.
|
||||||
|
*
|
||||||
* Revision 1.4 2001/09/07 21:32:04 cgf
|
* Revision 1.4 2001/09/07 21:32:04 cgf
|
||||||
* * cygheap.h (init_cygheap): Move heap pointers here.
|
* * cygheap.h (init_cygheap): Move heap pointers here.
|
||||||
* * include/sys/cygwin.h (perprocess): Remove heap pointers.
|
* * include/sys/cygwin.h (perprocess): Remove heap pointers.
|
||||||
@ -1843,7 +1866,6 @@ static void errprint(const char *file, int line, const char *err)
|
|||||||
write(2, err, strlen(err));
|
write(2, err, strlen(err));
|
||||||
write(2, "\n", 1);
|
write(2, "\n", 1);
|
||||||
recurs--;
|
recurs--;
|
||||||
abort ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void malloc_err(const char *err, mchunkptr p)
|
static void malloc_err(const char *err, mchunkptr p)
|
||||||
|
@ -168,22 +168,39 @@ dtable::release (int fd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
int
|
||||||
|
cygwin_attach_handle_to_fd (char *name, int fd, HANDLE handle, mode_t bin,
|
||||||
|
DWORD myaccess)
|
||||||
|
{
|
||||||
|
if (fd == -1)
|
||||||
|
fd = cygheap->fdtab.find_unused_handle ();
|
||||||
|
path_conv pc;
|
||||||
|
fhandler_base *res = cygheap->fdtab.build_fhandler_from_name (fd, name, handle,
|
||||||
|
pc);
|
||||||
|
res->init (handle, myaccess, bin);
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
dtable::init_std_file_from_handle (int fd, HANDLE handle,
|
dtable::init_std_file_from_handle (int fd, HANDLE handle, DWORD myaccess)
|
||||||
DWORD myaccess)
|
|
||||||
{
|
{
|
||||||
int bin;
|
int bin;
|
||||||
const char *name = NULL;
|
const char *name;
|
||||||
|
CONSOLE_SCREEN_BUFFER_INFO buf;
|
||||||
|
struct sockaddr sa;
|
||||||
|
int sal = sizeof (sa);
|
||||||
|
DCB dcb;
|
||||||
|
|
||||||
|
first_fd_for_open = 0;
|
||||||
|
|
||||||
if (__fmode)
|
if (__fmode)
|
||||||
bin = __fmode;
|
bin = __fmode;
|
||||||
else
|
else
|
||||||
bin = binmode ?: 0;
|
bin = binmode ?: 0;
|
||||||
|
|
||||||
first_fd_for_open = 0;
|
|
||||||
/* See if we can consoleify it - if it is a console,
|
/* See if we can consoleify it - if it is a console,
|
||||||
don't open it in binary. That will screw up our crlfs*/
|
don't open it in binary. That will screw up our crlfs*/
|
||||||
CONSOLE_SCREEN_BUFFER_INFO buf;
|
|
||||||
if (GetConsoleScreenBufferInfo (handle, &buf))
|
if (GetConsoleScreenBufferInfo (handle, &buf))
|
||||||
{
|
{
|
||||||
if (ISSTATE (myself, PID_USETTY))
|
if (ISSTATE (myself, PID_USETTY))
|
||||||
@ -192,7 +209,7 @@ dtable::init_std_file_from_handle (int fd, HANDLE handle,
|
|||||||
name = "/dev/conout";
|
name = "/dev/conout";
|
||||||
bin = 0;
|
bin = 0;
|
||||||
}
|
}
|
||||||
else if (FlushConsoleInputBuffer (handle))
|
else if (GetNumberOfConsoleInputEvents (handle, (DWORD *) &buf))
|
||||||
{
|
{
|
||||||
if (ISSTATE (myself, PID_USETTY))
|
if (ISSTATE (myself, PID_USETTY))
|
||||||
name = "/dev/tty";
|
name = "/dev/tty";
|
||||||
@ -204,56 +221,28 @@ dtable::init_std_file_from_handle (int fd, HANDLE handle,
|
|||||||
{
|
{
|
||||||
if (fd == 0)
|
if (fd == 0)
|
||||||
name = "/dev/piper";
|
name = "/dev/piper";
|
||||||
else if (fd == 1 || fd == 2)
|
else
|
||||||
name = "/dev/pipew";
|
name = "/dev/pipew";
|
||||||
if (bin == 0)
|
if (bin == 0)
|
||||||
bin = O_BINARY;
|
bin = O_BINARY;
|
||||||
}
|
}
|
||||||
|
else if (wsock_started && getpeername ((SOCKET) handle, &sa, &sal) == 0)
|
||||||
|
name = "/dev/socket";
|
||||||
|
else if (GetCommState (handle, &dcb))
|
||||||
|
name = "/dev/ttyS0"; // FIXME - determine correct device
|
||||||
|
else
|
||||||
|
name = "unknown disk file";
|
||||||
|
|
||||||
path_conv pc;
|
path_conv pc;
|
||||||
build_fhandler (fd, name, handle, pc)->init (handle, myaccess, bin);
|
build_fhandler_from_name (fd, name, handle, pc)->init (handle, myaccess, bin);
|
||||||
set_std_handle (fd);
|
set_std_handle (fd);
|
||||||
paranoid_printf ("fd %d, handle %p", fd, handle);
|
paranoid_printf ("fd %d, handle %p", fd, handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C"
|
|
||||||
int
|
|
||||||
cygwin_attach_handle_to_fd (char *name, int fd, HANDLE handle, mode_t bin,
|
|
||||||
DWORD myaccess)
|
|
||||||
{
|
|
||||||
if (fd == -1)
|
|
||||||
fd = cygheap->fdtab.find_unused_handle ();
|
|
||||||
path_conv pc;
|
|
||||||
fhandler_base *res = cygheap->fdtab.build_fhandler (fd, name, handle, pc);
|
|
||||||
res->init (handle, myaccess, bin);
|
|
||||||
return fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
fhandler_base *
|
fhandler_base *
|
||||||
dtable::build_fhandler (int fd, const char *name, HANDLE handle, path_conv& pc,
|
dtable::build_fhandler_from_name (int fd, const char *name, HANDLE handle,
|
||||||
unsigned opt, suffix_info *si)
|
path_conv& pc, unsigned opt, suffix_info *si)
|
||||||
{
|
{
|
||||||
if (!name && handle)
|
|
||||||
{
|
|
||||||
struct sockaddr sa;
|
|
||||||
int sal = sizeof (sa);
|
|
||||||
CONSOLE_SCREEN_BUFFER_INFO cinfo;
|
|
||||||
DCB dcb;
|
|
||||||
|
|
||||||
if (GetNumberOfConsoleInputEvents (handle, (DWORD *) &cinfo))
|
|
||||||
name = "/dev/conin";
|
|
||||||
else if (GetConsoleScreenBufferInfo (handle, &cinfo))
|
|
||||||
name = "/dev/conout";
|
|
||||||
else if (wsock_started && getpeername ((SOCKET) handle, &sa, &sal) == 0)
|
|
||||||
name = "/dev/socket";
|
|
||||||
else if (GetFileType (handle) == FILE_TYPE_PIPE)
|
|
||||||
name = "/dev/pipe";
|
|
||||||
else if (GetCommState (handle, &dcb))
|
|
||||||
name = "/dev/ttyS0"; // FIXME - determine correct device
|
|
||||||
else
|
|
||||||
name = "some disk file";
|
|
||||||
}
|
|
||||||
|
|
||||||
pc.check (name, opt | PC_NULLEMPTY, si);
|
pc.check (name, opt | PC_NULLEMPTY, si);
|
||||||
if (pc.error)
|
if (pc.error)
|
||||||
{
|
{
|
||||||
@ -338,7 +327,7 @@ dtable::build_fhandler (int fd, DWORD dev, const char *name, int unit)
|
|||||||
{
|
{
|
||||||
/* FIXME - this could recurse forever */
|
/* FIXME - this could recurse forever */
|
||||||
path_conv pc;
|
path_conv pc;
|
||||||
return build_fhandler (fd, name, NULL, pc);
|
return build_fhandler_from_name (fd, name, NULL, pc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,9 +50,10 @@ public:
|
|||||||
void fixup_after_fork (HANDLE);
|
void fixup_after_fork (HANDLE);
|
||||||
fhandler_base *build_fhandler (int fd, DWORD dev, const char *name,
|
fhandler_base *build_fhandler (int fd, DWORD dev, const char *name,
|
||||||
int unit = -1);
|
int unit = -1);
|
||||||
fhandler_base *build_fhandler (int fd, const char *name, HANDLE h,
|
fhandler_base *build_fhandler_from_name (int fd, const char *name, HANDLE h,
|
||||||
path_conv& pc, unsigned opts = PC_SYM_FOLLOW,
|
path_conv& pc,
|
||||||
suffix_info *si = NULL);
|
unsigned opts = PC_SYM_FOLLOW,
|
||||||
|
suffix_info *si = NULL);
|
||||||
inline int not_open (int fd)
|
inline int not_open (int fd)
|
||||||
{
|
{
|
||||||
SetResourceLock (LOCK_FD_LIST, READ_LOCK, "not_open");
|
SetResourceLock (LOCK_FD_LIST, READ_LOCK, "not_open");
|
||||||
|
@ -76,6 +76,7 @@ static unsigned char conv_start_chars[256] = {0};
|
|||||||
void
|
void
|
||||||
win_env::add_cache (const char *in_posix, const char *in_native)
|
win_env::add_cache (const char *in_posix, const char *in_native)
|
||||||
{
|
{
|
||||||
|
MALLOC_CHECK;
|
||||||
posix = (char *) realloc (posix, strlen (in_posix) + 1);
|
posix = (char *) realloc (posix, strlen (in_posix) + 1);
|
||||||
strcpy (posix, in_posix);
|
strcpy (posix, in_posix);
|
||||||
if (in_native)
|
if (in_native)
|
||||||
@ -90,6 +91,7 @@ win_env::add_cache (const char *in_posix, const char *in_native)
|
|||||||
(void) strcpy (native, name);
|
(void) strcpy (native, name);
|
||||||
towin32 (in_posix, native + namelen);
|
towin32 (in_posix, native + namelen);
|
||||||
}
|
}
|
||||||
|
MALLOC_CHECK;
|
||||||
debug_printf ("posix %s", posix);
|
debug_printf ("posix %s", posix);
|
||||||
debug_printf ("native %s", native);
|
debug_printf ("native %s", native);
|
||||||
}
|
}
|
||||||
@ -145,6 +147,7 @@ posify (char **here, const char *value)
|
|||||||
debug_printf ("env var converted to %s", outenv);
|
debug_printf ("env var converted to %s", outenv);
|
||||||
*here = outenv;
|
*here = outenv;
|
||||||
free (src);
|
free (src);
|
||||||
|
MALLOC_CHECK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -177,6 +180,7 @@ my_findenv (const char *name, int *offset)
|
|||||||
*offset = p - cur_environ ();
|
*offset = p - cur_environ ();
|
||||||
return (char *) (++c);
|
return (char *) (++c);
|
||||||
}
|
}
|
||||||
|
MALLOC_CHECK;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,12 +235,12 @@ _addenv (const char *name, const char *value, int overwrite)
|
|||||||
else
|
else
|
||||||
{ /* Create new slot. */
|
{ /* Create new slot. */
|
||||||
int sz = envsize (cur_environ ());
|
int sz = envsize (cur_environ ());
|
||||||
int allocsz = sz + sizeof (char *);
|
int allocsz = sz + (2 * sizeof (char *));
|
||||||
|
|
||||||
offset = (sz - 1) / sizeof (char *);
|
offset = (sz - 1) / sizeof (char *);
|
||||||
|
|
||||||
/* Allocate space for additional element plus terminating NULL. */
|
/* Allocate space for additional element plus terminating NULL. */
|
||||||
if (__cygwin_environ == lastenviron)
|
if (cur_environ () == lastenviron)
|
||||||
lastenviron = __cygwin_environ = (char **) realloc (cur_environ (),
|
lastenviron = __cygwin_environ = (char **) realloc (cur_environ (),
|
||||||
allocsz);
|
allocsz);
|
||||||
else if ((lastenviron = (char **) malloc (allocsz)) != NULL)
|
else if ((lastenviron = (char **) malloc (allocsz)) != NULL)
|
||||||
@ -248,7 +252,7 @@ _addenv (const char *name, const char *value, int overwrite)
|
|||||||
#ifdef DEBUGGING
|
#ifdef DEBUGGING
|
||||||
try_to_debug ();
|
try_to_debug ();
|
||||||
#endif
|
#endif
|
||||||
return -1; /* Oops. No more memory. */
|
return -1; /* Oops. No more memory. */
|
||||||
}
|
}
|
||||||
|
|
||||||
__cygwin_environ[offset + 1] = NULL; /* NULL terminate. */
|
__cygwin_environ[offset + 1] = NULL; /* NULL terminate. */
|
||||||
@ -282,6 +286,7 @@ _addenv (const char *name, const char *value, int overwrite)
|
|||||||
if ((spenv = getwinenv (envhere)))
|
if ((spenv = getwinenv (envhere)))
|
||||||
spenv->add_cache (value);
|
spenv->add_cache (value);
|
||||||
|
|
||||||
|
MALLOC_CHECK;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -612,13 +617,11 @@ parse_options (char *buf)
|
|||||||
static void __stdcall
|
static void __stdcall
|
||||||
regopt (const char *name)
|
regopt (const char *name)
|
||||||
{
|
{
|
||||||
MALLOC_CHECK;
|
|
||||||
/* FIXME: should not be under mount */
|
/* FIXME: should not be under mount */
|
||||||
reg_key r (KEY_READ, CYGWIN_INFO_PROGRAM_OPTIONS_NAME, NULL);
|
reg_key r (KEY_READ, CYGWIN_INFO_PROGRAM_OPTIONS_NAME, NULL);
|
||||||
char buf[MAX_PATH];
|
char buf[MAX_PATH];
|
||||||
char lname[strlen(name) + 1];
|
char lname[strlen(name) + 1];
|
||||||
strlwr (strcpy (lname, name));
|
strlwr (strcpy (lname, name));
|
||||||
MALLOC_CHECK;
|
|
||||||
if (r.get_string (lname, buf, sizeof (buf) - 1, "") == ERROR_SUCCESS)
|
if (r.get_string (lname, buf, sizeof (buf) - 1, "") == ERROR_SUCCESS)
|
||||||
parse_options (buf);
|
parse_options (buf);
|
||||||
else
|
else
|
||||||
@ -810,18 +813,21 @@ winenv (const char * const *envp, int keep_posix)
|
|||||||
for (int i = 0; forced_winenv_vars[i]; i++)
|
for (int i = 0; forced_winenv_vars[i]; i++)
|
||||||
if (!saw_forced_winenv[i])
|
if (!saw_forced_winenv[i])
|
||||||
{
|
{
|
||||||
int namelen = strlen (forced_winenv_vars[i]) + 1;
|
int vallen = GetEnvironmentVariable (forced_winenv_vars[i], dum, 0);
|
||||||
int vallen = GetEnvironmentVariable (forced_winenv_vars[i], dum, 0) + 1;
|
if (vallen > 0)
|
||||||
p = (char *) alloca (namelen + vallen);
|
|
||||||
strcpy (p, forced_winenv_vars[i]);
|
|
||||||
strcat (p, "=");
|
|
||||||
if (!GetEnvironmentVariable (forced_winenv_vars[i], p + namelen,
|
|
||||||
vallen + 1))
|
|
||||||
debug_printf ("warning: %s not present in environment", *srcp);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
*dstp++ = p;
|
int namelen = strlen (forced_winenv_vars[i]) + 1;
|
||||||
tl += strlen (p) + 1;
|
p = (char *) alloca (namelen + ++vallen);
|
||||||
|
strcpy (p, forced_winenv_vars[i]);
|
||||||
|
strcat (p, "=");
|
||||||
|
if (!GetEnvironmentVariable (forced_winenv_vars[i], p + namelen,
|
||||||
|
vallen))
|
||||||
|
debug_printf ("warning: %s not present in environment", *srcp);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*dstp++ = p;
|
||||||
|
tl += strlen (p) + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,7 +170,10 @@ open_stackdumpfile ()
|
|||||||
CREATE_ALWAYS, 0, 0);
|
CREATE_ALWAYS, 0, 0);
|
||||||
if (h != INVALID_HANDLE_VALUE)
|
if (h != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
system_printf ("Dumping stack trace to %s", corefile);
|
if (!myself->ppid_handle)
|
||||||
|
system_printf ("Dumping stack trace to %s", corefile);
|
||||||
|
else
|
||||||
|
debug_printf ("Dumping stack trace to %s", corefile);
|
||||||
SetStdHandle (STD_ERROR_HANDLE, h);
|
SetStdHandle (STD_ERROR_HANDLE, h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -377,7 +377,6 @@ done:
|
|||||||
else
|
else
|
||||||
syscall_printf ("%d = write (%d, %p, %d)", res, fd, ptr, len);
|
syscall_printf ("%d = write (%d, %p, %d)", res, fd, ptr, len);
|
||||||
|
|
||||||
MALLOC_CHECK;
|
|
||||||
return (ssize_t)res;
|
return (ssize_t)res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -499,7 +498,8 @@ _open (const char *unix_path, int flags, ...)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
path_conv pc;
|
path_conv pc;
|
||||||
if (!(fh = cygheap->fdtab.build_fhandler (fd, unix_path, NULL, pc)))
|
if (!(fh = cygheap->fdtab.build_fhandler_from_name (fd, unix_path,
|
||||||
|
NULL, pc)))
|
||||||
res = -1; // errno already set
|
res = -1; // errno already set
|
||||||
else if (!fh->open (pc, flags, (mode & 07777) & ~cygheap->umask))
|
else if (!fh->open (pc, flags, (mode & 07777) & ~cygheap->umask))
|
||||||
{
|
{
|
||||||
@ -1087,10 +1087,11 @@ stat_worker (const char *caller, const char *name, struct stat *buf,
|
|||||||
if (check_null_invalid_struct_errno (buf))
|
if (check_null_invalid_struct_errno (buf))
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
fh = cygheap->fdtab.build_fhandler (-1, name, NULL, real_path,
|
fh = cygheap->fdtab.build_fhandler_from_name (-1, name, NULL, real_path,
|
||||||
(nofollow ? PC_SYM_NOFOLLOW : PC_SYM_FOLLOW)
|
(nofollow ?
|
||||||
| PC_FULL, stat_suffixes);
|
PC_SYM_NOFOLLOW
|
||||||
|
: PC_SYM_FOLLOW)
|
||||||
|
| PC_FULL, stat_suffixes);
|
||||||
if (real_path.error)
|
if (real_path.error)
|
||||||
{
|
{
|
||||||
set_errno (real_path.error);
|
set_errno (real_path.error);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user