Blame src/functional/fcntl.c

Szabolcs Nagy 0c5fb5
#include <stdio.h>
Szabolcs Nagy 0c5fb5
#include <fcntl.h>
Szabolcs Nagy 0c5fb5
#include <unistd.h>
Szabolcs Nagy 0c5fb5
#include <errno.h>
Szabolcs Nagy 0c5fb5
#include <string.h>
Szabolcs Nagy 0c5fb5
#include <sys/wait.h>
Szabolcs Nagy 0c5fb5
#include "test.h"
Szabolcs Nagy 0c5fb5
Szabolcs Nagy 0c5fb5
#define TEST(c, ...) ((c) ? 1 : (error(#c" failed: " __VA_ARGS__),0))
Szabolcs Nagy dc3c95
#define TESTE(c) (errno=0, TEST(c, "errno = %s\n", strerror(errno)))
Szabolcs Nagy 0c5fb5
Szabolcs Nagy 0c5fb5
int main(void)
Szabolcs Nagy 0c5fb5
{
Szabolcs Nagy 0c5fb5
	struct flock fl = {0};
Szabolcs Nagy 0c5fb5
	FILE *f;
Szabolcs Nagy 0c5fb5
	int fd;
Szabolcs Nagy 0c5fb5
	pid_t pid;
Szabolcs Nagy 0c5fb5
	int status;
Szabolcs Nagy 0c5fb5
Szabolcs Nagy 0c5fb5
	if (!TESTE(f=tmpfile())) return test_status;
Szabolcs Nagy 0c5fb5
	fd = fileno(f);
Szabolcs Nagy 0c5fb5
Szabolcs Nagy 0c5fb5
	fl.l_type = F_WRLCK;
Szabolcs Nagy 0c5fb5
	fl.l_whence = SEEK_SET;
Szabolcs Nagy 0c5fb5
	fl.l_start = 0;
Szabolcs Nagy 0c5fb5
	fl.l_len = 0;
Szabolcs Nagy 0c5fb5
	TESTE(fcntl(fd, F_SETLK, &fl)==0);
Szabolcs Nagy 0c5fb5
Szabolcs Nagy 0c5fb5
	pid = fork();
Szabolcs Nagy 0c5fb5
	if (!pid) {
Szabolcs Nagy 0c5fb5
		fl.l_type = F_RDLCK;
Szabolcs Nagy 0c5fb5
		_exit(fcntl(fd, F_SETLK, &fl)==0 ||
Szabolcs Nagy 0c5fb5
			(errno!=EAGAIN && errno!=EACCES));
Szabolcs Nagy 0c5fb5
	}
Szabolcs Nagy 0c5fb5
	while (waitpid(pid, &status, 0)<0 && errno==EINTR);
Szabolcs Nagy 0c5fb5
	TEST(status==0, "lock failed to work\n");
Szabolcs Nagy 0c5fb5
Szabolcs Nagy 0c5fb5
	pid = fork();
Szabolcs Nagy 0c5fb5
	if (!pid) {
Szabolcs Nagy 0c5fb5
		fl.l_type = F_WRLCK;
Szabolcs Nagy 0c5fb5
		_exit(fcntl(fd, F_GETLK, &fl) || fl.l_pid != getppid());
Szabolcs Nagy 0c5fb5
	}
Szabolcs Nagy 0c5fb5
	while (waitpid(pid, &status, 0)<0 && errno==EINTR);
Szabolcs Nagy 0c5fb5
	TEST(status==0, "child failed to detect lock held by parent\n");
Szabolcs Nagy 0c5fb5
Szabolcs Nagy 0c5fb5
	fclose(f);
Szabolcs Nagy 0c5fb5
Szabolcs Nagy 0c5fb5
	return test_status;
Szabolcs Nagy 0c5fb5
}