1/*
2 * Copyright (c) 2016 Proofpoint, Inc. and its suppliers.
3 *      All rights reserved.
4 *
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
8 */
9
10#include <sm/gen.h>
11
12#include <stdio.h>
13
14# include <stdlib.h>
15# include <unistd.h>
16
17# include <sm/heap.h>
18# include <sm/string.h>
19# include <sm/test.h>
20# include <sm/notify.h>
21
22# define MAX_CNT	10
23
24/*
25**  MSGTEST -- test of message queue.
26**
27**	Parameters:
28**		owner -- create message queue.
29**
30**	Returns:
31**		0 on success
32**		< 0 on failure.
33*/
34
35static int
36notifytest(owner)
37	int owner;
38{
39	int r;
40	size_t len;
41	char buf[64];
42#define TSTSTR "qf0001"
43
44	r = sm_notify_start(owner, 0);
45	if (r < 0)
46	{
47		perror("sm_notify_start failed");
48		return -1;
49	}
50
51	if (!owner)
52	{
53		len = sm_strlcpy(buf, TSTSTR, sizeof(buf));
54		r = sm_notify_snd(buf, len);
55		SM_TEST(r >= 0);
56		if (r < 0)
57			goto end;
58
59  end:
60		return r;
61	}
62	else
63	{
64		r = sm_notify_rcv(buf, sizeof(buf), 5);
65		SM_TEST(r >= 0);
66		if (r < 0)
67			return r;
68		if (r > 0 && r < sizeof(buf))
69			buf[r] = '\0';
70		buf[sizeof(buf) - 1] = '\0';
71		SM_TEST(strcmp(buf, TSTSTR) == 0);
72		fprintf(stderr, "buf=\"%s\"\n", buf);
73	}
74	return 0;
75}
76
77int
78main(argc, argv)
79	int argc;
80	char *argv[];
81{
82	int ch;
83	int r = 0;
84	pid_t pid;
85
86# define OPTIONS	""
87	while ((ch = getopt(argc, argv, OPTIONS)) != -1)
88	{
89		switch ((char) ch)
90		{
91		  default:
92			break;
93		}
94	}
95
96	r = sm_notify_init(0);
97	if (r < 0)
98	{
99		perror("sm_notify_init failed\n");
100		return -1;
101	}
102
103	if ((pid = fork()) < 0)
104	{
105		perror("fork failed\n");
106		return -1;
107	}
108
109	sm_test_begin(argc, argv, "test notify");
110	if (pid == 0)
111	{
112		/* give the parent the chance to setup data */
113		sleep(1);
114		r = notifytest(false);
115	}
116	else
117	{
118		r = notifytest(true);
119	}
120	SM_TEST(r >= 0);
121	return sm_test_end();
122}
123