Changeset 3780:d463fa7a8ba9 in roaraudio for libroaross


Ignore:
Timestamp:
05/07/10 12:43:34 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added some very basic support for fcntl()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroaross/libroaross.c

    r3779 r3780  
    119119 struct session * session; 
    120120 int type; 
     121 int sysio_flags; 
    121122 struct roar_stream    stream; 
    122123 struct roar_vio_calls stream_vio; 
     
    538539 } 
    539540 
    540  handle->type       = ptr->type; 
    541  handle->stream_dir = -1; 
     541 handle->type        = ptr->type; 
     542 handle->sysio_flags = flags; 
     543 handle->stream_dir  = -1; 
    542544 
    543545 switch (flags & (O_RDONLY|O_WRONLY|O_RDWR)) { 
     
    15311533 long argl = -1; 
    15321534 void * vp = NULL; 
     1535 int ret   = -1; 
     1536 int diff; 
    15331537 
    15341538 _init(); 
     
    16051609 } 
    16061610 
    1607  errno = ENOSYS; 
    1608  return -1; 
     1611 switch (cmd) { 
     1612  case F_DUPFD: 
     1613    ret = _os.fcntl(fd, F_DUPFD, argl); 
     1614 
     1615    if ( ret != -1 ) { 
     1616     if ( _attach_pointer(pointer->handle, ret) == NULL ) { 
     1617      _os.close(ret); 
     1618      ret = -1; 
     1619     } 
     1620    } 
     1621   break; 
     1622  case F_SETFD: 
     1623    if ( argl == 0 ) { 
     1624     ret = 0; 
     1625    } else { 
     1626     errno = ENOSYS; 
     1627     ret = -1; 
     1628    } 
     1629   break; 
     1630  case F_GETFD: 
     1631    ret = 0; 
     1632   break; 
     1633  case F_GETFL: 
     1634    ret = pointer->handle->sysio_flags; 
     1635   break; 
     1636  case F_SETFL: 
     1637    diff  = (int)argl ^ pointer->handle->sysio_flags; 
     1638    diff &= (int)~(int)(O_DIRECT|O_APPEND|O_LARGEFILE|O_NOATIME|O_NOCTTY|O_TRUNC); 
     1639    if ( diff == 0 ) { // only flags changed we ignore anyway. 
     1640     pointer->handle->sysio_flags = (int)argl; 
     1641     ret = 0; 
     1642    } else { 
     1643     errno = EINVAL; 
     1644     ret = -1; 
     1645    } 
     1646   break; 
     1647/* TODO: add support for those types: 
     1648  case F_SETFD: 
     1649  case F_SETOWN: 
     1650  case F_SETSIG: 
     1651  case F_SETLEASE: 
     1652  case F_NOTIFY: 
     1653  case F_GETOWN: 
     1654  case F_GETSIG: 
     1655  case F_GETLEASE: 
     1656  case F_GETLK: 
     1657  case F_SETLK: 
     1658  case F_SETLKW: 
     1659*/ 
     1660  default: 
     1661    errno = ENOSYS; 
     1662    ret = -1; 
     1663   break; 
     1664 } 
     1665 
     1666 return ret; 
    16091667} 
    16101668 
Note: See TracChangeset for help on using the changeset viewer.