I've come across lots of C code which mixes whether it's using -errno, or errno and life all gets messy. And then there's the places where you're returning a pointer not an errno at all. (Which the kernel tries to solve with errptr I think - but there seems to be plenty of places fixing that)
And then there's the way that using -errno ends up with ssize_t (signed that is) which also confuses loads of things.