Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 15 Feb 2012 15:36:11 +0100
From:      Nicolas Bourdaud <nicolas.bourdaud@gmail.com>
To:        freebsd-standards@freebsd.org
Subject:   write system call violates POSIX standard
Message-ID:  <4F3BC2DB.6080703@gmail.com>

next in thread | raw e-mail | index | archive | help
[resent since the signature messed my previous message on the mailing
list archive]

Hi all,

When a write() cannot transfer as many bytes as requested (because of a
file limit), it fails instead of transferring as many bytes as there is
room to write.

This is a violation of the POSIX standard:
http://pubs.opengroup.org/onlinepubs/007904975/functions/write.html


I have provided a small test to verify the problem (fsize-lim.c).

I have also created a bug report but I have been advised to post on this
mailing list anyway:
http://www.freebsd.org/cgi/query-pr.cgi?pr=164793


Best regards

Nicolas

test file: fsize-lim.c:

#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include <string.h>

#define TARGETSIZE	80000
#define LIMSIZE		60000
#define PATTSIZE	27


int main(void)
{
	struct rlimit lim;
	int fd;
	ssize_t retc;
	size_t count = 0;
	const char pattern[PATTSIZE] = "Hello world!";
	
	signal(SIGXFSZ, SIG_IGN);
	getrlimit(RLIMIT_FSIZE, &lim);
	lim.rlim_cur = LIMSIZE;
	setrlimit(RLIMIT_FSIZE, &lim);

	fd = open("result.txt", O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR);

	while (count < TARGETSIZE) {
		retc = write(fd, pattern, PATTSIZE);

		if (retc < PATTSIZE && retc > 0)
			fprintf(stderr,
			        "added %zi bytes instead of %u bytes after %zu bytes\n",
				retc, PATTSIZE, count);
		else if (retc < 0) {
			fprintf(stderr,
			        "failed when adding %u bytes after %zu bytes (error: %s)\n",
				PATTSIZE, count, strerror(errno));
			break;
		}
		count += retc;
	}

	close(fd);

	return 0;
}







Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4F3BC2DB.6080703>