Changeset 3796:a3ee3b5bed2b in roaraudio


Ignore:
Timestamp:
05/07/10 17:49:13 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added support for shutdown()

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • include/libroar/vio.h

    r3769 r3796  
    7676// specal commands: 
    7777int     roar_vio_accept  (struct roar_vio_calls * calls, struct roar_vio_calls * dst); 
     78int     roar_vio_shutdown(struct roar_vio_calls * vio,   int how); 
    7879 
    7980// converters: 
  • include/libroar/vio_ctl.h

    r3769 r3796  
    7777#define ROAR_VIO_CTL_GET_NAME            (ROAR_VIO_CTL_GENERIC|ROAR_VIO_CTL_GET|0x0160) /* get name of VIO */ 
    7878#define ROAR_VIO_CTL_ACCEPT              (ROAR_VIO_CTL_GENERIC|0x0170) /* accept(), vio* */ 
     79#define ROAR_VIO_CTL_SHUTDOWN            (ROAR_VIO_CTL_GENERIC|ROAR_VIO_CTL_SET|0x0174) /* shutdown(), int */ 
    7980 
    8081// get or set data format used for read and write calls, see below 
     
    108109#define ROAR_VIO_CTL_SET_VOLUME    (ROAR_VIO_CTL_DRIVER|ROAR_VIO_CTL_SET|0x10) 
    109110 
     111// consts for ROAR_VIO_CTL_SHUTDOWN: 
     112#define ROAR_VIO_SHUTDOWN_READ        0x1 
     113#define ROAR_VIO_SHUTDOWN_WRITE       0x2 
     114#define ROAR_VIO_SHUTDOWN_LISTEN      0x4 /* like close() on listen sock but allow padding requests */ 
     115                                          /* to be accept()ed                                       */ 
     116#define ROAR_VIO_SHUTDOWN_RW       (ROAR_VIO_SHUTDOWN_READ|ROAR_VIO_SHUTDOWN_WRITE) 
    110117 
    111118// Data format used for read/write(): 
  • libroar/vio.c

    r3795 r3796  
    182182} 
    183183 
     184int     roar_vio_shutdown(struct roar_vio_calls * vio,   int how) { 
     185 return roar_vio_ctl(vio, ROAR_VIO_CTL_SHUTDOWN, &how); 
     186} 
     187 
    184188// converters: 
    185189int     roar_vio_open_file     (struct roar_vio_calls * calls, char * filename, int flags, mode_t mode) { 
     
    339343 
    340344int     roar_vio_basic_ctl     (struct roar_vio_calls * vio, int cmd, void * data) { 
    341  int fh; 
     345 int tmp; 
     346 int s_r = 0, s_w = 0; 
    342347 
    343348 if ( vio == NULL || cmd == -1 ) 
     
    369374   break; 
    370375  case ROAR_VIO_CTL_ACCEPT: 
    371     fh = accept(roar_vio_get_fh(vio), NULL, 0); 
    372     if ( fh == -1 ) 
     376    tmp = accept(roar_vio_get_fh(vio), NULL, 0); 
     377    if ( tmp == -1 ) 
    373378     return -1; 
    374379 
    375380    // most proably a socket. 
    376     if ( roar_vio_open_fh_socket(data, fh) == -1 ) { 
     381    if ( roar_vio_open_fh_socket(data, tmp) == -1 ) { 
    377382#ifdef ROAR_TARGET_WIN32 
    378      closesocket(fh); 
    379 #else 
    380      close(fh); 
     383     closesocket(tmp); 
     384#else 
     385     close(tmp); 
    381386#endif 
    382387     return -1; 
     
    384389 
    385390    return 0; 
     391   break; 
     392  case ROAR_VIO_CTL_SHUTDOWN: 
     393    tmp = *(int*)data; 
     394 
     395    if ( tmp & ROAR_VIO_SHUTDOWN_READ ) { 
     396     s_r = 1; 
     397     tmp -= ROAR_VIO_SHUTDOWN_READ; 
     398    } 
     399 
     400    if ( tmp & ROAR_VIO_SHUTDOWN_WRITE ) { 
     401     s_w = 1; 
     402     tmp -= ROAR_VIO_SHUTDOWN_WRITE; 
     403    } 
     404 
     405    if ( tmp != 0 ) /* we currently only support R and W shutdowns */ 
     406     return -1; 
     407 
     408    if ( s_r && s_w ) { 
     409     tmp = SHUT_RDWR; 
     410    } else if ( s_r ) { 
     411     tmp = SHUT_RD; 
     412    } else if ( s_w ) { 
     413     tmp = SHUT_WR; 
     414    } else { 
     415     return 0; // nothing to do. 
     416    } 
     417 
     418    return shutdown(roar_vio_get_fh(vio), tmp); 
    386419   break; 
    387420 } 
Note: See TracChangeset for help on using the changeset viewer.