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>