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