Skip to content

Weird ioctl_readwrite! behaviour for values above 10 #2623

Open
@mekanix

Description

@mekanix

I'm trying to implement crate to make OSS (audio on FreeBSD) handling easier, and this is the part of code that is behaving strangely

const SNDCTL_DSP_MAGIC: u8 = b'P';
const SNDCTL_DSP_COOKEDMODE: u8 = 30;
nix::ioctl_readwrite!(oss_set_cooked, SNDCTL_DSP_MAGIC, SNDCTL_DSP_COOKEDMODE, i32);

Later I call it like this

let mut cooked: i32 = 0;
oss_set_cooked(fd, &mut cooked).expect("Failed to disable cooked mode");

When I use truss to look at the syscalls, I get this

# truss target/debug/deps/oss-10d0d16316d09bcd --ignored 2>&1 | grep -A1 dsp
openat(AT_FDCWD,"/dev/dsp4",O_WRONLY|O_CLOEXEC,00) = 4 (0x4)
ioctl(4,0xc004501e { IORW 0x50('P'), 30, 4 },0x2fa2c9fc85ec) ERR#22 'Invalid argument'

But if I change SNDCTL_DSP_COOKEDMODE to 9 for example, this is what I get

# truss target/debug/deps/oss-10d0d16316d09bcd --ignored 2>&1 | grep -A1 dsp
openat(AT_FDCWD,"/dev/dsp4",O_WRONLY|O_CLOEXEC,00) = 4 (0x4)
ioctl(4,SNDCTL_DSP_SUBDIVIDE,0x157e572ad5ec)	 ERR#22 'Invalid argument'

Can you help me debug this, please? I'm new to Rust, but not new to FreeBSD. Thank you!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions