summaryrefslogtreecommitdiff
path: root/libsm/t-notify.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsm/t-notify.c')
-rw-r--r--libsm/t-notify.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/libsm/t-notify.c b/libsm/t-notify.c
new file mode 100644
index 0000000000000..7103cad2559dc
--- /dev/null
+++ b/libsm/t-notify.c
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2016 Proofpoint, Inc. and its suppliers.
+ * All rights reserved.
+ *
+ * By using this file, you agree to the terms and conditions set
+ * forth in the LICENSE file which can be found at the top level of
+ * the sendmail distribution.
+ */
+
+#include <sm/gen.h>
+
+#include <stdio.h>
+
+# include <stdlib.h>
+# include <unistd.h>
+
+# include <sm/heap.h>
+# include <sm/string.h>
+# include <sm/test.h>
+# include <sm/notify.h>
+
+# define MAX_CNT 10
+
+/*
+** MSGTEST -- test of message queue.
+**
+** Parameters:
+** owner -- create message queue.
+**
+** Returns:
+** 0 on success
+** < 0 on failure.
+*/
+
+static int
+notifytest(owner)
+ int owner;
+{
+ int r;
+ size_t len;
+ char buf[64];
+#define TSTSTR "qf0001"
+
+ r = sm_notify_start(owner, 0);
+ if (r < 0)
+ {
+ perror("sm_notify_start failed");
+ return -1;
+ }
+
+ if (!owner)
+ {
+ len = sm_strlcpy(buf, TSTSTR, sizeof(buf));
+ r = sm_notify_snd(buf, len);
+ SM_TEST(r >= 0);
+ if (r < 0)
+ goto end;
+
+ end:
+ return r;
+ }
+ else
+ {
+ r = sm_notify_rcv(buf, sizeof(buf), 5);
+ SM_TEST(r >= 0);
+ if (r < 0)
+ return r;
+ if (r > 0 && r < sizeof(buf))
+ buf[r] = '\0';
+ buf[sizeof(buf) - 1] = '\0';
+ SM_TEST(strcmp(buf, TSTSTR) == 0);
+ fprintf(stderr, "buf=\"%s\"\n", buf);
+ }
+ return 0;
+}
+
+int
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+ int ch;
+ int r = 0;
+ pid_t pid;
+
+# define OPTIONS ""
+ while ((ch = getopt(argc, argv, OPTIONS)) != -1)
+ {
+ switch ((char) ch)
+ {
+ default:
+ break;
+ }
+ }
+
+ r = sm_notify_init(0);
+ if (r < 0)
+ {
+ perror("sm_notify_init failed\n");
+ return -1;
+ }
+
+ if ((pid = fork()) < 0)
+ {
+ perror("fork failed\n");
+ return -1;
+ }
+
+ sm_test_begin(argc, argv, "test notify");
+ if (pid == 0)
+ {
+ /* give the parent the chance to setup data */
+ sleep(1);
+ r = notifytest(false);
+ }
+ else
+ {
+ r = notifytest(true);
+ }
+ SM_TEST(r >= 0);
+ return sm_test_end();
+}