Changeset 1301:0449abcdfbf6 in roaraudio


Ignore:
Timestamp:
03/19/09 03:57:00 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added roar_vio_open_pipe()

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • include/libroar/vio_pipe.h

    r1300 r1301  
    4545 
    4646struct roar_vio_pipe { 
     47 int refcount; 
    4748 int type; 
    4849 int flags; 
    4950 union { 
    50   struct roar_buffer b[2]; 
    51   int                p[4]; 
     51  struct roar_buffer * b[2]; 
     52  int                  p[4]; 
    5253 } b; 
    5354}; 
  • libroar/vio_pipe.c

    r1300 r1301  
    3535#include "libroar.h" 
    3636 
     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 
    37102//ll 
Note: See TracChangeset for help on using the changeset viewer.