mirror of
https://frontier.innolan.net/github/amiga-ixemul.git
synced 2026-09-14 00:32:05 +00:00
160 lines
3.9 KiB
C
160 lines
3.9 KiB
C
/*
|
|
* This file is part of ixemul.library for the Amiga.
|
|
* Copyright (C) 1991, 1992 Markus M. Wild
|
|
* Portions Copyright (C) 1994 Rafael W. Luebbert
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library 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
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the Free
|
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*
|
|
* $Id: pipe.c,v 1.1.1.1 2005/03/15 15:57:08 laire Exp $
|
|
*
|
|
* $Log: pipe.c,v $
|
|
* Revision 1.1.1.1 2005/03/15 15:57:08 laire
|
|
* a new beginning
|
|
*
|
|
* Revision 1.2 2004/07/04 22:47:12 piru
|
|
* 2004-07-05 Harry Sintonen <sintonen@iki.fi>
|
|
* * Removed the global max file limit of 512. Currently the close()d
|
|
* files don't get released, but are cached for reuse instead.
|
|
* * Bumped version to 49.13.
|
|
*
|
|
* WARNING: Since the deps are broken, you better make clean before build!
|
|
*
|
|
* Revision 1.1.1.1 2000/05/07 19:38:24 emm
|
|
* Imported sources
|
|
*
|
|
* Revision 1.1.1.1 2000/04/29 00:46:52 nobody
|
|
* Initial import
|
|
*
|
|
* Revision 1.4 1994/06/19 15:14:19 rluebbert
|
|
* *** empty log message ***
|
|
*
|
|
* Revision 1.2 1992/07/04 19:21:08 mwild
|
|
* (finally..) fix the bug which could cause pipe readers/writers to deadlock
|
|
*
|
|
* Revision 1.1 1992/05/14 19:55:40 mwild
|
|
* Initial revision
|
|
*
|
|
*/
|
|
|
|
#define _KERNEL
|
|
#include "ixemul.h"
|
|
#include "kprintf.h"
|
|
|
|
#include <sys/ioctl.h>
|
|
#include <string.h>
|
|
#include "select.h"
|
|
#include "unp.h"
|
|
|
|
/* information for the temporary implementation of pipes.
|
|
PIPE: has the big disadvantage that it blocks in the most unpleasent
|
|
situations, and doesn't send SIGPIPE to processes that write on
|
|
readerless pipes. Unacceptable for this library ;-)) */
|
|
|
|
static int __pclose();
|
|
|
|
int
|
|
pipe (int pv[2])
|
|
{
|
|
struct file *f1, *f2;
|
|
struct sock_stream *ss;
|
|
int res, err, omask;
|
|
usetup;
|
|
|
|
omask = syscall (SYS_sigsetmask, ~0);
|
|
res = -1;
|
|
err = EMFILE;
|
|
if ((ss = init_stream()))
|
|
{
|
|
if (! falloc (&f1, pv))
|
|
{
|
|
if (! falloc (&f2, pv+1))
|
|
{
|
|
f1->f_ss = ss;
|
|
f1->f_stb.st_mode = 0666 | S_IFCHR;
|
|
f1->f_stb.st_size = UNIX_SOCKET_SIZE;
|
|
f1->f_stb.st_blksize = 512;
|
|
f1->f_flags = FREAD;
|
|
f1->f_type = DTYPE_PIPE;
|
|
f1->f_read = stream_read;
|
|
f1->f_write = 0;
|
|
f1->f_ioctl = unp_ioctl;
|
|
f1->f_close = __pclose;
|
|
f1->f_select = unp_select;
|
|
|
|
f2->f_ss = ss;
|
|
f2->f_stb.st_mode = 0666 | S_IFCHR;
|
|
f2->f_stb.st_size = UNIX_SOCKET_SIZE;
|
|
f2->f_stb.st_blksize = 512;
|
|
f2->f_flags = FWRITE;
|
|
f2->f_type = DTYPE_PIPE;
|
|
f2->f_read = 0;
|
|
f2->f_write = stream_write;
|
|
f2->f_ioctl = unp_ioctl;
|
|
f2->f_close = __pclose;
|
|
f2->f_select = unp_select;
|
|
|
|
res = err =0;
|
|
goto ret;
|
|
}
|
|
f1->f_count = 0;
|
|
ffree(f1);
|
|
}
|
|
|
|
kfree (ss);
|
|
}
|
|
|
|
ret:
|
|
syscall (SYS_sigsetmask, omask);
|
|
|
|
errno = err;
|
|
KPRINTF_DISABLED (("&errno = %lx, errno = %ld\n", &errno, errno));
|
|
return res;
|
|
}
|
|
|
|
static int
|
|
__pclose (struct file *f)
|
|
{
|
|
struct sock_stream *ss = f->f_ss;
|
|
usetup;
|
|
|
|
Forbid();
|
|
|
|
f->f_count--;
|
|
|
|
if (f->f_count == 0)
|
|
{
|
|
if (f->f_read)
|
|
ss->flags |= UNF_NO_READER;
|
|
else
|
|
ss->flags |= UNF_NO_WRITER;
|
|
|
|
if ((ss->flags & (UNF_NO_READER|UNF_NO_WRITER)) ==
|
|
(UNF_NO_READER|UNF_NO_WRITER))
|
|
kfree (ss);
|
|
else
|
|
{
|
|
if (ss->task)
|
|
Signal(ss->task, 1UL << u.u_pipe_sig);
|
|
ix_wakeup ((u_int)ss);
|
|
}
|
|
|
|
ffree(f);
|
|
}
|
|
|
|
Permit();
|
|
|
|
return 0;
|
|
}
|