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
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2000-10-07 22:12:11 +0400
committerChristopher Faylor <me@cgf.cx>2000-10-07 22:12:11 +0400
commit57bf29e8258b921e632666ff17081805a5a62953 (patch)
treedc462b87bb49569be84b7f68ca9be56119f4db56
parent4ea34a68506bcd5233be1a3bfca9b81b5f9234b2 (diff)
* 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.
-rw-r--r--winsup/cygwin/ChangeLog21
-rw-r--r--winsup/cygwin/fhandler.cc130
-rw-r--r--winsup/cygwin/fhandler.h3
-rw-r--r--winsup/cygwin/pipe.cc13
-rw-r--r--winsup/cygwin/strace.cc11
5 files changed, 69 insertions, 109 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index f00bf5bd3..7f3929614 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -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>
* 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>
- * fhandler_mem.cc: Load ntdll functions via autoload method.
- (load_ntdll_funcs): Eliminated.
+ * fhandler_mem.cc: Load ntdll functions via autoload method.
+ (load_ntdll_funcs): Eliminated.
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>
@@ -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.
* 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.
* path.cc: Add /dev/mem to windows_device_names.
(get_device_number): Add FH_MEM type.
diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc
index 7307e882c..20b2c2a1f 100644
--- a/winsup/cygwin/fhandler.cc
+++ b/winsup/cygwin/fhandler.cc
@@ -364,8 +364,6 @@ fhandler_base::open (int flags, mode_t mode)
namehash_ = hash_path_name (0, get_win32_name ());
set_io_handle (x);
- rpos_ = 0;
- rsize_ = -1;
int bin;
int fmode;
if ((bin = flags & (O_BINARY | O_TEXT)))
@@ -441,8 +439,13 @@ fhandler_base::read (void *in_ptr, size_t in_len)
copied_chars += readlen;
}
- if (copied_chars <= 0 || get_r_binary ())
+ if (copied_chars <= 0)
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 */
@@ -454,7 +457,10 @@ fhandler_base::read (void *in_ptr, size_t in_len)
}
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 */
register char *src= (char *) ptr;
@@ -487,8 +493,6 @@ fhandler_base::read (void *in_ptr, size_t in_len)
*dst++ = c;
copied_chars = dst - (char *) ptr;
- rpos_ += copied_chars;
-
#ifndef NOSTRACE
if (strace.active)
{
@@ -507,6 +511,7 @@ fhandler_base::read (void *in_ptr, size_t in_len)
}
#endif
+ debug_printf ("returning %d chars, text mode", copied_chars);
return copied_chars;
}
@@ -564,118 +569,63 @@ fhandler_base::write (const void *ptr, size_t len)
if (get_w_binary ())
{
+ debug_printf ("binary write");
res = raw_write (ptr, len);
}
else
{
-#ifdef NOTDEF
- /* 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
+ debug_printf ("text write");
/* 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;
char *data = (char *)ptr;
+ res = 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;
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';
left_in_buf--;
}
- *buf_ptr++ = *data++;
+ *buf_ptr++ = ch;
left_in_buf--;
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 */
+ int nbytes;
int want = buf_ptr - buf;
- if ((res = raw_write (buf, want)) != want)
+ if ((nbytes = 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. */
- 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;
+ /* Keep track of how much written not counting additional \r's */
+ res = data - (char *)ptr;
+ continue;
}
- }
-#endif
- /* Done everything, update by the chars that the user sent */
- rpos_ += len;
- /* Length of file has changed */
- rsize_ = -1;
- res = len;
- debug_printf ("after write, name %s, rpos %d", unix_path_name_, rpos_);
+ if (nbytes == -1)
+ res = -1; /* Error */
+ else
+ res += nbytes; /* Partial write. Return total bytes written. */
+ break; /* All done */
+ }
}
+
+ debug_printf ("%d = write (%p, %d)", res, ptr, len);
return res;
}
@@ -1125,8 +1075,6 @@ fhandler_base::operator delete (void *p)
fhandler_base::fhandler_base (DWORD devtype, const char *name, int unit):
access_ (0),
io_handle (NULL),
- rpos_ (0),
- rsize_ (0),
namehash_ (0),
openflags_ (0),
rabuf (NULL),
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index 3f8a1c1e0..c869067e6 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -129,9 +129,6 @@ private:
int access_;
HANDLE io_handle;
- int rpos_; /* Used in text reading */
- int rsize_;
-
unsigned long namehash_; /* hashed filename, used as inode num */
/* Full unix path name of this file */
diff --git a/winsup/cygwin/pipe.cc b/winsup/cygwin/pipe.cc
index 2de499112..4a6e49345 100644
--- a/winsup/cygwin/pipe.cc
+++ b/winsup/cygwin/pipe.cc
@@ -24,8 +24,9 @@ make_pipe (int fildes[2], unsigned int psize, int mode)
SetResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," make_pipe");
HANDLE r, w;
- int fdr, fdw;
+ int fdr = -1, fdw = -1;
SECURITY_ATTRIBUTES *sa = (mode & O_NOINHERIT) ? &sec_none_nih : &sec_none;
+ int res = -1;
if ((fdr = fdtab.find_unused_handle ()) < 0)
set_errno (ENMFILE);
@@ -50,16 +51,12 @@ make_pipe (int fildes[2], unsigned int psize, int mode)
fildes[0] = fdr;
fildes[1] = fdw;
- debug_printf ("0 = pipe (%p) (%d:%p, %d:%p)", fildes,
- fdr, fhr->get_handle (), fdw, fhw->get_handle ());
-
- ReleaseResourceLock(LOCK_FD_LIST,WRITE_LOCK|READ_LOCK," make_pipe");
- return 0;
+ res = 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");
- return -1;
+ return res;
}
extern "C" int
diff --git a/winsup/cygwin/strace.cc b/winsup/cygwin/strace.cc
index 60d81e05b..92494a472 100644
--- a/winsup/cygwin/strace.cc
+++ b/winsup/cygwin/strace.cc
@@ -96,6 +96,8 @@ getfunc (char *in_dst, const char *func)
return dst - in_dst;
}
+extern "C" char *__progname;
+
/* sprintf analog for use by output routines. */
int
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;
DWORD err = GetLastError ();
const char *tn = threadname (0);
+ char *pn = __progname ?: myself->progname;
int microsec = microseconds ();
lmicrosec = microsec;
@@ -117,11 +120,13 @@ strace::vsprntf (char *buf, const char *func, const char *infmt, va_list ap)
count = 0;
else
{
- char *p, progname[sizeof (myself->progname)];
- if ((p = strrchr (myself->progname, '\\')) != NULL)
+ char *p, progname[MAX_PATH + 1];
+ if ((p = strrchr (pn, '\\')) != NULL)
+ p++;
+ else if ((p = strrchr (pn, '/')) != NULL)
p++;
else
- p = myself->progname;
+ p = pn;
strcpy (progname, p);
if ((p = strrchr (progname, '.')) != NULL)
*p = '\000';