home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
mitsch75.zip
/
scheme-7_5_17-src.zip
/
scheme-7.5.17
/
src
/
microcode
/
os2pipe.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-01-02
|
3KB
|
94 lines
/* -*-C-*-
$Id: os2pipe.c,v 1.8 1999/01/02 06:11:34 cph Exp $
Copyright (c) 1994-1999 Massachusetts Institute of Technology
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "os2.h"
static msg_t * input_pipe_reader (LHANDLE, qid_t, msg_t *, int *);
static void input_pipe_operator
(Tchannel, chop_t, choparg_t, choparg_t, choparg_t);
void
OS_make_pipe (Tchannel * readerp, Tchannel * writerp)
{
HFILE hread;
HFILE hwrite;
STD_API_CALL (dos_create_pipe, ((&hread), (&hwrite), 4096));
transaction_begin ();
OS2_handle_close_on_abort (hwrite);
(*readerp) = (OS2_make_channel (hread, CHANNEL_READ));
transaction_commit ();
transaction_begin ();
OS_channel_close_on_abort (*readerp);
(*writerp) = (OS2_make_channel (hwrite, CHANNEL_WRITE));
transaction_commit ();
}
void
OS2_initialize_pipe_channel (Tchannel channel)
{
if (CHANNEL_INPUTP (channel))
OS2_start_channel_thread (channel,
input_pipe_reader,
input_pipe_operator);
}
static msg_t *
input_pipe_reader (LHANDLE handle, qid_t qid, msg_t * message, int * eofp)
{
ULONG nread;
APIRET rc
= (dos_read (handle,
(SM_READAHEAD_DATA (message)),
(sizeof (SM_READAHEAD_DATA (message))),
(& nread)));
if (rc == NO_ERROR)
{
(SM_READAHEAD_SIZE (message)) = nread;
(*eofp) = (nread == 0);
return (message);
}
OS2_destroy_message (message);
if (rc == ERROR_INVALID_HANDLE)
/* Handle was closed on us -- no need to do anything else. */
return (0);
(*eofp) = (rc == ERROR_BROKEN_PIPE);
return (OS2_make_syscall_error (rc, syscall_dos_read));
}
static void
input_pipe_operator (Tchannel channel, chop_t operation,
choparg_t arg1, choparg_t arg2, choparg_t arg3)
{
switch (operation)
{
case chop_read:
OS2_channel_thread_read_op (channel, arg1, arg2, arg3);
break;
case chop_close:
OS2_channel_thread_close (channel);
STD_API_CALL (dos_close, (CHANNEL_HANDLE (channel)));
break;
default:
OS2_logic_error ("Unknown operation for input pipe.");
break;
}
}