* fhandler.h (fhandler_base): Remove obsolete _rpos and _rsize elements.
* fhandler.cc (fhandler_base::open): Ditto. * fhandler.cc (fhandler_base::fhandler_base): Ditto. (fhandler_base::read): Ditto. Add more debugging output. Don't issue a \r when \r\n detected. * pipe.cc (make_pipe): Streamline slightly. Make debug output more interesting. * strace.cc (strace::vsprintf): Use __progname where appropriate to distinguish strace output when exec'ing.
This commit is contained in:
parent
4ea34a6850
commit
57bf29e825
@ -1,3 +1,16 @@
|
|||||||
|
Sat Oct 7 13:59:15 2000 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
|
* fhandler.h (fhandler_base): Remove obsolete _rpos and _rsize
|
||||||
|
elements.
|
||||||
|
* fhandler.cc (fhandler_base::open): Ditto.
|
||||||
|
* fhandler.cc (fhandler_base::fhandler_base): Ditto.
|
||||||
|
(fhandler_base::read): Ditto. Add more debugging output. Don't issue
|
||||||
|
a \r when \r\n detected.
|
||||||
|
* pipe.cc (make_pipe): Streamline slightly. Make debug output more
|
||||||
|
interesting.
|
||||||
|
* strace.cc (strace::vsprintf): Use __progname where appropriate to
|
||||||
|
distinguish strace output when exec'ing.
|
||||||
|
|
||||||
Sat Oct 7 19:25:00 2000 Corinna Vinschen <corinna@vinschen.de>
|
Sat Oct 7 19:25:00 2000 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* fhandler.h (fhandler_dev_mem): Add methods mmap, munmap and msync.
|
* fhandler.h (fhandler_dev_mem): Add methods mmap, munmap and msync.
|
||||||
@ -102,12 +115,12 @@ Mon Oct 2 15:15:01 2000 Christopher Faylor <cgf@cygnus.com>
|
|||||||
|
|
||||||
Mon Oct 2 11:05:00 2000 Corinna Vinschen <corinna@vinschen.de>
|
Mon Oct 2 11:05:00 2000 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* fhandler_mem.cc: Load ntdll functions via autoload method.
|
* fhandler_mem.cc: Load ntdll functions via autoload method.
|
||||||
(load_ntdll_funcs): Eliminated.
|
(load_ntdll_funcs): Eliminated.
|
||||||
|
|
||||||
Sun Oct 1 16:36:00 2000 Corinna Vinschen <corinna@vinschen.de>
|
Sun Oct 1 16:36:00 2000 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* fhandler_mem.cc (load_ntdll_funcs): Add missing __stdcall qualifiers.
|
* fhandler_mem.cc (load_ntdll_funcs): Add missing __stdcall qualifiers.
|
||||||
|
|
||||||
Sun Oct 1 22:20:39 2000 Christopher Faylor <cgf@cygnus.com>
|
Sun Oct 1 22:20:39 2000 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
@ -125,7 +138,7 @@ Sun Oct 1 2:56:00 2000 Corinna Vinschen <corinna@vinschen.de>
|
|||||||
|
|
||||||
* Makefile.in: Add fhandler_mem.o to the dependencies.
|
* Makefile.in: Add fhandler_mem.o to the dependencies.
|
||||||
* dtable.cc (dtable::build_fhandler): Add case for FH_MEM.
|
* dtable.cc (dtable::build_fhandler): Add case for FH_MEM.
|
||||||
* fhandler.h: Add FH_MEM device type. Add class fhandler_dev_mem.
|
* fhandler.h: Add FH_MEM device type. Add class fhandler_dev_mem.
|
||||||
* fhandler_mem.cc: New file. Implementation of class fhandler_dev_mem.
|
* fhandler_mem.cc: New file. Implementation of class fhandler_dev_mem.
|
||||||
* path.cc: Add /dev/mem to windows_device_names.
|
* path.cc: Add /dev/mem to windows_device_names.
|
||||||
(get_device_number): Add FH_MEM type.
|
(get_device_number): Add FH_MEM type.
|
||||||
|
@ -364,8 +364,6 @@ fhandler_base::open (int flags, mode_t mode)
|
|||||||
|
|
||||||
namehash_ = hash_path_name (0, get_win32_name ());
|
namehash_ = hash_path_name (0, get_win32_name ());
|
||||||
set_io_handle (x);
|
set_io_handle (x);
|
||||||
rpos_ = 0;
|
|
||||||
rsize_ = -1;
|
|
||||||
int bin;
|
int bin;
|
||||||
int fmode;
|
int fmode;
|
||||||
if ((bin = flags & (O_BINARY | O_TEXT)))
|
if ((bin = flags & (O_BINARY | O_TEXT)))
|
||||||
@ -441,8 +439,13 @@ fhandler_base::read (void *in_ptr, size_t in_len)
|
|||||||
copied_chars += readlen;
|
copied_chars += readlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (copied_chars <= 0 || get_r_binary ())
|
if (copied_chars <= 0)
|
||||||
return copied_chars;
|
return copied_chars;
|
||||||
|
if (get_r_binary ())
|
||||||
|
{
|
||||||
|
debug_printf ("returning %d chars, binary mode", copied_chars);
|
||||||
|
return copied_chars;
|
||||||
|
}
|
||||||
|
|
||||||
/* Scan buffer for a control-z and shorten the buffer to that length */
|
/* Scan buffer for a control-z and shorten the buffer to that length */
|
||||||
|
|
||||||
@ -454,7 +457,10 @@ fhandler_base::read (void *in_ptr, size_t in_len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (copied_chars == 0)
|
if (copied_chars == 0)
|
||||||
return 0;
|
{
|
||||||
|
debug_printf ("returning 0 chars, text mode, CTRL-Z found");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Scan buffer and turn \r\n into \n */
|
/* Scan buffer and turn \r\n into \n */
|
||||||
register char *src= (char *) ptr;
|
register char *src= (char *) ptr;
|
||||||
@ -487,8 +493,6 @@ fhandler_base::read (void *in_ptr, size_t in_len)
|
|||||||
*dst++ = c;
|
*dst++ = c;
|
||||||
copied_chars = dst - (char *) ptr;
|
copied_chars = dst - (char *) ptr;
|
||||||
|
|
||||||
rpos_ += copied_chars;
|
|
||||||
|
|
||||||
#ifndef NOSTRACE
|
#ifndef NOSTRACE
|
||||||
if (strace.active)
|
if (strace.active)
|
||||||
{
|
{
|
||||||
@ -507,6 +511,7 @@ fhandler_base::read (void *in_ptr, size_t in_len)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
debug_printf ("returning %d chars, text mode", copied_chars);
|
||||||
return copied_chars;
|
return copied_chars;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -564,118 +569,63 @@ fhandler_base::write (const void *ptr, size_t len)
|
|||||||
|
|
||||||
if (get_w_binary ())
|
if (get_w_binary ())
|
||||||
{
|
{
|
||||||
|
debug_printf ("binary write");
|
||||||
res = raw_write (ptr, len);
|
res = raw_write (ptr, len);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifdef NOTDEF
|
debug_printf ("text write");
|
||||||
/* Keep track of previous \rs, we don't want to turn existing
|
|
||||||
\r\n's into \r\n\n's */
|
|
||||||
register int pr = 0;
|
|
||||||
|
|
||||||
/* Copy things in chunks */
|
|
||||||
char buf[CHUNK_SIZE];
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < len; i += sizeof (buf) / 2)
|
|
||||||
{
|
|
||||||
register const char *src = (char *)ptr + i;
|
|
||||||
int todo;
|
|
||||||
if ((todo = len - i) > sizeof (buf) / 2)
|
|
||||||
todo = sizeof (buf) / 2;
|
|
||||||
register const char *end = src + todo;
|
|
||||||
register char *dst = buf;
|
|
||||||
while (src < end)
|
|
||||||
{
|
|
||||||
if (*src == '\n' && !pr)
|
|
||||||
{
|
|
||||||
/* Emit a cr lf here */
|
|
||||||
*dst ++ = '\r';
|
|
||||||
*dst ++ = '\n';
|
|
||||||
}
|
|
||||||
else if (*src == '\r')
|
|
||||||
{
|
|
||||||
*dst ++ = '\r';
|
|
||||||
pr = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*dst ++ = *src;
|
|
||||||
pr = 0;
|
|
||||||
}
|
|
||||||
src++;
|
|
||||||
}
|
|
||||||
int want = dst - buf;
|
|
||||||
if ((res = raw_write (buf, want)) != want)
|
|
||||||
{
|
|
||||||
if (res == -1)
|
|
||||||
return -1;
|
|
||||||
/* FIXME: */
|
|
||||||
/* Tricky... Didn't write everything we wanted.. How can
|
|
||||||
we work out exactly which chars were sent? We don't...
|
|
||||||
This will only happen in pretty nasty circumstances. */
|
|
||||||
rpos_ += i;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* This is the Microsoft/DJGPP way. Still not ideal, but it's
|
/* This is the Microsoft/DJGPP way. Still not ideal, but it's
|
||||||
compatible. */
|
compatible.
|
||||||
|
Modified slightly by CGF 2000-10-07 */
|
||||||
|
|
||||||
int left_in_data = len;
|
int left_in_data = len;
|
||||||
char *data = (char *)ptr;
|
char *data = (char *)ptr;
|
||||||
|
res = 0;
|
||||||
|
|
||||||
while (left_in_data > 0)
|
while (left_in_data > 0)
|
||||||
{
|
{
|
||||||
char buf[CHUNK_SIZE], *buf_ptr = buf;
|
char buf[CHUNK_SIZE + 1], *buf_ptr = buf;
|
||||||
int left_in_buf = CHUNK_SIZE;
|
int left_in_buf = CHUNK_SIZE;
|
||||||
|
|
||||||
while (left_in_buf > 0 && left_in_data > 0)
|
while (left_in_buf > 0 && left_in_data > 0)
|
||||||
{
|
{
|
||||||
if (*data == '\n')
|
char ch = *data++;
|
||||||
|
if (ch == '\n')
|
||||||
{
|
{
|
||||||
if (left_in_buf == 1)
|
|
||||||
{
|
|
||||||
/* Not enough room for \r and \n */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
*buf_ptr++ = '\r';
|
*buf_ptr++ = '\r';
|
||||||
left_in_buf--;
|
left_in_buf--;
|
||||||
}
|
}
|
||||||
*buf_ptr++ = *data++;
|
*buf_ptr++ = ch;
|
||||||
left_in_buf--;
|
left_in_buf--;
|
||||||
left_in_data--;
|
left_in_data--;
|
||||||
|
if (left_in_data > 0 && ch == '\r' && *data == '\n')
|
||||||
|
{
|
||||||
|
*buf_ptr++ = *data++;
|
||||||
|
left_in_buf--;
|
||||||
|
left_in_data--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We've got a buffer-full, or we're out of data. Write it out */
|
/* We've got a buffer-full, or we're out of data. Write it out */
|
||||||
|
int nbytes;
|
||||||
int want = buf_ptr - buf;
|
int want = buf_ptr - buf;
|
||||||
if ((res = raw_write (buf, want)) != want)
|
if ((nbytes = raw_write (buf, want)) == want)
|
||||||
{
|
{
|
||||||
if (res == -1)
|
/* Keep track of how much written not counting additional \r's */
|
||||||
return -1;
|
res = data - (char *)ptr;
|
||||||
/* FIXME: */
|
continue;
|
||||||
/* Tricky... Didn't write everything we wanted.. How can
|
|
||||||
we work out exactly which chars were sent? We don't...
|
|
||||||
This will only happen in pretty nasty circumstances. */
|
|
||||||
int i = (len-left_in_data) - left_in_buf;
|
|
||||||
rpos_ += i;
|
|
||||||
/* just in case the math is off, guarantee it looks like
|
|
||||||
a disk full error */
|
|
||||||
if (i >= (int)len)
|
|
||||||
i = len-1;
|
|
||||||
if (i < 0)
|
|
||||||
i = 0;
|
|
||||||
return i;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Done everything, update by the chars that the user sent */
|
if (nbytes == -1)
|
||||||
rpos_ += len;
|
res = -1; /* Error */
|
||||||
/* Length of file has changed */
|
else
|
||||||
rsize_ = -1;
|
res += nbytes; /* Partial write. Return total bytes written. */
|
||||||
res = len;
|
break; /* All done */
|
||||||
debug_printf ("after write, name %s, rpos %d", unix_path_name_, rpos_);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
debug_printf ("%d = write (%p, %d)", res, ptr, len);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1125,8 +1075,6 @@ fhandler_base::operator delete (void *p)
|
|||||||
fhandler_base::fhandler_base (DWORD devtype, const char *name, int unit):
|
fhandler_base::fhandler_base (DWORD devtype, const char *name, int unit):
|
||||||
access_ (0),
|
access_ (0),
|
||||||
io_handle (NULL),
|
io_handle (NULL),
|
||||||
rpos_ (0),
|
|
||||||
rsize_ (0),
|
|
||||||
namehash_ (0),
|
namehash_ (0),
|
||||||
openflags_ (0),
|
openflags_ (0),
|
||||||
rabuf (NULL),
|
rabuf (NULL),
|
||||||
|
@ -129,9 +129,6 @@ private:
|
|||||||
int access_;
|
int access_;
|
||||||
HANDLE io_handle;
|
HANDLE io_handle;
|
||||||
|
|
||||||
int rpos_; /* Used in text reading */
|
|
||||||
int rsize_;
|
|
||||||
|
|
||||||
unsigned long namehash_; /* hashed filename, used as inode num */
|
unsigned long namehash_; /* hashed filename, used as inode num */
|
||||||
|
|
||||||
/* Full unix path name of this file */
|
/* Full unix path name of this file */
|
||||||
|
@ -24,8 +24,9 @@ make_pipe (int fildes[2], unsigned int psize, int mode)
|
|||||||
SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," make_pipe");
|
SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," make_pipe");
|
||||||
|
|
||||||
HANDLE r, w;
|
HANDLE r, w;
|
||||||
int fdr, fdw;
|
int fdr = -1, fdw = -1;
|
||||||
SECURITY_ATTRIBUTES *sa = (mode & O_NOINHERIT) ? &sec_none_nih : &sec_none;
|
SECURITY_ATTRIBUTES *sa = (mode & O_NOINHERIT) ? &sec_none_nih : &sec_none;
|
||||||
|
int res = -1;
|
||||||
|
|
||||||
if ((fdr = fdtab.find_unused_handle ()) < 0)
|
if ((fdr = fdtab.find_unused_handle ()) < 0)
|
||||||
set_errno (ENMFILE);
|
set_errno (ENMFILE);
|
||||||
@ -50,16 +51,12 @@ make_pipe (int fildes[2], unsigned int psize, int mode)
|
|||||||
fildes[0] = fdr;
|
fildes[0] = fdr;
|
||||||
fildes[1] = fdw;
|
fildes[1] = fdw;
|
||||||
|
|
||||||
debug_printf ("0 = pipe (%p) (%d:%p, %d:%p)", fildes,
|
res = 0;
|
||||||
fdr, fhr->get_handle (), fdw, fhw->get_handle ());
|
|
||||||
|
|
||||||
ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," make_pipe");
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
syscall_printf ("-1 = pipe (%p)", fildes);
|
syscall_printf ("%d = make_pipe ([%d, %d], %d, %p)", res, fdr, fdw, psize, mode);
|
||||||
ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," make_pipe");
|
ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," make_pipe");
|
||||||
return -1;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" int
|
extern "C" int
|
||||||
|
@ -96,6 +96,8 @@ getfunc (char *in_dst, const char *func)
|
|||||||
return dst - in_dst;
|
return dst - in_dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" char *__progname;
|
||||||
|
|
||||||
/* sprintf analog for use by output routines. */
|
/* sprintf analog for use by output routines. */
|
||||||
int
|
int
|
||||||
strace::vsprntf (char *buf, const char *func, const char *infmt, va_list ap)
|
strace::vsprntf (char *buf, const char *func, const char *infmt, va_list ap)
|
||||||
@ -105,6 +107,7 @@ strace::vsprntf (char *buf, const char *func, const char *infmt, va_list ap)
|
|||||||
static int nonewline = FALSE;
|
static int nonewline = FALSE;
|
||||||
DWORD err = GetLastError ();
|
DWORD err = GetLastError ();
|
||||||
const char *tn = threadname (0);
|
const char *tn = threadname (0);
|
||||||
|
char *pn = __progname ?: myself->progname;
|
||||||
|
|
||||||
int microsec = microseconds ();
|
int microsec = microseconds ();
|
||||||
lmicrosec = microsec;
|
lmicrosec = microsec;
|
||||||
@ -117,11 +120,13 @@ strace::vsprntf (char *buf, const char *func, const char *infmt, va_list ap)
|
|||||||
count = 0;
|
count = 0;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char *p, progname[sizeof (myself->progname)];
|
char *p, progname[MAX_PATH + 1];
|
||||||
if ((p = strrchr (myself->progname, '\\')) != NULL)
|
if ((p = strrchr (pn, '\\')) != NULL)
|
||||||
|
p++;
|
||||||
|
else if ((p = strrchr (pn, '/')) != NULL)
|
||||||
p++;
|
p++;
|
||||||
else
|
else
|
||||||
p = myself->progname;
|
p = pn;
|
||||||
strcpy (progname, p);
|
strcpy (progname, p);
|
||||||
if ((p = strrchr (progname, '.')) != NULL)
|
if ((p = strrchr (progname, '.')) != NULL)
|
||||||
*p = '\000';
|
*p = '\000';
|
||||||
|
Loading…
x
Reference in New Issue
Block a user