Subject: Re: wrap up of pipe(2)
To: Greg A. Woods <woods@weird.com>
From: Andrew Brown <atatat@atatdot.net>
List: tech-userlevel
Date: 10/16/2001 13:46:40
>> Or, let's take a different example, read(2) is defined as returning EINVAL
>> if "The total length of the I/O is more than can be expressed by the ssize_t
>> return value."   Which of NetBSD's current ports can ever actually return
>> that error (for that reason) ??   Maybe some can, but there are certainly
>> some of them where it will never happen.

all of them.  if you read the code for sys_read(), you'll see that it
calls dofileread(), and the first thing that function does is this:

	/*
	 * Reads return ssize_t because -1 is returned on error.  Therefore
	 * we must restrict the length to SSIZE_MAX to avoid garbage return
	 * values.
	 */
	if (auio.uio_resid > SSIZE_MAX) {
		error = EINVAL;
		goto out;
	}

that's from current.  the code i see in 1.3.3 (which doesn't have a
routine called dofileread()) looks like this:

	if (auio.uio_resid < 0)
		return EINVAL;

which is effectively the same.

>Well, since ssize_t is a (signed) int, the possibility is there on at
>least some platforms....

it's not an int.  and int isn't always big enough to do the job.
ssize_t is defined like this:

sys/types.h:typedef	_BSD_SSIZE_T_		ssize_t;

and _BSD_SSIZE_T_ comes from here:

arch/alpha/include/ansi.h:#define	_BSD_SSIZE_T_		long
arch/arm/include/ansi.h:#define	_BSD_SSIZE_T_		long int
arch/arm/include/ansi.h:#define	_BSD_SSIZE_T_		int
arch/i386/include/ansi.h:#define	_BSD_SSIZE_T_		int
arch/m68k/include/ansi.h:#define	_BSD_SSIZE_T_		int
arch/mips/include/ansi.h:#define	_BSD_SSIZE_T_		int
arch/pc532/include/ansi.h:#define	_BSD_SSIZE_T_		int
arch/powerpc/include/ansi.h:#define	_BSD_SSIZE_T_		int
arch/sh3/include/ansi.h:#define	_BSD_SSIZE_T_		int
arch/sparc/include/ansi.h:#define	_BSD_SSIZE_T_		long
arch/sparc64/include/ansi.h:#define	_BSD_SSIZE_T_		long
arch/vax/include/ansi.h:#define	_BSD_SSIZE_T_		long int
arch/vax/include/ansi.h:#define	_BSD_SSIZE_T_		int
arch/x86_64/include/ansi.h:#define	_BSD_SSIZE_T_		long
arch/hpc/stand/include/machine/ansi.h:#define	_BSD_SSIZE_T_		int

people should really read code before spouting off.

-- 
|-----< "CODE WARRIOR" >-----|
codewarrior@daemon.org             * "ah!  i see you have the internet
twofsonet@graffiti.com (Andrew Brown)                that goes *ping*!"
andrew@crossbar.com       * "information is power -- share the wealth."