2 * Copyright (c) 2005 MontaVista Software, Inc.
6 * Author: Steven Dake (sdake@mvista.com)
8 * This software licensed under BSD license, the text of which follows:
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions are met:
13 * - Redistributions of source code must retain the above copyright notice,
14 * this list of conditions and the following disclaimer.
15 * - Redistributions in binary form must reproduce the above copyright notice,
16 * this list of conditions and the following disclaimer in the documentation
17 * and/or other materials provided with the distribution.
18 * - Neither the name of the MontaVista Software, Inc. nor the names of its
19 * contributors may be used to endorse or promote products derived from this
20 * software without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32 * THE POSSIBILITY OF SUCH DAMAGE.
41 #include <sys/types.h>
42 #include <sys/socket.h>
43 #include <sys/select.h>
49 void QueueOpenCallback (
50 SaInvocationT invocation
,
51 SaMsgQueueHandleT queueHandle
,
56 void QueueGroupTrackCallback (
57 const SaNameT
*queueGroupName
,
58 const SaMsgQueueGroupNotificationBufferT
*notificationBuffer
,
59 SaUint32T numberOfMembers
,
64 void MessageDeliveredCallback (
65 SaInvocationT invocation
,
70 void MessageReceivedCallback (
71 SaMsgQueueHandleT queueHandle
)
75 SaMsgCallbacksT callbacks
= {
76 .saMsgQueueOpenCallback
= QueueOpenCallback
,
77 .saMsgQueueGroupTrackCallback
= QueueGroupTrackCallback
,
78 .saMsgMessageDeliveredCallback
= MessageDeliveredCallback
,
79 .saMsgMessageReceivedCallback
= MessageReceivedCallback
82 SaVersionT version
= { 'B', 1, 1 };
84 SaMsgQueueCreationAttributesT creation_attributes
= {
85 SA_MSG_QUEUE_PERSISTENT
,
86 {128000, 128000, 128000},
90 void setSaNameT (SaNameT
*name
, char *str
) {
91 name
->length
= strlen (str
);
92 memcpy (name
->value
, str
, name
->length
);
95 void sigintr_handler (int signum
) {
101 SaMsgQueueHandleT queue_handle
;
103 SaSelectionObjectT select_fd
;
106 SaNameT queue_group_name
;
108 signal (SIGINT
, sigintr_handler
);
110 result
= saMsgInitialize (&handle
, &callbacks
, &version
);
111 if (result
!= SA_AIS_OK
) {
112 printf ("Could not initialize Cluster Membership API instance error %d\n", result
);
116 saMsgSelectionObjectGet (handle
, &select_fd
);
118 setSaNameT (&queue_name
, "queue");
120 result
= saMsgQueueOpen (handle
,
122 &creation_attributes
,
126 printf ("saMsgQueueOpen result is %d (should be 1)\n", result
);
128 setSaNameT (&queue_group_name
, "queue_group");
130 result
= saMsgQueueGroupCreate (
133 SA_MSG_QUEUE_GROUP_ROUND_ROBIN
);
134 printf ("saMsgQueueGroupCreate result is %d (should be 1)\n", result
);
136 result
= saMsgQueueGroupCreate (
139 SA_MSG_QUEUE_GROUP_ROUND_ROBIN
);
140 printf ("saMsgQueueGroupCreate result is %d (should be 14)\n", result
);
142 result
= saMsgQueueGroupInsert (
146 printf ("saMsgQueueGroupInsert result is %d (should be 1)\n", result
);
151 FD_SET (select_fd
, &read_fds
);
152 FD_SET (STDIN_FILENO
, &read_fds
);
153 result
= select (select_fd
+ 1, &read_fds
, 0, 0, 0);
157 if (FD_ISSET (STDIN_FILENO
, &read_fds
)) {
160 saMsgDispatch (handle
, SA_DISPATCH_ALL
);
163 result
= saMsgQueueGroupRemove (
167 printf ("saMsgQueueGroupRemove result is %d (should be 1)\n", result
);
169 result
= saMsgQueueGroupDelete (handle
,
171 printf ("saMsgQueueGroupDelete result is %d (should be 1)\n", result
);
173 result
= saMsgQueueClose (queue_handle
);
174 printf ("saMsgQueueClose result is %d (should be 1)\n", result
);
176 result
= saMsgFinalize (handle
);
177 printf ("Finalize result is %d (should be 1)\n", result
);