source: roaraudio/libroar/vio_pipe.c @ 1301:0449abcdfbf6

Last change on this file since 1301:0449abcdfbf6 was 1301:0449abcdfbf6, checked in by phi, 15 years ago

added roar_vio_open_pipe()

File size: 2.9 KB
Line 
1//vio_pipe.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2009
5 *
6 *  This file is part of libroar a part of RoarAudio,
7 *  a cross-platform sound system for both, home and professional use.
8 *  See README for details.
9 *
10 *  This file is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 3
12 *  as published by the Free Software Foundation.
13 *
14 *  libroar is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this software; see the file COPYING.  If not, write to
21 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
22 *
23 *  NOTE for everyone want's to change something and send patches:
24 *  read README and HACKING! There a addition information on
25 *  the license of this document you need to read before you send
26 *  any patches.
27 *
28 *  NOTE for uses of non-GPL (LGPL,...) software using libesd, libartsc
29 *  or libpulse*:
30 *  The libs libroaresd, libroararts and libroarpulse link this lib
31 *  and are therefore GPL. Because of this it may be illigal to use
32 *  them with any software that uses libesd, libartsc or libpulse*.
33 */
34
35#include "libroar.h"
36
37int roar_vio_open_pipe (struct roar_vio_calls * s1, struct roar_vio_calls * s2, int type, int flags) {
38 struct roar_vio_pipe * self;
39 int                    rw = flags & (O_RDONLY|O_WRONLY|O_RDWR);
40
41 if ( s1 == NULL || s2 == NULL )
42  return -1;
43
44 if ( (self = malloc(sizeof(struct roar_vio_pipe))) == NULL )
45  return -1;
46
47 memset(self, 0, sizeof(struct roar_vio_pipe));
48
49 self->refcount = 2;
50 self->type     = type;
51 self->flags    = flags;
52
53 if ( type == ROAR_VIO_PIPE_TYPE_AUTO ) {
54#ifdef ROAR_TARGET_WIN32
55  type = ROAR_VIO_PIPE_TYPE_BUFFER;
56#else
57  type = ROAR_VIO_PIPE_TYPE_SOCKET;
58#endif
59 }
60
61 switch (type) {
62  case ROAR_VIO_PIPE_TYPE_BUFFER:
63    // no buffers need to be set up here,
64    // we handle the NULL pointer in the reader and writer func
65   break;
66  case ROAR_VIO_PIPE_TYPE_PIPE:
67    if ( rw == O_RDWR || rw == O_RDONLY )
68     if ( pipe(self->b.p) == -1 ) {
69      free(self);
70      return -1;
71     }
72    if ( rw == O_RDWR || rw == O_WRONLY )
73     if ( pipe((self->b.p) + 2) == -1 ) {
74      close(self->b.p[0]);
75      close(self->b.p[1]);
76      free(self);
77      return -1;
78     }
79   break;
80  case ROAR_VIO_PIPE_TYPE_SOCKET:
81    if ( socketpair(AF_UNIX, SOCK_STREAM, 0, self->b.p) == -1 ) {
82     free(self);
83     return -1;
84    }
85
86    if ( rw == O_RDONLY ) {
87     shutdown(self->b.p[0], SHUT_WR);
88     shutdown(self->b.p[1], SHUT_RD);
89    } else if ( rw == O_WRONLY ) {
90     shutdown(self->b.p[0], SHUT_RD);
91     shutdown(self->b.p[1], SHUT_WR);
92    }
93   break;
94  default:
95    free(self);
96    return -1;
97 }
98
99 return 0;
100}
101
102//ll
Note: See TracBrowser for help on using the repository browser.