1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (c) Linux Test Project, 2002-2022
4 * Copyright (c) International Business Machines Corp., 2001
5 */
6
7/*\
8 * [Description]
9 *
10 * Verify that write(2) fails with errno EAGAIN when attempt to write to fifo
11 * opened in O_NONBLOCK mode.
12 */
13
14#include <sys/stat.h>
15#include <fcntl.h>
16#include <signal.h>
17#include <setjmp.h>
18#include <errno.h>
19#include <string.h>
20#include <stdio.h>
21#include "tst_test.h"
22
23static char fifo[100];
24static int rfd, wfd;
25static long page_size;
26
27static void verify_write(void)
28{
29	char wbuf[8 * page_size];
30
31	TST_EXP_FAIL2(write(wfd, wbuf, sizeof(wbuf)), EAGAIN);
32}
33
34static void setup(void)
35{
36	page_size = getpagesize();
37
38	char wbuf[17 * page_size];
39
40	sprintf(fifo, "%s.%d", fifo, getpid());
41
42	SAFE_MKNOD(fifo, S_IFIFO | 0777, 0);
43
44	rfd = SAFE_OPEN(fifo, O_RDONLY | O_NONBLOCK);
45	wfd = SAFE_OPEN(fifo, O_WRONLY | O_NONBLOCK);
46
47	SAFE_WRITE(SAFE_WRITE_ANY, wfd, wbuf, sizeof(wbuf));
48}
49
50static void cleanup(void)
51{
52	if (rfd > 0)
53		SAFE_CLOSE(rfd);
54
55	if (wfd > 0)
56		SAFE_CLOSE(wfd);
57}
58
59static struct tst_test test = {
60	.needs_tmpdir = 1,
61	.setup = setup,
62	.cleanup = cleanup,
63	.test_all = verify_write,
64};
65