On 2010-4-3 11:21 AM, Segher Boessenkool wrote:
- /* Some clients request less parameters than the CIF method
- returns, e.g. getprop with OpenSolaris.
Really? getprop has only one return value, and it is essential to check it! Well, maybe they always call getproplen before. [...]
I have a vague recollection that for historical reasons that's exactly what Solaris does. Something about non-terminated null strings if the property was too large for the buffer (the size returned in getprop is the min of buffer size and property size). Buried in the mists of antiquity, back in the days when it wasn't unusual to have the kernel fall over doing a printf() of a too-long string.
But it's always an error to have the number of return values (or arguments) not match with what is required.
Oh, it's certainly the wrong thing to do, and when writing new code you should avoid it. But evidently there is existing code which does it. Since the interface allows specifying fewer requested return values, we have to handle the case where they aren't asked for.
I should note that there is some commentary in section 6.3.1 of 1275 which explains the additional return value pushed by client-call-iface:
/In addition to the ret1 through retN values that are returned in the array, the client interface handler returns a single value as specified in the Open Firmware supplement for the appropriate ISA (see 2.1). That value indicates whether the transfer of control to the Open Firmware succeeded or failed. If the requested service is unavailable or if the control transfer failed, the client interface handler returns the value –1; otherwise, it returns the value zero./