Mercurial > hg > xemacs-beta
diff src/event-msw.c @ 558:ed498ef2108b
[xemacs-hg @ 2001-05-23 09:59:33 by ben]
xemacs.mak: call `ver' to get the exact os version and put it in the
installation; suggestion from adrian.
behavior-defs.el: Add scroll-in-place, jka-compr, efs, fix up some things.
pop.c: Remove BROKEN_CYGWIN.
etc\sample.init.el: Rewrite to be much more careful about loading features --
now it decays gracefully even in the complete absence of packages.
Also avoid doing obnoxious things when loading efs.
configure.in: add some support for eventually turning on file coding by
default. Fix numerous places where AC_MSG_WARN had quotes
around its arg, which is bad. Replace with []. Same for
AC_MSG_ERROR.
s\cygwin32.h, s\mingw32.h: remove support for way old beta versions of cygwin.
don't put -Wno-sign-compare in the system switches; this
isn't a system issue. define BROKEN_SIGIO for cygwin to
get C-g support.
device-msw.c: signal an error rather than crash with an unavailable network
printer (from Mike Alexander).
event-msw.c: cleanup headers. fix (hopefully) an error with data corruption
when sending to a network connection.
fileio.c: Fix evil code that attempts
to handle the ~user prefix by (a) always assuming we're referencing
ourselves and not even verifying the user -- hence any file with
a tilde as its first char is invalid! (b) if there wasn't a slash
following the filename, the pointer was set *past* the end of
file and we started reading from uninitialized memory. Now we
simply treat these as files, always.
optionally for 21.4 (doc fix):
lread.c: cambia de pas_de_lache_ici -- al minimo usa la palabra certa.
frame.c: fix warnings.
emacs.c, nt.c, ntproc.c, process-nt.c, realpath.c, unexnt.c: rename MAX_PATH
to standard PATH_MAX.
process-nt.c, realpath.c: cleanup headers.
process-unix.c, sysdep.c, systime.h, syswindows.h: kill BROKEN_CYGWIN and
support for way old beta versions of cygwin.
sysfile.h: use _MAX_PATH (Windows) preferentially for PATH_MAX if defined.
include io.h on Cygwin (we need get_osfhandle()). include
sys/fcntl.h always, since we were including it in various
header files anyway.
unexcw.c: fix up style to conform to standard. remove duplicate definition
of PERROR.
buffer.c: comment change.
database.c, debug.h, device-tty.c, dired-msw.c, glyphs-msw.c: header
cleanups (remove places that directly include a system
header file, because we have our own layer to do this more cleanly
and portably); indentation fixes.
author | ben |
---|---|
date | Wed, 23 May 2001 09:59:48 +0000 |
parents | 666d73d6ac56 |
children | b202fbfc7dea |
line wrap: on
line diff
--- a/src/event-msw.c Tue May 22 06:49:43 2001 +0000 +++ b/src/event-msw.c Wed May 23 09:59:48 2001 +0000 @@ -1,7 +1,7 @@ /* The mswindows event_stream interface. Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. Copyright (C) 1995 Sun Microsystems, Inc. - Copyright (C) 1996, 2000 Ben Wing. + Copyright (C) 1996, 2000, 2001 Ben Wing. Copyright (C) 1997 Jonathan Harris. This file is part of XEmacs. @@ -49,30 +49,29 @@ # include "dragdrop.h" #endif +#include "buffer.h" #include "device.h" #include "events.h" +#include "faces.h" #include "frame.h" -#include "buffer.h" -#include "faces.h" #include "lstream.h" +#include "objects-msw.h" #include "process.h" #include "redisplay.h" #include "select.h" +#include "sysdep.h" #include "window.h" + +#include "sysfile.h" #include "sysproc.h" +#include "systime.h" #include "syswait.h" -#include "systime.h" -#include "sysdep.h" -#include "objects-msw.h" #ifdef HAVE_MSG_SELECT -#include "sysfile.h" #include "console-tty.h" #elif defined(CYGWIN) typedef unsigned int SOCKET; #endif -#include <io.h> -#include <errno.h> #if !(defined(CYGWIN) || defined(MINGW)) # include <shlobj.h> /* For IShellLink */ @@ -664,7 +663,7 @@ LPARAM user_data; /* Any user data stored in the stream object */ SOCKET s; /* Socket handle (which is a Win32 handle) */ OVERLAPPED ov; /* Overlapped I/O structure */ - void* buffer; /* Buffer. Allocated for input stream only */ + void* buffer; /* Buffer. */ unsigned long bufsize; /* Number of bytes last read */ unsigned long bufpos; /* Position in buffer for next fetch */ unsigned int error_p :1; /* I/O Error seen */ @@ -774,18 +773,24 @@ if (size == 0) return 0; - { - ResetEvent (str->ov.hEvent); - - /* Docs indicate that 4th parameter to WriteFile can be NULL since this is - * an overlapped operation. This fails on Win95 with winsock 1.x so we - * supply a spare address which is ignored by Win95 anyway. Sheesh. */ - if (WriteFile ((HANDLE)str->s, data, size, (LPDWORD)&str->buffer, &str->ov) - || GetLastError() == ERROR_IO_PENDING) - str->pending_p = 1; - else - str->error_p = 1; - } + ResetEvent (str->ov.hEvent); + + /* According to WriteFile docs, we must hold onto the data we pass to it + and not make any changes until it finishes -- which may not be until + the next time we get here, since we use asynchronous I/O. We have + in fact seen data loss as a result of not doing this. */ + str->buffer = xrealloc (str->buffer, size); + memcpy (str->buffer, data, size); + + /* Docs indicate that 4th parameter to WriteFile can be NULL since this is + * an overlapped operation. This fails on Win95 with winsock 1.x so we + * supply a spare address which is ignored by Win95 anyway. Sheesh. */ + if (WriteFile ((HANDLE)str->s, str->buffer, size, (LPDWORD)&str->buffer, + &str->ov) + || GetLastError() == ERROR_IO_PENDING) + str->pending_p = 1; + else + str->error_p = 1; return str->error_p ? -1 : size; } @@ -804,7 +809,7 @@ if (str->pending_p) WaitForSingleObject (str->ov.hEvent, INFINITE); - if (lstr->flags & LSTREAM_FL_READ) + if (str->buffer) xfree (str->buffer); CloseHandle (str->ov.hEvent); @@ -825,14 +830,10 @@ Lstream *lstr = Lstream_new (lstream_winsock, mode); struct winsock_stream *str = WINSOCK_STREAM_DATA (lstr); + xzero (*str); str->s = s; - str->blocking_p = 0; - str->error_p = 0; - str->eof_p = 0; - str->pending_p = 0; str->user_data = param; - xzero (str->ov); str->ov.hEvent = CreateEvent (NULL, TRUE, FALSE, NULL); if (lstr->flags & LSTREAM_FL_READ) @@ -2958,14 +2959,14 @@ if (psl->lpVtbl->QueryInterface (psl, &IID_IPersistFile, &ppf) == S_OK) { - WORD wsz[MAX_PATH]; + WORD wsz[PATH_MAX]; WIN32_FIND_DATA wfd; - LPSTR resolved = (char *) xmalloc (MAX_PATH+1); - - MultiByteToWideChar (CP_ACP,0, fname, -1, wsz, MAX_PATH); + LPSTR resolved = (char *) xmalloc (PATH_MAX+1); + + MultiByteToWideChar (CP_ACP,0, fname, -1, wsz, PATH_MAX); if ((ppf->lpVtbl->Load (ppf, wsz, STGM_READ) == S_OK) && - (psl->lpVtbl->GetPath (psl, resolved, MAX_PATH, + (psl->lpVtbl->GetPath (psl, resolved, PATH_MAX, &wfd, 0)==S_OK)) { xfree (fname);