ansok@ucbvax.berkeley.edu (01/08/86)
I came across a gotcha recently while trying to port a program onto our Pyramid. This program wanted to get information out of the kernel, so it opened up /dev/kmem, got some addresses via nlist, and tried to seek to those addresses. Unfortunately, the program kept reporting an error whenever it tried to seek (to an address in the neighborhood of 0xff05000). After some trial and error, I discovered the culprit was a line in the program that looked like: if (lseek(fd,addr,L_SET) != addr) /* error... */ and that the Pyramid returned 0 from lseek for addresses >= 0x80000000. (I suppose because such a number cannot be represented in the signed long that lseek returns.) Of course, the documentation fails to mention this little fact, and states that the return from lseek is *always* addr or -1. Admittedly, there may not be a better way to deal with a return value which could range from 0 to 0xffffffff and still have a value left over for error. But it would have been nice if this hadn't been a total surprise. Gary Ansok trwrb!trwspp!spp3!ansok