- g_set_error (error, G_IO_ERROR,
- g_io_error_from_win32_error (errsv),
- _("Error writing to handle: %s"),
- emsg);
- g_free (emsg);
- return -1;
+ if (errsv == ERROR_IO_PENDING &&
+ _g_win32_overlap_wait_result (win32_stream->priv->handle,
+ &overlap, &nwritten, cancellable))
+ {
+ retval = nwritten;
+ goto end;
+ }
+
+ if (g_cancellable_set_error_if_cancelled (cancellable, error))
+ goto end;
+
+ errsv = GetLastError ();
+ if (errsv == ERROR_HANDLE_EOF ||
+ errsv == ERROR_BROKEN_PIPE)
+ {
+ retval = 0;
+ }
+ else
+ {
+ gchar *emsg;
+
+ emsg = g_win32_error_message (errsv);
+ g_set_error (error, G_IO_ERROR,
+ g_io_error_from_win32_error (errsv),
+ _("Error writing to handle: %s"),
+ emsg);
+ g_free (emsg);
+ }