neophyte: tcsetattr() gives 22 error in i386, not in amd64?
Steve Franks
stevefranks at ieee.org
Wed Oct 29 22:30:49 UTC 2008
>> >>>> Hi,
>> >>>>
>> >>>> I'm getting a 22 errno from tcsetattr() on 7-STABLE i386 in code which
>> >>>> was working under 7-STABLE amd64. Serial device is a ucom (silabs
>> >>>> cp2103). Permissions on /dev/cuaU0 look fine. Cutecom/Minicom
>> >>>> appears to open the port without error...
>> >>> I don't see anything obviously wrong, but I'd bet a bug related to
>> >>> 32/64-bit types. Can you post a complete piece of code that can be
>> >>> compiled and run and demonstrates the problem? Also, try compiling with
>> >>> -Wall -W and investigate any warnings that are produced.
>> >>>
>> >>> By the way, errno 22 is EINVAL, "Invalid argument". perror() is your
>> >>> friend.
>> >> Strange freebsd doesnt document error numbers. On POSIX, errno 22 is
>> >> EINVAL as well (documented in errno(3)). Is this applicable to freebsd?
>> >
>> > /usr/include/errno.h isn't documentation of error numbers?
>>
> If you're wanting to track down how/why tcsetattr(3) results in EINVAL,
> using truss or ktrace might come in handy. Otherwise, you literally
> will have to throw some debugging code into the ucom(4) driver to
> try and figure out what function is kicking out code 22.
Wow! truss is quite handy.
I've located the problem, and am posting it for posterity:
Someone was memset()'ing the termios struct to zero's, then setting
the baudrate (setcfspeed) and a couple other things. Apparently this
was not a canonical set of required members of the struct, because
adding a tcgetattr(f, termio) right after the memset apparently
pre-populated the thing correctly and now it works fine...
Thanks for the leg up, Jeremy.
Best,
Steve
More information about the freebsd-hackers
mailing list