Home | History | Annotate | Download | only in dmapi
      1 /*
      2  *   Copyright (c) International Business Machines  Corp., 2004
      3  *
      4  *   This program is free software;  you can redistribute it and/or modify
      5  *   it under the terms of the GNU General Public License as published by
      6  *   the Free Software Foundation; either version 2 of the License, or
      7  *   (at your option) any later version.
      8  *
      9  *   This program is distributed in the hope that it will be useful,
     10  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
     11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     12  *   the GNU General Public License for more details.
     13  *
     14  *   You should have received a copy of the GNU General Public License
     15  *   along with this program;  if not, write to the Free Software
     16  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     17  */
     18 
     19 /*
     20  * TEST CASE	: event.c
     21  *
     22  * VARIATIONS	: 41
     23  *
     24  * API'S TESTED	: dm_get_events
     25  * 		  dm_respond_event
     26  * 		  dm_move_event
     27  * 		  dm_pending
     28  */
     29 #include <string.h>
     30 #include <stdio.h>
     31 #include <errno.h>
     32 #include <pthread.h>
     33 #include <unistd.h>
     34 #include <sys/stat.h>
     35 #include <sys/mount.h>
     36 #include <fcntl.h>
     37 #include <signal.h>
     38 #include "dm_test.h"
     39 
     40 #define MAX_EVENT (sizeof(dmMsgBuf)/(MSG_DATALEN+sizeof(dm_eventmsg_t)))
     41 
     42 pthread_t tid;
     43 dm_sessid_t sid;
     44 char dmMsgBuf[4096];
     45 char command[4096];
     46 char mountPt[FILENAME_MAX];
     47 char deviceNm[FILENAME_MAX];
     48 char *szFuncName;
     49 
     50 /* Variables for thread communications */
     51 int expectedNumMsg;
     52 u_int eventsFlags;
     53 int rcRespond;
     54 int errnoRespond;
     55 
     56 void *Thread(void *);
     57 
     58 void LogEventMsgs(void *bufp)
     59 {
     60 	int i = 0;
     61 	dm_eventmsg_t *em = (dm_eventmsg_t *) bufp;
     62 
     63 	while (em != NULL) {
     64 		DMLOG_PRINT(DMLVL_DEBUG, "  eventmsg %d:\n", i++);
     65 		DMLOG_PRINT(DMLVL_DEBUG, "    ev_type: %d\n", em->ev_type);
     66 		DMLOG_PRINT(DMLVL_DEBUG, "    ev_token: %d\n", em->ev_token);
     67 		DMLOG_PRINT(DMLVL_DEBUG, "    ev_sequence: %d\n",
     68 			    em->ev_sequence);
     69 		DMLOG_PRINT(DMLVL_DEBUG, "    ev_data: length %d, value %s\n",
     70 			    DM_GET_LEN(em, ev_data), DM_GET_VALUE(em, ev_data,
     71 								  dm_eventtype_t));
     72 
     73 		em = DM_STEP_TO_NEXT(em, dm_eventmsg_t *);
     74 	}
     75 }
     76 
     77 dm_eventmsg_t *GetSyncEventMsg(void *bufp)
     78 {
     79 	dm_eventmsg_t *em = (dm_eventmsg_t *) bufp;
     80 
     81 	while (em != NULL) {
     82 		if ((em->ev_type == DM_EVENT_USER)
     83 		    && (em->ev_token != DM_INVALID_TOKEN)) {
     84 			return em;
     85 		}
     86 		em = DM_STEP_TO_NEXT(em, dm_eventmsg_t *);
     87 	}
     88 
     89 	return NULL;
     90 }
     91 
     92 int GetNumEventMsg(void *bufp)
     93 {
     94 	dm_eventmsg_t *em = (dm_eventmsg_t *) bufp;
     95 	int i = 0;
     96 
     97 	while (em != NULL) {
     98 		i++;
     99 		em = DM_STEP_TO_NEXT(em, dm_eventmsg_t *);
    100 	}
    101 	return i;
    102 }
    103 
    104 int main(int argc, char **argv)
    105 {
    106 
    107 	char *varstr;
    108 	int rc;
    109 	char *szSessionInfo = "dm_test session info";
    110 	dm_eventset_t events;
    111 
    112 	DMOPT_PARSE(argc, argv);
    113 	DMLOG_START();
    114 
    115 	DMEV_ZERO(events);
    116 	DMEV_SET(DM_EVENT_MOUNT, events);
    117 
    118 	/* CANNOT DO ANYTHING WITHOUT SUCCESSFUL INITIALIZATION!!! */
    119 	if ((rc = dm_init_service(&varstr)) != 0) {
    120 		DMLOG_PRINT(DMLVL_ERR,
    121 			    "dm_init_service failed! (rc = %d, errno = %d)\n",
    122 			    rc, errno);
    123 		DM_EXIT();
    124 	} else if ((rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &sid))
    125 		   == -1) {
    126 		DMLOG_PRINT(DMLVL_ERR,
    127 			    "dm_create_session failed! (rc = %d, errno = %d)\n",
    128 			    rc, errno);
    129 		DM_EXIT();
    130 	}
    131 
    132 	DMLOG_PRINT(DMLVL_DEBUG, "Starting DMAPI move event tests\n");
    133 
    134 	szFuncName = "dm_get_events";
    135 
    136 	/*
    137 	 * TEST    : dm_get_events - invalid sid
    138 	 * EXPECTED: rc = -1, errno = EINVAL
    139 	 */
    140 	if (DMVAR_EXEC(GET_EVENTS_BASE + 1)) {
    141 		char buf[MSG_DATALEN];
    142 		size_t rlen;
    143 
    144 		/* Variation set up */
    145 
    146 		/* Variation */
    147 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n", szFuncName);
    148 		rc = dm_get_events(INVALID_ADDR, 0, 0, sizeof(buf), buf, &rlen);
    149 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    150 
    151 		/* Variation clean up */
    152 	}
    153 
    154 	/*
    155 	 * TEST    : dm_get_events - invalid buflen
    156 	 * EXPECTED: rc = -1, errno = E2BIG
    157 	 */
    158 	if (DMVAR_EXEC(GET_EVENTS_BASE + 2)) {
    159 		char buf[MSG_DATALEN];
    160 
    161 		/* Variation set up */
    162 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    163 		rc = pthread_create(&tid, NULL, Thread,
    164 				    (void *)(GET_EVENTS_BASE + 2));
    165 		if (rc == -1) {
    166 			DMLOG_PRINT(DMLVL_DEBUG,
    167 				    "Unable to set up variation! (errno = %d)\n",
    168 				    errno);
    169 			DMVAR_SKIP();
    170 		} else {
    171 			/* Message thread finishes off variation */
    172 			dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN, buf);
    173 			pthread_join(tid, NULL);
    174 		}
    175 	}
    176 
    177 	/*
    178 	 * TEST    : dm_get_events - invalid bufp
    179 	 * EXPECTED: rc = -1, errno = EFAULT
    180 	 */
    181 	if (DMVAR_EXEC(GET_EVENTS_BASE + 3)) {
    182 		char buf[MSG_DATALEN];
    183 
    184 		/* Variation set up */
    185 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    186 		rc = pthread_create(&tid, NULL, Thread,
    187 				    (void *)(GET_EVENTS_BASE + 3));
    188 		if (rc == -1) {
    189 			DMLOG_PRINT(DMLVL_DEBUG,
    190 				    "Unable to set up variation! (errno = %d)\n",
    191 				    errno);
    192 			DMVAR_SKIP();
    193 		} else {
    194 			/* Message thread finishes off variation */
    195 			dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN, buf);
    196 			pthread_join(tid, NULL);
    197 		}
    198 	}
    199 
    200 	/*
    201 	 * TEST    : dm_get_events - invalid rlenp
    202 	 * EXPECTED: rc = -1, errno = EFAULT
    203 	 */
    204 	if (DMVAR_EXEC(GET_EVENTS_BASE + 4)) {
    205 		char buf[MSG_DATALEN];
    206 
    207 		/* Variation set up */
    208 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    209 		rc = pthread_create(&tid, NULL, Thread,
    210 				    (void *)(GET_EVENTS_BASE + 4));
    211 		if (rc == -1) {
    212 			DMLOG_PRINT(DMLVL_DEBUG,
    213 				    "Unable to set up variation! (errno = %d)\n",
    214 				    errno);
    215 			DMVAR_SKIP();
    216 		} else {
    217 			/* Message thread finishes off variation */
    218 			dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN, buf);
    219 			pthread_join(tid, NULL);
    220 		}
    221 	}
    222 
    223 	/*
    224 	 * TEST    : dm_get_events - !DM_EV_WAIT with no messages
    225 	 * EXPECTED: rc = -1, errno = EAGAIN
    226 	 */
    227 	if (DMVAR_EXEC(GET_EVENTS_BASE + 5)) {
    228 
    229 		/* Variation set up */
    230 		rc = pthread_create(&tid, NULL, Thread,
    231 				    (void *)(GET_EVENTS_BASE + 5));
    232 		if (rc == -1) {
    233 			DMLOG_PRINT(DMLVL_DEBUG,
    234 				    "Unable to set up variation! (errno = %d)\n",
    235 				    errno);
    236 			DMVAR_SKIP();
    237 		} else {
    238 			pthread_join(tid, NULL);
    239 		}
    240 	}
    241 
    242 	/*
    243 	 * TEST    : dm_get_events - !DM_EV_WAIT with one message
    244 	 * EXPECTED: rc = 0
    245 	 */
    246 	if (DMVAR_EXEC(GET_EVENTS_BASE + 6)) {
    247 		char buf[MSG_DATALEN];
    248 
    249 		/* Variation set up */
    250 		expectedNumMsg = 1;
    251 		eventsFlags = 0;
    252 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    253 		rc = pthread_create(&tid, NULL, Thread,
    254 				    (void *)(GET_EVENTS_BASE + 6));
    255 		if (rc == -1) {
    256 			DMLOG_PRINT(DMLVL_DEBUG,
    257 				    "Unable to set up variation! (errno = %d)\n",
    258 				    errno);
    259 			DMVAR_SKIP();
    260 		} else {
    261 			/* Message thread finishes off variation */
    262 			dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN, buf);
    263 			pthread_join(tid, NULL);
    264 		}
    265 	}
    266 
    267 	/*
    268 	 * TEST    : dm_get_events - DM_EV_WAIT with one message
    269 	 * EXPECTED: rc = 0
    270 	 */
    271 	if (DMVAR_EXEC(GET_EVENTS_BASE + 7)) {
    272 		char buf[MSG_DATALEN];
    273 
    274 		/* Variation set up */
    275 		expectedNumMsg = 1;
    276 		eventsFlags = DM_EV_WAIT;
    277 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    278 		rc = pthread_create(&tid, NULL, Thread,
    279 				    (void *)(GET_EVENTS_BASE + 7));
    280 		if (rc == -1) {
    281 			DMLOG_PRINT(DMLVL_DEBUG,
    282 				    "Unable to set up variation! (errno = %d)\n",
    283 				    errno);
    284 			DMVAR_SKIP();
    285 		} else {
    286 			/* Message thread finishes off variation */
    287 			dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN, buf);
    288 			pthread_join(tid, NULL);
    289 		}
    290 	}
    291 
    292 	/*
    293 	 * TEST    : dm_get_events - !DM_EV_WAIT with two messages
    294 	 * EXPECTED: rc = 0
    295 	 */
    296 	if (DMVAR_EXEC(GET_EVENTS_BASE + 8)) {
    297 		char buf[MSG_DATALEN];
    298 
    299 		/* Variation set up */
    300 		expectedNumMsg = 2;
    301 		eventsFlags = 0;
    302 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    303 		rc = dm_send_msg(sid, DM_MSGTYPE_ASYNC, MSG_DATALEN, buf);
    304 		if (rc != -1) {
    305 			rc = pthread_create(&tid, NULL, Thread,
    306 					    (void *)(GET_EVENTS_BASE + 8));
    307 		}
    308 		if (rc == -1) {
    309 			DMLOG_PRINT(DMLVL_DEBUG,
    310 				    "Unable to set up variation! (errno = %d)\n",
    311 				    errno);
    312 			DMVAR_SKIP();
    313 		} else {
    314 			/* Message thread finishes off variation */
    315 			dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN, buf);
    316 			pthread_join(tid, NULL);
    317 		}
    318 	}
    319 
    320 	/*
    321 	 * TEST    : dm_get_events - DM_EV_WAIT with two messages
    322 	 * EXPECTED: rc = 0
    323 	 */
    324 	if (DMVAR_EXEC(GET_EVENTS_BASE + 9)) {
    325 		char buf[MSG_DATALEN];
    326 
    327 		/* Variation set up */
    328 		expectedNumMsg = 2;
    329 		eventsFlags = DM_EV_WAIT;
    330 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    331 		rc = dm_send_msg(sid, DM_MSGTYPE_ASYNC, MSG_DATALEN, buf);
    332 		if (rc != -1) {
    333 			rc = pthread_create(&tid, NULL, Thread,
    334 					    (void *)(GET_EVENTS_BASE + 9));
    335 		}
    336 		if (rc == -1) {
    337 			DMLOG_PRINT(DMLVL_DEBUG,
    338 				    "Unable to set up variation! (errno = %d)\n",
    339 				    errno);
    340 			DMVAR_SKIP();
    341 		} else {
    342 			/* Message thread finishes off variation */
    343 			dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN, buf);
    344 			pthread_join(tid, NULL);
    345 		}
    346 	}
    347 
    348 	/*
    349 	 * TEST    : dm_get_events - !DM_EV_WAIT with more than MAX_EVENT messages
    350 	 * EXPECTED: rc = 0
    351 	 */
    352 	if (DMVAR_EXEC(GET_EVENTS_BASE + 10)) {
    353 		int i, j;
    354 		char buf[MSG_DATALEN];
    355 
    356 		/* Variation set up */
    357 		expectedNumMsg = MAX_EVENT;
    358 		eventsFlags = 0;
    359 		for (i = 0, rc = 0; i < MAX_EVENT + 1 && rc == 0; i++) {
    360 			j = sprintf(buf, "Multi event message %d", i);
    361 			rc = dm_send_msg(sid, DM_MSGTYPE_ASYNC, j + 1, buf);
    362 		}
    363 		if (rc != -1) {
    364 			rc = pthread_create(&tid, NULL, Thread,
    365 					    (void *)(GET_EVENTS_BASE + 10));
    366 		}
    367 		if (rc == -1) {
    368 			DMLOG_PRINT(DMLVL_DEBUG,
    369 				    "Unable to set up variation! (errno = %d)\n",
    370 				    errno);
    371 			DMVAR_SKIP();
    372 		} else {
    373 			/* Message thread finishes off variation */
    374 			j = sprintf(buf, "Multi event message %d", i);
    375 			dm_send_msg(sid, DM_MSGTYPE_SYNC, j + 1, buf);
    376 			pthread_join(tid, NULL);
    377 		}
    378 	}
    379 
    380 	szFuncName = "dm_respond_event";
    381 
    382 	/*
    383 	 * TEST    : dm_respond_event - invalid sid
    384 	 * EXPECTED: rc = -1, errno = EINVAL
    385 	 */
    386 	if (DMVAR_EXEC(RESPOND_EVENT_BASE + 1)) {
    387 		char buf[MSG_DATALEN];
    388 		dm_token_t token;
    389 
    390 		/* Variation set up */
    391 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    392 		rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token);
    393 		if (rc == -1) {
    394 			DMLOG_PRINT(DMLVL_DEBUG,
    395 				    "Unable to set up variation! (errno = %d)\n",
    396 				    errno);
    397 			DMVAR_SKIP();
    398 		} else {
    399 			/* Variation */
    400 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
    401 				    szFuncName);
    402 			rc = dm_respond_event(INVALID_ADDR, token,
    403 					      DM_RESP_CONTINUE, 0, sizeof(buf),
    404 					      buf);
    405 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    406 
    407 			/* Variation clean up */
    408 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
    409 					      0, NULL);
    410 			if (rc == -1) {
    411 				DMLOG_PRINT(DMLVL_DEBUG,
    412 					    "Unable to clean up variation! (errno	= %d)\n",
    413 					    errno);
    414 			}
    415 		}
    416 	}
    417 
    418 	/*
    419 	 * TEST    : dm_respond_event - DM_NO_SESSION sid
    420 	 * EXPECTED: rc = -1, errno = EINVAL
    421 	 */
    422 	if (DMVAR_EXEC(RESPOND_EVENT_BASE + 2)) {
    423 		char buf[MSG_DATALEN];
    424 		dm_token_t token;
    425 
    426 		/* Variation set up */
    427 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    428 		rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token);
    429 		if (rc == -1) {
    430 			DMLOG_PRINT(DMLVL_DEBUG,
    431 				    "Unable to set up variation! (errno = %d)\n",
    432 				    errno);
    433 			DMVAR_SKIP();
    434 		} else {
    435 			/* Variation */
    436 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
    437 				    szFuncName);
    438 			rc = dm_respond_event(DM_NO_SESSION, token,
    439 					      DM_RESP_CONTINUE, 0, sizeof(buf),
    440 					      buf);
    441 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    442 
    443 			/* Variation clean up */
    444 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
    445 					      0, NULL);
    446 			if (rc == -1) {
    447 				DMLOG_PRINT(DMLVL_DEBUG,
    448 					    "Unable to clean up variation! (errno	= %d)\n",
    449 					    errno);
    450 			}
    451 		}
    452 	}
    453 
    454 	/*
    455 	 * TEST    : dm_respond_event - invalid token
    456 	 * EXPECTED: rc = -1, errno = EINVAL
    457 	 */
    458 	if (DMVAR_EXEC(RESPOND_EVENT_BASE + 3)) {
    459 		char buf[MSG_DATALEN];
    460 
    461 		/* Variation set up */
    462 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    463 
    464 		/* Variation */
    465 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n", szFuncName);
    466 		rc = dm_respond_event(sid, INVALID_ADDR, DM_RESP_CONTINUE, 0,
    467 				      sizeof(buf), buf);
    468 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    469 
    470 		/* Variation clean up */
    471 	}
    472 
    473 	/*
    474 	 * TEST    : dm_respond_event - DM_NO_TOKEN token
    475 	 * EXPECTED: rc = -1, errno = EINVAL
    476 	 */
    477 	if (DMVAR_EXEC(RESPOND_EVENT_BASE + 4)) {
    478 		char buf[MSG_DATALEN];
    479 
    480 		/* Variation set up */
    481 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    482 
    483 		/* Variation */
    484 		DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_TOKEN token)\n", szFuncName);
    485 		rc = dm_respond_event(sid, DM_NO_TOKEN, DM_RESP_CONTINUE, 0,
    486 				      sizeof(buf), buf);
    487 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    488 
    489 		/* Variation clean up */
    490 	}
    491 
    492 	/*
    493 	 * TEST    : dm_respond_event - DM_INVALID_TOKEN token
    494 	 * EXPECTED: rc = -1, errno = EINVAL
    495 	 */
    496 	if (DMVAR_EXEC(RESPOND_EVENT_BASE + 5)) {
    497 		char buf[MSG_DATALEN];
    498 
    499 		/* Variation set up */
    500 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    501 
    502 		/* Variation */
    503 		DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_INVALID_TOKEN token)\n",
    504 			    szFuncName);
    505 		rc = dm_respond_event(sid, DM_INVALID_TOKEN, DM_RESP_CONTINUE,
    506 				      0, sizeof(buf), buf);
    507 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    508 
    509 		/* Variation clean up */
    510 	}
    511 
    512 	/*
    513 	 * TEST    : dm_respond_event - invalid response
    514 	 * EXPECTED: rc = -1, errno = EINVAL
    515 	 */
    516 	if (DMVAR_EXEC(RESPOND_EVENT_BASE + 6)) {
    517 		char buf[MSG_DATALEN];
    518 		dm_token_t token;
    519 
    520 		/* Variation set up */
    521 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    522 		rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token);
    523 		if (rc == -1) {
    524 			DMLOG_PRINT(DMLVL_DEBUG,
    525 				    "Unable to set up variation! (errno = %d)\n",
    526 				    errno);
    527 			DMVAR_SKIP();
    528 		} else {
    529 			/* Variation */
    530 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid response)\n",
    531 				    szFuncName);
    532 			rc = dm_respond_event(sid, token, INVALID_ADDR, 0,
    533 					      sizeof(buf), buf);
    534 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    535 
    536 			/* Variation clean up */
    537 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
    538 					      0, NULL);
    539 			if (rc == -1) {
    540 				DMLOG_PRINT(DMLVL_DEBUG,
    541 					    "Unable to clean up variation! (errno	= %d)\n",
    542 					    errno);
    543 			}
    544 		}
    545 	}
    546 
    547 	/*
    548 	 * TEST    : dm_respond_event - invalid buflen
    549 	 * EXPECTED: rc = -1, errno = E2BIG
    550 	 *
    551 	 * This variation uncovered XFS BUG #37 (0 returned instead of -1 and
    552 	 * E2BIG)
    553 	 */
    554 	if (DMVAR_EXEC(RESPOND_EVENT_BASE + 7)) {
    555 		char buf[MSG_DATALEN];
    556 		dm_token_t token;
    557 
    558 		/* Variation set up */
    559 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    560 		rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token);
    561 		if (rc == -1) {
    562 			DMLOG_PRINT(DMLVL_DEBUG,
    563 				    "Unable to set up variation! (errno = %d)\n",
    564 				    errno);
    565 			DMVAR_SKIP();
    566 		} else {
    567 			/* Variation */
    568 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid response)\n",
    569 				    szFuncName);
    570 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
    571 					      INVALID_ADDR, buf);
    572 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, E2BIG);
    573 
    574 			/* Variation clean up */
    575 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
    576 					      0, NULL);
    577 			if (rc == -1) {
    578 				DMLOG_PRINT(DMLVL_DEBUG,
    579 					    "Unable to clean up variation! (errno	= %d)\n",
    580 					    errno);
    581 			}
    582 		}
    583 	}
    584 
    585 	/*
    586 	 * TEST    : dm_respond_event - invalidated token
    587 	 * EXPECTED: rc = -1, errno = ESRCH
    588 	 */
    589 	if (DMVAR_EXEC(RESPOND_EVENT_BASE + 8)) {
    590 		char buf[MSG_DATALEN];
    591 		dm_token_t token;
    592 
    593 		/* Variation set up */
    594 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    595 		rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token);
    596 		if (rc != -1) {
    597 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
    598 					      sizeof(buf), buf);
    599 		}
    600 		if (rc == -1) {
    601 			DMLOG_PRINT(DMLVL_DEBUG,
    602 				    "Unable to set up variation! (errno = %d)\n",
    603 				    errno);
    604 			DMVAR_SKIP();
    605 		} else {
    606 			/* Variation */
    607 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated token)\n",
    608 				    szFuncName);
    609 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
    610 					      sizeof(buf), buf);
    611 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, ESRCH);
    612 
    613 			/* Variation clean up */
    614 		}
    615 	}
    616 
    617 	/*
    618 	 * TEST    : dm_respond_event - DM_RESP_INVALID
    619 	 * EXPECTED: rc = -1, errno = EINVAL
    620 	 */
    621 	if (DMVAR_EXEC(RESPOND_EVENT_BASE + 9)) {
    622 		char buf[MSG_DATALEN];
    623 
    624 		/* Variation set up */
    625 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    626 		rc = pthread_create(&tid, NULL, Thread,
    627 				    (void *)(RESPOND_EVENT_BASE + 9));
    628 		if (rc == -1) {
    629 			DMLOG_PRINT(DMLVL_DEBUG,
    630 				    "Unable to set up variation! (errno = %d)\n",
    631 				    errno);
    632 			DMVAR_SKIP();
    633 		} else {
    634 			/* Message thread finishes off variation */
    635 			dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN, buf);
    636 			pthread_join(tid, NULL);
    637 		}
    638 	}
    639 
    640 	/*
    641 	 * TEST    : dm_respond_event - DM_RESP_CONTINUE with zero reterror
    642 	 * EXPECTED: rc = 0
    643 	 */
    644 	if (DMVAR_EXEC(RESPOND_EVENT_BASE + 10)) {
    645 		char buf[MSG_DATALEN];
    646 
    647 		/* Variation set up */
    648 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    649 		rc = pthread_create(&tid, NULL, Thread,
    650 				    (void *)(RESPOND_EVENT_BASE + 10));
    651 		if (rc == -1) {
    652 			DMLOG_PRINT(DMLVL_DEBUG,
    653 				    "Unable to set up variation! (errno = %d)\n",
    654 				    errno);
    655 			DMVAR_SKIP();
    656 		} else {
    657 			/* Message thread continues variation */
    658 			rc = dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN,
    659 					 buf);
    660 			if (rcRespond == 0) {
    661 				if (rc == 0) {
    662 					DMLOG_PRINT(DMLVL_DEBUG,
    663 						    "%s passed with expected rc = %d and expected dm_send_msg rc = %d\n",
    664 						    szFuncName, rcRespond, rc);
    665 					DMVAR_PASS();
    666 				} else {
    667 					DMLOG_PRINT(DMLVL_ERR,
    668 						    "%s failed with expected rc = %d but unexpected dm_send_msg rc = %d and errno %d\n",
    669 						    szFuncName, rcRespond, rc,
    670 						    errno);
    671 					DMVAR_FAIL();
    672 				}
    673 			} else {
    674 				DMLOG_PRINT(DMLVL_ERR,
    675 					    "%s failed with unexpected rc = %d (errno = %d)\n",
    676 					    szFuncName, rcRespond,
    677 					    errnoRespond);
    678 				DMVAR_FAIL();
    679 			}
    680 			pthread_join(tid, NULL);
    681 		}
    682 	}
    683 
    684 	/*
    685 	 * TEST    : dm_respond_event - DM_RESP_CONTINUE with non-zero reterror
    686 	 * EXPECTED: rc = -1, errno = EINVAL
    687 	 */
    688 	if (DMVAR_EXEC(RESPOND_EVENT_BASE + 11)) {
    689 		char buf[MSG_DATALEN];
    690 
    691 		/* Variation set up */
    692 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    693 		rc = pthread_create(&tid, NULL, Thread,
    694 				    (void *)(RESPOND_EVENT_BASE + 11));
    695 		if (rc == -1) {
    696 			DMLOG_PRINT(DMLVL_DEBUG,
    697 				    "Unable to set up variation! (errno = %d)\n",
    698 				    errno);
    699 			DMVAR_SKIP();
    700 		} else {
    701 			/* Message thread finishes off variation */
    702 			dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN, buf);
    703 			pthread_join(tid, NULL);
    704 		}
    705 	}
    706 
    707 	/*
    708 	 * TEST    : dm_respond_event - DM_RESP_ABORT with zero reterror
    709 	 * EXPECTED: rc = -1, errno = EINVAL
    710 	 */
    711 	if (DMVAR_EXEC(RESPOND_EVENT_BASE + 12)) {
    712 		char buf[MSG_DATALEN];
    713 
    714 		/* Variation set up */
    715 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    716 		rc = pthread_create(&tid, NULL, Thread,
    717 				    (void *)(RESPOND_EVENT_BASE + 12));
    718 		if (rc == -1) {
    719 			DMLOG_PRINT(DMLVL_DEBUG,
    720 				    "Unable to set up variation! (errno = %d)\n",
    721 				    errno);
    722 			DMVAR_SKIP();
    723 		} else {
    724 			/* Message thread finishes off variation */
    725 			dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN, buf);
    726 			pthread_join(tid, NULL);
    727 		}
    728 	}
    729 
    730 	/*
    731 	 * TEST    : dm_respond_event - DM_RESP_ABORT with non-zero reterror
    732 	 * EXPECTED: rc = ABORT_ERRNO
    733 	 */
    734 	if (DMVAR_EXEC(RESPOND_EVENT_BASE + 13)) {
    735 		char buf[MSG_DATALEN];
    736 
    737 		/* Variation set up */
    738 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    739 		rc = pthread_create(&tid, NULL, Thread,
    740 				    (void *)(RESPOND_EVENT_BASE + 13));
    741 		if (rc == -1) {
    742 			DMLOG_PRINT(DMLVL_DEBUG,
    743 				    "Unable to set up variation! (errno = %d)\n",
    744 				    errno);
    745 			DMVAR_SKIP();
    746 		} else {
    747 			/* Message thread continues variation */
    748 			rc = dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN,
    749 					 buf);
    750 			if (rcRespond == 0) {
    751 				if (rc == -1) {
    752 					if (errno == ABORT_ERRNO) {
    753 						DMLOG_PRINT(DMLVL_DEBUG,
    754 							    "%s passed with expected rc = %d and dm_send_msg rc = %d\n",
    755 							    szFuncName,
    756 							    rcRespond, rc);
    757 						DMVAR_PASS();
    758 					} else {
    759 						DMLOG_PRINT(DMLVL_ERR,
    760 							    "%s failed with expected rc = %d and dm_send_msg rc = %d but unexpected errno (%d vs %d)\n",
    761 							    szFuncName,
    762 							    rcRespond, rc,
    763 							    errno, ABORT_ERRNO);
    764 						DMVAR_FAIL();
    765 					}
    766 				} else {
    767 					DMLOG_PRINT(DMLVL_ERR,
    768 						    "%s failed with expected rc = %d but unexpected dm_send_msg rc (%d vs %d)\n",
    769 						    szFuncName, rcRespond, rc,
    770 						    -1);
    771 					DMVAR_FAIL();
    772 				}
    773 			} else {
    774 				DMLOG_PRINT(DMLVL_ERR,
    775 					    "%s failed with unexpected rc = %d (errno = %d)\n",
    776 					    szFuncName, rcRespond,
    777 					    errnoRespond);
    778 				DMVAR_FAIL();
    779 			}
    780 			pthread_join(tid, NULL);
    781 		}
    782 	}
    783 
    784 	/*
    785 	 * TEST    : dm_respond_event - DM_RESP_DONTCARE
    786 	 * EXPECTED: rc = -1, errno = EINVAL
    787 	 */
    788 	if (DMVAR_EXEC(RESPOND_EVENT_BASE + 14)) {
    789 		char buf[MSG_DATALEN];
    790 
    791 		/* Variation set up */
    792 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    793 		rc = pthread_create(&tid, NULL, Thread,
    794 				    (void *)(RESPOND_EVENT_BASE + 14));
    795 		if (rc == -1) {
    796 			DMLOG_PRINT(DMLVL_DEBUG,
    797 				    "Unable to set up variation! (errno = %d)\n",
    798 				    errno);
    799 			DMVAR_SKIP();
    800 		} else {
    801 			/* Message thread finishes off variation */
    802 			dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN, buf);
    803 			pthread_join(tid, NULL);
    804 		}
    805 	}
    806 
    807 	szFuncName = "dm_move_event";
    808 
    809 	/*
    810 	 * TEST    : dm_move_event - invalid srcsid
    811 	 * EXPECTED: rc = -1, errno = EINVAL
    812 	 */
    813 	if (DMVAR_EXEC(MOVE_EVENT_BASE + 1)) {
    814 		dm_sessid_t targsid;
    815 		dm_token_t token, rtoken;
    816 		char buf[MSG_DATALEN];
    817 
    818 		/* Variation set up */
    819 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    820 		if ((rc =
    821 		     dm_create_session(DM_NO_SESSION, szSessionInfo,
    822 				       &targsid)) == -1) {
    823 			/* No clean up */
    824 		} else
    825 		    if ((rc =
    826 			 dm_create_userevent(sid, MSG_DATALEN, buf,
    827 					     &token)) == -1) {
    828 			dm_destroy_session(targsid);
    829 		}
    830 		if (rc == -1) {
    831 			DMLOG_PRINT(DMLVL_DEBUG,
    832 				    "Unable to set up variation! (errno = %d)\n",
    833 				    errno);
    834 			DMVAR_SKIP();
    835 		} else {
    836 			/* Variation */
    837 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid srcsid)\n",
    838 				    szFuncName);
    839 			rc = dm_move_event(INVALID_ADDR, token, targsid,
    840 					   &rtoken);
    841 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    842 
    843 			/* Variation clean up */
    844 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
    845 					      0, NULL);
    846 			rc |= dm_destroy_session(targsid);
    847 			if (rc == -1) {
    848 				DMLOG_PRINT(DMLVL_DEBUG,
    849 					    "Unable to clean up variation! (errno	= %d)\n",
    850 					    errno);
    851 			}
    852 		}
    853 	}
    854 
    855 	/*
    856 	 * TEST    : dm_move_event - DM_NO_SESSION srcsid
    857 	 * EXPECTED: rc = -1, errno = EINVAL
    858 	 */
    859 	if (DMVAR_EXEC(MOVE_EVENT_BASE + 2)) {
    860 		dm_sessid_t targsid;
    861 		dm_token_t token, rtoken;
    862 		char buf[MSG_DATALEN];
    863 
    864 		/* Variation set up */
    865 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    866 		if ((rc =
    867 		     dm_create_session(DM_NO_SESSION, szSessionInfo,
    868 				       &targsid)) == -1) {
    869 			/* No clean up */
    870 		} else
    871 		    if ((rc =
    872 			 dm_create_userevent(sid, MSG_DATALEN, buf,
    873 					     &token)) == -1) {
    874 			dm_destroy_session(targsid);
    875 		}
    876 		if (rc == -1) {
    877 			DMLOG_PRINT(DMLVL_DEBUG,
    878 				    "Unable to set up variation! (errno = %d)\n",
    879 				    errno);
    880 			DMVAR_SKIP();
    881 		} else {
    882 			/* Variation */
    883 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION srcsid)\n",
    884 				    szFuncName);
    885 			rc = dm_move_event(DM_NO_SESSION, token, targsid,
    886 					   &rtoken);
    887 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    888 
    889 			/* Variation clean up */
    890 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
    891 					      0, NULL);
    892 			rc |= dm_destroy_session(targsid);
    893 			if (rc == -1) {
    894 				DMLOG_PRINT(DMLVL_DEBUG,
    895 					    "Unable to clean up variation! (errno	= %d)\n",
    896 					    errno);
    897 			}
    898 		}
    899 	}
    900 
    901 	/*
    902 	 * TEST    : dm_move_event - invalid token
    903 	 * EXPECTED: rc = -1, errno = EINVAL
    904 	 */
    905 	if (DMVAR_EXEC(MOVE_EVENT_BASE + 3)) {
    906 		dm_sessid_t targsid;
    907 		dm_token_t token, rtoken;
    908 		char buf[MSG_DATALEN];
    909 
    910 		/* Variation set up */
    911 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    912 		if ((rc =
    913 		     dm_create_session(DM_NO_SESSION, szSessionInfo,
    914 				       &targsid)) == -1) {
    915 			/* No clean up */
    916 		} else
    917 		    if ((rc =
    918 			 dm_create_userevent(sid, MSG_DATALEN, buf,
    919 					     &token)) == -1) {
    920 			dm_destroy_session(targsid);
    921 		}
    922 		if (rc == -1) {
    923 			DMLOG_PRINT(DMLVL_DEBUG,
    924 				    "Unable to set up variation! (errno = %d)\n",
    925 				    errno);
    926 			DMVAR_SKIP();
    927 		} else {
    928 			/* Variation */
    929 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
    930 				    szFuncName);
    931 			rc = dm_move_event(sid, INVALID_ADDR, targsid, &rtoken);
    932 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    933 
    934 			/* Variation clean up */
    935 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
    936 					      0, NULL);
    937 			rc |= dm_destroy_session(targsid);
    938 			if (rc == -1) {
    939 				DMLOG_PRINT(DMLVL_DEBUG,
    940 					    "Unable to clean up variation! (errno	= %d)\n",
    941 					    errno);
    942 			}
    943 		}
    944 	}
    945 
    946 	/*
    947 	 * TEST    : dm_move_event - invalid targetsid
    948 	 * EXPECTED: rc = -1, errno = EINVAL
    949 	 */
    950 	if (DMVAR_EXEC(MOVE_EVENT_BASE + 4)) {
    951 		dm_sessid_t targsid;
    952 		dm_token_t token, rtoken;
    953 		char buf[MSG_DATALEN];
    954 
    955 		/* Variation set up */
    956 		memcpy(buf, MSG_DATA, MSG_DATALEN);
    957 		if ((rc =
    958 		     dm_create_session(DM_NO_SESSION, szSessionInfo,
    959 				       &targsid)) == -1) {
    960 			/* No clean up */
    961 		} else
    962 		    if ((rc =
    963 			 dm_create_userevent(sid, MSG_DATALEN, buf,
    964 					     &token)) == -1) {
    965 			dm_destroy_session(targsid);
    966 		}
    967 		if (rc == -1) {
    968 			DMLOG_PRINT(DMLVL_DEBUG,
    969 				    "Unable to set up variation! (errno = %d)\n",
    970 				    errno);
    971 			DMVAR_SKIP();
    972 		} else {
    973 			/* Variation */
    974 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid targetsid)\n",
    975 				    szFuncName);
    976 			rc = dm_move_event(sid, token, INVALID_ADDR, &rtoken);
    977 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    978 
    979 			/* Variation clean up */
    980 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
    981 					      0, NULL);
    982 			rc |= dm_destroy_session(targsid);
    983 			if (rc == -1) {
    984 				DMLOG_PRINT(DMLVL_DEBUG,
    985 					    "Unable to clean up variation! (errno	= %d)\n",
    986 					    errno);
    987 			}
    988 		}
    989 	}
    990 
    991 	/*
    992 	 * TEST    : dm_move_event - DM_NO_SESSION targetsid
    993 	 * EXPECTED: rc = -1, errno = EINVAL
    994 	 */
    995 	if (DMVAR_EXEC(MOVE_EVENT_BASE + 5)) {
    996 		dm_sessid_t targsid;
    997 		dm_token_t token, rtoken;
    998 		char buf[MSG_DATALEN];
    999 
   1000 		/* Variation set up */
   1001 		memcpy(buf, MSG_DATA, MSG_DATALEN);
   1002 		if ((rc =
   1003 		     dm_create_session(DM_NO_SESSION, szSessionInfo,
   1004 				       &targsid)) == -1) {
   1005 			/* No clean up */
   1006 		} else
   1007 		    if ((rc =
   1008 			 dm_create_userevent(sid, MSG_DATALEN, buf,
   1009 					     &token)) == -1) {
   1010 			dm_destroy_session(targsid);
   1011 		}
   1012 		if (rc == -1) {
   1013 			DMLOG_PRINT(DMLVL_DEBUG,
   1014 				    "Unable to set up variation! (errno = %d)\n",
   1015 				    errno);
   1016 			DMVAR_SKIP();
   1017 		} else {
   1018 			/* Variation */
   1019 			DMLOG_PRINT(DMLVL_DEBUG,
   1020 				    "%s(DM_NO_SESSION targetsid)\n",
   1021 				    szFuncName);
   1022 			rc = dm_move_event(sid, token, DM_NO_SESSION, &rtoken);
   1023 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1024 
   1025 			/* Variation clean up */
   1026 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
   1027 					      0, NULL);
   1028 			rc |= dm_destroy_session(targsid);
   1029 			if (rc == -1) {
   1030 				DMLOG_PRINT(DMLVL_DEBUG,
   1031 					    "Unable to clean up variation! (errno	= %d)\n",
   1032 					    errno);
   1033 			}
   1034 		}
   1035 	}
   1036 
   1037 	/*
   1038 	 * TEST    : dm_move_event - invalid rtokenp
   1039 	 * EXPECTED: rc = -1, errno = EFAULT
   1040 	 *
   1041 	 * This variation uncovered XFS BUG #36 (event moved to targetsid
   1042 	 * despite failure)
   1043 	 */
   1044 	if (DMVAR_EXEC(MOVE_EVENT_BASE + 6)) {
   1045 		dm_sessid_t targsid;
   1046 		dm_token_t token;
   1047 		char buf[MSG_DATALEN];
   1048 
   1049 		/* Variation set up */
   1050 		memcpy(buf, MSG_DATA, MSG_DATALEN);
   1051 		if ((rc =
   1052 		     dm_create_session(DM_NO_SESSION, szSessionInfo,
   1053 				       &targsid)) == -1) {
   1054 			/* No clean up */
   1055 		} else
   1056 		    if ((rc =
   1057 			 dm_create_userevent(sid, MSG_DATALEN, buf,
   1058 					     &token)) == -1) {
   1059 			dm_destroy_session(targsid);
   1060 		}
   1061 		if (rc == -1) {
   1062 			DMLOG_PRINT(DMLVL_DEBUG,
   1063 				    "Unable to set up variation! (errno = %d)\n",
   1064 				    errno);
   1065 			DMVAR_SKIP();
   1066 		} else {
   1067 			/* Variation */
   1068 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid rtokenp)\n",
   1069 				    szFuncName);
   1070 			rc = dm_move_event(sid, token, targsid,
   1071 					   (dm_token_t *) INVALID_ADDR);
   1072 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   1073 
   1074 			/* Variation clean up */
   1075 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
   1076 					      0, NULL);
   1077 			rc |= dm_destroy_session(targsid);
   1078 			if (rc == -1) {
   1079 				DMLOG_PRINT(DMLVL_DEBUG,
   1080 					    "Unable to clean up variation! (errno	= %d)\n",
   1081 					    errno);
   1082 			}
   1083 		}
   1084 	}
   1085 
   1086 	/*
   1087 	 * TEST    : dm_move_event - token not in session
   1088 	 * EXPECTED: rc = -1, errno = ENOENT
   1089 	 *
   1090 	 * This variation uncovered XFS BUG #34 (ESRCH returned instead of
   1091 	 * ENOENT)
   1092 	 */
   1093 	if (DMVAR_EXEC(MOVE_EVENT_BASE + 7)) {
   1094 		dm_sessid_t targsid;
   1095 		dm_token_t token, rtoken;
   1096 		char buf[MSG_DATALEN];
   1097 
   1098 		/* Variation set up */
   1099 		memcpy(buf, MSG_DATA, MSG_DATALEN);
   1100 		if ((rc =
   1101 		     dm_create_session(DM_NO_SESSION, szSessionInfo,
   1102 				       &targsid)) == -1) {
   1103 			/* No clean up */
   1104 		} else
   1105 		    if ((rc =
   1106 			 dm_create_userevent(sid, MSG_DATALEN, buf,
   1107 					     &token)) == -1) {
   1108 			dm_destroy_session(targsid);
   1109 		}
   1110 		if (rc == -1) {
   1111 			DMLOG_PRINT(DMLVL_DEBUG,
   1112 				    "Unable to set up variation! (errno = %d)\n",
   1113 				    errno);
   1114 			DMVAR_SKIP();
   1115 		} else {
   1116 			/* Variation */
   1117 			DMLOG_PRINT(DMLVL_DEBUG, "%s(token not in session)\n",
   1118 				    szFuncName);
   1119 			rc = dm_move_event(targsid, token, sid, &rtoken);
   1120 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, ENOENT);
   1121 
   1122 			/* Variation clean up */
   1123 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
   1124 					      0, NULL);
   1125 			rc |= dm_destroy_session(targsid);
   1126 			if (rc == -1) {
   1127 				DMLOG_PRINT(DMLVL_DEBUG,
   1128 					    "Unable to clean up variation! (errno	= %d)\n",
   1129 					    errno);
   1130 			}
   1131 		}
   1132 	}
   1133 
   1134 	/*
   1135 	 * TEST    : dm_move_event - srcsid == targetsid
   1136 	 * EXPECTED: rc = 0
   1137 	 */
   1138 	if (DMVAR_EXEC(MOVE_EVENT_BASE + 8)) {
   1139 		dm_sessid_t targsid;
   1140 		dm_token_t token, rtoken;
   1141 		char buf[MSG_DATALEN];
   1142 		size_t rlen;
   1143 
   1144 		/* Variation set up */
   1145 		memcpy(buf, MSG_DATA, MSG_DATALEN);
   1146 		if ((rc =
   1147 		     dm_create_session(DM_NO_SESSION, szSessionInfo,
   1148 				       &targsid)) == -1) {
   1149 			/* No clean up */
   1150 		} else
   1151 		    if ((rc =
   1152 			 dm_create_userevent(sid, MSG_DATALEN, buf,
   1153 					     &token)) == -1) {
   1154 			dm_destroy_session(targsid);
   1155 		}
   1156 		if (rc == -1) {
   1157 			DMLOG_PRINT(DMLVL_DEBUG,
   1158 				    "Unable to set up variation! (errno = %d)\n",
   1159 				    errno);
   1160 			DMVAR_SKIP();
   1161 		} else {
   1162 			/* Variation */
   1163 			DMLOG_PRINT(DMLVL_DEBUG, "%s(srcsid == targetsid)\n",
   1164 				    szFuncName);
   1165 			rc = dm_move_event(sid, token, sid, &rtoken);
   1166 			if (rc == 0) {
   1167 				DMLOG_PRINT(DMLVL_DEBUG, "rtoken = %d\n",
   1168 					    rtoken);
   1169 				rc = dm_find_eventmsg(sid, rtoken,
   1170 						      sizeof(dmMsgBuf),
   1171 						      dmMsgBuf, &rlen);
   1172 				if (rc == 0 && rlen > 0) {
   1173 					DMLOG_PRINT(DMLVL_DEBUG,
   1174 						    "%s passed with expected rc = %d\n",
   1175 						    szFuncName, 0);
   1176 					DMVAR_PASS();
   1177 				} else {
   1178 					DMLOG_PRINT(DMLVL_ERR,
   1179 						    "%s failed with expected rc = %d but token %d NOT in src/target session %d\n",
   1180 						    szFuncName, 0, token, sid);
   1181 					DMVAR_FAIL();
   1182 				}
   1183 			} else {
   1184 				DMLOG_PRINT(DMLVL_ERR,
   1185 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   1186 					    szFuncName, rc, errno);
   1187 				DMVAR_FAIL();
   1188 			}
   1189 
   1190 			/* Variation clean up */
   1191 			rc = dm_respond_event(sid, rtoken, DM_RESP_CONTINUE, 0,
   1192 					      0, NULL);
   1193 			rc |= dm_destroy_session(targsid);
   1194 			if (rc == -1) {
   1195 				DMLOG_PRINT(DMLVL_DEBUG,
   1196 					    "Unable to clean up variation! (errno	= %d)\n",
   1197 					    errno);
   1198 			}
   1199 		}
   1200 	}
   1201 
   1202 	/*
   1203 	 * TEST    : dm_move_event - srcsid != targetsid
   1204 	 * EXPECTED: rc = 0
   1205 	 *
   1206 	 * This variation uncovered XFS BUG #35 (ESRCH returned instead of
   1207 	 * EINVAL)
   1208 	 */
   1209 	if (DMVAR_EXEC(MOVE_EVENT_BASE + 9)) {
   1210 		dm_sessid_t targsid;
   1211 		dm_token_t token, rtoken;
   1212 		char buf[MSG_DATALEN];
   1213 		size_t rlen;
   1214 
   1215 		/* Variation set up */
   1216 		memcpy(buf, MSG_DATA, MSG_DATALEN);
   1217 		if ((rc =
   1218 		     dm_create_session(DM_NO_SESSION, szSessionInfo,
   1219 				       &targsid)) == -1) {
   1220 			/* No clean up */
   1221 		} else
   1222 		    if ((rc =
   1223 			 dm_create_userevent(sid, MSG_DATALEN, buf,
   1224 					     &token)) == -1) {
   1225 			dm_destroy_session(targsid);
   1226 		}
   1227 		if (rc == -1) {
   1228 			DMLOG_PRINT(DMLVL_DEBUG,
   1229 				    "Unable to set up variation! (errno = %d)\n",
   1230 				    errno);
   1231 			DMVAR_SKIP();
   1232 		} else {
   1233 			/* Variation */
   1234 			DMLOG_PRINT(DMLVL_DEBUG, "%s(srcsid != targetsid)\n",
   1235 				    szFuncName);
   1236 			rc = dm_move_event(sid, token, targsid, &rtoken);
   1237 			if (rc == 0) {
   1238 				DMLOG_PRINT(DMLVL_DEBUG, "rtoken = %d\n",
   1239 					    rtoken);
   1240 				rc = dm_find_eventmsg(sid, token,
   1241 						      sizeof(dmMsgBuf),
   1242 						      dmMsgBuf, &rlen);
   1243 				if (rc == -1 && errno == EINVAL) {
   1244 					rc = dm_find_eventmsg(targsid, rtoken,
   1245 							      sizeof(dmMsgBuf),
   1246 							      dmMsgBuf, &rlen);
   1247 					if (rc == 0 && rlen > 0) {
   1248 						DMLOG_PRINT(DMLVL_DEBUG,
   1249 							    "%s passed with expected rc = %d\n",
   1250 							    szFuncName, 0);
   1251 						DMVAR_PASS();
   1252 					} else {
   1253 						DMLOG_PRINT(DMLVL_ERR,
   1254 							    "%s failed with expected rc = %d but token %d NOT in target session %d\n",
   1255 							    szFuncName, 0,
   1256 							    token, targsid);
   1257 						DMVAR_FAIL();
   1258 					}
   1259 				} else {
   1260 					DMLOG_PRINT(DMLVL_ERR,
   1261 						    "%s failed with expected rc = %d but token %d still in source session %d\n",
   1262 						    szFuncName, 0, token, sid);
   1263 					DMVAR_FAIL();
   1264 				}
   1265 			} else {
   1266 				DMLOG_PRINT(DMLVL_ERR,
   1267 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   1268 					    szFuncName, rc, errno);
   1269 				DMVAR_FAIL();
   1270 			}
   1271 
   1272 			/* Variation clean up */
   1273 			rc = dm_respond_event(targsid, rtoken, DM_RESP_CONTINUE,
   1274 					      0, 0, NULL);
   1275 			rc |= dm_destroy_session(targsid);
   1276 			if (rc == -1) {
   1277 				DMLOG_PRINT(DMLVL_DEBUG,
   1278 					    "Unable to clean up variation! (errno	= %d)\n",
   1279 					    errno);
   1280 			}
   1281 		}
   1282 	}
   1283 
   1284 	szFuncName = "dm_pending";
   1285 
   1286 	/*
   1287 	 * TEST    : dm_pending - invalid sid
   1288 	 * EXPECTED: rc = -1, errno = EINVAL
   1289 	 */
   1290 	if (DMVAR_EXEC(PENDING_BASE + 1)) {
   1291 		char buf[MSG_DATALEN];
   1292 		dm_token_t token;
   1293 		dm_timestruct_t delay;
   1294 
   1295 		/* Variation set up */
   1296 		memcpy(buf, MSG_DATA, MSG_DATALEN);
   1297 		rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token);
   1298 		if (rc == -1) {
   1299 			DMLOG_PRINT(DMLVL_DEBUG,
   1300 				    "Unable to set up variation! (errno = %d)\n",
   1301 				    errno);
   1302 			DMVAR_SKIP();
   1303 		} else {
   1304 			/* Variation */
   1305 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
   1306 				    szFuncName);
   1307 			rc = dm_pending(INVALID_ADDR, token, &delay);
   1308 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1309 
   1310 			/* Variation clean up */
   1311 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
   1312 					      0, NULL);
   1313 			if (rc == -1) {
   1314 				DMLOG_PRINT(DMLVL_DEBUG,
   1315 					    "Unable to clean up variation! (errno	= %d)\n",
   1316 					    errno);
   1317 			}
   1318 		}
   1319 	}
   1320 
   1321 	/*
   1322 	 * TEST    : dm_pending - DM_NO_SESSION sid
   1323 	 * EXPECTED: rc = -1, errno = EINVAL
   1324 	 */
   1325 	if (DMVAR_EXEC(PENDING_BASE + 2)) {
   1326 		char buf[MSG_DATALEN];
   1327 		dm_token_t token;
   1328 		dm_timestruct_t delay;
   1329 
   1330 		/* Variation set up */
   1331 		memcpy(buf, MSG_DATA, MSG_DATALEN);
   1332 		rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token);
   1333 		if (rc == -1) {
   1334 			DMLOG_PRINT(DMLVL_DEBUG,
   1335 				    "Unable to set up variation! (errno = %d)\n",
   1336 				    errno);
   1337 			DMVAR_SKIP();
   1338 		} else {
   1339 			/* Variation */
   1340 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
   1341 				    szFuncName);
   1342 			rc = dm_pending(DM_NO_SESSION, token, &delay);
   1343 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1344 
   1345 			/* Variation clean up */
   1346 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
   1347 					      0, NULL);
   1348 			if (rc == -1) {
   1349 				DMLOG_PRINT(DMLVL_DEBUG,
   1350 					    "Unable to clean up variation! (errno	= %d)\n",
   1351 					    errno);
   1352 			}
   1353 		}
   1354 	}
   1355 
   1356 	/*
   1357 	 * TEST    : dm_pending - invalid token
   1358 	 * EXPECTED: rc = -1, errno = EINVAL
   1359 	 */
   1360 	if (DMVAR_EXEC(PENDING_BASE + 3)) {
   1361 		dm_timestruct_t delay;
   1362 
   1363 		/* Variation set up */
   1364 
   1365 		/* Variation */
   1366 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n", szFuncName);
   1367 		rc = dm_pending(sid, INVALID_ADDR, &delay);
   1368 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1369 
   1370 		/* Variation clean up */
   1371 	}
   1372 
   1373 	/*
   1374 	 * TEST    : dm_pending - DM_NO_TOKEN token
   1375 	 * EXPECTED: rc = -1, errno = EINVAL
   1376 	 */
   1377 	if (DMVAR_EXEC(PENDING_BASE + 4)) {
   1378 		dm_timestruct_t delay;
   1379 
   1380 		/* Variation set up */
   1381 
   1382 		/* Variation */
   1383 		DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_TOKEN token)\n", szFuncName);
   1384 		rc = dm_pending(sid, DM_NO_TOKEN, &delay);
   1385 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1386 
   1387 		/* Variation clean up */
   1388 	}
   1389 
   1390 	/*
   1391 	 * TEST    : dm_pending - DM_INVALID_TOKEN token
   1392 	 * EXPECTED: rc = -1, errno = EINVAL
   1393 	 */
   1394 	if (DMVAR_EXEC(PENDING_BASE + 5)) {
   1395 		dm_timestruct_t delay;
   1396 
   1397 		/* Variation set up */
   1398 
   1399 		/* Variation */
   1400 		DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_INVALID_TOKEN token)\n",
   1401 			    szFuncName);
   1402 		rc = dm_pending(sid, DM_INVALID_TOKEN, &delay);
   1403 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1404 
   1405 		/* Variation clean up */
   1406 	}
   1407 
   1408 	/*
   1409 	 * TEST    : dm_pending - invalid delay
   1410 	 * EXPECTED: rc = -1, errno = EFAULT
   1411 	 */
   1412 	if (DMVAR_EXEC(PENDING_BASE + 6)) {
   1413 		char buf[MSG_DATALEN];
   1414 		dm_token_t token;
   1415 
   1416 		/* Variation set up */
   1417 		memcpy(buf, MSG_DATA, MSG_DATALEN);
   1418 		rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token);
   1419 		if (rc == -1) {
   1420 			DMLOG_PRINT(DMLVL_DEBUG,
   1421 				    "Unable to set up variation! (errno = %d)\n",
   1422 				    errno);
   1423 			DMVAR_SKIP();
   1424 		} else {
   1425 			/* Variation */
   1426 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
   1427 				    szFuncName);
   1428 			rc = dm_pending(sid, token,
   1429 					(dm_timestruct_t *) INVALID_ADDR);
   1430 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   1431 
   1432 			/* Variation clean up */
   1433 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
   1434 					      0, NULL);
   1435 			if (rc == -1) {
   1436 				DMLOG_PRINT(DMLVL_DEBUG,
   1437 					    "Unable to clean up variation! (errno	= %d)\n",
   1438 					    errno);
   1439 			}
   1440 		}
   1441 	}
   1442 
   1443 	/*
   1444 	 * TEST    : dm_respond_event - invalidated token
   1445 	 * EXPECTED: rc = -1, errno = ESRCH
   1446 	 */
   1447 	if (DMVAR_EXEC(PENDING_BASE + 7)) {
   1448 		char buf[MSG_DATALEN];
   1449 		dm_token_t token;
   1450 		dm_timestruct_t delay;
   1451 
   1452 		/* Variation set up */
   1453 		memcpy(buf, MSG_DATA, MSG_DATALEN);
   1454 		rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token);
   1455 		if (rc != -1) {
   1456 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
   1457 					      sizeof(buf), buf);
   1458 		}
   1459 		if (rc == -1) {
   1460 			DMLOG_PRINT(DMLVL_DEBUG,
   1461 				    "Unable to set up variation! (errno = %d)\n",
   1462 				    errno);
   1463 			DMVAR_SKIP();
   1464 		} else {
   1465 			/* Variation */
   1466 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated token)\n",
   1467 				    szFuncName);
   1468 			rc = dm_pending(sid, token, &delay);
   1469 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, ESRCH);
   1470 
   1471 			/* Variation clean up */
   1472 		}
   1473 	}
   1474 
   1475 	/*
   1476 	 * TEST    : dm_pending - valid
   1477 	 * EXPECTED: rc = 0
   1478 	 */
   1479 	if (DMVAR_EXEC(PENDING_BASE + 8)) {
   1480 		char buf[MSG_DATALEN];
   1481 		dm_token_t token;
   1482 		dm_timestruct_t delay;
   1483 
   1484 		/* Variation set up */
   1485 		memcpy(buf, MSG_DATA, MSG_DATALEN);
   1486 		rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token);
   1487 		if (rc == -1) {
   1488 			DMLOG_PRINT(DMLVL_DEBUG,
   1489 				    "Unable to set up variation! (errno = %d)\n",
   1490 				    errno);
   1491 			DMVAR_SKIP();
   1492 		} else {
   1493 			/* Variation */
   1494 			DMLOG_PRINT(DMLVL_DEBUG, "%s(valid)\n", szFuncName);
   1495 			rc = dm_pending(sid, token, &delay);
   1496 			DMVAR_ENDPASSEXP(szFuncName, 0, rc);
   1497 
   1498 			/* Variation clean up */
   1499 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
   1500 					      0, NULL);
   1501 			if (rc == -1) {
   1502 				DMLOG_PRINT(DMLVL_DEBUG,
   1503 					    "Unable to clean up variation! (errno	= %d)\n",
   1504 					    errno);
   1505 			}
   1506 		}
   1507 	}
   1508 
   1509 	rc = dm_destroy_session(sid);
   1510 	if (rc == -1) {
   1511 		DMLOG_PRINT(DMLVL_ERR,
   1512 			    "dm_destroy_session failed! (rc = %d, errno = %d)\n",
   1513 			    rc, errno);
   1514 	}
   1515 
   1516 	DMLOG_STOP();
   1517 
   1518 	tst_exit();
   1519 }
   1520 
   1521 void *Thread(void *parm)
   1522 {
   1523 	int rc;
   1524 	dm_token_t token;
   1525 	size_t rlen;
   1526 	dm_eventmsg_t *dmMsg;
   1527 	int numMsg;
   1528 
   1529 	EVENT_DELIVERY_DELAY;
   1530 
   1531 	switch ((long)parm) {
   1532 	case GET_EVENTS_BASE + 2:
   1533 		/* Variation */
   1534 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid buflen)\n", szFuncName);
   1535 		rc = dm_get_events(sid, MAX_EVENT, 0, 0, dmMsgBuf, &rlen);
   1536 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, E2BIG);
   1537 
   1538 		/* Variation clean up */
   1539 		rc = dm_get_events(sid, MAX_EVENT, 0, sizeof(dmMsgBuf),
   1540 				   dmMsgBuf, &rlen);
   1541 		if (rc == 0) {
   1542 			token = ((dm_eventmsg_t *) dmMsgBuf)->ev_token;
   1543 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
   1544 					      0, NULL);
   1545 		}
   1546 		if (rc == -1) {
   1547 			DMLOG_PRINT(DMLVL_DEBUG,
   1548 				    "Unable to clean up variation! (errno	= %d)\n",
   1549 				    errno);
   1550 		}
   1551 		break;
   1552 
   1553 	case GET_EVENTS_BASE + 3:
   1554 		/* Variation */
   1555 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid bufp)\n", szFuncName);
   1556 		rc = dm_get_events(sid, MAX_EVENT, 0, sizeof(dmMsgBuf),
   1557 				   (void *)INVALID_ADDR, &rlen);
   1558 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   1559 
   1560 		/* Variation clean up */
   1561 		rc = dm_get_events(sid, MAX_EVENT, 0, sizeof(dmMsgBuf),
   1562 				   dmMsgBuf, &rlen);
   1563 		if (rc == 0) {
   1564 			token = ((dm_eventmsg_t *) dmMsgBuf)->ev_token;
   1565 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
   1566 					      0, NULL);
   1567 		}
   1568 		if (rc == -1) {
   1569 			DMLOG_PRINT(DMLVL_DEBUG,
   1570 				    "Unable to clean up variation! (errno	= %d)\n",
   1571 				    errno);
   1572 		}
   1573 		break;
   1574 
   1575 	case GET_EVENTS_BASE + 4:
   1576 		/* Variation */
   1577 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid rlenp)\n", szFuncName);
   1578 		rc = dm_get_events(sid, MAX_EVENT, 0, sizeof(dmMsgBuf),
   1579 				   dmMsgBuf, (size_t *) INVALID_ADDR);
   1580 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   1581 
   1582 		/* Variation clean up */
   1583 		rc = dm_get_events(sid, MAX_EVENT, 0, sizeof(dmMsgBuf),
   1584 				   dmMsgBuf, &rlen);
   1585 		if (rc == 0) {
   1586 			token = ((dm_eventmsg_t *) dmMsgBuf)->ev_token;
   1587 			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
   1588 					      0, NULL);
   1589 		}
   1590 		if (rc == -1) {
   1591 			DMLOG_PRINT(DMLVL_DEBUG,
   1592 				    "Unable to clean up variation! (errno	= %d)\n",
   1593 				    errno);
   1594 		}
   1595 		break;
   1596 
   1597 	case GET_EVENTS_BASE + 5:
   1598 		/* Variation */
   1599 		DMLOG_PRINT(DMLVL_DEBUG, "%s(!DM_EV_WAIT with no messages)\n",
   1600 			    szFuncName);
   1601 		rc = dm_get_events(sid, MAX_EVENT, 0, sizeof(dmMsgBuf),
   1602 				   dmMsgBuf, &rlen);
   1603 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EAGAIN);
   1604 
   1605 		/* Variation clean up */
   1606 
   1607 		break;
   1608 
   1609 	case GET_EVENTS_BASE + 6:
   1610 	case GET_EVENTS_BASE + 7:
   1611 	case GET_EVENTS_BASE + 8:
   1612 	case GET_EVENTS_BASE + 9:
   1613 		/* Variation */
   1614 		DMLOG_PRINT(DMLVL_DEBUG, "%s(%s with %d message(s))\n",
   1615 			    szFuncName,
   1616 			    (eventsFlags & DM_EV_WAIT) ? "DM_EV_WAIT" :
   1617 			    "!DM_EV_WAIT", expectedNumMsg);
   1618 		do {
   1619 			rlen = 0;
   1620 			rc = dm_get_events(sid, MAX_EVENT, eventsFlags,
   1621 					   sizeof(dmMsgBuf), dmMsgBuf, &rlen);
   1622 		} while ((eventsFlags & DM_EV_WAIT) && (rc == -1)
   1623 			 && (errno == EINTR) && (rlen == 0));
   1624 		if (rc == 0) {
   1625 			LogEventMsgs(dmMsgBuf);
   1626 			numMsg = GetNumEventMsg(dmMsgBuf);
   1627 			dmMsg = GetSyncEventMsg(dmMsgBuf);
   1628 			DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen);
   1629 
   1630 			if (numMsg == expectedNumMsg) {
   1631 				if (dmMsg != NULL) {
   1632 					if (dmMsg->ev_type == DM_EVENT_USER) {
   1633 						DMLOG_PRINT(DMLVL_DEBUG,
   1634 							    "%s passed with expected rc = %d\n",
   1635 							    szFuncName, 0);
   1636 						DMVAR_PASS();
   1637 					} else {
   1638 						DMLOG_PRINT(DMLVL_ERR,
   1639 							    "%s failed with expected rc = %d but unexpected event (%d vs %d)\n",
   1640 							    szFuncName, 0,
   1641 							    dmMsg->ev_type,
   1642 							    DM_EVENT_USER);
   1643 						DMVAR_FAIL();
   1644 					}
   1645 				} else {
   1646 					DMLOG_PRINT(DMLVL_ERR,
   1647 						    "%s failed with expected rc = %d but no synchronous event\n",
   1648 						    szFuncName, 0);
   1649 					DMVAR_FAIL();
   1650 				}
   1651 			} else {
   1652 				DMLOG_PRINT(DMLVL_ERR,
   1653 					    "%s failed with expected rc = %d but unexpected number of events (%d vs %d)\n",
   1654 					    szFuncName, 0, numMsg,
   1655 					    expectedNumMsg);
   1656 				DMVAR_FAIL();
   1657 			}
   1658 		} else {
   1659 			dmMsg = NULL;
   1660 			DMLOG_PRINT(DMLVL_ERR,
   1661 				    "%s failed with unexpected rc = %d (errno = %d)\n",
   1662 				    szFuncName, rc, errno);
   1663 			DMVAR_FAIL();
   1664 		}
   1665 
   1666 		/* Variation clean up */
   1667 		rc = dm_respond_event(sid,
   1668 				      dmMsg ? dmMsg->
   1669 				      ev_token : DM_INVALID_TOKEN,
   1670 				      DM_RESP_CONTINUE, 0, 0, NULL);
   1671 		if (rc == -1) {
   1672 			DMLOG_PRINT(DMLVL_DEBUG,
   1673 				    "Unable to clean up variation! (errno	= %d)\n",
   1674 				    errno);
   1675 		}
   1676 
   1677 		break;
   1678 
   1679 	case GET_EVENTS_BASE + 10:
   1680 		/* Variation */
   1681 		DMLOG_PRINT(DMLVL_DEBUG, "%s(%s with %d messages)\n",
   1682 			    szFuncName,
   1683 			    (eventsFlags & DM_EV_WAIT) ? "DM_EV_WAIT" :
   1684 			    "!DM_EV_WAIT", expectedNumMsg);
   1685 		rc = dm_get_events(sid, MAX_EVENT, 0, sizeof(dmMsgBuf),
   1686 				   dmMsgBuf, &rlen);
   1687 		if (rc == 0) {
   1688 			DMLOG_PRINT(DMLVL_DEBUG, "1st call:\n");
   1689 			LogEventMsgs(dmMsgBuf);
   1690 			numMsg = GetNumEventMsg(dmMsgBuf);
   1691 			DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen);
   1692 			rc = dm_get_events(sid, MAX_EVENT, 0, sizeof(dmMsgBuf),
   1693 					   dmMsgBuf, &rlen);
   1694 			if (rc == 0) {
   1695 				DMLOG_PRINT(DMLVL_DEBUG, "2nd call:\n");
   1696 				DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen);
   1697 				LogEventMsgs(dmMsgBuf);
   1698 				dmMsg = GetSyncEventMsg(dmMsgBuf);
   1699 
   1700 				if (numMsg == expectedNumMsg) {
   1701 					if (dmMsg != NULL) {
   1702 						if (dmMsg->ev_type ==
   1703 						    DM_EVENT_USER) {
   1704 							DMLOG_PRINT(DMLVL_DEBUG,
   1705 								    "%s passed with expected rc = %d\n",
   1706 								    szFuncName,
   1707 								    0);
   1708 							DMVAR_PASS();
   1709 						} else {
   1710 							DMLOG_PRINT(DMLVL_ERR,
   1711 								    "%s failed with expected rc = %d but unexpected event (%d vs %d)\n",
   1712 								    szFuncName,
   1713 								    0,
   1714 								    dmMsg->
   1715 								    ev_type,
   1716 								    DM_EVENT_USER);
   1717 							DMVAR_FAIL();
   1718 						}
   1719 					} else {
   1720 						DMLOG_PRINT(DMLVL_ERR,
   1721 							    "%s failed with expected rc = %d but no synchronous event\n",
   1722 							    szFuncName, 0);
   1723 						DMVAR_FAIL();
   1724 					}
   1725 				} else {
   1726 					DMLOG_PRINT(DMLVL_ERR,
   1727 						    "%s failed with expected rc = %d but unexpected number of events (%d vs %d)\n",
   1728 						    szFuncName, 0, numMsg,
   1729 						    expectedNumMsg);
   1730 					DMVAR_FAIL();
   1731 				}
   1732 			} else {
   1733 				dmMsg = NULL;
   1734 				DMLOG_PRINT(DMLVL_ERR,
   1735 					    "%s 2nd call failed with unexpected rc = %d (errno = %d)\n",
   1736 					    szFuncName, rc, errno);
   1737 				DMVAR_FAIL();
   1738 			}
   1739 		} else {
   1740 			dmMsg = NULL;
   1741 			DMLOG_PRINT(DMLVL_ERR,
   1742 				    "%s 1st call failed with unexpected rc = %d (errno = %d)\n",
   1743 				    szFuncName, rc, errno);
   1744 			DMVAR_FAIL();
   1745 		}
   1746 
   1747 		/* Variation clean up */
   1748 		rc = dm_respond_event(sid,
   1749 				      dmMsg ? dmMsg->
   1750 				      ev_token : DM_INVALID_TOKEN,
   1751 				      DM_RESP_CONTINUE, 0, 0, NULL);
   1752 		if (rc == -1) {
   1753 			DMLOG_PRINT(DMLVL_DEBUG,
   1754 				    "Unable to clean up variation! (errno	= %d)\n",
   1755 				    errno);
   1756 		}
   1757 
   1758 		break;
   1759 
   1760 	case RESPOND_EVENT_BASE + 9:
   1761 		/* Variation */
   1762 		DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_RESP_INVALID)\n", szFuncName);
   1763 		rc = dm_get_events(sid, MAX_EVENT, 0, sizeof(dmMsgBuf),
   1764 				   dmMsgBuf, &rlen);
   1765 		if (rc == 0 && ((dmMsg = GetSyncEventMsg(dmMsgBuf)) != NULL)) {
   1766 			rc = dm_respond_event(sid, dmMsg->ev_token,
   1767 					      DM_RESP_INVALID, 0, 0, NULL);
   1768 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1769 
   1770 			/* Variation clean up */
   1771 			rc = dm_respond_event(sid, dmMsg->ev_token,
   1772 					      DM_RESP_CONTINUE, 0, 0, NULL);
   1773 			if (rc == -1) {
   1774 				DMLOG_PRINT(DMLVL_DEBUG,
   1775 					    "Unable to clean up variation! (errno	= %d)\n",
   1776 					    errno);
   1777 			}
   1778 		} else {
   1779 			DMLOG_PRINT(DMLVL_ERR,
   1780 				    "Unable to obtain synchronous event! (rc = %d, errno = %d)\n",
   1781 				    rc, errno);
   1782 		}
   1783 		break;
   1784 
   1785 	case RESPOND_EVENT_BASE + 10:
   1786 		/* Variation */
   1787 		DMLOG_PRINT(DMLVL_DEBUG,
   1788 			    "%s(DM_RESP_CONTINUE with zero reterror)\n",
   1789 			    szFuncName);
   1790 		rc = dm_get_events(sid, MAX_EVENT, 0, sizeof(dmMsgBuf),
   1791 				   dmMsgBuf, &rlen);
   1792 		if (rc == 0 && ((dmMsg = GetSyncEventMsg(dmMsgBuf)) != NULL)) {
   1793 			rcRespond =
   1794 			    dm_respond_event(sid, dmMsg->ev_token,
   1795 					     DM_RESP_CONTINUE, 0, 0, NULL);
   1796 			errnoRespond = rcRespond == -1 ? errno : 0;
   1797 		} else {
   1798 			DMLOG_PRINT(DMLVL_ERR,
   1799 				    "Unable to obtain synchronous event! (rc = %d, errno = %d)\n",
   1800 				    rc, errno);
   1801 		}
   1802 		break;
   1803 
   1804 	case RESPOND_EVENT_BASE + 11:
   1805 		/* Variation */
   1806 		DMLOG_PRINT(DMLVL_DEBUG,
   1807 			    "%s(DM_RESP_CONTINUE with non-zero reterror)\n",
   1808 			    szFuncName);
   1809 		rc = dm_get_events(sid, MAX_EVENT, 0, sizeof(dmMsgBuf),
   1810 				   dmMsgBuf, &rlen);
   1811 		if (rc == 0 && ((dmMsg = GetSyncEventMsg(dmMsgBuf)) != NULL)) {
   1812 			rc = dm_respond_event(sid, dmMsg->ev_token,
   1813 					      DM_RESP_CONTINUE, ABORT_ERRNO, 0,
   1814 					      NULL);
   1815 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1816 
   1817 			/* Variation clean up */
   1818 			rc = dm_respond_event(sid, dmMsg->ev_token,
   1819 					      DM_RESP_CONTINUE, 0, 0, NULL);
   1820 			if (rc == -1) {
   1821 				DMLOG_PRINT(DMLVL_DEBUG,
   1822 					    "Unable to clean up variation! (errno	= %d)\n",
   1823 					    errno);
   1824 			}
   1825 		} else {
   1826 			DMLOG_PRINT(DMLVL_ERR,
   1827 				    "Unable to obtain synchronous event! (rc = %d, errno = %d)\n",
   1828 				    rc, errno);
   1829 		}
   1830 		break;
   1831 
   1832 	case RESPOND_EVENT_BASE + 12:
   1833 		/* Variation */
   1834 		DMLOG_PRINT(DMLVL_DEBUG,
   1835 			    "%s(DM_RESP_ABORT with zero reterror)\n",
   1836 			    szFuncName);
   1837 		rc = dm_get_events(sid, MAX_EVENT, 0, sizeof(dmMsgBuf),
   1838 				   dmMsgBuf, &rlen);
   1839 		if (rc == 0 && ((dmMsg = GetSyncEventMsg(dmMsgBuf)) != NULL)) {
   1840 			rc = dm_respond_event(sid, dmMsg->ev_token,
   1841 					      DM_RESP_ABORT, 0, 0, NULL);
   1842 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1843 
   1844 			/* Variation clean up */
   1845 			rc = dm_respond_event(sid, dmMsg->ev_token,
   1846 					      DM_RESP_CONTINUE, 0, 0, NULL);
   1847 			if (rc == -1) {
   1848 				DMLOG_PRINT(DMLVL_DEBUG,
   1849 					    "Unable to clean up variation! (errno	= %d)\n",
   1850 					    errno);
   1851 			}
   1852 		} else {
   1853 			DMLOG_PRINT(DMLVL_ERR,
   1854 				    "Unable to obtain synchronous event! (rc = %d, errno = %d)\n",
   1855 				    rc, errno);
   1856 		}
   1857 		break;
   1858 
   1859 	case RESPOND_EVENT_BASE + 13:
   1860 		/* Variation */
   1861 		DMLOG_PRINT(DMLVL_DEBUG,
   1862 			    "%s(DM_RESP_ABORT with non-zero reterror)\n",
   1863 			    szFuncName);
   1864 		rc = dm_get_events(sid, MAX_EVENT, 0, sizeof(dmMsgBuf),
   1865 				   dmMsgBuf, &rlen);
   1866 		if (rc == 0 && ((dmMsg = GetSyncEventMsg(dmMsgBuf)) != NULL)) {
   1867 			rcRespond =
   1868 			    dm_respond_event(sid, dmMsg->ev_token,
   1869 					     DM_RESP_ABORT, ABORT_ERRNO, 0,
   1870 					     NULL);
   1871 			errnoRespond = rcRespond == -1 ? errno : 0;
   1872 		} else {
   1873 			DMLOG_PRINT(DMLVL_ERR,
   1874 				    "Unable to obtain synchronous event! (rc = %d, errno = %d)\n",
   1875 				    rc, errno);
   1876 		}
   1877 		break;
   1878 
   1879 	case RESPOND_EVENT_BASE + 14:
   1880 		/* Variation */
   1881 		DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_RESP_DONTCARE)\n", szFuncName);
   1882 		rc = dm_get_events(sid, MAX_EVENT, 0, sizeof(dmMsgBuf),
   1883 				   dmMsgBuf, &rlen);
   1884 		if (rc == 0 && ((dmMsg = GetSyncEventMsg(dmMsgBuf)) != NULL)) {
   1885 			rc = dm_respond_event(sid, dmMsg->ev_token,
   1886 					      DM_RESP_ABORT, 0, 0, NULL);
   1887 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1888 
   1889 			/* Variation clean up */
   1890 			rc = dm_respond_event(sid, dmMsg->ev_token,
   1891 					      DM_RESP_CONTINUE, 0, 0, NULL);
   1892 			if (rc == -1) {
   1893 				DMLOG_PRINT(DMLVL_DEBUG,
   1894 					    "Unable to clean up variation! (errno	= %d)\n",
   1895 					    errno);
   1896 			}
   1897 		} else {
   1898 			DMLOG_PRINT(DMLVL_ERR,
   1899 				    "Unable to obtain synchronous event! (rc = %d, errno = %d)\n",
   1900 				    rc, errno);
   1901 		}
   1902 		break;
   1903 
   1904 	}
   1905 
   1906 	pthread_exit(0);
   1907 }
   1908