xref: /netbsd-src/external/ibm-public/postfix/dist/src/util/fifo_open.c (revision 41fbaed053f8fbfdf9d2a4ee0a7386a3c83f8505)
1 /*	$NetBSD: fifo_open.c,v 1.1.1.1 2009/06/23 10:08:59 tron Exp $	*/
2 
3 /*++
4 /* NAME
5 /*	fifo_open 1
6 /* SUMMARY
7 /*	fifo client test program
8 /* SYNOPSIS
9 /*	fifo_open
10 /* DESCRIPTION
11 /*	fifo_open creates a FIFO, then attempts to open it for writing
12 /*	with non-blocking mode enabled. According to the POSIX standard
13 /*	the open should succeed.
14 /* DIAGNOSTICS
15 /*	Problems are reported to the standard error stream.
16 /* LICENSE
17 /* .ad
18 /* .fi
19 /*	The Secure Mailer license must be distributed with this software.
20 /* AUTHOR(S)
21 /*	Wietse Venema
22 /*	IBM T.J. Watson Research
23 /*	P.O. Box 704
24 /*	Yorktown Heights, NY 10598, USA
25 /*--*/
26 
27 #include <sys/stat.h>
28 #include <stdio.h>
29 #include <fcntl.h>
30 #include <signal.h>
31 #include <unistd.h>
32 #include <stdlib.h>
33 
34 #define FIFO_PATH	"test-fifo"
35 #define perrorexit(s)	{ perror(s); exit(1); }
36 
cleanup(void)37 static void cleanup(void)
38 {
39     printf("Removing fifo %s...\n", FIFO_PATH);
40     if (unlink(FIFO_PATH))
41 	perrorexit("unlink");
42     printf("Done.\n");
43 }
44 
stuck(int unused_sig)45 static void stuck(int unused_sig)
46 {
47     printf("Non-blocking, write-only open of FIFO blocked\n");
48     cleanup();
49     exit(1);
50 }
51 
main(int unused_argc,char ** unused_argv)52 int     main(int unused_argc, char **unused_argv)
53 {
54     (void) unlink(FIFO_PATH);
55     printf("Creating fifo %s...\n", FIFO_PATH);
56     if (mkfifo(FIFO_PATH, 0600) < 0)
57 	perrorexit("mkfifo");
58     signal(SIGALRM, stuck);
59     alarm(5);
60     printf("Opening fifo %s, non-blocking, write-only mode...\n", FIFO_PATH);
61     if (open(FIFO_PATH, O_WRONLY | O_NONBLOCK, 0) < 0) {
62 	perror("open");
63 	cleanup();
64 	exit(1);
65     }
66     printf("Non-blocking, write-only open of FIFO succeeded\n");
67     cleanup();
68     exit(0);
69 }
70