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	: attr.c - DMAPI attributes
     21  *
     22  * VARIATIONS	: 204
     23  *
     24  * API'S TESTED	: dm_set_dmattr
     25  * 		  dm_get_dmattr
     26  * 		  dm_remove_dmattr
     27  * 		  dm_getall_dmattr
     28  * 		  dm_set_fileattr
     29  * 		  dm_get_fileattr
     30  * 		  dm_get_dirattrs
     31  * 		  dm_set_inherit
     32  * 		  dm_clear_inherit
     33  * 		  dm_getall_inherit
     34  */
     35 #include <string.h>
     36 #include <stdio.h>
     37 #include <stdlib.h>
     38 #include <errno.h>
     39 #include <unistd.h>
     40 #include <fcntl.h>
     41 #include <sys/stat.h>
     42 #include <sys/xattr.h>
     43 #include "dm_test.h"
     44 
     45 #define TMP_FILELEN 1000
     46 #define ATTR_NAME2 "DMAttr02"
     47 #define NUM_ATTRS 15
     48 #define ATTR_SMALLLEN (DWALIGN(sizeof(dm_stat_t)+1) + DWALIGN(sizeof(DUMMY_FILE)+1))
     49 #define MIN_ENTRYLEN (DWALIGN(sizeof(dm_stat_t)+1) + DWALIGN(sizeof(CURRENT_DIR)+1))
     50 #define DM_AT_ALL_DIRATTRS (DM_AT_DTIME|DM_AT_HANDLE|DM_AT_EMASK|DM_AT_PMANR|DM_AT_PATTR|DM_AT_STAT|DM_AT_CFLAG)
     51 #define NON_DM_ATTR_NAME "user.non-dm.attr"
     52 #define NON_DM_ATTR_VALUE "This is a non-DM attribute's value"
     53 
     54 /*
     55  * DIRENTS_FILES is very implementation-dependent, and is the number of files
     56  * that will just fill up the buffer passed to jfs_get_dirents; NUM_FILES
     57  * should be at least 3 times DIRENTS_FILES; ATTR_LISTLEN needs to be large
     58  * enough to contain 3 files (., .. and dummy.txt) worth of information while
     59  * ATTR_BIGLISTLEN needs to be large enough to contain NUM_FILES files worth
     60  * of information
     61  */
     62 #define DIRENTS_FILES 5
     63 #define NUM_FILES 15
     64 #define ATTR_LISTLEN 1000
     65 #define ATTR_BIGLISTLEN 10000
     66 
     67 char command[4096];
     68 char fullAttrName[32];
     69 dm_sessid_t sid;
     70 dm_size_t maxAttrSize;
     71 dm_size_t persInheritAttr;
     72 
     73 void LogDmStat(dm_stat_t * statdm)
     74 {
     75 
     76 	DMLOG_PRINT(DMLVL_DEBUG, "    dt_dev %d\n", statdm->dt_dev);
     77 	DMLOG_PRINT(DMLVL_DEBUG, "    dt_ino %d\n", statdm->dt_ino);
     78 	DMLOG_PRINT(DMLVL_DEBUG, "    dt_mode 0x%x\n", statdm->dt_mode);
     79 	DMLOG_PRINT(DMLVL_DEBUG, "    dt_nlink %d\n", statdm->dt_nlink);
     80 	DMLOG_PRINT(DMLVL_DEBUG, "    dt_uid %d\n", statdm->dt_uid);
     81 	DMLOG_PRINT(DMLVL_DEBUG, "    dt_gid %d\n", statdm->dt_gid);
     82 	DMLOG_PRINT(DMLVL_DEBUG, "    dt_rdev %d\n", statdm->dt_rdev);
     83 	DMLOG_PRINT(DMLVL_DEBUG, "    dt_size %lld\n", statdm->dt_size);
     84 	DMLOG_PRINT(DMLVL_DEBUG, "    dt_blksize %d\n", statdm->dt_blksize);
     85 	DMLOG_PRINT(DMLVL_DEBUG, "    dt_blocks %d\n", statdm->dt_blocks);
     86 	DMLOG_PRINT(DMLVL_DEBUG, "    dt_atime %d\n", statdm->dt_atime);
     87 	DMLOG_PRINT(DMLVL_DEBUG, "    dt_mtime %d\n", statdm->dt_mtime);
     88 	DMLOG_PRINT(DMLVL_DEBUG, "    dt_ctime %d\n", statdm->dt_ctime);
     89 
     90 }
     91 
     92 void LogDmAttrs(dm_attrlist_t * attrlist)
     93 {
     94 
     95 	int i = 0;
     96 	dm_attrlist_t *attr = attrlist;
     97 
     98 	while (attr != NULL) {
     99 		DMLOG_PRINT(DMLVL_DEBUG, "  dmattr %d: name %.*s, value %.*s\n",
    100 			    i++, DM_ATTR_NAME_SIZE, attr->al_name.an_chars,
    101 			    DM_GET_LEN(attr, al_data), DM_GET_VALUE(attr,
    102 								    al_data,
    103 								    char *));
    104 		attr = DM_STEP_TO_NEXT(attr, dm_attrlist_t *);
    105 	}
    106 }
    107 
    108 void LogDirAttrs(void *attrlist, u_int mask)
    109 {
    110 	int i = 0;
    111 	dm_stat_t *stat = (dm_stat_t *) attrlist;
    112 
    113 	while (stat != NULL) {
    114 		DMLOG_PRINT(DMLVL_DEBUG, "  dirattr %d:\n", i++);
    115 		DMLOG_PRINT(DMLVL_DEBUG, "    dt_compname: %s\n",
    116 			    DM_GET_VALUE(stat, dt_compname, char *));
    117 		if (mask & DM_AT_HANDLE)
    118 			dm_LogHandle(DM_GET_VALUE(stat, dt_handle, void *),
    119 				     DM_GET_LEN(stat, dt_handle));
    120 		if (mask & DM_AT_EMASK)
    121 			DMLOG_PRINT(DMLVL_DEBUG, "    dt_emask: %x\n",
    122 				    stat->dt_emask);
    123 		if (mask & DM_AT_PMANR)
    124 			DMLOG_PRINT(DMLVL_DEBUG, "    dt_pmanreg: %s\n",
    125 				    stat->dt_pmanreg ? "DM_TRUE" : "DM_FALSE");
    126 		if (mask & DM_AT_PATTR)
    127 			DMLOG_PRINT(DMLVL_DEBUG, "    dt_pers: %s\n",
    128 				    stat->dt_pers ? "DM_TRUE" : "DM_FALSE");
    129 		if (mask & DM_AT_DTIME)
    130 			DMLOG_PRINT(DMLVL_DEBUG, "    dt_dtime: %d\n",
    131 				    stat->dt_dtime);
    132 		if (mask & DM_AT_CFLAG)
    133 			DMLOG_PRINT(DMLVL_DEBUG, "    dt_change: %d\n",
    134 				    stat->dt_change);
    135 		if (mask & DM_AT_STAT)
    136 			LogDmStat(stat);
    137 
    138 		stat = DM_STEP_TO_NEXT(stat, dm_stat_t *);
    139 	}
    140 }
    141 
    142 dm_stat_t *GetDirEntry(void *attrlist, char *compname)
    143 {
    144 
    145 	dm_stat_t *stat = (dm_stat_t *) attrlist;
    146 
    147 	while (stat != NULL) {
    148 		if (strcmp(DM_GET_VALUE(stat, dt_compname, char *), compname) ==
    149 		    0)
    150 			return stat;
    151 		stat = DM_STEP_TO_NEXT(stat, dm_stat_t *);
    152 	}
    153 	return NULL;
    154 
    155 }
    156 
    157 dm_stat_t *GetLastDirEntry(void *attrlist)
    158 {
    159 
    160 	dm_stat_t *stat = (dm_stat_t *) attrlist;
    161 	dm_stat_t *laststat = NULL;
    162 
    163 	while (stat != NULL) {
    164 		laststat = stat;
    165 		stat = DM_STEP_TO_NEXT(stat, dm_stat_t *);
    166 	}
    167 	return laststat;
    168 
    169 }
    170 
    171 int GetNumDirEntry(void *attrlist)
    172 {
    173 
    174 	dm_stat_t *stat = (dm_stat_t *) attrlist;
    175 	int i = 0;
    176 
    177 	while (stat != NULL) {
    178 		i++;
    179 		stat = DM_STEP_TO_NEXT(stat, dm_stat_t *);
    180 	}
    181 	return i;
    182 
    183 }
    184 
    185 int main(int argc, char **argv)
    186 {
    187 
    188 	char *szFuncName;
    189 	char *varstr;
    190 	int i;
    191 	int rc;
    192 	char *szSessionInfo = "dm_test session info";
    193 
    194 	DMOPT_PARSE(argc, argv);
    195 	DMLOG_START();
    196 
    197 	/* CANNOT DO ANYTHING WITHOUT SUCCESSFUL INITIALIZATION!!! */
    198 	if ((rc = dm_init_service(&varstr)) != 0) {
    199 		DMLOG_PRINT(DMLVL_ERR,
    200 			    "dm_init_service failed! (rc = %d, errno = %d)\n",
    201 			    rc, errno);
    202 		DM_EXIT();
    203 	} else if ((rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &sid))
    204 		   != 0) {
    205 		DMLOG_PRINT(DMLVL_ERR,
    206 			    "dm_create_session failed! (rc = %d, errno = %d)\n",
    207 			    rc, errno);
    208 		DM_EXIT();
    209 	} else {
    210 		int fd;
    211 		void *fshanp;
    212 		size_t fshlen;
    213 
    214 		fd = open(DUMMY_TMP, O_RDWR | O_CREAT | O_TRUNC,
    215 			  DUMMY_FILE_RW_MODE);
    216 		if (fd != -1) {
    217 			for (i = 0; i < (TMP_FILELEN / DUMMY_STRLEN); i++) {
    218 				if (write(fd, DUMMY_STRING, DUMMY_STRLEN) !=
    219 				    DUMMY_STRLEN) {
    220 					rc = -1;
    221 					break;
    222 				}
    223 			}
    224 		} else {
    225 			rc = -1;
    226 		}
    227 		if (rc == 0) {
    228 			rc = close(fd);
    229 		}
    230 		if (rc == -1) {
    231 			DMLOG_PRINT(DMLVL_ERR,
    232 				    "creating dummy file failed! (rc = %d, errno = %d)\n",
    233 				    rc, errno);
    234 			dm_destroy_session(sid);
    235 			DM_EXIT();
    236 		}
    237 
    238 		rc = dm_path_to_fshandle(DUMMY_TMP, &fshanp, &fshlen);
    239 		if (rc == -1) {
    240 			DMLOG_PRINT(DMLVL_ERR,
    241 				    "dm_path_to_fshandle! (rc = %d, errno = %d)\n",
    242 				    rc, errno);
    243 			dm_destroy_session(sid);
    244 			DM_EXIT();
    245 		}
    246 
    247 		rc = dm_get_config(fshanp, fshlen, DM_CONFIG_MAX_ATTRIBUTE_SIZE,
    248 				   &maxAttrSize);
    249 		if (rc == -1) {
    250 			DMLOG_PRINT(DMLVL_ERR,
    251 				    "dm_get_config failed! (rc = %d, errno = %d)\n",
    252 				    rc, errno);
    253 			dm_handle_free(fshanp, fshlen);
    254 			dm_destroy_session(sid);
    255 			DM_EXIT();
    256 		}
    257 
    258 		rc = dm_get_config(fshanp, fshlen,
    259 				   DM_CONFIG_PERS_INHERIT_ATTRIBS,
    260 				   &persInheritAttr);
    261 		if (rc == -1) {
    262 			DMLOG_PRINT(DMLVL_ERR,
    263 				    "dm_get_config failed! (rc = %d, errno = %d)\n",
    264 				    rc, errno);
    265 			dm_handle_free(fshanp, fshlen);
    266 			dm_destroy_session(sid);
    267 			DM_EXIT();
    268 		}
    269 
    270 		dm_handle_free(fshanp, fshlen);
    271 
    272 		sprintf(fullAttrName, "%s%s", DMAPI_ATTR_PREFIX, ATTR_NAME);
    273 
    274 		/* Clean up any possible leftovers that could get in the way */
    275 		remove(DUMMY_SUBDIR_FILE);
    276 		unlink(DUMMY_SUBDIR_LINK);
    277 		rmdir(DUMMY_SUBDIR_SUBDIR);
    278 		remove(DUMMY_FILE);
    279 		remove(DUMMY_FILE2);
    280 		unlink(DUMMY_LINK);
    281 		rmdir(DUMMY_SUBDIR);
    282 	}
    283 
    284 	DMLOG_PRINT(DMLVL_DEBUG, "Starting DMAPI attribute tests\n");
    285 
    286 	szFuncName = "dm_set_dmattr";
    287 
    288 	/*
    289 	 * TEST    : dm_set_dmattr - invalid sid
    290 	 * EXPECTED: rc = -1, errno = EINVAL
    291 	 */
    292 	if (DMVAR_EXEC(SET_DMATTR_BASE + 1)) {
    293 		int fd;
    294 		void *hanp;
    295 		size_t hlen;
    296 		dm_attrname_t attrname;
    297 		char buf[ATTR_VALUELEN];
    298 
    299 		/* Variation set up */
    300 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
    301 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
    302 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
    303 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
    304 		if ((rc = system(command)) == -1) {
    305 			/* No clean up */
    306 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
    307 			remove(DUMMY_FILE);
    308 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    309 			close(fd);
    310 			remove(DUMMY_FILE);
    311 		}
    312 		if (fd == -1 || rc == -1) {
    313 			DMLOG_PRINT(DMLVL_DEBUG,
    314 				    "Unable to set up variation! (errno = %d)\n",
    315 				    errno);
    316 			DMVAR_SKIP();
    317 		} else {
    318 			/* Variation */
    319 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
    320 				    szFuncName);
    321 			rc = dm_set_dmattr(INVALID_ADDR, hanp, hlen,
    322 					   DM_NO_TOKEN, &attrname, 0,
    323 					   sizeof(buf), buf);
    324 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    325 
    326 			/* Variation clean up */
    327 			rc = close(fd);
    328 			rc |= remove(DUMMY_FILE);
    329 			if (rc == -1) {
    330 				DMLOG_PRINT(DMLVL_DEBUG,
    331 					    "Unable to clean up variation! (errno = %d)\n",
    332 					    errno);
    333 			}
    334 			dm_handle_free(hanp, hlen);
    335 		}
    336 	}
    337 
    338 	/*
    339 	 * TEST    : dm_set_dmattr - invalid hanp
    340 	 * EXPECTED: rc = -1, errno = EFAULT
    341 	 */
    342 	if (DMVAR_EXEC(SET_DMATTR_BASE + 2)) {
    343 		int fd;
    344 		void *hanp;
    345 		size_t hlen;
    346 		dm_attrname_t attrname;
    347 		char buf[ATTR_VALUELEN];
    348 
    349 		/* Variation set up */
    350 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
    351 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
    352 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
    353 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
    354 		if ((rc = system(command)) == -1) {
    355 			/* No clean up */
    356 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
    357 			remove(DUMMY_FILE);
    358 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    359 			close(fd);
    360 			remove(DUMMY_FILE);
    361 		}
    362 		if (fd == -1 || rc == -1) {
    363 			DMLOG_PRINT(DMLVL_DEBUG,
    364 				    "Unable to set up variation! (errno = %d)\n",
    365 				    errno);
    366 			DMVAR_SKIP();
    367 		} else {
    368 			/* Variation */
    369 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
    370 				    szFuncName);
    371 			rc = dm_set_dmattr(sid, (void *)INVALID_ADDR, hlen,
    372 					   DM_NO_TOKEN, &attrname, 0,
    373 					   sizeof(buf), buf);
    374 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
    375 
    376 			/* Variation clean up */
    377 			rc = close(fd);
    378 			rc |= remove(DUMMY_FILE);
    379 			if (rc == -1) {
    380 				DMLOG_PRINT(DMLVL_DEBUG,
    381 					    "Unable to clean up variation! (errno = %d)\n",
    382 					    errno);
    383 			}
    384 			dm_handle_free(hanp, hlen);
    385 		}
    386 	}
    387 
    388 	/*
    389 	 * TEST    : dm_set_dmattr - invalid hlen
    390 	 * EXPECTED: rc = -1, errno = EBADF
    391 	 */
    392 	if (DMVAR_EXEC(SET_DMATTR_BASE + 3)) {
    393 		int fd;
    394 		void *hanp;
    395 		size_t hlen;
    396 		dm_attrname_t attrname;
    397 		char buf[ATTR_VALUELEN];
    398 
    399 		/* Variation set up */
    400 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
    401 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
    402 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
    403 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
    404 		if ((rc = system(command)) == -1) {
    405 			/* No clean up */
    406 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
    407 			remove(DUMMY_FILE);
    408 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    409 			close(fd);
    410 			remove(DUMMY_FILE);
    411 		}
    412 		if (fd == -1 || rc == -1) {
    413 			DMLOG_PRINT(DMLVL_DEBUG,
    414 				    "Unable to set up variation! (errno = %d)\n",
    415 				    errno);
    416 			DMVAR_SKIP();
    417 		} else {
    418 			/* Variation */
    419 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
    420 				    szFuncName);
    421 			rc = dm_set_dmattr(sid, hanp, INVALID_ADDR, DM_NO_TOKEN,
    422 					   &attrname, 0, sizeof(buf), buf);
    423 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
    424 
    425 			/* Variation clean up */
    426 			rc = close(fd);
    427 			rc |= remove(DUMMY_FILE);
    428 			if (rc == -1) {
    429 				DMLOG_PRINT(DMLVL_DEBUG,
    430 					    "Unable to clean up variation! (errno = %d)\n",
    431 					    errno);
    432 			}
    433 			dm_handle_free(hanp, hlen);
    434 		}
    435 	}
    436 
    437 	/*
    438 	 * TEST    : dm_set_dmattr - invalid token
    439 	 * EXPECTED: rc = -1, errno = EINVAL
    440 	 */
    441 	if (DMVAR_EXEC(SET_DMATTR_BASE + 4)) {
    442 		int fd;
    443 		void *hanp;
    444 		size_t hlen;
    445 		dm_attrname_t attrname;
    446 		char buf[ATTR_VALUELEN];
    447 
    448 		/* Variation set up */
    449 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
    450 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
    451 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
    452 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
    453 		if ((rc = system(command)) == -1) {
    454 			/* No clean up */
    455 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
    456 			remove(DUMMY_FILE);
    457 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    458 			close(fd);
    459 			remove(DUMMY_FILE);
    460 		}
    461 		if (fd == -1 || rc == -1) {
    462 			DMLOG_PRINT(DMLVL_DEBUG,
    463 				    "Unable to set up variation! (errno = %d)\n",
    464 				    errno);
    465 			DMVAR_SKIP();
    466 		} else {
    467 			/* Variation */
    468 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
    469 				    szFuncName);
    470 			rc = dm_set_dmattr(sid, hanp, hlen, INVALID_ADDR,
    471 					   &attrname, 0, sizeof(buf), buf);
    472 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    473 
    474 			/* Variation clean up */
    475 			rc = close(fd);
    476 			rc |= remove(DUMMY_FILE);
    477 			if (rc == -1) {
    478 				DMLOG_PRINT(DMLVL_DEBUG,
    479 					    "Unable to clean up variation! (errno = %d)\n",
    480 					    errno);
    481 			}
    482 			dm_handle_free(hanp, hlen);
    483 		}
    484 	}
    485 
    486 	/*
    487 	 * TEST    : dm_set_dmattr - invalid attrnamep
    488 	 * EXPECTED: rc = -1, errno = EFAULT
    489 	 *
    490 	 * This variation uncovered XFS BUG #10 (0 return code from strnlen_user
    491 	 * ignored, which indicated fault)
    492 	 */
    493 	if (DMVAR_EXEC(SET_DMATTR_BASE + 5)) {
    494 		int fd;
    495 		void *hanp;
    496 		size_t hlen;
    497 		dm_attrname_t attrname;
    498 		char buf[ATTR_VALUELEN];
    499 
    500 		/* Variation set up */
    501 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
    502 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
    503 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
    504 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
    505 		if ((rc = system(command)) == -1) {
    506 			/* No clean up */
    507 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
    508 			remove(DUMMY_FILE);
    509 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    510 			close(fd);
    511 			remove(DUMMY_FILE);
    512 		}
    513 		if (fd == -1 || rc == -1) {
    514 			DMLOG_PRINT(DMLVL_DEBUG,
    515 				    "Unable to set up variation! (errno = %d)\n",
    516 				    errno);
    517 			DMVAR_SKIP();
    518 		} else {
    519 			/* Variation */
    520 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid attrnamep)\n",
    521 				    szFuncName);
    522 			rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
    523 					   (dm_attrname_t *) INVALID_ADDR, 0,
    524 					   sizeof(buf), buf);
    525 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
    526 
    527 			/* Variation clean up */
    528 			rc = close(fd);
    529 			rc |= remove(DUMMY_FILE);
    530 			if (rc == -1) {
    531 				DMLOG_PRINT(DMLVL_DEBUG,
    532 					    "Unable to clean up variation! (errno = %d)\n",
    533 					    errno);
    534 			}
    535 			dm_handle_free(hanp, hlen);
    536 		}
    537 	}
    538 
    539 	/*
    540 	 * TEST    : dm_set_dmattr - invalid buflen
    541 	 * EXPECTED: rc = -1, errno = E2BIG
    542 	 */
    543 	if (DMVAR_EXEC(SET_DMATTR_BASE + 6)) {
    544 		int fd;
    545 		void *hanp;
    546 		size_t hlen;
    547 		dm_attrname_t attrname;
    548 		char buf[ATTR_VALUELEN];
    549 
    550 		/* Variation set up */
    551 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
    552 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
    553 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
    554 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
    555 		if ((rc = system(command)) == -1) {
    556 			/* No clean up */
    557 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
    558 			remove(DUMMY_FILE);
    559 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    560 			close(fd);
    561 			remove(DUMMY_FILE);
    562 		}
    563 		if (fd == -1 || rc == -1) {
    564 			DMLOG_PRINT(DMLVL_DEBUG,
    565 				    "Unable to set up variation! (errno = %d)\n",
    566 				    errno);
    567 			DMVAR_SKIP();
    568 		} else {
    569 			/* Variation */
    570 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid buflen)\n",
    571 				    szFuncName);
    572 			rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
    573 					   &attrname, 0, INVALID_ADDR, buf);
    574 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, E2BIG);
    575 
    576 			/* Variation clean up */
    577 			rc = close(fd);
    578 			rc |= remove(DUMMY_FILE);
    579 			if (rc == -1) {
    580 				DMLOG_PRINT(DMLVL_DEBUG,
    581 					    "Unable to clean up variation! (errno = %d)\n",
    582 					    errno);
    583 			}
    584 			dm_handle_free(hanp, hlen);
    585 		}
    586 	}
    587 
    588 	/*
    589 	 * TEST    : dm_set_dmattr - invalid bufp
    590 	 * EXPECTED: rc = -1, errno = EFAULT
    591 	 */
    592 	if (DMVAR_EXEC(SET_DMATTR_BASE + 7)) {
    593 		int fd;
    594 		void *hanp;
    595 		size_t hlen;
    596 		dm_attrname_t attrname;
    597 		char buf[ATTR_VALUELEN];
    598 
    599 		/* Variation set up */
    600 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
    601 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
    602 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
    603 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
    604 		if ((rc = system(command)) == -1) {
    605 			/* No clean up */
    606 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
    607 			remove(DUMMY_FILE);
    608 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    609 			close(fd);
    610 			remove(DUMMY_FILE);
    611 		}
    612 		if (fd == -1 || rc == -1) {
    613 			DMLOG_PRINT(DMLVL_DEBUG,
    614 				    "Unable to set up variation! (errno = %d)\n",
    615 				    errno);
    616 			DMVAR_SKIP();
    617 		} else {
    618 			/* Variation */
    619 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid bufp)\n",
    620 				    szFuncName);
    621 			rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
    622 					   &attrname, 0, sizeof(buf),
    623 					   (void *)INVALID_ADDR);
    624 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
    625 
    626 			/* Variation clean up */
    627 			rc = close(fd);
    628 			rc |= remove(DUMMY_FILE);
    629 			if (rc == -1) {
    630 				DMLOG_PRINT(DMLVL_DEBUG,
    631 					    "Unable to clean up variation! (errno = %d)\n",
    632 					    errno);
    633 			}
    634 			dm_handle_free(hanp, hlen);
    635 		}
    636 	}
    637 
    638 	/*
    639 	 * TEST    : dm_set_dmattr - empty attrname
    640 	 * EXPECTED: rc = -1, errno = EINVAL
    641 	 */
    642 	if (DMVAR_EXEC(SET_DMATTR_BASE + 8)) {
    643 		int fd;
    644 		void *hanp;
    645 		size_t hlen;
    646 		dm_attrname_t attrname;
    647 		char buf[ATTR_VALUELEN];
    648 
    649 		/* Variation set up */
    650 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
    651 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
    652 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
    653 		if ((rc = system(command)) == -1) {
    654 			/* No clean up */
    655 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
    656 			remove(DUMMY_FILE);
    657 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    658 			close(fd);
    659 			remove(DUMMY_FILE);
    660 		}
    661 		if (fd == -1 || rc == -1) {
    662 			DMLOG_PRINT(DMLVL_DEBUG,
    663 				    "Unable to set up variation! (errno = %d)\n",
    664 				    errno);
    665 			DMVAR_SKIP();
    666 		} else {
    667 			/* Variation */
    668 			DMLOG_PRINT(DMLVL_DEBUG, "%s(empty attrname)\n",
    669 				    szFuncName);
    670 			rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
    671 					   &attrname, 0, sizeof(buf), buf);
    672 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    673 
    674 			/* Variation clean up */
    675 			rc = close(fd);
    676 			rc |= remove(DUMMY_FILE);
    677 			if (rc == -1) {
    678 				DMLOG_PRINT(DMLVL_DEBUG,
    679 					    "Unable to clean up variation! (errno = %d)\n",
    680 					    errno);
    681 			}
    682 			dm_handle_free(hanp, hlen);
    683 		}
    684 	}
    685 
    686 	/*
    687 	 * TEST    : dm_set_dmattr - zero buflen
    688 	 * EXPECTED: rc = 0
    689 	 */
    690 	if (DMVAR_EXEC(SET_DMATTR_BASE + 9)) {
    691 		int fd;
    692 		void *hanp;
    693 		size_t hlen;
    694 		dm_attrname_t attrname;
    695 		char buf[ATTR_VALUELEN], value[ATTR_VALUELEN];
    696 
    697 		/* Variation set up */
    698 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
    699 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
    700 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
    701 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
    702 		if ((rc = system(command)) == -1) {
    703 			/* No clean up */
    704 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
    705 			remove(DUMMY_FILE);
    706 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    707 			close(fd);
    708 			remove(DUMMY_FILE);
    709 		}
    710 		if (fd == -1 || rc == -1) {
    711 			DMLOG_PRINT(DMLVL_DEBUG,
    712 				    "Unable to set up variation! (errno = %d)\n",
    713 				    errno);
    714 			DMVAR_SKIP();
    715 		} else {
    716 			/* Variation */
    717 			DMLOG_PRINT(DMLVL_DEBUG, "%s(zero buflen)\n",
    718 				    szFuncName);
    719 			rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
    720 					   &attrname, 0, 0, NULL);
    721 			if (rc == 0) {
    722 				if ((rc =
    723 				     getxattr(DUMMY_FILE, fullAttrName, value,
    724 					      sizeof(value))) == 0) {
    725 					DMLOG_PRINT(DMLVL_DEBUG,
    726 						    "%s passed with expected rc = %d\n",
    727 						    szFuncName, 0);
    728 					DMVAR_PASS();
    729 				} else {
    730 					DMLOG_PRINT(DMLVL_ERR,
    731 						    "%s failed with expected rc = %d but unexpected attribute length (%d vs %d)\n",
    732 						    szFuncName, 0, 0, rc);
    733 					DMVAR_FAIL();
    734 				}
    735 			} else {
    736 				DMLOG_PRINT(DMLVL_ERR,
    737 					    "%s failed with unexpected rc = %d (errno = %d)\n",
    738 					    szFuncName, rc, errno);
    739 				DMVAR_FAIL();
    740 			}
    741 
    742 			/* Variation clean up */
    743 			rc = close(fd);
    744 			rc |= remove(DUMMY_FILE);
    745 			if (rc == -1) {
    746 				DMLOG_PRINT(DMLVL_DEBUG,
    747 					    "Unable to clean up variation! (errno = %d)\n",
    748 					    errno);
    749 			}
    750 			dm_handle_free(hanp, hlen);
    751 		}
    752 	}
    753 
    754 	/*
    755 	 * TEST    : dm_set_dmattr - maximum buflen
    756 	 * EXPECTED: rc = 0
    757 	 */
    758 	if (DMVAR_EXEC(SET_DMATTR_BASE + 10)) {
    759 		int fd;
    760 		void *hanp;
    761 		size_t hlen;
    762 		dm_attrname_t attrname;
    763 		char *buf, *value;
    764 
    765 		/* Variation set up */
    766 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
    767 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
    768 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
    769 		if ((buf = malloc(maxAttrSize)) == NULL) {
    770 			/* No clean up */
    771 		} else if ((memset(buf, '1', maxAttrSize) == NULL) ||
    772 			   ((value = malloc(maxAttrSize)) == NULL)) {
    773 			free(buf);
    774 		} else if ((memset(value, 0, maxAttrSize) == NULL) ||
    775 			   ((rc = system(command)) == -1)) {
    776 			free(value);
    777 			free(buf);
    778 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
    779 			remove(DUMMY_FILE);
    780 			free(value);
    781 			free(buf);
    782 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    783 			close(fd);
    784 			remove(DUMMY_FILE);
    785 			free(value);
    786 			free(buf);
    787 		}
    788 		if (fd == -1 || rc == -1 || buf == NULL || value == NULL) {
    789 			DMLOG_PRINT(DMLVL_DEBUG,
    790 				    "Unable to set up variation! (errno = %d)\n",
    791 				    errno);
    792 			DMVAR_SKIP();
    793 		} else {
    794 			/* Variation */
    795 			DMLOG_PRINT(DMLVL_DEBUG, "%s(max buflen)\n",
    796 				    szFuncName);
    797 			rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
    798 					   &attrname, 0, maxAttrSize, buf);
    799 			if (rc == 0) {
    800 				if ((rc =
    801 				     getxattr(DUMMY_FILE, fullAttrName, value,
    802 					      maxAttrSize)) == maxAttrSize) {
    803 					if (memcmp(buf, value, maxAttrSize) ==
    804 					    0) {
    805 						DMLOG_PRINT(DMLVL_DEBUG,
    806 							    "%s passed with expected rc = %d\n",
    807 							    szFuncName, 0);
    808 						DMVAR_PASS();
    809 					} else {
    810 						DMLOG_PRINT(DMLVL_ERR,
    811 							    "%s failed with expected rc = %d but unexpected attribute value (%s vs %s)\n",
    812 							    szFuncName, 0, buf,
    813 							    value);
    814 						DMVAR_FAIL();
    815 					}
    816 				} else {
    817 					DMLOG_PRINT(DMLVL_ERR,
    818 						    "%s failed with expected rc = %d but unexpected attribute length (%d vs %d)\n",
    819 						    szFuncName, 0, maxAttrSize,
    820 						    rc);
    821 					DMVAR_FAIL();
    822 				}
    823 			} else {
    824 				DMLOG_PRINT(DMLVL_ERR,
    825 					    "%s failed with unexpected rc = %d (errno = %d)\n",
    826 					    szFuncName, rc, errno);
    827 				DMVAR_FAIL();
    828 			}
    829 
    830 			/* Variation clean up */
    831 			rc = close(fd);
    832 			rc |= remove(DUMMY_FILE);
    833 			if (rc == -1) {
    834 				DMLOG_PRINT(DMLVL_DEBUG,
    835 					    "Unable to clean up variation! (errno = %d)\n",
    836 					    errno);
    837 			}
    838 			free(buf);
    839 			free(value);
    840 			dm_handle_free(hanp, hlen);
    841 		}
    842 	}
    843 
    844 	/*
    845 	 * TEST    : dm_set_dmattr - buflen too big
    846 	 * EXPECTED: rc = -1, errno = E2BIG
    847 	 */
    848 	if (DMVAR_EXEC(SET_DMATTR_BASE + 11)) {
    849 		int fd;
    850 		void *hanp;
    851 		size_t hlen;
    852 		dm_attrname_t attrname;
    853 		char *buf;
    854 
    855 		/* Variation set up */
    856 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
    857 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
    858 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
    859 		if ((buf = malloc(maxAttrSize + 1)) == NULL) {
    860 			/* No clean up */
    861 		} else if ((memset(buf, '2', maxAttrSize + 1) == NULL) ||
    862 			   ((rc = system(command)) == -1)) {
    863 			free(buf);
    864 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
    865 			remove(DUMMY_FILE);
    866 			free(buf);
    867 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    868 			close(fd);
    869 			remove(DUMMY_FILE);
    870 			free(buf);
    871 		}
    872 		if (fd == -1 || rc == -1 || buf == NULL) {
    873 			DMLOG_PRINT(DMLVL_DEBUG,
    874 				    "Unable to set up variation! (errno = %d)\n",
    875 				    errno);
    876 			DMVAR_SKIP();
    877 		} else {
    878 			/* Variation */
    879 			DMLOG_PRINT(DMLVL_DEBUG, "%s(buflen too big)\n",
    880 				    szFuncName);
    881 			rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
    882 					   &attrname, 0, maxAttrSize + 1, buf);
    883 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, E2BIG);
    884 
    885 			/* Variation clean up */
    886 			rc = close(fd);
    887 			rc |= remove(DUMMY_FILE);
    888 			if (rc == -1) {
    889 				DMLOG_PRINT(DMLVL_DEBUG,
    890 					    "Unable to clean up variation! (errno = %d)\n",
    891 					    errno);
    892 			}
    893 			free(buf);
    894 			dm_handle_free(hanp, hlen);
    895 		}
    896 	}
    897 
    898 	/*
    899 	 * TEST    : dm_set_dmattr - one file attribute, setdtime zero
    900 	 * EXPECTED: rc = 0
    901 	 */
    902 	if (DMVAR_EXEC(SET_DMATTR_BASE + 12)) {
    903 		int fd;
    904 		int rc2;
    905 		void *hanp;
    906 		size_t hlen;
    907 		dm_attrname_t attrname;
    908 		char buf[ATTR_VALUELEN];
    909 		struct stat statfs1, statfs2;
    910 
    911 		/* Variation set up */
    912 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
    913 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
    914 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
    915 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
    916 		if ((rc = system(command)) == -1) {
    917 			/* No clean up */
    918 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
    919 			remove(DUMMY_FILE);
    920 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    921 			close(fd);
    922 			remove(DUMMY_FILE);
    923 		}
    924 		if (fd == -1 || rc == -1) {
    925 			DMLOG_PRINT(DMLVL_DEBUG,
    926 				    "Unable to set up variation! (errno = %d)\n",
    927 				    errno);
    928 			DMVAR_SKIP();
    929 		} else {
    930 			/* Variation */
    931 			rc2 = stat(DUMMY_FILE, &statfs1);
    932 			TIMESTAMP_DELAY;
    933 			DMLOG_PRINT(DMLVL_DEBUG,
    934 				    "%s(one file attr, setdtime zero)\n",
    935 				    szFuncName);
    936 			rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
    937 					   &attrname, 0, sizeof(buf), buf);
    938 			rc2 |= stat(DUMMY_FILE, &statfs2);
    939 			if (rc == 0) {
    940 				if ((rc2 == 0)
    941 				    && (statfs1.st_ctime == statfs2.st_ctime)) {
    942 					DMLOG_PRINT(DMLVL_DEBUG,
    943 						    "%s passed with expected rc = %d and dtime unmodified\n",
    944 						    szFuncName, 0);
    945 					DMVAR_PASS();
    946 				} else {
    947 					DMLOG_PRINT(DMLVL_ERR,
    948 						    "%s failed with expected rc = %d but dtime modified (%d vs %d)\n",
    949 						    szFuncName, 0,
    950 						    statfs1.st_ctime,
    951 						    statfs2.st_ctime);
    952 					DMVAR_FAIL();
    953 				}
    954 			} else {
    955 				DMLOG_PRINT(DMLVL_ERR,
    956 					    "%s failed with unexpected rc = %d (errno = %d)\n",
    957 					    szFuncName, rc, errno);
    958 				DMVAR_FAIL();
    959 			}
    960 
    961 			/* Variation clean up */
    962 			rc = close(fd);
    963 			rc |= remove(DUMMY_FILE);
    964 			if (rc == -1) {
    965 				DMLOG_PRINT(DMLVL_DEBUG,
    966 					    "Unable to clean up variation! (errno = %d)\n",
    967 					    errno);
    968 			}
    969 			dm_handle_free(hanp, hlen);
    970 		}
    971 	}
    972 
    973 	/*
    974 	 * TEST    : dm_set_dmattr - one file attribute, setdtime non-zero
    975 	 * EXPECTED: rc = 0
    976 	 */
    977 	if (DMVAR_EXEC(SET_DMATTR_BASE + 13)) {
    978 		int fd;
    979 		int rc2;
    980 		void *hanp;
    981 		size_t hlen;
    982 		dm_attrname_t attrname;
    983 		char buf[ATTR_VALUELEN];
    984 		struct stat statfs1, statfs2;
    985 
    986 		/* Variation set up */
    987 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
    988 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
    989 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
    990 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
    991 		if ((rc = system(command)) == -1) {
    992 			/* No clean up */
    993 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
    994 			remove(DUMMY_FILE);
    995 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    996 			close(fd);
    997 			remove(DUMMY_FILE);
    998 		}
    999 		if (fd == -1 || rc == -1) {
   1000 			DMLOG_PRINT(DMLVL_DEBUG,
   1001 				    "Unable to set up variation! (errno = %d)\n",
   1002 				    errno);
   1003 			DMVAR_SKIP();
   1004 		} else {
   1005 			/* Variation */
   1006 			rc2 = stat(DUMMY_FILE, &statfs1);
   1007 			TIMESTAMP_DELAY;
   1008 			DMLOG_PRINT(DMLVL_DEBUG,
   1009 				    "%s(one file attr, setdtime non-zero)\n",
   1010 				    szFuncName);
   1011 			rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   1012 					   &attrname, 1, sizeof(buf), buf);
   1013 			rc2 |= stat(DUMMY_FILE, &statfs2);
   1014 			if (rc == 0) {
   1015 				if ((rc2 == 0)
   1016 				    && (statfs1.st_ctime != statfs2.st_ctime)) {
   1017 					DMLOG_PRINT(DMLVL_DEBUG,
   1018 						    "%s passed with expected rc = %d and dtime modified\n",
   1019 						    szFuncName, 0);
   1020 					DMVAR_PASS();
   1021 				} else {
   1022 					DMLOG_PRINT(DMLVL_ERR,
   1023 						    "%s failed with expected rc = %d but dtime unmodified (%d vs %d)\n",
   1024 						    szFuncName, 0,
   1025 						    statfs1.st_ctime,
   1026 						    statfs2.st_ctime);
   1027 					DMVAR_FAIL();
   1028 				}
   1029 			} else {
   1030 				DMLOG_PRINT(DMLVL_ERR,
   1031 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   1032 					    szFuncName, rc, errno);
   1033 				DMVAR_FAIL();
   1034 			}
   1035 
   1036 			/* Variation clean up */
   1037 			rc = close(fd);
   1038 			rc |= remove(DUMMY_FILE);
   1039 			if (rc == -1) {
   1040 				DMLOG_PRINT(DMLVL_DEBUG,
   1041 					    "Unable to clean up variation! (errno = %d)\n",
   1042 					    errno);
   1043 			}
   1044 			dm_handle_free(hanp, hlen);
   1045 		}
   1046 	}
   1047 
   1048 	/*
   1049 	 * TEST    : dm_set_dmattr - two file attributes
   1050 	 * EXPECTED: rc = 0
   1051 	 */
   1052 	if (DMVAR_EXEC(SET_DMATTR_BASE + 14)) {
   1053 		int fd;
   1054 		void *hanp;
   1055 		size_t hlen;
   1056 		dm_attrname_t attrname;
   1057 		char buf[ATTR_VALUELEN];
   1058 		int buf2 = INVALID_ADDR;
   1059 
   1060 		/* Variation set up */
   1061 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1062 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   1063 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1064 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   1065 		if ((rc = system(command)) == -1) {
   1066 			/* No clean up */
   1067 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   1068 			remove(DUMMY_FILE);
   1069 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   1070 			close(fd);
   1071 			remove(DUMMY_FILE);
   1072 		}
   1073 		if (fd == -1 || rc == -1) {
   1074 			DMLOG_PRINT(DMLVL_DEBUG,
   1075 				    "Unable to set up variation! (errno = %d)\n",
   1076 				    errno);
   1077 			DMVAR_SKIP();
   1078 		} else {
   1079 			/* Variation */
   1080 			DMLOG_PRINT(DMLVL_DEBUG, "%s(two file attr)\n",
   1081 				    szFuncName);
   1082 			rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   1083 					   &attrname, 0, sizeof(buf), buf);
   1084 			if (rc == 0) {
   1085 				memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1086 				memcpy(attrname.an_chars, ATTR_NAME2,
   1087 				       DM_ATTR_NAME_SIZE);
   1088 				rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   1089 						   &attrname, 0, sizeof(buf2),
   1090 						   (void *)&buf2);
   1091 			}
   1092 			DMVAR_ENDPASSEXP(szFuncName, 0, rc);
   1093 
   1094 			/* Variation clean up */
   1095 			rc = close(fd);
   1096 			rc |= remove(DUMMY_FILE);
   1097 			if (rc == -1) {
   1098 				DMLOG_PRINT(DMLVL_DEBUG,
   1099 					    "Unable to clean up variation! (errno = %d)\n",
   1100 					    errno);
   1101 			}
   1102 			dm_handle_free(hanp, hlen);
   1103 		}
   1104 	}
   1105 
   1106 	/*
   1107 	 * TEST    : dm_set_dmattr - multiple file attributes
   1108 	 * EXPECTED: rc = 0
   1109 	 */
   1110 	if (DMVAR_EXEC(SET_DMATTR_BASE + 15)) {
   1111 		int fd;
   1112 		void *hanp;
   1113 		size_t hlen;
   1114 		dm_attrname_t attrname;
   1115 		char buf[ATTR_VALUELEN];
   1116 
   1117 		/* Variation set up */
   1118 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1119 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   1120 		if ((rc = system(command)) == -1) {
   1121 			/* No clean up */
   1122 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   1123 			remove(DUMMY_FILE);
   1124 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   1125 			close(fd);
   1126 			remove(DUMMY_FILE);
   1127 		}
   1128 		if (fd == -1 || rc == -1) {
   1129 			DMLOG_PRINT(DMLVL_DEBUG,
   1130 				    "Unable to set up variation! (errno = %d)\n",
   1131 				    errno);
   1132 			DMVAR_SKIP();
   1133 		} else {
   1134 			/* Variation */
   1135 			DMLOG_PRINT(DMLVL_DEBUG, "%s(multiple file attr)\n",
   1136 				    szFuncName);
   1137 			for (i = 1; (i <= NUM_ATTRS) && (rc == 0); i++) {
   1138 				memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1139 				memcpy(attrname.an_chars, ATTR_NAME,
   1140 				       DM_ATTR_NAME_SIZE);
   1141 				attrname.an_chars[DM_ATTR_NAME_SIZE - 2] =
   1142 				    '0' + (i / 10);
   1143 				attrname.an_chars[DM_ATTR_NAME_SIZE - 1] =
   1144 				    '0' + (i % 10);
   1145 				DMLOG_PRINT(DMLVL_DEBUG, "%s(%.*s)\n",
   1146 					    szFuncName, DM_ATTR_NAME_SIZE,
   1147 					    attrname.an_chars);
   1148 				rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   1149 						   &attrname, 0, sizeof(buf),
   1150 						   buf);
   1151 			}
   1152 			DMVAR_ENDPASSEXP(szFuncName, 0, rc);
   1153 
   1154 			/* Variation clean up */
   1155 			rc = close(fd);
   1156 			rc |= remove(DUMMY_FILE);
   1157 			if (rc == -1) {
   1158 				DMLOG_PRINT(DMLVL_DEBUG,
   1159 					    "Unable to clean up variation! (errno = %d)\n",
   1160 					    errno);
   1161 			}
   1162 			dm_handle_free(hanp, hlen);
   1163 		}
   1164 	}
   1165 
   1166 	/*
   1167 	 * TEST    : dm_set_dmattr - replace file attribute
   1168 	 * EXPECTED: rc = 0
   1169 	 */
   1170 	if (DMVAR_EXEC(SET_DMATTR_BASE + 16)) {
   1171 		int fd;
   1172 		void *hanp;
   1173 		size_t hlen;
   1174 		dm_attrname_t attrname;
   1175 		char buf[ATTR_VALUELEN], value[ATTR_VALUELEN];
   1176 
   1177 		/* Variation set up */
   1178 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1179 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   1180 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1181 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   1182 		if ((rc = system(command)) == -1) {
   1183 			/* No clean up */
   1184 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   1185 			remove(DUMMY_FILE);
   1186 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   1187 			close(fd);
   1188 			remove(DUMMY_FILE);
   1189 		} else
   1190 		    if (((rc =
   1191 			  dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   1192 					0, sizeof(attrname), &attrname)) == -1)
   1193 			||
   1194 			((rc =
   1195 			  (getxattr
   1196 			   (DUMMY_FILE, fullAttrName, value,
   1197 			    sizeof(value)) == sizeof(attrname)) ? 0 : -1) == -1)
   1198 			||
   1199 			((rc =
   1200 			  (memcmp(&attrname, value, sizeof(attrname)) ==
   1201 			   0) ? 0 : -1) == -1)) {
   1202 			dm_handle_free(hanp, hlen);
   1203 			close(fd);
   1204 			remove(DUMMY_FILE);
   1205 		}
   1206 		if (fd == -1 || rc == -1) {
   1207 			DMLOG_PRINT(DMLVL_DEBUG,
   1208 				    "Unable to set up variation! (errno = %d)\n",
   1209 				    errno);
   1210 			DMVAR_SKIP();
   1211 		} else {
   1212 			/* Variation */
   1213 			DMLOG_PRINT(DMLVL_DEBUG, "%s(replace file attr)\n",
   1214 				    szFuncName);
   1215 			rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   1216 					   &attrname, 0, sizeof(buf), buf);
   1217 			if (rc == 0) {
   1218 				if ((rc =
   1219 				     getxattr(DUMMY_FILE, fullAttrName, value,
   1220 					      sizeof(value))) ==
   1221 				    ATTR_VALUELEN) {
   1222 					if (memcmp(buf, value, sizeof(buf)) ==
   1223 					    0) {
   1224 						DMLOG_PRINT(DMLVL_DEBUG,
   1225 							    "%s passed with expected rc = %d\n",
   1226 							    szFuncName, 0);
   1227 						DMVAR_PASS();
   1228 					} else {
   1229 						DMLOG_PRINT(DMLVL_ERR,
   1230 							    "%s failed with expected rc = %d but unexpected attribute value (%s vs %s)\n",
   1231 							    szFuncName, 0, buf,
   1232 							    value);
   1233 						DMVAR_FAIL();
   1234 					}
   1235 				} else {
   1236 					DMLOG_PRINT(DMLVL_ERR,
   1237 						    "%s failed with expected rc = %d but unexpected attribute length (%d vs %d)\n",
   1238 						    szFuncName, 0,
   1239 						    ATTR_VALUELEN, rc);
   1240 					DMVAR_FAIL();
   1241 				}
   1242 			} else {
   1243 				DMLOG_PRINT(DMLVL_ERR,
   1244 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   1245 					    szFuncName, rc, errno);
   1246 				DMVAR_FAIL();
   1247 			}
   1248 
   1249 			/* Variation clean up */
   1250 			rc = close(fd);
   1251 			rc |= remove(DUMMY_FILE);
   1252 			if (rc == -1) {
   1253 				DMLOG_PRINT(DMLVL_DEBUG,
   1254 					    "Unable to clean up variation! (errno = %d)\n",
   1255 					    errno);
   1256 			}
   1257 			dm_handle_free(hanp, hlen);
   1258 		}
   1259 	}
   1260 
   1261 	/*
   1262 	 * TEST    : dm_set_dmattr - one directory attribute, setdtime zero
   1263 	 * EXPECTED: rc = 0
   1264 	 */
   1265 	if (DMVAR_EXEC(SET_DMATTR_BASE + 17)) {
   1266 		int rc2;
   1267 		void *hanp;
   1268 		size_t hlen;
   1269 		dm_attrname_t attrname;
   1270 		char buf[ATTR_VALUELEN];
   1271 		struct stat statfs1, statfs2;
   1272 
   1273 		/* Variation set up */
   1274 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1275 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   1276 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1277 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   1278 			/* No clean up */
   1279 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   1280 			   == -1) {
   1281 			rmdir(DUMMY_SUBDIR);
   1282 		}
   1283 		if (rc == -1) {
   1284 			DMLOG_PRINT(DMLVL_DEBUG,
   1285 				    "Unable to set up variation! (errno = %d)\n",
   1286 				    errno);
   1287 			rmdir(DUMMY_SUBDIR);
   1288 			DMVAR_SKIP();
   1289 		} else {
   1290 			/* Variation */
   1291 			rc2 = stat(DUMMY_SUBDIR, &statfs1);
   1292 			TIMESTAMP_DELAY;
   1293 			DMLOG_PRINT(DMLVL_DEBUG,
   1294 				    "%s(one dir attr, setdtime zero)\n",
   1295 				    szFuncName);
   1296 			rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   1297 					   &attrname, 0, sizeof(buf), buf);
   1298 			rc2 |= stat(DUMMY_SUBDIR, &statfs2);
   1299 			if (rc == 0) {
   1300 				if ((rc2 == 0)
   1301 				    && (statfs1.st_ctime == statfs2.st_ctime)) {
   1302 					DMLOG_PRINT(DMLVL_DEBUG,
   1303 						    "%s passed with expected rc = %d and dtime unmodified\n",
   1304 						    szFuncName, 0);
   1305 					DMVAR_PASS();
   1306 				} else {
   1307 					DMLOG_PRINT(DMLVL_ERR,
   1308 						    "%s failed with expected rc = %d but dtime modified (%d vs %d)\n",
   1309 						    szFuncName, 0,
   1310 						    statfs1.st_ctime,
   1311 						    statfs2.st_ctime);
   1312 					DMVAR_FAIL();
   1313 				}
   1314 			} else {
   1315 				DMLOG_PRINT(DMLVL_ERR,
   1316 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   1317 					    szFuncName, rc, errno);
   1318 				DMVAR_FAIL();
   1319 			}
   1320 
   1321 			/* Variation clean up */
   1322 			rc = rmdir(DUMMY_SUBDIR);
   1323 			if (rc == -1) {
   1324 				DMLOG_PRINT(DMLVL_DEBUG,
   1325 					    "Unable to clean up variation! (errno = %d)\n",
   1326 					    errno);
   1327 			}
   1328 			dm_handle_free(hanp, hlen);
   1329 		}
   1330 	}
   1331 
   1332 	/*
   1333 	 * TEST    : dm_set_dmattr - one directory attribute, setdtime non-zero
   1334 	 * EXPECTED: rc = 0
   1335 	 */
   1336 	if (DMVAR_EXEC(SET_DMATTR_BASE + 18)) {
   1337 		int rc2;
   1338 		void *hanp;
   1339 		size_t hlen;
   1340 		dm_attrname_t attrname;
   1341 		char buf[ATTR_VALUELEN];
   1342 		struct stat statfs1, statfs2;
   1343 
   1344 		/* Variation set up */
   1345 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1346 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   1347 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1348 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   1349 			/* No clean up */
   1350 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   1351 			   == -1) {
   1352 			rmdir(DUMMY_SUBDIR);
   1353 		}
   1354 		if (rc == -1) {
   1355 			DMLOG_PRINT(DMLVL_DEBUG,
   1356 				    "Unable to set up variation! (errno = %d)\n",
   1357 				    errno);
   1358 			rmdir(DUMMY_SUBDIR);
   1359 			DMVAR_SKIP();
   1360 		} else {
   1361 			/* Variation */
   1362 			rc2 = stat(DUMMY_SUBDIR, &statfs1);
   1363 			TIMESTAMP_DELAY;
   1364 			DMLOG_PRINT(DMLVL_DEBUG,
   1365 				    "%s(one dir attr, setdtime non-zero)\n",
   1366 				    szFuncName);
   1367 			rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   1368 					   &attrname, 1, sizeof(buf), buf);
   1369 			rc2 |= stat(DUMMY_SUBDIR, &statfs2);
   1370 			if (rc == 0) {
   1371 				if ((rc2 == 0)
   1372 				    && (statfs1.st_ctime != statfs2.st_ctime)) {
   1373 					DMLOG_PRINT(DMLVL_DEBUG,
   1374 						    "%s passed with expected rc = %d and dtime modified\n",
   1375 						    szFuncName, 0);
   1376 					DMVAR_PASS();
   1377 				} else {
   1378 					DMLOG_PRINT(DMLVL_ERR,
   1379 						    "%s failed with expected rc = %d but dtime unmodified (%d vs %d)\n",
   1380 						    szFuncName, 0,
   1381 						    statfs1.st_ctime,
   1382 						    statfs2.st_ctime);
   1383 					DMVAR_FAIL();
   1384 				}
   1385 			} else {
   1386 				DMLOG_PRINT(DMLVL_ERR,
   1387 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   1388 					    szFuncName, rc, errno);
   1389 				DMVAR_FAIL();
   1390 			}
   1391 
   1392 			/* Variation clean up */
   1393 			rc = rmdir(DUMMY_SUBDIR);
   1394 			if (rc == -1) {
   1395 				DMLOG_PRINT(DMLVL_DEBUG,
   1396 					    "Unable to clean up variation! (errno = %d)\n",
   1397 					    errno);
   1398 			}
   1399 			dm_handle_free(hanp, hlen);
   1400 		}
   1401 	}
   1402 
   1403 	/*
   1404 	 * TEST    : dm_set_dmattr - fs handle
   1405 	 * EXPECTED: rc = -1, errno = EINVAL
   1406 	 */
   1407 	if (DMVAR_EXEC(SET_DMATTR_BASE + 19)) {
   1408 		void *hanp;
   1409 		size_t hlen;
   1410 		dm_attrname_t attrname;
   1411 		char buf[ATTR_VALUELEN];
   1412 
   1413 		/* Variation set up */
   1414 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1415 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   1416 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1417 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   1418 		if ((rc = system(command)) == -1) {
   1419 			/* No clean up */
   1420 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   1421 			   == -1) {
   1422 			remove(DUMMY_FILE);
   1423 		}
   1424 		if (rc == -1) {
   1425 			DMLOG_PRINT(DMLVL_DEBUG,
   1426 				    "Unable to set up variation! (errno = %d)\n",
   1427 				    errno);
   1428 			DMVAR_SKIP();
   1429 		} else {
   1430 			/* Variation */
   1431 			DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName);
   1432 			rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   1433 					   &attrname, 0, sizeof(buf), buf);
   1434 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1435 
   1436 			/* Variation clean up */
   1437 			rc = remove(DUMMY_FILE);
   1438 			if (rc == -1) {
   1439 				DMLOG_PRINT(DMLVL_DEBUG,
   1440 					    "Unable to clean up variation! (errno = %d)\n",
   1441 					    errno);
   1442 			}
   1443 			dm_handle_free(hanp, hlen);
   1444 		}
   1445 	}
   1446 
   1447 	/*
   1448 	 * TEST    : dm_set_dmattr - DM_NO_SESSION sid
   1449 	 * EXPECTED: rc = -1, errno = EINVAL
   1450 	 */
   1451 	if (DMVAR_EXEC(SET_DMATTR_BASE + 20)) {
   1452 		int fd;
   1453 		void *hanp;
   1454 		size_t hlen;
   1455 		dm_attrname_t attrname;
   1456 		char buf[ATTR_VALUELEN];
   1457 
   1458 		/* Variation set up */
   1459 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1460 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   1461 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1462 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   1463 		if ((rc = system(command)) == -1) {
   1464 			/* No clean up */
   1465 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   1466 			remove(DUMMY_FILE);
   1467 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   1468 			close(fd);
   1469 			remove(DUMMY_FILE);
   1470 		}
   1471 		if (fd == -1 || rc == -1) {
   1472 			DMLOG_PRINT(DMLVL_DEBUG,
   1473 				    "Unable to set up variation! (errno = %d)\n",
   1474 				    errno);
   1475 			DMVAR_SKIP();
   1476 		} else {
   1477 			/* Variation */
   1478 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
   1479 				    szFuncName);
   1480 			rc = dm_set_dmattr(DM_NO_SESSION, hanp, hlen,
   1481 					   DM_NO_TOKEN, &attrname, 0,
   1482 					   sizeof(buf), buf);
   1483 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1484 
   1485 			/* Variation clean up */
   1486 			rc = close(fd);
   1487 			rc |= remove(DUMMY_FILE);
   1488 			if (rc == -1) {
   1489 				DMLOG_PRINT(DMLVL_DEBUG,
   1490 					    "Unable to clean up variation! (errno = %d)\n",
   1491 					    errno);
   1492 			}
   1493 			dm_handle_free(hanp, hlen);
   1494 		}
   1495 	}
   1496 
   1497 	/*
   1498 	 * TEST    : dm_set_dmattr - global handle
   1499 	 * EXPECTED: rc = -1, errno = EBADF
   1500 	 */
   1501 	if (DMVAR_EXEC(SET_DMATTR_BASE + 21)) {
   1502 		dm_attrname_t attrname;
   1503 		char buf[ATTR_VALUELEN];
   1504 
   1505 		/* Variation set up */
   1506 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1507 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   1508 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1509 
   1510 		/* Variation */
   1511 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
   1512 		rc = dm_set_dmattr(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN,
   1513 				   DM_NO_TOKEN, &attrname, 0, sizeof(buf), buf);
   1514 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   1515 
   1516 		/* Variation clean up */
   1517 	}
   1518 
   1519 	/*
   1520 	 * TEST    : dm_set_dmattr - invalidated hanp
   1521 	 * EXPECTED: rc = -1, errno = BADF
   1522 	 */
   1523 	if (DMVAR_EXEC(SET_DMATTR_BASE + 22)) {
   1524 		int fd;
   1525 		void *hanp;
   1526 		size_t hlen;
   1527 		dm_attrname_t attrname;
   1528 		char buf[ATTR_VALUELEN];
   1529 
   1530 		/* Variation set up */
   1531 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1532 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   1533 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1534 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   1535 		if ((rc = system(command)) == -1) {
   1536 			/* No clean up */
   1537 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   1538 			remove(DUMMY_FILE);
   1539 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   1540 			close(fd);
   1541 			remove(DUMMY_FILE);
   1542 		} else if ((rc = close(fd)) == -1) {
   1543 			dm_handle_free(hanp, hlen);
   1544 			remove(DUMMY_FILE);
   1545 		} else if ((rc = remove(DUMMY_FILE)) == -1) {
   1546 			dm_handle_free(hanp, hlen);
   1547 		}
   1548 		if (fd == -1 || rc == -1) {
   1549 			DMLOG_PRINT(DMLVL_DEBUG,
   1550 				    "Unable to set up variation! (errno = %d)\n",
   1551 				    errno);
   1552 			DMVAR_SKIP();
   1553 		} else {
   1554 			/* Variation */
   1555 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated hanp)\n",
   1556 				    szFuncName);
   1557 			rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   1558 					   &attrname, 0, sizeof(buf), buf);
   1559 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   1560 
   1561 			/* Variation clean up */
   1562 			dm_handle_free(hanp, hlen);
   1563 		}
   1564 	}
   1565 
   1566 	szFuncName = "dm_get_dmattr";
   1567 
   1568 	/*
   1569 	 * TEST    : dm_get_dmattr - invalid sid
   1570 	 * EXPECTED: rc = -1, errno = EINVAL
   1571 	 */
   1572 	if (DMVAR_EXEC(GET_DMATTR_BASE + 1)) {
   1573 		int fd;
   1574 		void *hanp;
   1575 		size_t hlen;
   1576 		dm_attrname_t attrname;
   1577 		char buf[ATTR_VALUELEN];
   1578 		size_t rlen;
   1579 
   1580 		/* Variation set up */
   1581 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1582 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   1583 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1584 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   1585 		if ((rc = system(command)) == -1) {
   1586 			/* No clean up */
   1587 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   1588 			remove(DUMMY_FILE);
   1589 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   1590 			close(fd);
   1591 			remove(DUMMY_FILE);
   1592 		} else
   1593 		    if ((rc =
   1594 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   1595 				       0, sizeof(buf), buf)) == -1) {
   1596 			dm_handle_free(hanp, hlen);
   1597 			close(fd);
   1598 			remove(DUMMY_FILE);
   1599 		}
   1600 		if (fd == -1 || rc == -1) {
   1601 			DMLOG_PRINT(DMLVL_DEBUG,
   1602 				    "Unable to set up variation! (errno = %d)\n",
   1603 				    errno);
   1604 			DMVAR_SKIP();
   1605 		} else {
   1606 			/* Variation */
   1607 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
   1608 				    szFuncName);
   1609 			rc = dm_get_dmattr(INVALID_ADDR, hanp, hlen,
   1610 					   DM_NO_TOKEN, &attrname, sizeof(buf),
   1611 					   buf, &rlen);
   1612 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1613 
   1614 			/* Variation clean up */
   1615 			rc = close(fd);
   1616 			rc |= remove(DUMMY_FILE);
   1617 			if (rc == -1) {
   1618 				DMLOG_PRINT(DMLVL_DEBUG,
   1619 					    "Unable to clean up variation! (errno = %d)\n",
   1620 					    errno);
   1621 			}
   1622 			dm_handle_free(hanp, hlen);
   1623 		}
   1624 	}
   1625 
   1626 	/*
   1627 	 * TEST    : dm_get_dmattr - invalid hanp
   1628 	 * EXPECTED: rc = -1, errno = EFAULT
   1629 	 */
   1630 	if (DMVAR_EXEC(GET_DMATTR_BASE + 2)) {
   1631 		int fd;
   1632 		void *hanp;
   1633 		size_t hlen;
   1634 		dm_attrname_t attrname;
   1635 		char buf[ATTR_VALUELEN];
   1636 		size_t rlen;
   1637 
   1638 		/* Variation set up */
   1639 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1640 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   1641 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1642 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   1643 		if ((rc = system(command)) == -1) {
   1644 			/* No clean up */
   1645 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   1646 			remove(DUMMY_FILE);
   1647 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   1648 			close(fd);
   1649 			remove(DUMMY_FILE);
   1650 		} else
   1651 		    if ((rc =
   1652 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   1653 				       0, sizeof(buf), buf)) == -1) {
   1654 			dm_handle_free(hanp, hlen);
   1655 			close(fd);
   1656 			remove(DUMMY_FILE);
   1657 		}
   1658 		if (fd == -1 || rc == -1) {
   1659 			DMLOG_PRINT(DMLVL_DEBUG,
   1660 				    "Unable to set up variation! (errno = %d)\n",
   1661 				    errno);
   1662 			DMVAR_SKIP();
   1663 		} else {
   1664 			/* Variation */
   1665 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
   1666 				    szFuncName);
   1667 			rc = dm_get_dmattr(sid, (void *)INVALID_ADDR, hlen,
   1668 					   DM_NO_TOKEN, &attrname, sizeof(buf),
   1669 					   buf, &rlen);
   1670 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   1671 
   1672 			/* Variation clean up */
   1673 			rc = close(fd);
   1674 			rc |= remove(DUMMY_FILE);
   1675 			if (rc == -1) {
   1676 				DMLOG_PRINT(DMLVL_DEBUG,
   1677 					    "Unable to clean up variation! (errno = %d)\n",
   1678 					    errno);
   1679 			}
   1680 			dm_handle_free(hanp, hlen);
   1681 		}
   1682 	}
   1683 
   1684 	/*
   1685 	 * TEST    : dm_get_dmattr - invalid hlen
   1686 	 * EXPECTED: rc = -1, errno = EBADF
   1687 	 */
   1688 	if (DMVAR_EXEC(GET_DMATTR_BASE + 3)) {
   1689 		int fd;
   1690 		void *hanp;
   1691 		size_t hlen;
   1692 		dm_attrname_t attrname;
   1693 		char buf[ATTR_VALUELEN];
   1694 		size_t rlen;
   1695 
   1696 		/* Variation set up */
   1697 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1698 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   1699 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1700 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   1701 		if ((rc = system(command)) == -1) {
   1702 			/* No clean up */
   1703 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   1704 			remove(DUMMY_FILE);
   1705 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   1706 			close(fd);
   1707 			remove(DUMMY_FILE);
   1708 		} else
   1709 		    if ((rc =
   1710 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   1711 				       0, sizeof(buf), buf)) == -1) {
   1712 			dm_handle_free(hanp, hlen);
   1713 			close(fd);
   1714 			remove(DUMMY_FILE);
   1715 		}
   1716 		if (fd == -1 || rc == -1) {
   1717 			DMLOG_PRINT(DMLVL_DEBUG,
   1718 				    "Unable to set up variation! (errno = %d)\n",
   1719 				    errno);
   1720 			DMVAR_SKIP();
   1721 		} else {
   1722 			/* Variation */
   1723 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
   1724 				    szFuncName);
   1725 			rc = dm_get_dmattr(sid, hanp, INVALID_ADDR, DM_NO_TOKEN,
   1726 					   &attrname, sizeof(buf), buf, &rlen);
   1727 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   1728 
   1729 			/* Variation clean up */
   1730 			rc = close(fd);
   1731 			rc |= remove(DUMMY_FILE);
   1732 			if (rc == -1) {
   1733 				DMLOG_PRINT(DMLVL_DEBUG,
   1734 					    "Unable to clean up variation! (errno = %d)\n",
   1735 					    errno);
   1736 			}
   1737 			dm_handle_free(hanp, hlen);
   1738 		}
   1739 	}
   1740 
   1741 	/*
   1742 	 * TEST    : dm_get_dmattr - invalid token
   1743 	 * EXPECTED: rc = -1, errno = EINVAL
   1744 	 */
   1745 	if (DMVAR_EXEC(GET_DMATTR_BASE + 4)) {
   1746 		int fd;
   1747 		void *hanp;
   1748 		size_t hlen;
   1749 		dm_attrname_t attrname;
   1750 		char buf[ATTR_VALUELEN];
   1751 		size_t rlen;
   1752 
   1753 		/* Variation set up */
   1754 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1755 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   1756 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1757 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   1758 		if ((rc = system(command)) == -1) {
   1759 			/* No clean up */
   1760 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   1761 			remove(DUMMY_FILE);
   1762 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   1763 			close(fd);
   1764 			remove(DUMMY_FILE);
   1765 		} else
   1766 		    if ((rc =
   1767 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   1768 				       0, sizeof(buf), buf)) == -1) {
   1769 			dm_handle_free(hanp, hlen);
   1770 			close(fd);
   1771 			remove(DUMMY_FILE);
   1772 		}
   1773 		if (fd == -1 || rc == -1) {
   1774 			DMLOG_PRINT(DMLVL_DEBUG,
   1775 				    "Unable to set up variation! (errno = %d)\n",
   1776 				    errno);
   1777 			DMVAR_SKIP();
   1778 		} else {
   1779 			/* Variation */
   1780 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
   1781 				    szFuncName);
   1782 			rc = dm_get_dmattr(sid, hanp, hlen, INVALID_ADDR,
   1783 					   &attrname, sizeof(buf), buf, &rlen);
   1784 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   1785 
   1786 			/* Variation clean up */
   1787 			rc = close(fd);
   1788 			rc |= remove(DUMMY_FILE);
   1789 			if (rc == -1) {
   1790 				DMLOG_PRINT(DMLVL_DEBUG,
   1791 					    "Unable to clean up variation! (errno = %d)\n",
   1792 					    errno);
   1793 			}
   1794 			dm_handle_free(hanp, hlen);
   1795 		}
   1796 	}
   1797 
   1798 	/*
   1799 	 * TEST    : dm_get_dmattr - invalid attrnamep
   1800 	 * EXPECTED: rc = -1, errno = EFAULT
   1801 	 */
   1802 	if (DMVAR_EXEC(GET_DMATTR_BASE + 5)) {
   1803 		int fd;
   1804 		void *hanp;
   1805 		size_t hlen;
   1806 		dm_attrname_t attrname;
   1807 		char buf[ATTR_VALUELEN];
   1808 		size_t rlen;
   1809 
   1810 		/* Variation set up */
   1811 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1812 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   1813 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1814 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   1815 		if ((rc = system(command)) == -1) {
   1816 			/* No clean up */
   1817 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   1818 			remove(DUMMY_FILE);
   1819 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   1820 			close(fd);
   1821 			remove(DUMMY_FILE);
   1822 		} else
   1823 		    if ((rc =
   1824 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   1825 				       0, sizeof(buf), buf)) == -1) {
   1826 			dm_handle_free(hanp, hlen);
   1827 			close(fd);
   1828 			remove(DUMMY_FILE);
   1829 		}
   1830 		if (fd == -1 || rc == -1) {
   1831 			DMLOG_PRINT(DMLVL_DEBUG,
   1832 				    "Unable to set up variation! (errno = %d)\n",
   1833 				    errno);
   1834 			DMVAR_SKIP();
   1835 		} else {
   1836 			/* Variation */
   1837 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid attrnamep)\n",
   1838 				    szFuncName);
   1839 			rc = dm_get_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   1840 					   (dm_attrname_t *) INVALID_ADDR,
   1841 					   sizeof(buf), buf, &rlen);
   1842 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   1843 
   1844 			/* Variation clean up */
   1845 			rc = close(fd);
   1846 			rc |= remove(DUMMY_FILE);
   1847 			if (rc == -1) {
   1848 				DMLOG_PRINT(DMLVL_DEBUG,
   1849 					    "Unable to clean up variation! (errno = %d)\n",
   1850 					    errno);
   1851 			}
   1852 			dm_handle_free(hanp, hlen);
   1853 		}
   1854 	}
   1855 
   1856 	/*
   1857 	 * TEST    : dm_get_dmattr - invalid buflen
   1858 	 * EXPECTED: rc = -1, errno = E2BIG
   1859 	 */
   1860 	if (DMVAR_EXEC(GET_DMATTR_BASE + 6)) {
   1861 		int fd;
   1862 		void *hanp;
   1863 		size_t hlen;
   1864 		dm_attrname_t attrname;
   1865 		char buf[ATTR_VALUELEN];
   1866 		size_t rlen;
   1867 
   1868 		/* Variation set up */
   1869 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1870 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   1871 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1872 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   1873 		if ((rc = system(command)) == -1) {
   1874 			/* No clean up */
   1875 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   1876 			remove(DUMMY_FILE);
   1877 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   1878 			close(fd);
   1879 			remove(DUMMY_FILE);
   1880 		} else
   1881 		    if ((rc =
   1882 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   1883 				       0, sizeof(buf), buf)) == -1) {
   1884 			dm_handle_free(hanp, hlen);
   1885 			close(fd);
   1886 			remove(DUMMY_FILE);
   1887 		}
   1888 		if (fd == -1 || rc == -1) {
   1889 			DMLOG_PRINT(DMLVL_DEBUG,
   1890 				    "Unable to set up variation! (errno = %d)\n",
   1891 				    errno);
   1892 			DMVAR_SKIP();
   1893 		} else {
   1894 			/* Variation */
   1895 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid buflen)\n",
   1896 				    szFuncName);
   1897 			rc = dm_get_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   1898 					   &attrname, 1, buf, &rlen);
   1899 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, E2BIG);
   1900 			DMLOG_PRINT(DMLVL_DEBUG, "rlen %d\n");
   1901 
   1902 			/* Variation clean up */
   1903 			rc = close(fd);
   1904 			rc |= remove(DUMMY_FILE);
   1905 			if (rc == -1) {
   1906 				DMLOG_PRINT(DMLVL_DEBUG,
   1907 					    "Unable to clean up variation! (errno = %d)\n",
   1908 					    errno);
   1909 			}
   1910 			dm_handle_free(hanp, hlen);
   1911 		}
   1912 	}
   1913 
   1914 	/*
   1915 	 * TEST    : dm_get_dmattr - invalid bufp
   1916 	 * EXPECTED: rc = -1, errno = EFAULT
   1917 	 *
   1918 	 * This variation uncovered XFS BUG #13 (attrname not null-terminated)
   1919 	 */
   1920 	if (DMVAR_EXEC(GET_DMATTR_BASE + 7)) {
   1921 		int fd;
   1922 		void *hanp;
   1923 		size_t hlen;
   1924 		dm_attrname_t attrname;
   1925 		char buf[ATTR_VALUELEN];
   1926 		size_t rlen;
   1927 
   1928 		/* Variation set up */
   1929 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1930 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   1931 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1932 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   1933 		if ((rc = system(command)) == -1) {
   1934 			/* No clean up */
   1935 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   1936 			remove(DUMMY_FILE);
   1937 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   1938 			close(fd);
   1939 			remove(DUMMY_FILE);
   1940 		} else
   1941 		    if ((rc =
   1942 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   1943 				       0, sizeof(buf), buf)) == -1) {
   1944 			dm_handle_free(hanp, hlen);
   1945 			close(fd);
   1946 			remove(DUMMY_FILE);
   1947 		}
   1948 		if (fd == -1 || rc == -1) {
   1949 			DMLOG_PRINT(DMLVL_DEBUG,
   1950 				    "Unable to set up variation! (errno = %d)\n",
   1951 				    errno);
   1952 			DMVAR_SKIP();
   1953 		} else {
   1954 			/* Variation */
   1955 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid bufp)\n",
   1956 				    szFuncName);
   1957 			rc = dm_get_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   1958 					   &attrname, sizeof(buf),
   1959 					   (void *)INVALID_ADDR, &rlen);
   1960 			DMLOG_PRINT(DMLVL_DEBUG, "rc = %d, %s", rc, &attrname);
   1961 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   1962 
   1963 			/* Variation clean up */
   1964 			rc = close(fd);
   1965 			rc |= remove(DUMMY_FILE);
   1966 			if (rc == -1) {
   1967 				DMLOG_PRINT(DMLVL_DEBUG,
   1968 					    "Unable to clean up variation! (errno = %d)\n",
   1969 					    errno);
   1970 			}
   1971 			dm_handle_free(hanp, hlen);
   1972 		}
   1973 	}
   1974 
   1975 	/*
   1976 	 * TEST    : dm_get_dmattr - invalid rlenp
   1977 	 * EXPECTED: rc = -1, errno = EFAULT
   1978 	 */
   1979 	if (DMVAR_EXEC(GET_DMATTR_BASE + 8)) {
   1980 		int fd;
   1981 		void *hanp;
   1982 		size_t hlen;
   1983 		dm_attrname_t attrname;
   1984 		char buf[ATTR_VALUELEN];
   1985 
   1986 		/* Variation set up */
   1987 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   1988 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   1989 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   1990 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   1991 		if ((rc = system(command)) == -1) {
   1992 			/* No clean up */
   1993 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   1994 			remove(DUMMY_FILE);
   1995 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   1996 			close(fd);
   1997 			remove(DUMMY_FILE);
   1998 		} else
   1999 		    if ((rc =
   2000 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   2001 				       0, sizeof(buf), buf)) == -1) {
   2002 			dm_handle_free(hanp, hlen);
   2003 			close(fd);
   2004 			remove(DUMMY_FILE);
   2005 		}
   2006 		if (fd == -1 || rc == -1) {
   2007 			DMLOG_PRINT(DMLVL_DEBUG,
   2008 				    "Unable to set up variation! (errno = %d)\n",
   2009 				    errno);
   2010 			DMVAR_SKIP();
   2011 		} else {
   2012 			/* Variation */
   2013 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid rlenp)\n",
   2014 				    szFuncName);
   2015 			rc = dm_get_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   2016 					   &attrname, sizeof(buf), buf,
   2017 					   (size_t *) INVALID_ADDR);
   2018 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   2019 
   2020 			/* Variation clean up */
   2021 			rc = close(fd);
   2022 			rc |= remove(DUMMY_FILE);
   2023 			if (rc == -1) {
   2024 				DMLOG_PRINT(DMLVL_DEBUG,
   2025 					    "Unable to clean up variation! (errno = %d)\n",
   2026 					    errno);
   2027 			}
   2028 			dm_handle_free(hanp, hlen);
   2029 		}
   2030 	}
   2031 
   2032 	/*
   2033 	 * TEST    : dm_get_dmattr - zero buflen, zero attribute length
   2034 	 * EXPECTED: rc = 0
   2035 	 */
   2036 	if (DMVAR_EXEC(GET_DMATTR_BASE + 9)) {
   2037 		int fd;
   2038 		void *hanp;
   2039 		size_t hlen;
   2040 		dm_attrname_t attrname;
   2041 		size_t rlen;
   2042 
   2043 		/* Variation set up */
   2044 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2045 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2046 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   2047 		if ((rc = system(command)) == -1) {
   2048 			/* No clean up */
   2049 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   2050 			remove(DUMMY_FILE);
   2051 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   2052 			close(fd);
   2053 			remove(DUMMY_FILE);
   2054 		} else
   2055 		    if ((rc =
   2056 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   2057 				       0, 0, NULL)) == -1) {
   2058 			dm_handle_free(hanp, hlen);
   2059 			close(fd);
   2060 			remove(DUMMY_FILE);
   2061 		}
   2062 		if (fd == -1 || rc == -1) {
   2063 			DMLOG_PRINT(DMLVL_DEBUG,
   2064 				    "Unable to set up variation! (errno = %d)\n",
   2065 				    errno);
   2066 			DMVAR_SKIP();
   2067 		} else {
   2068 			/* Variation */
   2069 			DMLOG_PRINT(DMLVL_DEBUG,
   2070 				    "%s(zero buflen, zero attr len)\n",
   2071 				    szFuncName);
   2072 			rc = dm_get_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   2073 					   &attrname, 0, NULL, &rlen);
   2074 			if (rc == 0) {
   2075 				DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen);
   2076 			}
   2077 			DMVAR_ENDPASSEXP(szFuncName, 0, rc);
   2078 
   2079 			/* Variation clean up */
   2080 			rc = close(fd);
   2081 			rc |= remove(DUMMY_FILE);
   2082 			if (rc == -1) {
   2083 				DMLOG_PRINT(DMLVL_DEBUG,
   2084 					    "Unable to clean up variation! (errno = %d)\n",
   2085 					    errno);
   2086 			}
   2087 			dm_handle_free(hanp, hlen);
   2088 		}
   2089 	}
   2090 
   2091 	/*
   2092 	 * TEST    : dm_get_dmattr - zero buflen, non-zero attribute length
   2093 	 * EXPECTED: rc = -1, errno = E2BIG
   2094 	 */
   2095 	if (DMVAR_EXEC(GET_DMATTR_BASE + 10)) {
   2096 		int fd;
   2097 		void *hanp;
   2098 		size_t hlen;
   2099 		dm_attrname_t attrname;
   2100 		char buf[ATTR_VALUELEN];
   2101 		size_t rlen;
   2102 
   2103 		/* Variation set up */
   2104 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2105 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2106 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   2107 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   2108 		if ((rc = system(command)) == -1) {
   2109 			/* No clean up */
   2110 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   2111 			remove(DUMMY_FILE);
   2112 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   2113 			close(fd);
   2114 			remove(DUMMY_FILE);
   2115 		} else
   2116 		    if ((rc =
   2117 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   2118 				       0, sizeof(buf), buf)) == -1) {
   2119 			dm_handle_free(hanp, hlen);
   2120 			close(fd);
   2121 			remove(DUMMY_FILE);
   2122 		}
   2123 		if (fd == -1 || rc == -1) {
   2124 			DMLOG_PRINT(DMLVL_DEBUG,
   2125 				    "Unable to set up variation! (errno = %d)\n",
   2126 				    errno);
   2127 			DMVAR_SKIP();
   2128 		} else {
   2129 			/* Variation */
   2130 			DMLOG_PRINT(DMLVL_DEBUG,
   2131 				    "%s(zero buflen, non-zero attr len)\n",
   2132 				    szFuncName);
   2133 			rc = dm_get_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   2134 					   &attrname, 0, NULL, &rlen);
   2135 			if (rc == -1) {
   2136 				if (errno == E2BIG) {
   2137 					DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n",
   2138 						    rlen);
   2139 					if (rlen == ATTR_VALUELEN) {
   2140 						DMLOG_PRINT(DMLVL_DEBUG,
   2141 							    "%s passed with expected rc = %d and expected errno = %d\n",
   2142 							    szFuncName, -1,
   2143 							    E2BIG);
   2144 						DMVAR_PASS();
   2145 					} else {
   2146 						DMLOG_PRINT(DMLVL_ERR,
   2147 							    "%s failed with expected rc = %d and expected errno = %d but unexpected rlen (%d vs %d)\n",
   2148 							    szFuncName, -1,
   2149 							    E2BIG, rlen,
   2150 							    ATTR_VALUELEN);
   2151 						DMVAR_FAIL();
   2152 					}
   2153 				} else {
   2154 					DMLOG_PRINT(DMLVL_ERR,
   2155 						    "%s failed with expected rc = %d but unexpected errno = %d\n",
   2156 						    szFuncName, -1, E2BIG);
   2157 					DMVAR_FAIL();
   2158 				}
   2159 			} else {
   2160 				DMLOG_PRINT(DMLVL_ERR,
   2161 					    "%s failed with unexpected rc = %d\n",
   2162 					    szFuncName, -1);
   2163 				DMVAR_FAIL();
   2164 			}
   2165 
   2166 			/* Variation clean up */
   2167 			rc = close(fd);
   2168 			rc |= remove(DUMMY_FILE);
   2169 			if (rc == -1) {
   2170 				DMLOG_PRINT(DMLVL_DEBUG,
   2171 					    "Unable to clean up variation! (errno = %d)\n",
   2172 					    errno);
   2173 			}
   2174 			dm_handle_free(hanp, hlen);
   2175 		}
   2176 	}
   2177 
   2178 	/*
   2179 	 * TEST    : dm_get_dmattr - attribute not exist
   2180 	 * EXPECTED: rc = -1, errno = ENOENT
   2181 	 */
   2182 	if (DMVAR_EXEC(GET_DMATTR_BASE + 11)) {
   2183 		int fd;
   2184 		void *hanp;
   2185 		size_t hlen;
   2186 		dm_attrname_t attrname;
   2187 		char buf[ATTR_VALUELEN];
   2188 		size_t rlen;
   2189 
   2190 		/* Variation set up */
   2191 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2192 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2193 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   2194 		if ((rc = system(command)) == -1) {
   2195 			/* No clean up */
   2196 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   2197 			remove(DUMMY_FILE);
   2198 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   2199 			close(fd);
   2200 			remove(DUMMY_FILE);
   2201 		}
   2202 		if (fd == -1 || rc == -1) {
   2203 			DMLOG_PRINT(DMLVL_DEBUG,
   2204 				    "Unable to set up variation! (errno = %d)\n",
   2205 				    errno);
   2206 			DMVAR_SKIP();
   2207 		} else {
   2208 			/* Variation */
   2209 			DMLOG_PRINT(DMLVL_DEBUG, "%s(attr not exist)\n",
   2210 				    szFuncName);
   2211 			rc = dm_get_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   2212 					   &attrname, sizeof(buf), buf, &rlen);
   2213 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, ENOENT);
   2214 
   2215 			/* Variation clean up */
   2216 			rc = close(fd);
   2217 			rc |= remove(DUMMY_FILE);
   2218 			if (rc == -1) {
   2219 				DMLOG_PRINT(DMLVL_DEBUG,
   2220 					    "Unable to clean up variation! (errno = %d)\n",
   2221 					    errno);
   2222 			}
   2223 			dm_handle_free(hanp, hlen);
   2224 		}
   2225 	}
   2226 
   2227 	/*
   2228 	 * TEST    : dm_get_dmattr - buf too small
   2229 	 * EXPECTED: rc = -1, errno = E2BIG
   2230 	 */
   2231 	if (DMVAR_EXEC(GET_DMATTR_BASE + 12)) {
   2232 		int fd;
   2233 		void *hanp;
   2234 		size_t hlen;
   2235 		dm_attrname_t attrname;
   2236 		char buf[ATTR_VALUELEN];
   2237 		size_t rlen;
   2238 
   2239 		/* Variation set up */
   2240 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2241 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2242 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   2243 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   2244 		if ((rc = system(command)) == -1) {
   2245 			/* No clean up */
   2246 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   2247 			remove(DUMMY_FILE);
   2248 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   2249 			close(fd);
   2250 			remove(DUMMY_FILE);
   2251 		} else
   2252 		    if ((rc =
   2253 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   2254 				       0, sizeof(buf), buf)) == -1) {
   2255 			dm_handle_free(hanp, hlen);
   2256 			close(fd);
   2257 			remove(DUMMY_FILE);
   2258 		}
   2259 		if (fd == -1 || rc == -1) {
   2260 			DMLOG_PRINT(DMLVL_DEBUG,
   2261 				    "Unable to set up variation! (errno = %d)\n",
   2262 				    errno);
   2263 			DMVAR_SKIP();
   2264 		} else {
   2265 			/* Variation */
   2266 			DMLOG_PRINT(DMLVL_DEBUG, "%s(buflen too small)\n",
   2267 				    szFuncName);
   2268 			rc = dm_get_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   2269 					   &attrname, sizeof(buf) - 1, buf,
   2270 					   &rlen);
   2271 			if (rc == -1 && errno == E2BIG) {
   2272 				DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen);
   2273 			}
   2274 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, E2BIG);
   2275 
   2276 			/* Variation clean up */
   2277 			rc = close(fd);
   2278 			rc |= remove(DUMMY_FILE);
   2279 			if (rc == -1) {
   2280 				DMLOG_PRINT(DMLVL_DEBUG,
   2281 					    "Unable to clean up variation! (errno = %d)\n",
   2282 					    errno);
   2283 			}
   2284 			dm_handle_free(hanp, hlen);
   2285 		}
   2286 	}
   2287 
   2288 	/*
   2289 	 * TEST    : dm_get_dmattr - file handle
   2290 	 * EXPECTED: rc = 0
   2291 	 */
   2292 	if (DMVAR_EXEC(GET_DMATTR_BASE + 13)) {
   2293 		int fd;
   2294 		void *hanp;
   2295 		size_t hlen;
   2296 		dm_attrname_t attrname;
   2297 		char buf[ATTR_VALUELEN];
   2298 		size_t rlen;
   2299 
   2300 		/* Variation set up */
   2301 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2302 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2303 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   2304 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   2305 		if ((rc = system(command)) == -1) {
   2306 			/* No clean up */
   2307 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   2308 			remove(DUMMY_FILE);
   2309 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   2310 			close(fd);
   2311 			remove(DUMMY_FILE);
   2312 		} else
   2313 		    if ((rc =
   2314 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   2315 				       0, sizeof(buf), buf)) == -1) {
   2316 			dm_handle_free(hanp, hlen);
   2317 			close(fd);
   2318 			remove(DUMMY_FILE);
   2319 		}
   2320 		if (fd == -1 || rc == -1) {
   2321 			DMLOG_PRINT(DMLVL_DEBUG,
   2322 				    "Unable to set up variation! (errno = %d)\n",
   2323 				    errno);
   2324 			DMVAR_SKIP();
   2325 		} else {
   2326 			/* Variation */
   2327 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file handle)\n",
   2328 				    szFuncName);
   2329 			rc = dm_get_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   2330 					   &attrname, sizeof(buf), buf, &rlen);
   2331 			if (rc == 0) {
   2332 				DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen);
   2333 				if (rlen == ATTR_VALUELEN) {
   2334 					if (memcmp
   2335 					    (buf, ATTR_VALUE,
   2336 					     ATTR_VALUELEN) == 0) {
   2337 						DMLOG_PRINT(DMLVL_DEBUG,
   2338 							    "%s passed with expected rc = %d\n",
   2339 							    szFuncName, 0);
   2340 						DMVAR_PASS();
   2341 					} else {
   2342 						DMLOG_PRINT(DMLVL_ERR,
   2343 							    "%s failed with expected rc = %d and rlen = %d but unexpected buf %s",
   2344 							    szFuncName, 0, rlen,
   2345 							    buf);
   2346 						DMVAR_FAIL();
   2347 					}
   2348 				} else {
   2349 					DMLOG_PRINT(DMLVL_ERR,
   2350 						    "%s failed with expected rc = %d but unexpected rlen = %d\n",
   2351 						    szFuncName, 0, rlen);
   2352 					DMVAR_FAIL();
   2353 				}
   2354 			} else {
   2355 				DMLOG_PRINT(DMLVL_ERR,
   2356 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   2357 					    szFuncName, rc, errno);
   2358 				DMVAR_FAIL();
   2359 			}
   2360 
   2361 			/* Variation clean up */
   2362 			rc = close(fd);
   2363 			rc |= remove(DUMMY_FILE);
   2364 			if (rc == -1) {
   2365 				DMLOG_PRINT(DMLVL_DEBUG,
   2366 					    "Unable to clean up variation! (errno = %d)\n",
   2367 					    errno);
   2368 			}
   2369 			dm_handle_free(hanp, hlen);
   2370 		}
   2371 	}
   2372 
   2373 	/*
   2374 	 * TEST    : dm_get_dmattr - maximum buflen
   2375 	 * EXPECTED: rc = 0
   2376 	 */
   2377 	if (DMVAR_EXEC(GET_DMATTR_BASE + 14)) {
   2378 		int fd;
   2379 		void *hanp;
   2380 		size_t hlen;
   2381 		dm_attrname_t attrname;
   2382 		char *buf;
   2383 		size_t rlen;
   2384 
   2385 		/* Variation set up */
   2386 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2387 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2388 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   2389 		if ((buf = malloc(maxAttrSize)) == NULL) {
   2390 			/* No clean up */
   2391 		} else if ((memset(buf, '3', maxAttrSize) == NULL) ||
   2392 			   ((rc = system(command)) == -1)) {
   2393 			free(buf);
   2394 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   2395 			free(buf);
   2396 			remove(DUMMY_FILE);
   2397 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   2398 			free(buf);
   2399 			close(fd);
   2400 			remove(DUMMY_FILE);
   2401 		} else
   2402 		    if ((rc =
   2403 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   2404 				       0, maxAttrSize, buf)) == -1) {
   2405 			free(buf);
   2406 			dm_handle_free(hanp, hlen);
   2407 			close(fd);
   2408 			remove(DUMMY_FILE);
   2409 		}
   2410 		if (fd == -1 || rc == -1 || buf == NULL) {
   2411 			DMLOG_PRINT(DMLVL_DEBUG,
   2412 				    "Unable to set up variation! (errno = %d)\n",
   2413 				    errno);
   2414 			DMVAR_SKIP();
   2415 		} else {
   2416 			/* Variation */
   2417 			DMLOG_PRINT(DMLVL_DEBUG, "%s(max buflen)\n",
   2418 				    szFuncName);
   2419 			rc = dm_get_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   2420 					   &attrname, maxAttrSize, buf, &rlen);
   2421 			if (rc == 0) {
   2422 				DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen);
   2423 				if (rlen == maxAttrSize) {
   2424 					DMLOG_PRINT(DMLVL_DEBUG,
   2425 						    "%s passed with expected rc = %d\n",
   2426 						    szFuncName, 0);
   2427 					DMVAR_PASS();
   2428 				} else {
   2429 					DMLOG_PRINT(DMLVL_ERR,
   2430 						    "%s failed with expected rc = %d but unexpected rlen (%d vs %d)\n",
   2431 						    szFuncName, 0, rlen,
   2432 						    maxAttrSize);
   2433 					DMVAR_FAIL();
   2434 				}
   2435 			} else {
   2436 				DMLOG_PRINT(DMLVL_ERR,
   2437 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   2438 					    szFuncName, rc, errno);
   2439 				DMVAR_FAIL();
   2440 			}
   2441 
   2442 			/* Variation clean up */
   2443 			rc = close(fd);
   2444 			rc |= remove(DUMMY_FILE);
   2445 			if (rc == -1) {
   2446 				DMLOG_PRINT(DMLVL_DEBUG,
   2447 					    "Unable to clean up variation! (errno = %d)\n",
   2448 					    errno);
   2449 			}
   2450 			free(buf);
   2451 			dm_handle_free(hanp, hlen);
   2452 		}
   2453 	}
   2454 
   2455 	/*
   2456 	 * TEST    : dm_get_dmattr - directory handle
   2457 	 * EXPECTED: rc = 0
   2458 	 */
   2459 	if (DMVAR_EXEC(GET_DMATTR_BASE + 15)) {
   2460 		void *hanp;
   2461 		size_t hlen;
   2462 		dm_attrname_t attrname;
   2463 		char buf[ATTR_VALUELEN];
   2464 		size_t rlen;
   2465 
   2466 		/* Variation set up */
   2467 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2468 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2469 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   2470 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   2471 			/* No clean up */
   2472 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   2473 			   == -1) {
   2474 			rmdir(DUMMY_SUBDIR);
   2475 		} else
   2476 		    if ((rc =
   2477 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   2478 				       0, sizeof(buf), buf)) == -1) {
   2479 			dm_handle_free(hanp, hlen);
   2480 			rmdir(DUMMY_SUBDIR);
   2481 		}
   2482 		if (rc == -1) {
   2483 			DMLOG_PRINT(DMLVL_DEBUG,
   2484 				    "Unable to set up variation! (errno = %d)\n",
   2485 				    errno);
   2486 			DMVAR_SKIP();
   2487 		} else {
   2488 			/* Variation */
   2489 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir handle)\n",
   2490 				    szFuncName);
   2491 			rc = dm_get_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   2492 					   &attrname, sizeof(buf), buf, &rlen);
   2493 			if (rc == 0) {
   2494 				DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen);
   2495 				if (rlen == ATTR_VALUELEN) {
   2496 					if (memcmp
   2497 					    (buf, ATTR_VALUE,
   2498 					     ATTR_VALUELEN) == 0) {
   2499 						DMLOG_PRINT(DMLVL_DEBUG,
   2500 							    "%s passed with expected rc = %d\n",
   2501 							    szFuncName, 0);
   2502 						DMVAR_PASS();
   2503 					} else {
   2504 						DMLOG_PRINT(DMLVL_ERR,
   2505 							    "%s failed with expected rc = %d and rlen = %d but unexpected buf %s",
   2506 							    szFuncName, 0, rlen,
   2507 							    buf);
   2508 						DMVAR_FAIL();
   2509 					}
   2510 				} else {
   2511 					DMLOG_PRINT(DMLVL_ERR,
   2512 						    "%s failed with expected rc = %d but unexpected rlen = %d\n",
   2513 						    szFuncName, 0, rlen);
   2514 					DMVAR_FAIL();
   2515 				}
   2516 			} else {
   2517 				DMLOG_PRINT(DMLVL_ERR,
   2518 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   2519 					    szFuncName, rc, errno);
   2520 				DMVAR_FAIL();
   2521 			}
   2522 
   2523 			/* Variation clean up */
   2524 			rc = rmdir(DUMMY_SUBDIR);
   2525 			if (rc == -1) {
   2526 				DMLOG_PRINT(DMLVL_DEBUG,
   2527 					    "Unable to clean up variation! (errno = %d)\n",
   2528 					    errno);
   2529 			}
   2530 			dm_handle_free(hanp, hlen);
   2531 		}
   2532 	}
   2533 
   2534 	/*
   2535 	 * TEST    : dm_get_dmattr - fs handle
   2536 	 * EXPECTED: rc = -1, errno = EINVAL
   2537 	 */
   2538 	if (DMVAR_EXEC(GET_DMATTR_BASE + 16)) {
   2539 		void *hanp;
   2540 		size_t hlen;
   2541 		dm_attrname_t attrname;
   2542 		char buf[ATTR_VALUELEN];
   2543 		size_t rlen;
   2544 
   2545 		/* Variation set up */
   2546 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2547 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2548 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   2549 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   2550 		if ((rc = system(command)) == -1) {
   2551 			/* No clean up */
   2552 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   2553 			   == -1) {
   2554 			remove(DUMMY_FILE);
   2555 		}
   2556 		if (rc == -1) {
   2557 			DMLOG_PRINT(DMLVL_DEBUG,
   2558 				    "Unable to set up variation! (errno = %d)\n",
   2559 				    errno);
   2560 			DMVAR_SKIP();
   2561 		} else {
   2562 			/* Variation */
   2563 			DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName);
   2564 			rc = dm_get_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   2565 					   &attrname, sizeof(buf), buf, &rlen);
   2566 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   2567 
   2568 			/* Variation clean up */
   2569 			rc = remove(DUMMY_FILE);
   2570 			if (rc == -1) {
   2571 				DMLOG_PRINT(DMLVL_DEBUG,
   2572 					    "Unable to clean up variation! (errno = %d)\n",
   2573 					    errno);
   2574 			}
   2575 			dm_handle_free(hanp, hlen);
   2576 		}
   2577 	}
   2578 
   2579 	/*
   2580 	 * TEST    : dm_get_dmattr - DM_NO_SESSION sid
   2581 	 * EXPECTED: rc = -1, errno = EINVAL
   2582 	 */
   2583 	if (DMVAR_EXEC(GET_DMATTR_BASE + 17)) {
   2584 		int fd;
   2585 		void *hanp;
   2586 		size_t hlen;
   2587 		dm_attrname_t attrname;
   2588 		char buf[ATTR_VALUELEN];
   2589 		size_t rlen;
   2590 
   2591 		/* Variation set up */
   2592 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2593 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2594 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   2595 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   2596 		if ((rc = system(command)) == -1) {
   2597 			/* No clean up */
   2598 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   2599 			remove(DUMMY_FILE);
   2600 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   2601 			close(fd);
   2602 			remove(DUMMY_FILE);
   2603 		} else
   2604 		    if ((rc =
   2605 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   2606 				       0, sizeof(buf), buf)) == -1) {
   2607 			dm_handle_free(hanp, hlen);
   2608 			close(fd);
   2609 			remove(DUMMY_FILE);
   2610 		}
   2611 		if (fd == -1 || rc == -1) {
   2612 			DMLOG_PRINT(DMLVL_DEBUG,
   2613 				    "Unable to set up variation! (errno = %d)\n",
   2614 				    errno);
   2615 			DMVAR_SKIP();
   2616 		} else {
   2617 			/* Variation */
   2618 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
   2619 				    szFuncName);
   2620 			rc = dm_get_dmattr(DM_NO_SESSION, hanp, hlen,
   2621 					   DM_NO_TOKEN, &attrname, sizeof(buf),
   2622 					   buf, &rlen);
   2623 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   2624 
   2625 			/* Variation clean up */
   2626 			rc = close(fd);
   2627 			rc |= remove(DUMMY_FILE);
   2628 			if (rc == -1) {
   2629 				DMLOG_PRINT(DMLVL_DEBUG,
   2630 					    "Unable to clean up variation! (errno = %d)\n",
   2631 					    errno);
   2632 			}
   2633 			dm_handle_free(hanp, hlen);
   2634 		}
   2635 	}
   2636 
   2637 	/*
   2638 	 * TEST    : dm_get_dmattr - global handle
   2639 	 * EXPECTED: rc = -1, errno = EBADF
   2640 	 */
   2641 	if (DMVAR_EXEC(GET_DMATTR_BASE + 18)) {
   2642 		dm_attrname_t attrname;
   2643 		char buf[ATTR_VALUELEN];
   2644 		size_t rlen;
   2645 
   2646 		/* Variation set up */
   2647 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2648 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2649 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   2650 
   2651 		/* Variation */
   2652 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
   2653 		rc = dm_get_dmattr(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN,
   2654 				   DM_NO_TOKEN, &attrname, sizeof(buf), buf,
   2655 				   &rlen);
   2656 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   2657 
   2658 		/* Variation clean up */
   2659 	}
   2660 
   2661 	/*
   2662 	 * TEST    : dm_get_dmattr - invalidated hanp
   2663 	 * EXPECTED: rc = -1, errno = EBADF
   2664 	 */
   2665 	if (DMVAR_EXEC(GET_DMATTR_BASE + 19)) {
   2666 		int fd;
   2667 		void *hanp;
   2668 		size_t hlen;
   2669 		dm_attrname_t attrname;
   2670 		char buf[ATTR_VALUELEN];
   2671 		size_t rlen;
   2672 
   2673 		/* Variation set up */
   2674 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2675 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2676 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   2677 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   2678 		if ((rc = system(command)) == -1) {
   2679 			/* No clean up */
   2680 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   2681 			remove(DUMMY_FILE);
   2682 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   2683 			close(fd);
   2684 			remove(DUMMY_FILE);
   2685 		} else
   2686 		    if ((rc =
   2687 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   2688 				       0, sizeof(buf), buf)) == -1) {
   2689 			dm_handle_free(hanp, hlen);
   2690 			close(fd);
   2691 			remove(DUMMY_FILE);
   2692 		} else if ((rc = close(fd)) == -1) {
   2693 			dm_handle_free(hanp, hlen);
   2694 			remove(DUMMY_FILE);
   2695 		} else if ((rc == remove(DUMMY_FILE)) == -1) {
   2696 			dm_handle_free(hanp, hlen);
   2697 		}
   2698 		if (fd == -1 || rc == -1) {
   2699 			DMLOG_PRINT(DMLVL_DEBUG,
   2700 				    "Unable to set up variation! (errno = %d)\n",
   2701 				    errno);
   2702 			DMVAR_SKIP();
   2703 		} else {
   2704 			/* Variation */
   2705 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated hanp)\n",
   2706 				    szFuncName);
   2707 			rc = dm_get_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   2708 					   &attrname, sizeof(buf), buf, &rlen);
   2709 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   2710 
   2711 			/* Variation clean up */
   2712 			dm_handle_free(hanp, hlen);
   2713 		}
   2714 	}
   2715 
   2716 	szFuncName = "dm_remove_dmattr";
   2717 
   2718 	/*
   2719 	 * TEST    : dm_remove_dmattr - invalid sid
   2720 	 * EXPECTED: rc = -1, errno = EINVAL
   2721 	 */
   2722 	if (DMVAR_EXEC(REMOVE_DMATTR_BASE + 1)) {
   2723 		int fd;
   2724 		void *hanp;
   2725 		size_t hlen;
   2726 		dm_attrname_t attrname;
   2727 
   2728 		/* Variation set up */
   2729 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2730 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2731 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   2732 		if ((rc = system(command)) == -1) {
   2733 			/* No clean up */
   2734 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   2735 			remove(DUMMY_FILE);
   2736 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   2737 			close(fd);
   2738 			remove(DUMMY_FILE);
   2739 		}
   2740 		if (fd == -1 || rc == -1) {
   2741 			DMLOG_PRINT(DMLVL_DEBUG,
   2742 				    "Unable to set up variation! (errno = %d)\n",
   2743 				    errno);
   2744 			DMVAR_SKIP();
   2745 		} else {
   2746 			/* Variation */
   2747 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
   2748 				    szFuncName);
   2749 			rc = dm_remove_dmattr(INVALID_ADDR, hanp, hlen,
   2750 					      DM_NO_TOKEN, 0, &attrname);
   2751 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   2752 
   2753 			/* Variation clean up */
   2754 			rc = close(fd);
   2755 			rc |= remove(DUMMY_FILE);
   2756 			if (rc == -1) {
   2757 				DMLOG_PRINT(DMLVL_DEBUG,
   2758 					    "Unable to clean up variation! (errno = %d)\n",
   2759 					    errno);
   2760 			}
   2761 			dm_handle_free(hanp, hlen);
   2762 		}
   2763 	}
   2764 
   2765 	/*
   2766 	 * TEST    : dm_remove_dmattr - invalid hanp
   2767 	 * EXPECTED: rc = -1, errno = EFAULT
   2768 	 */
   2769 	if (DMVAR_EXEC(REMOVE_DMATTR_BASE + 2)) {
   2770 		int fd;
   2771 		void *hanp;
   2772 		size_t hlen;
   2773 		dm_attrname_t attrname;
   2774 
   2775 		/* Variation set up */
   2776 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2777 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2778 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   2779 		if ((rc = system(command)) == -1) {
   2780 			/* No clean up */
   2781 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   2782 			remove(DUMMY_FILE);
   2783 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   2784 			close(fd);
   2785 			remove(DUMMY_FILE);
   2786 		}
   2787 		if (fd == -1 || rc == -1) {
   2788 			DMLOG_PRINT(DMLVL_DEBUG,
   2789 				    "Unable to set up variation! (errno = %d)\n",
   2790 				    errno);
   2791 			DMVAR_SKIP();
   2792 		} else {
   2793 			/* Variation */
   2794 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
   2795 				    szFuncName);
   2796 			rc = dm_remove_dmattr(sid, (void *)INVALID_ADDR, hlen,
   2797 					      DM_NO_TOKEN, 0, &attrname);
   2798 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   2799 
   2800 			/* Variation clean up */
   2801 			rc = close(fd);
   2802 			rc |= remove(DUMMY_FILE);
   2803 			if (rc == -1) {
   2804 				DMLOG_PRINT(DMLVL_DEBUG,
   2805 					    "Unable to clean up variation! (errno = %d)\n",
   2806 					    errno);
   2807 			}
   2808 			dm_handle_free(hanp, hlen);
   2809 		}
   2810 	}
   2811 
   2812 	/*
   2813 	 * TEST    : dm_remove_dmattr - invalid hlen
   2814 	 * EXPECTED: rc = -1, errno = EBADF
   2815 	 */
   2816 	if (DMVAR_EXEC(REMOVE_DMATTR_BASE + 3)) {
   2817 		int fd;
   2818 		void *hanp;
   2819 		size_t hlen;
   2820 		dm_attrname_t attrname;
   2821 
   2822 		/* Variation set up */
   2823 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2824 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2825 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   2826 		if ((rc = system(command)) == -1) {
   2827 			/* No clean up */
   2828 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   2829 			remove(DUMMY_FILE);
   2830 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   2831 			close(fd);
   2832 			remove(DUMMY_FILE);
   2833 		}
   2834 		if (fd == -1 || rc == -1) {
   2835 			DMLOG_PRINT(DMLVL_DEBUG,
   2836 				    "Unable to set up variation! (errno = %d)\n",
   2837 				    errno);
   2838 			DMVAR_SKIP();
   2839 		} else {
   2840 			/* Variation */
   2841 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
   2842 				    szFuncName);
   2843 			rc = dm_remove_dmattr(sid, hanp, INVALID_ADDR,
   2844 					      DM_NO_TOKEN, 0, &attrname);
   2845 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   2846 
   2847 			/* Variation clean up */
   2848 			rc = close(fd);
   2849 			rc |= remove(DUMMY_FILE);
   2850 			if (rc == -1) {
   2851 				DMLOG_PRINT(DMLVL_DEBUG,
   2852 					    "Unable to clean up variation! (errno = %d)\n",
   2853 					    errno);
   2854 			}
   2855 			dm_handle_free(hanp, hlen);
   2856 		}
   2857 	}
   2858 
   2859 	/*
   2860 	 * TEST    : dm_remove_dmattr - invalid token
   2861 	 * EXPECTED: rc = -1, errno = EINVAL
   2862 	 */
   2863 	if (DMVAR_EXEC(REMOVE_DMATTR_BASE + 4)) {
   2864 		int fd;
   2865 		void *hanp;
   2866 		size_t hlen;
   2867 		dm_attrname_t attrname;
   2868 
   2869 		/* Variation set up */
   2870 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2871 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2872 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   2873 		if ((rc = system(command)) == -1) {
   2874 			/* No clean up */
   2875 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   2876 			remove(DUMMY_FILE);
   2877 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   2878 			close(fd);
   2879 			remove(DUMMY_FILE);
   2880 		}
   2881 		if (fd == -1 || rc == -1) {
   2882 			DMLOG_PRINT(DMLVL_DEBUG,
   2883 				    "Unable to set up variation! (errno = %d)\n",
   2884 				    errno);
   2885 			DMVAR_SKIP();
   2886 		} else {
   2887 			/* Variation */
   2888 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
   2889 				    szFuncName);
   2890 			rc = dm_remove_dmattr(sid, hanp, hlen, INVALID_ADDR, 0,
   2891 					      &attrname);
   2892 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   2893 
   2894 			/* Variation clean up */
   2895 			rc = close(fd);
   2896 			rc |= remove(DUMMY_FILE);
   2897 			if (rc == -1) {
   2898 				DMLOG_PRINT(DMLVL_DEBUG,
   2899 					    "Unable to clean up variation! (errno = %d)\n",
   2900 					    errno);
   2901 			}
   2902 			dm_handle_free(hanp, hlen);
   2903 		}
   2904 	}
   2905 
   2906 	/*
   2907 	 * TEST    : dm_remove_dmattr - invalid attrnamep
   2908 	 * EXPECTED: rc = -1, errno = EFAULT
   2909 	 */
   2910 	if (DMVAR_EXEC(REMOVE_DMATTR_BASE + 5)) {
   2911 		int fd;
   2912 		void *hanp;
   2913 		size_t hlen;
   2914 		dm_attrname_t attrname;
   2915 
   2916 		/* Variation set up */
   2917 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2918 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2919 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   2920 		if ((rc = system(command)) == -1) {
   2921 			/* No clean up */
   2922 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   2923 			remove(DUMMY_FILE);
   2924 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   2925 			close(fd);
   2926 			remove(DUMMY_FILE);
   2927 		}
   2928 		if (fd == -1 || rc == -1) {
   2929 			DMLOG_PRINT(DMLVL_DEBUG,
   2930 				    "Unable to set up variation! (errno = %d)\n",
   2931 				    errno);
   2932 			DMVAR_SKIP();
   2933 		} else {
   2934 			/* Variation */
   2935 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid attrnamep)\n",
   2936 				    szFuncName);
   2937 			rc = dm_remove_dmattr(sid, hanp, hlen, DM_NO_TOKEN, 0,
   2938 					      (dm_attrname_t *) INVALID_ADDR);
   2939 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   2940 
   2941 			/* Variation clean up */
   2942 			rc = close(fd);
   2943 			rc |= remove(DUMMY_FILE);
   2944 			if (rc == -1) {
   2945 				DMLOG_PRINT(DMLVL_DEBUG,
   2946 					    "Unable to clean up variation! (errno = %d)\n",
   2947 					    errno);
   2948 			}
   2949 			dm_handle_free(hanp, hlen);
   2950 		}
   2951 	}
   2952 
   2953 	/*
   2954 	 * TEST    : dm_remove_dmattr - attribute not exist
   2955 	 * EXPECTED: rc = -1, errno = ENOENT
   2956 	 */
   2957 	if (DMVAR_EXEC(REMOVE_DMATTR_BASE + 6)) {
   2958 		int fd;
   2959 		void *hanp;
   2960 		size_t hlen;
   2961 		dm_attrname_t attrname;
   2962 
   2963 		/* Variation set up */
   2964 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   2965 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   2966 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   2967 		if ((rc = system(command)) == -1) {
   2968 			/* No clean up */
   2969 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   2970 			remove(DUMMY_FILE);
   2971 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   2972 			close(fd);
   2973 			remove(DUMMY_FILE);
   2974 		}
   2975 		if (fd == -1 || rc == -1) {
   2976 			DMLOG_PRINT(DMLVL_DEBUG,
   2977 				    "Unable to set up variation! (errno = %d)\n",
   2978 				    errno);
   2979 			DMVAR_SKIP();
   2980 		} else {
   2981 			/* Variation */
   2982 			DMLOG_PRINT(DMLVL_DEBUG, "%s(attr not exist)\n",
   2983 				    szFuncName);
   2984 			rc = dm_remove_dmattr(sid, hanp, hlen, DM_NO_TOKEN, 0,
   2985 					      &attrname);
   2986 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, ENOENT);
   2987 
   2988 			/* Variation clean up */
   2989 			rc = close(fd);
   2990 			rc |= remove(DUMMY_FILE);
   2991 			if (rc == -1) {
   2992 				DMLOG_PRINT(DMLVL_DEBUG,
   2993 					    "Unable to clean up variation! (errno = %d)\n",
   2994 					    errno);
   2995 			}
   2996 			dm_handle_free(hanp, hlen);
   2997 		}
   2998 	}
   2999 
   3000 	/*
   3001 	 * TEST    : dm_remove_dmattr - file attribute, setdtime zero
   3002 	 * EXPECTED: rc = 0
   3003 	 */
   3004 	if (DMVAR_EXEC(REMOVE_DMATTR_BASE + 7)) {
   3005 		int fd;
   3006 		int rc2;
   3007 		void *hanp;
   3008 		size_t hlen;
   3009 		dm_attrname_t attrname;
   3010 		char buf[ATTR_VALUELEN];
   3011 		size_t rlen;
   3012 		struct stat statfs1, statfs2;
   3013 
   3014 		/* Variation set up */
   3015 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   3016 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   3017 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   3018 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   3019 		if ((rc = system(command)) == -1) {
   3020 			/* No clean up */
   3021 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   3022 			remove(DUMMY_FILE);
   3023 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   3024 			close(fd);
   3025 			remove(DUMMY_FILE);
   3026 		} else
   3027 		    if ((rc =
   3028 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   3029 				       0, sizeof(buf), buf)) == -1) {
   3030 			dm_handle_free(hanp, hlen);
   3031 			close(fd);
   3032 			remove(DUMMY_FILE);
   3033 		}
   3034 		if (fd == -1 || rc == -1) {
   3035 			DMLOG_PRINT(DMLVL_DEBUG,
   3036 				    "Unable to set up variation! (errno = %d)\n",
   3037 				    errno);
   3038 			DMVAR_SKIP();
   3039 		} else {
   3040 			/* Variation */
   3041 			rc2 = stat(DUMMY_FILE, &statfs1);
   3042 			TIMESTAMP_DELAY;
   3043 			DMLOG_PRINT(DMLVL_DEBUG,
   3044 				    "%s(file attr, setdtime zero)\n",
   3045 				    szFuncName);
   3046 			rc = dm_remove_dmattr(sid, hanp, hlen, DM_NO_TOKEN, 0,
   3047 					      &attrname);
   3048 			rc2 |= stat(DUMMY_FILE, &statfs2);
   3049 			if (rc == 0) {
   3050 				if (((rc =
   3051 				      dm_get_dmattr(sid, hanp, hlen,
   3052 						    DM_NO_TOKEN, &attrname,
   3053 						    sizeof(buf), buf,
   3054 						    &rlen)) == -1)
   3055 				    && (errno == ENOENT)) {
   3056 					if ((rc2 == 0)
   3057 					    && (statfs1.st_ctime ==
   3058 						statfs2.st_ctime)) {
   3059 						DMLOG_PRINT(DMLVL_DEBUG,
   3060 							    "%s passed with expected rc = %d and dtime unmodified\n",
   3061 							    szFuncName, 0);
   3062 						DMVAR_PASS();
   3063 					} else {
   3064 						DMLOG_PRINT(DMLVL_ERR,
   3065 							    "%s failed with expected rc = %d but dtime modified (%d vs %d)\n",
   3066 							    szFuncName, 0,
   3067 							    statfs1.st_ctime,
   3068 							    statfs2.st_ctime);
   3069 						DMVAR_FAIL();
   3070 					}
   3071 				} else {
   3072 					DMLOG_PRINT(DMLVL_ERR,
   3073 						    "%s failed with expected rc = %d but attr still exist (errno = %d)\n",
   3074 						    szFuncName, 0, errno);
   3075 					DMVAR_FAIL();
   3076 				}
   3077 			} else {
   3078 				DMLOG_PRINT(DMLVL_ERR,
   3079 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   3080 					    szFuncName, rc, errno);
   3081 				DMVAR_FAIL();
   3082 			}
   3083 
   3084 			/* Variation clean up */
   3085 			rc = close(fd);
   3086 			rc |= remove(DUMMY_FILE);
   3087 			if (rc == -1) {
   3088 				DMLOG_PRINT(DMLVL_DEBUG,
   3089 					    "Unable to clean up variation! (errno = %d)\n",
   3090 					    errno);
   3091 			}
   3092 			dm_handle_free(hanp, hlen);
   3093 		}
   3094 	}
   3095 
   3096 	/*
   3097 	 * TEST    : dm_remove_dmattr - file attribute, setdtime non-zero
   3098 	 * EXPECTED: rc = 0
   3099 	 */
   3100 	if (DMVAR_EXEC(REMOVE_DMATTR_BASE + 8)) {
   3101 		int fd;
   3102 		int rc2;
   3103 		void *hanp;
   3104 		size_t hlen;
   3105 		dm_attrname_t attrname;
   3106 		char buf[ATTR_VALUELEN];
   3107 		size_t rlen;
   3108 		struct stat statfs1, statfs2;
   3109 
   3110 		/* Variation set up */
   3111 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   3112 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   3113 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   3114 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   3115 		if ((rc = system(command)) == -1) {
   3116 			/* No clean up */
   3117 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   3118 			remove(DUMMY_FILE);
   3119 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   3120 			close(fd);
   3121 			remove(DUMMY_FILE);
   3122 		} else
   3123 		    if ((rc =
   3124 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   3125 				       0, sizeof(buf), buf)) == -1) {
   3126 			dm_handle_free(hanp, hlen);
   3127 			close(fd);
   3128 			remove(DUMMY_FILE);
   3129 		}
   3130 		if (fd == -1 || rc == -1) {
   3131 			DMLOG_PRINT(DMLVL_DEBUG,
   3132 				    "Unable to set up variation! (errno = %d)\n",
   3133 				    errno);
   3134 			DMVAR_SKIP();
   3135 		} else {
   3136 			/* Variation */
   3137 			rc2 = stat(DUMMY_FILE, &statfs1);
   3138 			TIMESTAMP_DELAY;
   3139 			DMLOG_PRINT(DMLVL_DEBUG,
   3140 				    "%s(file attr, setdtime non-zero)\n",
   3141 				    szFuncName);
   3142 			rc = dm_remove_dmattr(sid, hanp, hlen, DM_NO_TOKEN, 1,
   3143 					      &attrname);
   3144 			rc2 |= stat(DUMMY_FILE, &statfs2);
   3145 			if (rc == 0) {
   3146 				if (((rc =
   3147 				      dm_get_dmattr(sid, hanp, hlen,
   3148 						    DM_NO_TOKEN, &attrname,
   3149 						    sizeof(buf), buf,
   3150 						    &rlen)) == -1)
   3151 				    && (errno == ENOENT)) {
   3152 					if ((rc2 == 0)
   3153 					    && (statfs1.st_ctime !=
   3154 						statfs2.st_ctime)) {
   3155 						DMLOG_PRINT(DMLVL_DEBUG,
   3156 							    "%s passed with expected rc = %d and dtime modified\n",
   3157 							    szFuncName, 0);
   3158 						DMVAR_PASS();
   3159 					} else {
   3160 						DMLOG_PRINT(DMLVL_ERR,
   3161 							    "%s failed with expected rc = %d but dtime unmodified (%d vs %d)\n",
   3162 							    szFuncName, 0,
   3163 							    statfs1.st_ctime,
   3164 							    statfs2.st_ctime);
   3165 						DMVAR_FAIL();
   3166 					}
   3167 				} else {
   3168 					DMLOG_PRINT(DMLVL_ERR,
   3169 						    "%s failed with expected rc = %d but attr still exist (errno = %d)\n",
   3170 						    szFuncName, 0, errno);
   3171 					DMVAR_FAIL();
   3172 				}
   3173 			} else {
   3174 				DMLOG_PRINT(DMLVL_ERR,
   3175 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   3176 					    szFuncName, rc, errno);
   3177 				DMVAR_FAIL();
   3178 			}
   3179 
   3180 			/* Variation clean up */
   3181 			rc = close(fd);
   3182 			rc |= remove(DUMMY_FILE);
   3183 			if (rc == -1) {
   3184 				DMLOG_PRINT(DMLVL_DEBUG,
   3185 					    "Unable to clean up variation! (errno = %d)\n",
   3186 					    errno);
   3187 			}
   3188 			dm_handle_free(hanp, hlen);
   3189 		}
   3190 	}
   3191 
   3192 	/*
   3193 	 * TEST    : dm_remove_dmattr - directory attribute, setdtime zero
   3194 	 * EXPECTED: rc = 0
   3195 	 */
   3196 	if (DMVAR_EXEC(REMOVE_DMATTR_BASE + 9)) {
   3197 		int rc2;
   3198 		void *hanp;
   3199 		size_t hlen;
   3200 		dm_attrname_t attrname;
   3201 		char buf[ATTR_VALUELEN];
   3202 		size_t rlen;
   3203 		struct stat statfs1, statfs2;
   3204 
   3205 		/* Variation set up */
   3206 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   3207 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   3208 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   3209 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   3210 			/* No clean up */
   3211 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   3212 			   == -1) {
   3213 			rmdir(DUMMY_SUBDIR);
   3214 		} else
   3215 		    if ((rc =
   3216 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   3217 				       0, sizeof(buf), buf)) == -1) {
   3218 			dm_handle_free(hanp, hlen);
   3219 			rmdir(DUMMY_SUBDIR);
   3220 		}
   3221 		if (rc == -1) {
   3222 			DMLOG_PRINT(DMLVL_DEBUG,
   3223 				    "Unable to set up variation! (errno = %d)\n",
   3224 				    errno);
   3225 			DMVAR_SKIP();
   3226 		} else {
   3227 			/* Variation */
   3228 			rc2 = stat(DUMMY_SUBDIR, &statfs1);
   3229 			TIMESTAMP_DELAY;
   3230 			DMLOG_PRINT(DMLVL_DEBUG,
   3231 				    "%s(dir attr, setdtime zero)\n",
   3232 				    szFuncName);
   3233 			rc = dm_remove_dmattr(sid, hanp, hlen, DM_NO_TOKEN, 0,
   3234 					      &attrname);
   3235 			rc2 |= stat(DUMMY_SUBDIR, &statfs2);
   3236 			if (rc == 0) {
   3237 				if (((rc =
   3238 				      dm_get_dmattr(sid, hanp, hlen,
   3239 						    DM_NO_TOKEN, &attrname,
   3240 						    sizeof(buf), buf,
   3241 						    &rlen)) == -1)
   3242 				    && (errno == ENOENT)) {
   3243 					if ((rc2 == 0)
   3244 					    && (statfs1.st_ctime ==
   3245 						statfs2.st_ctime)) {
   3246 						DMLOG_PRINT(DMLVL_DEBUG,
   3247 							    "%s passed with expected rc = %d and dtime unmodified\n",
   3248 							    szFuncName, 0);
   3249 						DMVAR_PASS();
   3250 					} else {
   3251 						DMLOG_PRINT(DMLVL_ERR,
   3252 							    "%s failed with expected rc = %d but dtime modified (%d vs %d)\n",
   3253 							    szFuncName, 0,
   3254 							    statfs1.st_ctime,
   3255 							    statfs2.st_ctime);
   3256 						DMVAR_FAIL();
   3257 					}
   3258 				} else {
   3259 					DMLOG_PRINT(DMLVL_ERR,
   3260 						    "%s failed with expected rc = %d but attr still exist (errno = %d)\n",
   3261 						    szFuncName, 0, errno);
   3262 					DMVAR_FAIL();
   3263 				}
   3264 			} else {
   3265 				DMLOG_PRINT(DMLVL_ERR,
   3266 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   3267 					    szFuncName, rc, errno);
   3268 				DMVAR_FAIL();
   3269 			}
   3270 
   3271 			/* Variation clean up */
   3272 			rc = rmdir(DUMMY_SUBDIR);
   3273 			if (rc == -1) {
   3274 				DMLOG_PRINT(DMLVL_DEBUG,
   3275 					    "Unable to clean up variation! (errno = %d)\n",
   3276 					    errno);
   3277 			}
   3278 			dm_handle_free(hanp, hlen);
   3279 		}
   3280 	}
   3281 
   3282 	/*
   3283 	 * TEST    : dm_remove_dmattr - directory attribute, setdtime non-zero
   3284 	 * EXPECTED: rc = 0
   3285 	 */
   3286 	if (DMVAR_EXEC(REMOVE_DMATTR_BASE + 10)) {
   3287 		int rc2;
   3288 		void *hanp;
   3289 		size_t hlen;
   3290 		dm_attrname_t attrname;
   3291 		char buf[ATTR_VALUELEN];
   3292 		size_t rlen;
   3293 		struct stat statfs1, statfs2;
   3294 
   3295 		/* Variation set up */
   3296 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   3297 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   3298 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   3299 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   3300 			/* No clean up */
   3301 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   3302 			   == -1) {
   3303 			rmdir(DUMMY_SUBDIR);
   3304 		} else
   3305 		    if ((rc =
   3306 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   3307 				       0, sizeof(buf), buf)) == -1) {
   3308 			dm_handle_free(hanp, hlen);
   3309 			rmdir(DUMMY_SUBDIR);
   3310 		}
   3311 		if (rc == -1) {
   3312 			DMLOG_PRINT(DMLVL_DEBUG,
   3313 				    "Unable to set up variation! (errno = %d)\n",
   3314 				    errno);
   3315 			DMVAR_SKIP();
   3316 		} else {
   3317 			/* Variation */
   3318 			rc2 = stat(DUMMY_SUBDIR, &statfs1);
   3319 			TIMESTAMP_DELAY;
   3320 			DMLOG_PRINT(DMLVL_DEBUG,
   3321 				    "%s(dir attr, setdtime non-zero)\n",
   3322 				    szFuncName);
   3323 			rc = dm_remove_dmattr(sid, hanp, hlen, DM_NO_TOKEN, 1,
   3324 					      &attrname);
   3325 			rc2 |= stat(DUMMY_SUBDIR, &statfs2);
   3326 			if (rc == 0) {
   3327 				if (((rc =
   3328 				      dm_get_dmattr(sid, hanp, hlen,
   3329 						    DM_NO_TOKEN, &attrname,
   3330 						    sizeof(buf), buf,
   3331 						    &rlen)) == -1)
   3332 				    && (errno == ENOENT)) {
   3333 					if ((rc2 == 0)
   3334 					    && (statfs1.st_ctime !=
   3335 						statfs2.st_ctime)) {
   3336 						DMLOG_PRINT(DMLVL_DEBUG,
   3337 							    "%s passed with expected rc = %d and dtime modified\n",
   3338 							    szFuncName, 0);
   3339 						DMVAR_PASS();
   3340 					} else {
   3341 						DMLOG_PRINT(DMLVL_ERR,
   3342 							    "%s failed with expected rc = %d but dtime unmodified (%d vs %d)\n",
   3343 							    szFuncName, 0,
   3344 							    statfs1.st_ctime,
   3345 							    statfs2.st_ctime);
   3346 						DMVAR_FAIL();
   3347 					}
   3348 				} else {
   3349 					DMLOG_PRINT(DMLVL_ERR,
   3350 						    "%s failed with expected rc = %d but attr still exist (errno = %d)\n",
   3351 						    szFuncName, 0, errno);
   3352 					DMVAR_FAIL();
   3353 				}
   3354 			} else {
   3355 				DMLOG_PRINT(DMLVL_ERR,
   3356 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   3357 					    szFuncName, rc, errno);
   3358 				DMVAR_FAIL();
   3359 			}
   3360 
   3361 			/* Variation clean up */
   3362 			rc = rmdir(DUMMY_SUBDIR);
   3363 			if (rc == -1) {
   3364 				DMLOG_PRINT(DMLVL_DEBUG,
   3365 					    "Unable to clean up variation! (errno = %d)\n",
   3366 					    errno);
   3367 			}
   3368 			dm_handle_free(hanp, hlen);
   3369 		}
   3370 	}
   3371 
   3372 	/*
   3373 	 * TEST    : dm_remove_dmattr - fs handle
   3374 	 * EXPECTED: rc = -1, errno = EINVAL
   3375 	 */
   3376 	if (DMVAR_EXEC(REMOVE_DMATTR_BASE + 11)) {
   3377 		void *hanp;
   3378 		size_t hlen;
   3379 		dm_attrname_t attrname;
   3380 
   3381 		/* Variation set up */
   3382 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   3383 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   3384 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   3385 		if ((rc = system(command)) == -1) {
   3386 			/* No clean up */
   3387 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   3388 			   == -1) {
   3389 			remove(DUMMY_FILE);
   3390 		}
   3391 		if (rc == -1) {
   3392 			DMLOG_PRINT(DMLVL_DEBUG,
   3393 				    "Unable to set up variation! (errno = %d)\n",
   3394 				    errno);
   3395 			DMVAR_SKIP();
   3396 		} else {
   3397 			/* Variation */
   3398 			DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName);
   3399 			rc = dm_remove_dmattr(sid, hanp, hlen, DM_NO_TOKEN, 0,
   3400 					      &attrname);
   3401 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   3402 
   3403 			/* Variation clean up */
   3404 			rc = remove(DUMMY_FILE);
   3405 			if (rc == -1) {
   3406 				DMLOG_PRINT(DMLVL_DEBUG,
   3407 					    "Unable to clean up variation! (errno = %d)\n",
   3408 					    errno);
   3409 			}
   3410 			dm_handle_free(hanp, hlen);
   3411 		}
   3412 	}
   3413 
   3414 	/*
   3415 	 * TEST    : dm_remove_dmattr - DM_NO_SESSION sid
   3416 	 * EXPECTED: rc = -1, errno = EINVAL
   3417 	 */
   3418 	if (DMVAR_EXEC(REMOVE_DMATTR_BASE + 12)) {
   3419 		int fd;
   3420 		void *hanp;
   3421 		size_t hlen;
   3422 		dm_attrname_t attrname;
   3423 
   3424 		/* Variation set up */
   3425 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   3426 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   3427 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   3428 		if ((rc = system(command)) == -1) {
   3429 			/* No clean up */
   3430 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   3431 			remove(DUMMY_FILE);
   3432 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   3433 			close(fd);
   3434 			remove(DUMMY_FILE);
   3435 		}
   3436 		if (fd == -1 || rc == -1) {
   3437 			DMLOG_PRINT(DMLVL_DEBUG,
   3438 				    "Unable to set up variation! (errno = %d)\n",
   3439 				    errno);
   3440 			DMVAR_SKIP();
   3441 		} else {
   3442 			/* Variation */
   3443 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
   3444 				    szFuncName);
   3445 			rc = dm_remove_dmattr(DM_NO_SESSION, hanp, hlen,
   3446 					      DM_NO_TOKEN, 0, &attrname);
   3447 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   3448 
   3449 			/* Variation clean up */
   3450 			rc = close(fd);
   3451 			rc |= remove(DUMMY_FILE);
   3452 			if (rc == -1) {
   3453 				DMLOG_PRINT(DMLVL_DEBUG,
   3454 					    "Unable to clean up variation! (errno = %d)\n",
   3455 					    errno);
   3456 			}
   3457 			dm_handle_free(hanp, hlen);
   3458 		}
   3459 	}
   3460 
   3461 	/*
   3462 	 * TEST    : dm_remove_dmattr - global handle
   3463 	 * EXPECTED: rc = -1, errno = EBADF
   3464 	 */
   3465 	if (DMVAR_EXEC(REMOVE_DMATTR_BASE + 13)) {
   3466 		dm_attrname_t attrname;
   3467 		char buf[ATTR_VALUELEN];
   3468 
   3469 		/* Variation set up */
   3470 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   3471 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   3472 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   3473 
   3474 		/* Variation */
   3475 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
   3476 		rc = dm_remove_dmattr(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN,
   3477 				      DM_NO_TOKEN, 0, &attrname);
   3478 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   3479 
   3480 		/* Variation clean up */
   3481 	}
   3482 
   3483 	/*
   3484 	 * TEST    : dm_remove_dmattr - invalidated handle
   3485 	 * EXPECTED: rc = -1, errno = EBADF
   3486 	 */
   3487 	if (DMVAR_EXEC(REMOVE_DMATTR_BASE + 14)) {
   3488 		int fd;
   3489 		void *hanp;
   3490 		size_t hlen;
   3491 		dm_attrname_t attrname;
   3492 		char buf[ATTR_VALUELEN];
   3493 
   3494 		/* Variation set up */
   3495 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   3496 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   3497 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   3498 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   3499 		if ((rc = system(command)) == -1) {
   3500 			/* No clean up */
   3501 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   3502 			remove(DUMMY_FILE);
   3503 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   3504 			close(fd);
   3505 			remove(DUMMY_FILE);
   3506 		} else
   3507 		    if ((rc =
   3508 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   3509 				       0, sizeof(buf), buf)) == -1) {
   3510 			dm_handle_free(hanp, hlen);
   3511 			close(fd);
   3512 			remove(DUMMY_FILE);
   3513 		} else if ((rc = close(fd)) == -1) {
   3514 			dm_handle_free(hanp, hlen);
   3515 			remove(DUMMY_FILE);
   3516 		} else if ((rc = remove(DUMMY_FILE)) == -1) {
   3517 			dm_handle_free(hanp, hlen);
   3518 		}
   3519 		if (fd == -1 || rc == -1) {
   3520 			DMLOG_PRINT(DMLVL_DEBUG,
   3521 				    "Unable to set up variation! (errno = %d)\n",
   3522 				    errno);
   3523 			DMVAR_SKIP();
   3524 		} else {
   3525 			/* Variation */
   3526 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated handle)\n",
   3527 				    szFuncName);
   3528 			rc = dm_remove_dmattr(sid, hanp, hlen, DM_NO_TOKEN, 0,
   3529 					      &attrname);
   3530 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   3531 
   3532 			/* Variation clean up */
   3533 			dm_handle_free(hanp, hlen);
   3534 		}
   3535 	}
   3536 
   3537 	szFuncName = "dm_getall_dmattr";
   3538 
   3539 	/*
   3540 	 * TEST    : dm_getall_dmattr - invalid sid
   3541 	 * EXPECTED: rc = -1, errno = EINVAL
   3542 	 */
   3543 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 1)) {
   3544 		int fd;
   3545 		void *hanp;
   3546 		size_t hlen;
   3547 		dm_attrname_t attrname;
   3548 		char buf[ATTR_LISTLEN];
   3549 		size_t rlen;
   3550 
   3551 		/* Variation set up */
   3552 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   3553 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   3554 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   3555 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   3556 		if ((rc = system(command)) == -1) {
   3557 			/* No clean up */
   3558 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   3559 			remove(DUMMY_FILE);
   3560 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   3561 			close(fd);
   3562 			remove(DUMMY_FILE);
   3563 		} else
   3564 		    if ((rc =
   3565 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   3566 				       0, sizeof(buf), buf)) == -1) {
   3567 			dm_handle_free(hanp, hlen);
   3568 			close(fd);
   3569 			remove(DUMMY_FILE);
   3570 		}
   3571 		if (fd == -1 || rc == -1) {
   3572 			DMLOG_PRINT(DMLVL_DEBUG,
   3573 				    "Unable to set up variation! (errno = %d)\n",
   3574 				    errno);
   3575 			DMVAR_SKIP();
   3576 		} else {
   3577 			/* Variation */
   3578 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
   3579 				    szFuncName);
   3580 			rc = dm_getall_dmattr(INVALID_ADDR, hanp, hlen,
   3581 					      DM_NO_TOKEN, sizeof(buf), buf,
   3582 					      &rlen);
   3583 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   3584 
   3585 			/* Variation clean up */
   3586 			rc = close(fd);
   3587 			rc |= remove(DUMMY_FILE);
   3588 			if (rc == -1) {
   3589 				DMLOG_PRINT(DMLVL_DEBUG,
   3590 					    "Unable to clean up variation! (errno = %d)\n",
   3591 					    errno);
   3592 			}
   3593 			dm_handle_free(hanp, hlen);
   3594 		}
   3595 	}
   3596 
   3597 	/*
   3598 	 * TEST    : dm_getall_dmattr - invalid hanp
   3599 	 * EXPECTED: rc = -1, errno = EFAULT
   3600 	 */
   3601 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 2)) {
   3602 		int fd;
   3603 		void *hanp;
   3604 		size_t hlen;
   3605 		dm_attrname_t attrname;
   3606 		char buf[ATTR_LISTLEN];
   3607 		size_t rlen;
   3608 
   3609 		/* Variation set up */
   3610 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   3611 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   3612 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   3613 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   3614 		if ((rc = system(command)) == -1) {
   3615 			/* No clean up */
   3616 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   3617 			remove(DUMMY_FILE);
   3618 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   3619 			close(fd);
   3620 			remove(DUMMY_FILE);
   3621 		} else
   3622 		    if ((rc =
   3623 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   3624 				       0, sizeof(buf), buf)) == -1) {
   3625 			dm_handle_free(hanp, hlen);
   3626 			close(fd);
   3627 			remove(DUMMY_FILE);
   3628 		}
   3629 		if (fd == -1 || rc == -1) {
   3630 			DMLOG_PRINT(DMLVL_DEBUG,
   3631 				    "Unable to set up variation! (errno = %d)\n",
   3632 				    errno);
   3633 			DMVAR_SKIP();
   3634 		} else {
   3635 			/* Variation */
   3636 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
   3637 				    szFuncName);
   3638 			rc = dm_getall_dmattr(sid, (void *)INVALID_ADDR, hlen,
   3639 					      DM_NO_TOKEN, sizeof(buf), buf,
   3640 					      &rlen);
   3641 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   3642 
   3643 			/* Variation clean up */
   3644 			rc = close(fd);
   3645 			rc |= remove(DUMMY_FILE);
   3646 			if (rc == -1) {
   3647 				DMLOG_PRINT(DMLVL_DEBUG,
   3648 					    "Unable to clean up variation! (errno = %d)\n",
   3649 					    errno);
   3650 			}
   3651 			dm_handle_free(hanp, hlen);
   3652 		}
   3653 	}
   3654 
   3655 	/*
   3656 	 * TEST    : dm_getall_dmattr - invalid hlen
   3657 	 * EXPECTED: rc = -1, errno = EBADF
   3658 	 */
   3659 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 3)) {
   3660 		int fd;
   3661 		void *hanp;
   3662 		size_t hlen;
   3663 		dm_attrname_t attrname;
   3664 		char buf[ATTR_LISTLEN];
   3665 		size_t rlen;
   3666 
   3667 		/* Variation set up */
   3668 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   3669 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   3670 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   3671 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   3672 		if ((rc = system(command)) == -1) {
   3673 			/* No clean up */
   3674 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   3675 			remove(DUMMY_FILE);
   3676 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   3677 			close(fd);
   3678 			remove(DUMMY_FILE);
   3679 		} else
   3680 		    if ((rc =
   3681 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   3682 				       0, sizeof(buf), buf)) == -1) {
   3683 			dm_handle_free(hanp, hlen);
   3684 			close(fd);
   3685 			remove(DUMMY_FILE);
   3686 		}
   3687 		if (fd == -1 || rc == -1) {
   3688 			DMLOG_PRINT(DMLVL_DEBUG,
   3689 				    "Unable to set up variation! (errno = %d)\n",
   3690 				    errno);
   3691 			DMVAR_SKIP();
   3692 		} else {
   3693 			/* Variation */
   3694 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
   3695 				    szFuncName);
   3696 			rc = dm_getall_dmattr(sid, hanp, INVALID_ADDR,
   3697 					      DM_NO_TOKEN, sizeof(buf), buf,
   3698 					      &rlen);
   3699 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   3700 
   3701 			/* Variation clean up */
   3702 			rc = close(fd);
   3703 			rc |= remove(DUMMY_FILE);
   3704 			if (rc == -1) {
   3705 				DMLOG_PRINT(DMLVL_DEBUG,
   3706 					    "Unable to clean up variation! (errno = %d)\n",
   3707 					    errno);
   3708 			}
   3709 			dm_handle_free(hanp, hlen);
   3710 		}
   3711 	}
   3712 
   3713 	/*
   3714 	 * TEST    : dm_getall_dmattr - invalid token
   3715 	 * EXPECTED: rc = -1, errno = EINVAL
   3716 	 */
   3717 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 4)) {
   3718 		int fd;
   3719 		void *hanp;
   3720 		size_t hlen;
   3721 		dm_attrname_t attrname;
   3722 		char buf[ATTR_LISTLEN];
   3723 		size_t rlen;
   3724 
   3725 		/* Variation set up */
   3726 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   3727 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   3728 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   3729 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   3730 		if ((rc = system(command)) == -1) {
   3731 			/* No clean up */
   3732 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   3733 			remove(DUMMY_FILE);
   3734 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   3735 			close(fd);
   3736 			remove(DUMMY_FILE);
   3737 		} else
   3738 		    if ((rc =
   3739 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   3740 				       0, sizeof(buf), buf)) == -1) {
   3741 			dm_handle_free(hanp, hlen);
   3742 			close(fd);
   3743 			remove(DUMMY_FILE);
   3744 		}
   3745 		if (fd == -1 || rc == -1) {
   3746 			DMLOG_PRINT(DMLVL_DEBUG,
   3747 				    "Unable to set up variation! (errno = %d)\n",
   3748 				    errno);
   3749 			DMVAR_SKIP();
   3750 		} else {
   3751 			/* Variation */
   3752 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
   3753 				    szFuncName);
   3754 			rc = dm_getall_dmattr(sid, hanp, hlen, INVALID_ADDR,
   3755 					      sizeof(buf), buf, &rlen);
   3756 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   3757 
   3758 			/* Variation clean up */
   3759 			rc = close(fd);
   3760 			rc |= remove(DUMMY_FILE);
   3761 			if (rc == -1) {
   3762 				DMLOG_PRINT(DMLVL_DEBUG,
   3763 					    "Unable to clean up variation! (errno = %d)\n",
   3764 					    errno);
   3765 			}
   3766 			dm_handle_free(hanp, hlen);
   3767 		}
   3768 	}
   3769 
   3770 	/*
   3771 	 * TEST    : dm_getall_dmattr - invalid buflen
   3772 	 * EXPECTED: rc = -1, errno = E2BIG
   3773 	 */
   3774 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 5)) {
   3775 		int fd;
   3776 		void *hanp;
   3777 		size_t hlen;
   3778 		dm_attrname_t attrname;
   3779 		char buf[ATTR_LISTLEN];
   3780 		size_t rlen;
   3781 
   3782 		/* Variation set up */
   3783 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   3784 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   3785 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   3786 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   3787 		if ((rc = system(command)) == -1) {
   3788 			/* No clean up */
   3789 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   3790 			remove(DUMMY_FILE);
   3791 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   3792 			close(fd);
   3793 			remove(DUMMY_FILE);
   3794 		} else
   3795 		    if ((rc =
   3796 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   3797 				       0, sizeof(buf), buf)) == -1) {
   3798 			dm_handle_free(hanp, hlen);
   3799 			close(fd);
   3800 			remove(DUMMY_FILE);
   3801 		}
   3802 		if (fd == -1 || rc == -1) {
   3803 			DMLOG_PRINT(DMLVL_DEBUG,
   3804 				    "Unable to set up variation! (errno = %d)\n",
   3805 				    errno);
   3806 			DMVAR_SKIP();
   3807 		} else {
   3808 			/* Variation */
   3809 			DMLOG_PRINT(DMLVL_DEBUG, "%s(buflen too small)\n",
   3810 				    szFuncName);
   3811 			rc = dm_getall_dmattr(sid, hanp, hlen, DM_NO_TOKEN, 1,
   3812 					      buf, &rlen);
   3813 			if (rc == -1 && errno == E2BIG) {
   3814 				DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen);
   3815 			}
   3816 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, E2BIG);
   3817 
   3818 			/* Variation clean up */
   3819 			rc = close(fd);
   3820 			rc |= remove(DUMMY_FILE);
   3821 			if (rc == -1) {
   3822 				DMLOG_PRINT(DMLVL_DEBUG,
   3823 					    "Unable to clean up variation! (errno = %d)\n",
   3824 					    errno);
   3825 			}
   3826 			dm_handle_free(hanp, hlen);
   3827 		}
   3828 	}
   3829 
   3830 	/*
   3831 	 * TEST    : dm_getall_dmattr - invalid bufp
   3832 	 * EXPECTED: rc = -1, errno = EFAULT
   3833 	 */
   3834 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 6)) {
   3835 		int fd;
   3836 		void *hanp;
   3837 		size_t hlen;
   3838 		dm_attrname_t attrname;
   3839 		char buf[ATTR_LISTLEN];
   3840 		size_t rlen;
   3841 
   3842 		/* Variation set up */
   3843 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   3844 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   3845 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   3846 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   3847 		if ((rc = system(command)) == -1) {
   3848 			/* No clean up */
   3849 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   3850 			remove(DUMMY_FILE);
   3851 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   3852 			close(fd);
   3853 			remove(DUMMY_FILE);
   3854 		} else
   3855 		    if ((rc =
   3856 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   3857 				       0, sizeof(buf), buf)) == -1) {
   3858 			dm_handle_free(hanp, hlen);
   3859 			close(fd);
   3860 			remove(DUMMY_FILE);
   3861 		}
   3862 		if (fd == -1 || rc == -1) {
   3863 			DMLOG_PRINT(DMLVL_DEBUG,
   3864 				    "Unable to set up variation! (errno = %d)\n",
   3865 				    errno);
   3866 			DMVAR_SKIP();
   3867 		} else {
   3868 			/* Variation */
   3869 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid bufp)\n",
   3870 				    szFuncName);
   3871 			rc = dm_getall_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   3872 					      sizeof(buf), (void *)INVALID_ADDR,
   3873 					      &rlen);
   3874 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   3875 
   3876 			/* Variation clean up */
   3877 			rc = close(fd);
   3878 			rc |= remove(DUMMY_FILE);
   3879 			if (rc == -1) {
   3880 				DMLOG_PRINT(DMLVL_DEBUG,
   3881 					    "Unable to clean up variation! (errno = %d)\n",
   3882 					    errno);
   3883 			}
   3884 			dm_handle_free(hanp, hlen);
   3885 		}
   3886 	}
   3887 
   3888 	/*
   3889 	 * TEST    : dm_getall_dmattr - invalid rlenp
   3890 	 * EXPECTED: rc = -1, errno = EFAULT
   3891 	 */
   3892 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 7)) {
   3893 		int fd;
   3894 		void *hanp;
   3895 		size_t hlen;
   3896 		dm_attrname_t attrname;
   3897 		char buf[ATTR_LISTLEN];
   3898 
   3899 		/* Variation set up */
   3900 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   3901 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   3902 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   3903 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   3904 		if ((rc = system(command)) == -1) {
   3905 			/* No clean up */
   3906 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   3907 			remove(DUMMY_FILE);
   3908 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   3909 			close(fd);
   3910 			remove(DUMMY_FILE);
   3911 		} else
   3912 		    if ((rc =
   3913 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   3914 				       0, sizeof(buf), buf)) == -1) {
   3915 			dm_handle_free(hanp, hlen);
   3916 			close(fd);
   3917 			remove(DUMMY_FILE);
   3918 		}
   3919 		if (fd == -1 || rc == -1) {
   3920 			DMLOG_PRINT(DMLVL_DEBUG,
   3921 				    "Unable to set up variation! (errno = %d)\n",
   3922 				    errno);
   3923 			DMVAR_SKIP();
   3924 		} else {
   3925 			/* Variation */
   3926 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid rlenp)\n",
   3927 				    szFuncName);
   3928 			rc = dm_getall_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   3929 					      sizeof(buf), buf,
   3930 					      (size_t *) INVALID_ADDR);
   3931 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   3932 
   3933 			/* Variation clean up */
   3934 			rc = close(fd);
   3935 			rc |= remove(DUMMY_FILE);
   3936 			if (rc == -1) {
   3937 				DMLOG_PRINT(DMLVL_DEBUG,
   3938 					    "Unable to clean up variation! (errno = %d)\n",
   3939 					    errno);
   3940 			}
   3941 			dm_handle_free(hanp, hlen);
   3942 		}
   3943 	}
   3944 
   3945 	/*
   3946 	 * TEST    : dm_getall_dmattr - no file attribute
   3947 	 * EXPECTED: rc = 0
   3948 	 */
   3949 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 8)) {
   3950 		int fd;
   3951 		void *hanp;
   3952 		size_t hlen;
   3953 		dm_attrname_t attrname;
   3954 		char buf[ATTR_LISTLEN];
   3955 		size_t rlen;
   3956 
   3957 		/* Variation set up */
   3958 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   3959 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   3960 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   3961 		if ((rc = system(command)) == -1) {
   3962 			/* No clean up */
   3963 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   3964 			remove(DUMMY_FILE);
   3965 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   3966 			close(fd);
   3967 			remove(DUMMY_FILE);
   3968 		}
   3969 		if (fd == -1 || rc == -1) {
   3970 			DMLOG_PRINT(DMLVL_DEBUG,
   3971 				    "Unable to set up variation! (errno = %d)\n",
   3972 				    errno);
   3973 			DMVAR_SKIP();
   3974 		} else {
   3975 			/* Variation */
   3976 			DMLOG_PRINT(DMLVL_DEBUG, "%s(no file attr)\n",
   3977 				    szFuncName);
   3978 			rc = dm_getall_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   3979 					      sizeof(buf), buf, &rlen);
   3980 			if (rc == 0) {
   3981 				DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen);
   3982 				if (rlen == 0) {
   3983 					DMLOG_PRINT(DMLVL_DEBUG,
   3984 						    "%s passed with expected rc = %d\n",
   3985 						    szFuncName, 0);
   3986 					DMVAR_PASS();
   3987 				} else {
   3988 					DMLOG_PRINT(DMLVL_ERR,
   3989 						    "%s failed with expected rc = %d but unexpected rlen %d\n",
   3990 						    szFuncName, 0, rlen);
   3991 					DMVAR_FAIL();
   3992 				}
   3993 			} else {
   3994 				DMLOG_PRINT(DMLVL_ERR,
   3995 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   3996 					    szFuncName, rc, errno);
   3997 				DMVAR_FAIL();
   3998 			}
   3999 
   4000 			/* Variation clean up */
   4001 			rc = close(fd);
   4002 			rc |= remove(DUMMY_FILE);
   4003 			if (rc == -1) {
   4004 				DMLOG_PRINT(DMLVL_DEBUG,
   4005 					    "Unable to clean up variation! (errno = %d)\n",
   4006 					    errno);
   4007 			}
   4008 			dm_handle_free(hanp, hlen);
   4009 		}
   4010 	}
   4011 
   4012 	/*
   4013 	 * TEST    : dm_getall_dmattr - one file attribute
   4014 	 * EXPECTED: rc = 0
   4015 	 */
   4016 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 9)) {
   4017 		int fd;
   4018 		void *hanp;
   4019 		size_t hlen;
   4020 		dm_attrname_t attrname;
   4021 		char buf[ATTR_LISTLEN];
   4022 		size_t rlen;
   4023 
   4024 		/* Variation set up */
   4025 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   4026 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   4027 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   4028 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   4029 		if ((rc = system(command)) == -1) {
   4030 			/* No clean up */
   4031 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   4032 			remove(DUMMY_FILE);
   4033 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   4034 			close(fd);
   4035 			remove(DUMMY_FILE);
   4036 		} else
   4037 		    if ((rc =
   4038 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   4039 				       0, ATTR_VALUELEN, buf)) == -1) {
   4040 			dm_handle_free(hanp, hlen);
   4041 			close(fd);
   4042 			remove(DUMMY_FILE);
   4043 		}
   4044 		if (fd == -1 || rc == -1) {
   4045 			DMLOG_PRINT(DMLVL_DEBUG,
   4046 				    "Unable to set up variation! (errno = %d)\n",
   4047 				    errno);
   4048 			DMVAR_SKIP();
   4049 		} else {
   4050 			/* Variation */
   4051 			DMLOG_PRINT(DMLVL_DEBUG, "%s(one file attr)\n",
   4052 				    szFuncName);
   4053 			rc = dm_getall_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   4054 					      sizeof(buf), buf, &rlen);
   4055 			if (rc == 0) {
   4056 				DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen);
   4057 				LogDmAttrs((dm_attrlist_t *) buf);
   4058 				if (rlen ==
   4059 				    DWALIGN(sizeof(dm_attrlist_t) +
   4060 					    ATTR_VALUELEN)) {
   4061 					DMLOG_PRINT(DMLVL_DEBUG,
   4062 						    "%s passed with expected rc = %d\n",
   4063 						    szFuncName, 0);
   4064 					DMVAR_PASS();
   4065 				} else {
   4066 					DMLOG_PRINT(DMLVL_ERR,
   4067 						    "%s failed with expected rc = %d but unexpected rlen %d\n",
   4068 						    szFuncName, 0, rlen);
   4069 					DMVAR_FAIL();
   4070 				}
   4071 			} else {
   4072 				DMLOG_PRINT(DMLVL_ERR,
   4073 					    "%s failed with unexpected rc = %d (errno = %d) %d\n",
   4074 					    szFuncName, rc, errno, rlen);
   4075 				DMVAR_FAIL();
   4076 			}
   4077 
   4078 			/* Variation clean up */
   4079 			rc = close(fd);
   4080 			rc |= remove(DUMMY_FILE);
   4081 			if (rc == -1) {
   4082 				DMLOG_PRINT(DMLVL_DEBUG,
   4083 					    "Unable to clean up variation! (errno = %d)\n",
   4084 					    errno);
   4085 			}
   4086 			dm_handle_free(hanp, hlen);
   4087 		}
   4088 	}
   4089 
   4090 	/*
   4091 	 * TEST    : dm_getall_dmattr - two file attributes
   4092 	 * EXPECTED: rc = 0
   4093 	 */
   4094 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 10)) {
   4095 		int fd;
   4096 		void *hanp;
   4097 		size_t hlen;
   4098 		dm_attrname_t attrname;
   4099 		char buf[ATTR_LISTLEN];
   4100 		size_t rlen;
   4101 
   4102 		/* Variation set up */
   4103 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   4104 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   4105 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   4106 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   4107 		if ((rc = system(command)) == -1) {
   4108 			/* No clean up */
   4109 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   4110 			remove(DUMMY_FILE);
   4111 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   4112 			close(fd);
   4113 			remove(DUMMY_FILE);
   4114 		} else
   4115 		    if (((rc =
   4116 			  dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   4117 					0, ATTR_VALUELEN, buf)) == -1)
   4118 			|| (memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE) ==
   4119 			    NULL)
   4120 			||
   4121 			(memcpy
   4122 			 (attrname.an_chars, ATTR_NAME2,
   4123 			  DM_ATTR_NAME_SIZE) == NULL)
   4124 			||
   4125 			((rc =
   4126 			  dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   4127 					0, ATTR_VALUELEN, buf)) == -1)) {
   4128 			dm_handle_free(hanp, hlen);
   4129 			close(fd);
   4130 			remove(DUMMY_FILE);
   4131 		}
   4132 		if (fd == -1 || rc == -1) {
   4133 			DMLOG_PRINT(DMLVL_DEBUG,
   4134 				    "Unable to set up variation! (errno = %d)\n",
   4135 				    errno);
   4136 			DMVAR_SKIP();
   4137 		} else {
   4138 			/* Variation */
   4139 			DMLOG_PRINT(DMLVL_DEBUG, "%s(two file attr)\n",
   4140 				    szFuncName);
   4141 			rc = dm_getall_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   4142 					      sizeof(buf), buf, &rlen);
   4143 			if (rc == 0) {
   4144 				DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen);
   4145 				LogDmAttrs((dm_attrlist_t *) buf);
   4146 				if (rlen ==
   4147 				    2 * DWALIGN(sizeof(dm_attrlist_t) +
   4148 						ATTR_VALUELEN)) {
   4149 					DMLOG_PRINT(DMLVL_DEBUG,
   4150 						    "%s passed with expected rc = %d\n",
   4151 						    szFuncName, 0);
   4152 					DMVAR_PASS();
   4153 				} else {
   4154 					DMLOG_PRINT(DMLVL_ERR,
   4155 						    "%s failed with expected rc = %d but unexpected rlen %d\n",
   4156 						    szFuncName, 0, rlen);
   4157 					DMVAR_FAIL();
   4158 				}
   4159 			} else {
   4160 				DMLOG_PRINT(DMLVL_ERR,
   4161 					    "%s failed with unexpected rc = %d (errno = %d) %d\n",
   4162 					    szFuncName, rc, errno, rlen);
   4163 				DMVAR_FAIL();
   4164 			}
   4165 
   4166 			/* Variation clean up */
   4167 			rc = close(fd);
   4168 			rc |= remove(DUMMY_FILE);
   4169 			if (rc == -1) {
   4170 				DMLOG_PRINT(DMLVL_DEBUG,
   4171 					    "Unable to clean up variation! (errno = %d)\n",
   4172 					    errno);
   4173 			}
   4174 			dm_handle_free(hanp, hlen);
   4175 		}
   4176 	}
   4177 
   4178 	/*
   4179 	 * TEST    : dm_getall_dmattr - multiple file attributes
   4180 	 * EXPECTED: rc = 0
   4181 	 */
   4182 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 11)) {
   4183 		int fd;
   4184 		void *hanp;
   4185 		size_t hlen;
   4186 		dm_attrname_t attrname;
   4187 		char buf[ATTR_LISTLEN];
   4188 		size_t rlen;
   4189 		size_t len;
   4190 		size_t totlen;
   4191 		int i;
   4192 		void *totbuf;
   4193 
   4194 		/* Variation set up */
   4195 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   4196 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   4197 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   4198 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   4199 		if ((rc = system(command)) == -1) {
   4200 			/* No clean up */
   4201 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   4202 			remove(DUMMY_FILE);
   4203 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   4204 			close(fd);
   4205 			remove(DUMMY_FILE);
   4206 		}
   4207 		for (i = 0, len = 0, totlen = 0; i < NUM_ATTRS && rc == 0; i++) {
   4208 			memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   4209 			memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   4210 			attrname.an_chars[DM_ATTR_NAME_SIZE - 2] =
   4211 			    '0' + (i / 10);
   4212 			attrname.an_chars[DM_ATTR_NAME_SIZE - 1] =
   4213 			    '0' + (i % 10);
   4214 			memcpy(buf + len, DUMMY_STRING, DUMMY_STRLEN);
   4215 			len += DUMMY_STRLEN;
   4216 			totlen += DWALIGN(len + sizeof(dm_attrlist_t));
   4217 			rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   4218 					   &attrname, 0, len, buf);
   4219 		}
   4220 		if (rc != -1) {
   4221 			if ((totbuf = malloc(totlen)) == NULL) {
   4222 				close(fd);
   4223 				remove(DUMMY_FILE);
   4224 			}
   4225 		}
   4226 		if (fd == -1 || rc == -1 || totbuf == NULL) {
   4227 			DMLOG_PRINT(DMLVL_DEBUG,
   4228 				    "Unable to set up variation! (errno = %d)\n",
   4229 				    errno);
   4230 			DMVAR_SKIP();
   4231 		} else {
   4232 			/* Variation */
   4233 			DMLOG_PRINT(DMLVL_DEBUG, "%s(%d file attr)\n",
   4234 				    szFuncName, NUM_ATTRS);
   4235 			rc = dm_getall_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   4236 					      totlen, totbuf, &rlen);
   4237 			if (rc == 0) {
   4238 				DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen);
   4239 				LogDmAttrs((dm_attrlist_t *) totbuf);
   4240 				if (rlen == totlen) {
   4241 					DMLOG_PRINT(DMLVL_DEBUG,
   4242 						    "%s passed with expected rc = %d\n",
   4243 						    szFuncName, 0);
   4244 					DMVAR_PASS();
   4245 				} else {
   4246 					DMLOG_PRINT(DMLVL_ERR,
   4247 						    "%s failed with expected rc = %d but unexpected rlen %d\n",
   4248 						    szFuncName, 0, rlen);
   4249 					DMVAR_FAIL();
   4250 				}
   4251 			} else {
   4252 				DMLOG_PRINT(DMLVL_ERR,
   4253 					    "%s failed with unexpected rc = %d (errno = %d) %d\n",
   4254 					    szFuncName, rc, errno, rlen);
   4255 				DMVAR_FAIL();
   4256 			}
   4257 
   4258 			/* Variation clean up */
   4259 			rc = close(fd);
   4260 			rc |= remove(DUMMY_FILE);
   4261 			if (rc == -1) {
   4262 				DMLOG_PRINT(DMLVL_DEBUG,
   4263 					    "Unable to clean up variation! (errno = %d)\n",
   4264 					    errno);
   4265 			}
   4266 			free(totbuf);
   4267 			dm_handle_free(hanp, hlen);
   4268 		}
   4269 	}
   4270 
   4271 	/*
   4272 	 * TEST    : dm_getall_dmattr - one file attribute with non-DM attribute
   4273 	 * EXPECTED: rc = 0
   4274 	 */
   4275 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 12)) {
   4276 		int fd;
   4277 		void *hanp;
   4278 		size_t hlen;
   4279 		dm_attrname_t attrname;
   4280 		char buf[ATTR_LISTLEN];
   4281 		size_t rlen;
   4282 
   4283 		/* Variation set up */
   4284 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   4285 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   4286 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   4287 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   4288 		if ((rc = system(command)) == -1) {
   4289 			/* No clean up */
   4290 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   4291 			remove(DUMMY_FILE);
   4292 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   4293 			close(fd);
   4294 			remove(DUMMY_FILE);
   4295 		} else
   4296 		    if (((rc =
   4297 			  dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   4298 					0, ATTR_VALUELEN, buf)) == -1)
   4299 			||
   4300 			((rc =
   4301 			  setxattr(DUMMY_FILE, NON_DM_ATTR_NAME,
   4302 				   NON_DM_ATTR_VALUE, sizeof(NON_DM_ATTR_VALUE),
   4303 				   0)) == -1)) {
   4304 			dm_handle_free(hanp, hlen);
   4305 			close(fd);
   4306 			remove(DUMMY_FILE);
   4307 		}
   4308 		if (fd == -1 || rc == -1) {
   4309 			DMLOG_PRINT(DMLVL_DEBUG,
   4310 				    "Unable to set up variation! (errno = %d)\n",
   4311 				    errno);
   4312 			DMVAR_SKIP();
   4313 		} else {
   4314 			/* Variation */
   4315 			DMLOG_PRINT(DMLVL_DEBUG,
   4316 				    "%s(one file attr with non-DM attr)\n",
   4317 				    szFuncName);
   4318 			rc = dm_getall_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   4319 					      sizeof(buf), buf, &rlen);
   4320 			if (rc == 0) {
   4321 				DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen);
   4322 				LogDmAttrs((dm_attrlist_t *) buf);
   4323 				if (rlen ==
   4324 				    DWALIGN(sizeof(dm_attrlist_t) +
   4325 					    ATTR_VALUELEN)) {
   4326 					DMLOG_PRINT(DMLVL_DEBUG,
   4327 						    "%s passed with expected rc = %d\n",
   4328 						    szFuncName, 0);
   4329 					DMVAR_PASS();
   4330 				} else {
   4331 					DMLOG_PRINT(DMLVL_ERR,
   4332 						    "%s failed with expected rc = %d but unexpected rlen %d\n",
   4333 						    szFuncName, 0, rlen);
   4334 					DMVAR_FAIL();
   4335 				}
   4336 			} else {
   4337 				DMLOG_PRINT(DMLVL_ERR,
   4338 					    "%s failed with unexpected rc = %d (errno = %d) %d\n",
   4339 					    szFuncName, rc, errno, rlen);
   4340 				DMVAR_FAIL();
   4341 			}
   4342 
   4343 			/* Variation clean up */
   4344 			rc = close(fd);
   4345 			rc |= remove(DUMMY_FILE);
   4346 			if (rc == -1) {
   4347 				DMLOG_PRINT(DMLVL_DEBUG,
   4348 					    "Unable to clean up variation! (errno = %d)\n",
   4349 					    errno);
   4350 			}
   4351 			dm_handle_free(hanp, hlen);
   4352 		}
   4353 	}
   4354 
   4355 	/*
   4356 	 * TEST    : dm_getall_dmattr - one directory attribute
   4357 	 * EXPECTED: rc = 0
   4358 	 */
   4359 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 13)) {
   4360 		void *hanp;
   4361 		size_t hlen;
   4362 		dm_attrname_t attrname;
   4363 		char buf[ATTR_LISTLEN];
   4364 		size_t rlen;
   4365 
   4366 		/* Variation set up */
   4367 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   4368 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   4369 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   4370 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   4371 			/* No claen up */
   4372 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   4373 			   == -1) {
   4374 			rmdir(DUMMY_SUBDIR);
   4375 		} else
   4376 		    if ((rc =
   4377 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   4378 				       0, ATTR_VALUELEN, buf)) == -1) {
   4379 			dm_handle_free(hanp, hlen);
   4380 			rmdir(DUMMY_SUBDIR);
   4381 		}
   4382 		if (rc == -1) {
   4383 			DMLOG_PRINT(DMLVL_DEBUG,
   4384 				    "Unable to set up variation! (errno = %d)\n",
   4385 				    errno);
   4386 			DMVAR_SKIP();
   4387 		} else {
   4388 			/* Variation */
   4389 			DMLOG_PRINT(DMLVL_DEBUG, "%s(one dir attr)\n",
   4390 				    szFuncName);
   4391 			rc = dm_getall_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   4392 					      sizeof(buf), buf, &rlen);
   4393 			if (rc == 0) {
   4394 				DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen);
   4395 				LogDmAttrs((dm_attrlist_t *) buf);
   4396 				if (rlen ==
   4397 				    DWALIGN(sizeof(dm_attrlist_t) +
   4398 					    ATTR_VALUELEN)) {
   4399 					DMLOG_PRINT(DMLVL_DEBUG,
   4400 						    "%s passed with expected rc = %d\n",
   4401 						    szFuncName, 0);
   4402 					DMVAR_PASS();
   4403 				} else {
   4404 					DMLOG_PRINT(DMLVL_ERR,
   4405 						    "%s failed with expected rc = %d but unexpected rlen %d\n",
   4406 						    szFuncName, 0, rlen);
   4407 					DMVAR_FAIL();
   4408 				}
   4409 			} else {
   4410 				DMLOG_PRINT(DMLVL_ERR,
   4411 					    "%s failed with unexpected rc = %d (errno = %d) %d\n",
   4412 					    szFuncName, rc, errno, rlen);
   4413 				DMVAR_FAIL();
   4414 			}
   4415 
   4416 			/* Variation clean up */
   4417 			rc = rmdir(DUMMY_SUBDIR);
   4418 			if (rc == -1) {
   4419 				DMLOG_PRINT(DMLVL_DEBUG,
   4420 					    "Unable to clean up variation! (errno = %d)\n",
   4421 					    errno);
   4422 			}
   4423 			dm_handle_free(hanp, hlen);
   4424 		}
   4425 	}
   4426 
   4427 	/*
   4428 	 * TEST    : dm_getall_dmattr - fs handle
   4429 	 * EXPECTED: rc = -1, errno = EINVAL
   4430 	 */
   4431 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 14)) {
   4432 		void *hanp;
   4433 		size_t hlen;
   4434 		dm_attrname_t attrname;
   4435 		char buf[ATTR_LISTLEN];
   4436 		size_t rlen;
   4437 
   4438 		/* Variation set up */
   4439 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   4440 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   4441 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   4442 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   4443 		if ((rc = system(command)) == -1) {
   4444 			/* No clean up */
   4445 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   4446 			   == -1) {
   4447 			remove(DUMMY_FILE);
   4448 		}
   4449 		if (rc == -1) {
   4450 			DMLOG_PRINT(DMLVL_DEBUG,
   4451 				    "Unable to set up variation! (errno = %d)\n",
   4452 				    errno);
   4453 			DMVAR_SKIP();
   4454 		} else {
   4455 			/* Variation */
   4456 			DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName);
   4457 			rc = dm_getall_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   4458 					      sizeof(buf), buf, &rlen);
   4459 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   4460 
   4461 			/* Variation clean up */
   4462 			rc = remove(DUMMY_FILE);
   4463 			if (rc == -1) {
   4464 				DMLOG_PRINT(DMLVL_DEBUG,
   4465 					    "Unable to clean up variation! (errno = %d)\n",
   4466 					    errno);
   4467 			}
   4468 			dm_handle_free(hanp, hlen);
   4469 		}
   4470 	}
   4471 
   4472 	/*
   4473 	 * TEST    : dm_getall_dmattr - DM_NO_SESSION sid
   4474 	 * EXPECTED: rc = -1, errno = EINVAL
   4475 	 */
   4476 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 15)) {
   4477 		int fd;
   4478 		void *hanp;
   4479 		size_t hlen;
   4480 		dm_attrname_t attrname;
   4481 		char buf[ATTR_LISTLEN];
   4482 		size_t rlen;
   4483 
   4484 		/* Variation set up */
   4485 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   4486 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   4487 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   4488 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   4489 		if ((rc = system(command)) == -1) {
   4490 			/* No clean up */
   4491 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   4492 			remove(DUMMY_FILE);
   4493 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   4494 			close(fd);
   4495 			remove(DUMMY_FILE);
   4496 		} else
   4497 		    if ((rc =
   4498 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   4499 				       0, sizeof(buf), buf)) == -1) {
   4500 			dm_handle_free(hanp, hlen);
   4501 			close(fd);
   4502 			remove(DUMMY_FILE);
   4503 		}
   4504 		if (fd == -1 || rc == -1) {
   4505 			DMLOG_PRINT(DMLVL_DEBUG,
   4506 				    "Unable to set up variation! (errno = %d)\n",
   4507 				    errno);
   4508 			DMVAR_SKIP();
   4509 		} else {
   4510 			/* Variation */
   4511 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
   4512 				    szFuncName);
   4513 			rc = dm_getall_dmattr(DM_NO_SESSION, hanp, hlen,
   4514 					      DM_NO_TOKEN, sizeof(buf), buf,
   4515 					      &rlen);
   4516 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   4517 
   4518 			/* Variation clean up */
   4519 			rc = close(fd);
   4520 			rc |= remove(DUMMY_FILE);
   4521 			if (rc == -1) {
   4522 				DMLOG_PRINT(DMLVL_DEBUG,
   4523 					    "Unable to clean up variation! (errno = %d)\n",
   4524 					    errno);
   4525 			}
   4526 			dm_handle_free(hanp, hlen);
   4527 		}
   4528 	}
   4529 
   4530 	/*
   4531 	 * TEST    : dm_getall_dmattr - global handle
   4532 	 * EXPECTED: rc = -1, errno = EBADF
   4533 	 */
   4534 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 16)) {
   4535 		dm_attrname_t attrname;
   4536 		char buf[ATTR_LISTLEN];
   4537 		size_t rlen;
   4538 
   4539 		/* Variation set up */
   4540 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   4541 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   4542 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   4543 
   4544 		/* Variation */
   4545 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
   4546 		rc = dm_getall_dmattr(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN,
   4547 				      DM_NO_TOKEN, sizeof(buf), buf, &rlen);
   4548 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   4549 
   4550 		/* Variation clean up */
   4551 	}
   4552 
   4553 	/*
   4554 	 * TEST    : dm_getall_dmattr - invalidated handle
   4555 	 * EXPECTED: rc = -1, errno = EBADF
   4556 	 */
   4557 	if (DMVAR_EXEC(GETALL_DMATTR_BASE + 17)) {
   4558 		int fd;
   4559 		void *hanp;
   4560 		size_t hlen;
   4561 		dm_attrname_t attrname;
   4562 		char buf[ATTR_LISTLEN];
   4563 		size_t rlen;
   4564 
   4565 		/* Variation set up */
   4566 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   4567 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   4568 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   4569 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   4570 		if ((rc = system(command)) == -1) {
   4571 			/* No clean up */
   4572 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   4573 			remove(DUMMY_FILE);
   4574 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   4575 			close(fd);
   4576 			remove(DUMMY_FILE);
   4577 		} else
   4578 		    if ((rc =
   4579 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   4580 				       0, ATTR_VALUELEN, buf)) == -1) {
   4581 			dm_handle_free(hanp, hlen);
   4582 			close(fd);
   4583 			remove(DUMMY_FILE);
   4584 		} else if ((rc = close(fd)) == -1) {
   4585 			dm_handle_free(hanp, hlen);
   4586 			remove(DUMMY_FILE);
   4587 		} else if ((rc = remove(DUMMY_FILE)) == -1) {
   4588 			dm_handle_free(hanp, hlen);
   4589 		}
   4590 		if (fd == -1 || rc == -1) {
   4591 			DMLOG_PRINT(DMLVL_DEBUG,
   4592 				    "Unable to set up variation! (errno = %d)\n",
   4593 				    errno);
   4594 			DMVAR_SKIP();
   4595 		} else {
   4596 			/* Variation */
   4597 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated handle)\n",
   4598 				    szFuncName);
   4599 			rc = dm_getall_dmattr(sid, hanp, hlen, DM_NO_TOKEN,
   4600 					      sizeof(buf), buf, &rlen);
   4601 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   4602 
   4603 			/* Variation clean up */
   4604 			dm_handle_free(hanp, hlen);
   4605 		}
   4606 	}
   4607 
   4608 	szFuncName = "dm_set_fileattr";
   4609 
   4610 	/*
   4611 	 * TEST    : dm_set_fileattr - invalid sid
   4612 	 * EXPECTED: rc = -1, errno = EINVAL
   4613 	 */
   4614 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 1)) {
   4615 		int fd;
   4616 		void *hanp;
   4617 		size_t hlen;
   4618 		dm_fileattr_t fileattr;
   4619 
   4620 		/* Variation set up */
   4621 		fileattr.fa_uid = DUMMY_UID;
   4622 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   4623 		if ((rc = system(command)) == -1) {
   4624 			/* No clean up */
   4625 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   4626 			remove(DUMMY_FILE);
   4627 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   4628 			close(fd);
   4629 			remove(DUMMY_FILE);
   4630 		}
   4631 		if (fd == -1 || rc == -1) {
   4632 			DMLOG_PRINT(DMLVL_DEBUG,
   4633 				    "Unable to set up variation! (errno = %d)\n",
   4634 				    errno);
   4635 			DMVAR_SKIP();
   4636 		} else {
   4637 			/* Variation */
   4638 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
   4639 				    szFuncName);
   4640 			rc = dm_set_fileattr(INVALID_ADDR, hanp, hlen,
   4641 					     DM_NO_TOKEN, DM_AT_UID, &fileattr);
   4642 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   4643 
   4644 			/* Variation clean up */
   4645 			rc = close(fd);
   4646 			rc |= remove(DUMMY_FILE);
   4647 			if (rc == -1) {
   4648 				DMLOG_PRINT(DMLVL_DEBUG,
   4649 					    "Unable to clean up variation! (errno = %d)\n",
   4650 					    errno);
   4651 			}
   4652 			dm_handle_free(hanp, hlen);
   4653 		}
   4654 	}
   4655 
   4656 	/*
   4657 	 * TEST    : dm_set_fileattr - invalid hanp
   4658 	 * EXPECTED: rc = -1, errno = EFAULT
   4659 	 */
   4660 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 2)) {
   4661 		int fd;
   4662 		void *hanp;
   4663 		size_t hlen;
   4664 		dm_fileattr_t fileattr;
   4665 
   4666 		/* Variation set up */
   4667 		fileattr.fa_uid = DUMMY_UID;
   4668 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   4669 		if ((rc = system(command)) == -1) {
   4670 			/* No clean up */
   4671 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   4672 			remove(DUMMY_FILE);
   4673 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   4674 			close(fd);
   4675 			remove(DUMMY_FILE);
   4676 		}
   4677 		if (fd == -1 || rc == -1) {
   4678 			DMLOG_PRINT(DMLVL_DEBUG,
   4679 				    "Unable to set up variation! (errno = %d)\n",
   4680 				    errno);
   4681 			DMVAR_SKIP();
   4682 		} else {
   4683 			/* Variation */
   4684 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
   4685 				    szFuncName);
   4686 			rc = dm_set_fileattr(sid, (void *)INVALID_ADDR, hlen,
   4687 					     DM_NO_TOKEN, DM_AT_UID, &fileattr);
   4688 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   4689 
   4690 			/* Variation clean up */
   4691 			rc = close(fd);
   4692 			rc |= remove(DUMMY_FILE);
   4693 			if (rc == -1) {
   4694 				DMLOG_PRINT(DMLVL_DEBUG,
   4695 					    "Unable to clean up variation! (errno = %d)\n",
   4696 					    errno);
   4697 			}
   4698 			dm_handle_free(hanp, hlen);
   4699 		}
   4700 	}
   4701 
   4702 	/*
   4703 	 * TEST    : dm_set_fileattr - invalid hlen
   4704 	 * EXPECTED: rc = -1, errno = EBADF
   4705 	 */
   4706 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 3)) {
   4707 		int fd;
   4708 		void *hanp;
   4709 		size_t hlen;
   4710 		dm_fileattr_t fileattr;
   4711 
   4712 		/* Variation set up */
   4713 		fileattr.fa_uid = DUMMY_UID;
   4714 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   4715 		if ((rc = system(command)) == -1) {
   4716 			/* No clean up */
   4717 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   4718 			remove(DUMMY_FILE);
   4719 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   4720 			close(fd);
   4721 			remove(DUMMY_FILE);
   4722 		}
   4723 		if (fd == -1 || rc == -1) {
   4724 			DMLOG_PRINT(DMLVL_DEBUG,
   4725 				    "Unable to set up variation! (errno = %d)\n",
   4726 				    errno);
   4727 			DMVAR_SKIP();
   4728 		} else {
   4729 			/* Variation */
   4730 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
   4731 				    szFuncName);
   4732 			rc = dm_set_fileattr(sid, hanp, INVALID_ADDR,
   4733 					     DM_NO_TOKEN, DM_AT_UID, &fileattr);
   4734 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   4735 
   4736 			/* Variation clean up */
   4737 			rc = close(fd);
   4738 			rc |= remove(DUMMY_FILE);
   4739 			if (rc == -1) {
   4740 				DMLOG_PRINT(DMLVL_DEBUG,
   4741 					    "Unable to clean up variation! (errno = %d)\n",
   4742 					    errno);
   4743 			}
   4744 			dm_handle_free(hanp, hlen);
   4745 		}
   4746 	}
   4747 
   4748 	/*
   4749 	 * TEST    : dm_set_fileattr - invalid token
   4750 	 * EXPECTED: rc = -1, errno = EINVAL
   4751 	 */
   4752 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 4)) {
   4753 		int fd;
   4754 		void *hanp;
   4755 		size_t hlen;
   4756 		dm_fileattr_t fileattr;
   4757 
   4758 		/* Variation set up */
   4759 		fileattr.fa_uid = DUMMY_UID;
   4760 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   4761 		if ((rc = system(command)) == -1) {
   4762 			/* No clean up */
   4763 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   4764 			remove(DUMMY_FILE);
   4765 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   4766 			close(fd);
   4767 			remove(DUMMY_FILE);
   4768 		}
   4769 		if (fd == -1 || rc == -1) {
   4770 			DMLOG_PRINT(DMLVL_DEBUG,
   4771 				    "Unable to set up variation! (errno = %d)\n",
   4772 				    errno);
   4773 			DMVAR_SKIP();
   4774 		} else {
   4775 			/* Variation */
   4776 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
   4777 				    szFuncName);
   4778 			rc = dm_set_fileattr(sid, hanp, hlen, INVALID_ADDR,
   4779 					     DM_AT_UID, &fileattr);
   4780 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   4781 
   4782 			/* Variation clean up */
   4783 			rc = close(fd);
   4784 			rc |= remove(DUMMY_FILE);
   4785 			if (rc == -1) {
   4786 				DMLOG_PRINT(DMLVL_DEBUG,
   4787 					    "Unable to clean up variation! (errno = %d)\n",
   4788 					    errno);
   4789 			}
   4790 			dm_handle_free(hanp, hlen);
   4791 		}
   4792 	}
   4793 
   4794 	/*
   4795 	 * TEST    : dm_set_fileattr - invalid mask
   4796 	 * EXPECTED: rc = -1, errno = EINVAL
   4797 	 *
   4798 	 * This variation uncovered XFS BUG #20 (0 returned instead of -1 and
   4799 	 * EINVAL errno)
   4800 	 */
   4801 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 5)) {
   4802 		int fd;
   4803 		void *hanp;
   4804 		size_t hlen;
   4805 		dm_fileattr_t fileattr;
   4806 
   4807 		/* Variation set up */
   4808 		fileattr.fa_uid = DUMMY_UID;
   4809 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   4810 		if ((rc = system(command)) == -1) {
   4811 			/* No clean up */
   4812 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   4813 			remove(DUMMY_FILE);
   4814 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   4815 			close(fd);
   4816 			remove(DUMMY_FILE);
   4817 		}
   4818 		if (fd == -1 || rc == -1) {
   4819 			DMLOG_PRINT(DMLVL_DEBUG,
   4820 				    "Unable to set up variation! (errno = %d)\n",
   4821 				    errno);
   4822 			DMVAR_SKIP();
   4823 		} else {
   4824 			/* Variation */
   4825 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid mask)\n",
   4826 				    szFuncName);
   4827 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   4828 					     DM_AT_HANDLE, &fileattr);
   4829 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   4830 
   4831 			/* Variation clean up */
   4832 			rc = close(fd);
   4833 			rc |= remove(DUMMY_FILE);
   4834 			if (rc == -1) {
   4835 				DMLOG_PRINT(DMLVL_DEBUG,
   4836 					    "Unable to clean up variation! (errno = %d)\n",
   4837 					    errno);
   4838 			}
   4839 			dm_handle_free(hanp, hlen);
   4840 		}
   4841 	}
   4842 
   4843 	/*
   4844 	 * TEST    : dm_set_fileattr - invalid attrp
   4845 	 * EXPECTED: rc = -1, errno = EFAULT
   4846 	 */
   4847 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 6)) {
   4848 		int fd;
   4849 		void *hanp;
   4850 		size_t hlen;
   4851 		dm_fileattr_t fileattr;
   4852 
   4853 		/* Variation set up */
   4854 		fileattr.fa_uid = DUMMY_UID;
   4855 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   4856 		if ((rc = system(command)) == -1) {
   4857 			/* No clean up */
   4858 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   4859 			remove(DUMMY_FILE);
   4860 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   4861 			close(fd);
   4862 			remove(DUMMY_FILE);
   4863 		}
   4864 		if (fd == -1 || rc == -1) {
   4865 			DMLOG_PRINT(DMLVL_DEBUG,
   4866 				    "Unable to set up variation! (errno = %d)\n",
   4867 				    errno);
   4868 			DMVAR_SKIP();
   4869 		} else {
   4870 			/* Variation */
   4871 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid attrp)\n",
   4872 				    szFuncName);
   4873 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   4874 					     DM_AT_UID,
   4875 					     (dm_fileattr_t *) INVALID_ADDR);
   4876 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   4877 
   4878 			/* Variation clean up */
   4879 			rc = close(fd);
   4880 			rc |= remove(DUMMY_FILE);
   4881 			if (rc == -1) {
   4882 				DMLOG_PRINT(DMLVL_DEBUG,
   4883 					    "Unable to clean up variation! (errno = %d)\n",
   4884 					    errno);
   4885 			}
   4886 			dm_handle_free(hanp, hlen);
   4887 		}
   4888 	}
   4889 
   4890 	/*
   4891 	 * TEST    : dm_set_fileattr - DM_AT_ATIME on file
   4892 	 * EXPECTED: rc = 0
   4893 	 */
   4894 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 7)) {
   4895 		int fd;
   4896 		void *hanp;
   4897 		size_t hlen;
   4898 		dm_fileattr_t fileattr;
   4899 		struct stat statfs1, statfs2;
   4900 		int rc2;
   4901 
   4902 		/* Variation set up */
   4903 		fileattr.fa_atime = DUMMY_TIME;
   4904 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   4905 		if ((rc = system(command)) == -1) {
   4906 			/* No clean up */
   4907 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   4908 			remove(DUMMY_FILE);
   4909 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   4910 			close(fd);
   4911 			remove(DUMMY_FILE);
   4912 		}
   4913 		if (fd == -1 || rc == -1) {
   4914 			DMLOG_PRINT(DMLVL_DEBUG,
   4915 				    "Unable to set up variation! (errno = %d)\n",
   4916 				    errno);
   4917 			DMVAR_SKIP();
   4918 		} else {
   4919 			/* Variation */
   4920 			rc2 = stat(DUMMY_FILE, &statfs1);
   4921 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file DM_AT_ATIME)\n",
   4922 				    szFuncName);
   4923 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   4924 					     DM_AT_ATIME, &fileattr);
   4925 			rc2 |= stat(DUMMY_FILE, &statfs2);
   4926 			if (rc == 0) {
   4927 				if ((rc2 == 0)
   4928 				    && (statfs1.st_atime != statfs2.st_atime)
   4929 				    && (statfs2.st_atime == DUMMY_TIME)) {
   4930 					DMLOG_PRINT(DMLVL_DEBUG,
   4931 						    "%s passed with expected rc = %d and atime modified\n",
   4932 						    szFuncName, 0);
   4933 					DMVAR_PASS();
   4934 				} else {
   4935 					DMLOG_PRINT(DMLVL_ERR,
   4936 						    "%s failed with expected rc = %d but atime unmodified (%d vs %d)\n",
   4937 						    szFuncName, 0,
   4938 						    statfs1.st_atime,
   4939 						    statfs2.st_atime);
   4940 					DMVAR_FAIL();
   4941 				}
   4942 			} else {
   4943 				DMLOG_PRINT(DMLVL_ERR,
   4944 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   4945 					    szFuncName, rc, errno);
   4946 				DMVAR_FAIL();
   4947 			}
   4948 
   4949 			/* Variation clean up */
   4950 			rc = close(fd);
   4951 			rc |= remove(DUMMY_FILE);
   4952 			if (rc == -1) {
   4953 				DMLOG_PRINT(DMLVL_DEBUG,
   4954 					    "Unable to clean up variation! (errno = %d)\n",
   4955 					    errno);
   4956 			}
   4957 			dm_handle_free(hanp, hlen);
   4958 		}
   4959 	}
   4960 
   4961 	/*
   4962 	 * TEST    : dm_set_fileattr - DM_AT_MTIME on file
   4963 	 * EXPECTED: rc = 0
   4964 	 */
   4965 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 8)) {
   4966 		int fd;
   4967 		void *hanp;
   4968 		size_t hlen;
   4969 		dm_fileattr_t fileattr;
   4970 		struct stat statfs1, statfs2;
   4971 		int rc2;
   4972 
   4973 		/* Variation set up */
   4974 		fileattr.fa_mtime = DUMMY_TIME;
   4975 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   4976 		if ((rc = system(command)) == -1) {
   4977 			/* No clean up */
   4978 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   4979 			remove(DUMMY_FILE);
   4980 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   4981 			close(fd);
   4982 			remove(DUMMY_FILE);
   4983 		}
   4984 		if (fd == -1 || rc == -1) {
   4985 			DMLOG_PRINT(DMLVL_DEBUG,
   4986 				    "Unable to set up variation! (errno = %d)\n",
   4987 				    errno);
   4988 			DMVAR_SKIP();
   4989 		} else {
   4990 			/* Variation */
   4991 			rc2 = stat(DUMMY_FILE, &statfs1);
   4992 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file DM_AT_MTIME)\n",
   4993 				    szFuncName);
   4994 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   4995 					     DM_AT_MTIME, &fileattr);
   4996 			rc2 |= stat(DUMMY_FILE, &statfs2);
   4997 			if (rc == 0) {
   4998 				if ((rc2 == 0)
   4999 				    && (statfs1.st_mtime != statfs2.st_mtime)
   5000 				    && (statfs2.st_mtime == DUMMY_TIME)) {
   5001 					DMLOG_PRINT(DMLVL_DEBUG,
   5002 						    "%s passed with expected rc = %d and mtime modified\n",
   5003 						    szFuncName, 0);
   5004 					DMVAR_PASS();
   5005 				} else {
   5006 					DMLOG_PRINT(DMLVL_ERR,
   5007 						    "%s failed with expected rc = %d but mtime unmodified (%d vs %d)\n",
   5008 						    szFuncName, 0,
   5009 						    statfs1.st_mtime,
   5010 						    statfs2.st_mtime);
   5011 					DMVAR_FAIL();
   5012 				}
   5013 			} else {
   5014 				DMLOG_PRINT(DMLVL_ERR,
   5015 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   5016 					    szFuncName, rc, errno);
   5017 				DMVAR_FAIL();
   5018 			}
   5019 
   5020 			/* Variation clean up */
   5021 			rc = close(fd);
   5022 			rc |= remove(DUMMY_FILE);
   5023 			if (rc == -1) {
   5024 				DMLOG_PRINT(DMLVL_DEBUG,
   5025 					    "Unable to clean up variation! (errno = %d)\n",
   5026 					    errno);
   5027 			}
   5028 			dm_handle_free(hanp, hlen);
   5029 		}
   5030 	}
   5031 
   5032 	/*
   5033 	 * TEST    : dm_set_fileattr - DM_AT_CTIME on file
   5034 	 * EXPECTED: rc = 0
   5035 	 */
   5036 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 9)) {
   5037 		int fd;
   5038 		void *hanp;
   5039 		size_t hlen;
   5040 		dm_fileattr_t fileattr;
   5041 		struct stat statfs1, statfs2;
   5042 		int rc2;
   5043 
   5044 		/* Variation set up */
   5045 		fileattr.fa_ctime = DUMMY_TIME;
   5046 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   5047 		if ((rc = system(command)) == -1) {
   5048 			/* No clean up */
   5049 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   5050 			remove(DUMMY_FILE);
   5051 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   5052 			close(fd);
   5053 			remove(DUMMY_FILE);
   5054 		}
   5055 		if (fd == -1 || rc == -1) {
   5056 			DMLOG_PRINT(DMLVL_DEBUG,
   5057 				    "Unable to set up variation! (errno = %d)\n",
   5058 				    errno);
   5059 			DMVAR_SKIP();
   5060 		} else {
   5061 			/* Variation */
   5062 			rc2 = stat(DUMMY_FILE, &statfs1);
   5063 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file DM_AT_CTIME)\n",
   5064 				    szFuncName);
   5065 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   5066 					     DM_AT_CTIME, &fileattr);
   5067 			rc2 |= stat(DUMMY_FILE, &statfs2);
   5068 			if (rc == 0) {
   5069 				if ((rc2 == 0)
   5070 				    && (statfs1.st_ctime != statfs2.st_ctime)
   5071 				    && (statfs2.st_ctime == DUMMY_TIME)) {
   5072 					DMLOG_PRINT(DMLVL_DEBUG,
   5073 						    "%s passed with expected rc = %d and ctime modified\n",
   5074 						    szFuncName, 0);
   5075 					DMVAR_PASS();
   5076 				} else {
   5077 					DMLOG_PRINT(DMLVL_ERR,
   5078 						    "%s failed with expected rc = %d but ctime unmodified (%d vs %d)\n",
   5079 						    szFuncName, 0,
   5080 						    statfs1.st_ctime,
   5081 						    statfs2.st_ctime);
   5082 					DMVAR_FAIL();
   5083 				}
   5084 			} else {
   5085 				DMLOG_PRINT(DMLVL_ERR,
   5086 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   5087 					    szFuncName, rc, errno);
   5088 				DMVAR_FAIL();
   5089 			}
   5090 
   5091 			/* Variation clean up */
   5092 			rc = close(fd);
   5093 			rc |= remove(DUMMY_FILE);
   5094 			if (rc == -1) {
   5095 				DMLOG_PRINT(DMLVL_DEBUG,
   5096 					    "Unable to clean up variation! (errno = %d)\n",
   5097 					    errno);
   5098 			}
   5099 			dm_handle_free(hanp, hlen);
   5100 		}
   5101 	}
   5102 
   5103 	/*
   5104 	 * TEST    : dm_set_fileattr - DM_AT_DTIME on file with DM attribute
   5105 	 * EXPECTED: rc = 0
   5106 	 */
   5107 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 10)) {
   5108 		int fd;
   5109 		void *hanp;
   5110 		size_t hlen;
   5111 		dm_fileattr_t fileattr;
   5112 		dm_attrname_t attrname;
   5113 		char buf[ATTR_LISTLEN];
   5114 		struct stat statfs1, statfs2;
   5115 		int rc2;
   5116 
   5117 		/* Variation set up */
   5118 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   5119 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   5120 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   5121 		fileattr.fa_dtime = DUMMY_TIME;
   5122 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   5123 		if ((rc = system(command)) == -1) {
   5124 			/* No clean up */
   5125 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   5126 			remove(DUMMY_FILE);
   5127 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   5128 			close(fd);
   5129 			remove(DUMMY_FILE);
   5130 		} else
   5131 		    if ((rc =
   5132 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   5133 				       0, ATTR_VALUELEN, buf)) == -1) {
   5134 			dm_handle_free(hanp, hlen);
   5135 			close(fd);
   5136 			remove(DUMMY_FILE);
   5137 		}
   5138 		if (fd == -1 || rc == -1) {
   5139 			DMLOG_PRINT(DMLVL_DEBUG,
   5140 				    "Unable to set up variation! (errno = %d)\n",
   5141 				    errno);
   5142 			DMVAR_SKIP();
   5143 		} else {
   5144 			/* Variation */
   5145 			rc2 = stat(DUMMY_FILE, &statfs1);
   5146 			DMLOG_PRINT(DMLVL_DEBUG,
   5147 				    "%s(file DM_AT_DTIME with attr)\n",
   5148 				    szFuncName);
   5149 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   5150 					     DM_AT_DTIME, &fileattr);
   5151 			rc2 |= stat(DUMMY_FILE, &statfs2);
   5152 			if (rc == 0) {
   5153 				if ((rc2 == 0)
   5154 				    && (statfs1.st_ctime != statfs2.st_ctime)
   5155 				    && (statfs2.st_ctime == DUMMY_TIME)) {
   5156 					DMLOG_PRINT(DMLVL_DEBUG,
   5157 						    "%s passed with expected rc = %d and ctime modified\n",
   5158 						    szFuncName, 0);
   5159 					DMVAR_PASS();
   5160 				} else {
   5161 					DMLOG_PRINT(DMLVL_ERR,
   5162 						    "%s failed with expected rc = %d but ctime unmodified (%d vs %d)\n",
   5163 						    szFuncName, 0,
   5164 						    statfs1.st_ctime,
   5165 						    statfs2.st_ctime);
   5166 					DMVAR_FAIL();
   5167 				}
   5168 			} else {
   5169 				DMLOG_PRINT(DMLVL_ERR,
   5170 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   5171 					    szFuncName, rc, errno);
   5172 				DMVAR_FAIL();
   5173 			}
   5174 
   5175 			/* Variation clean up */
   5176 			rc = close(fd);
   5177 			rc |= remove(DUMMY_FILE);
   5178 			if (rc == -1) {
   5179 				DMLOG_PRINT(DMLVL_DEBUG,
   5180 					    "Unable to clean up variation! (errno = %d)\n",
   5181 					    errno);
   5182 			}
   5183 			dm_handle_free(hanp, hlen);
   5184 		}
   5185 	}
   5186 
   5187 	/*
   5188 	 * TEST    : dm_set_fileattr - DM_AT_DTIME on file without DM attr
   5189 	 * EXPECTED: rc = -1, errno = EINVAL
   5190 	 *
   5191 	 * This variation uncovered XFS BUG #21 (dtime updated without any DM
   5192 	 * attributes)
   5193 	 */
   5194 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 11)) {
   5195 		int fd;
   5196 		void *hanp;
   5197 		size_t hlen;
   5198 		dm_fileattr_t fileattr;
   5199 		struct stat statfs1, statfs2;
   5200 		int rc2;
   5201 
   5202 		/* Variation set up */
   5203 		fileattr.fa_dtime = DUMMY_TIME;
   5204 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   5205 		if ((rc = system(command)) == -1) {
   5206 			/* No clean up */
   5207 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   5208 			remove(DUMMY_FILE);
   5209 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   5210 			close(fd);
   5211 			remove(DUMMY_FILE);
   5212 		}
   5213 		if (fd == -1 || rc == -1) {
   5214 			DMLOG_PRINT(DMLVL_DEBUG,
   5215 				    "Unable to set up variation! (errno = %d)\n",
   5216 				    errno);
   5217 			DMVAR_SKIP();
   5218 		} else {
   5219 			/* Variation */
   5220 			rc2 = stat(DUMMY_FILE, &statfs1);
   5221 			DMLOG_PRINT(DMLVL_DEBUG,
   5222 				    "%s(file DM_AT_DTIME without attr)\n",
   5223 				    szFuncName);
   5224 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   5225 					     DM_AT_DTIME, &fileattr);
   5226 			rc2 |= stat(DUMMY_FILE, &statfs2);
   5227 			if (rc == 0) {
   5228 				if ((rc2 == 0)
   5229 				    && (statfs1.st_ctime == statfs2.st_ctime)
   5230 				    && (statfs2.st_ctime != DUMMY_TIME)) {
   5231 					DMLOG_PRINT(DMLVL_DEBUG,
   5232 						    "%s passed with expected rc = %d and ctime unmodified\n",
   5233 						    szFuncName, 0);
   5234 					DMVAR_PASS();
   5235 				} else {
   5236 					DMLOG_PRINT(DMLVL_ERR,
   5237 						    "%s failed with expected rc = %d but ctime modified (%d vs %d)\n",
   5238 						    szFuncName, 0,
   5239 						    statfs1.st_ctime,
   5240 						    statfs2.st_ctime);
   5241 					DMVAR_FAIL();
   5242 				}
   5243 			} else {
   5244 				DMLOG_PRINT(DMLVL_ERR,
   5245 					    "%s failed with unexpected rc = %d\n",
   5246 					    szFuncName, rc);
   5247 				DMVAR_FAIL();
   5248 			}
   5249 
   5250 			/* Variation clean up */
   5251 			rc = close(fd);
   5252 			rc |= remove(DUMMY_FILE);
   5253 			if (rc == -1) {
   5254 				DMLOG_PRINT(DMLVL_DEBUG,
   5255 					    "Unable to clean up variation! (errno = %d)\n",
   5256 					    errno);
   5257 			}
   5258 			dm_handle_free(hanp, hlen);
   5259 		}
   5260 	}
   5261 
   5262 	/*
   5263 	 * TEST    : dm_set_fileattr - DM_AT_UID on file
   5264 	 * EXPECTED: rc = 0
   5265 	 */
   5266 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 12)) {
   5267 		int fd;
   5268 		void *hanp;
   5269 		size_t hlen;
   5270 		dm_fileattr_t fileattr;
   5271 		struct stat statfs1, statfs2;
   5272 		int rc2;
   5273 
   5274 		/* Variation set up */
   5275 		fileattr.fa_uid = DUMMY_UID;
   5276 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   5277 		if ((rc = system(command)) == -1) {
   5278 			/* No clean up */
   5279 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   5280 			remove(DUMMY_FILE);
   5281 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   5282 			close(fd);
   5283 			remove(DUMMY_FILE);
   5284 		}
   5285 		if (fd == -1 || rc == -1) {
   5286 			DMLOG_PRINT(DMLVL_DEBUG,
   5287 				    "Unable to set up variation! (errno = %d)\n",
   5288 				    errno);
   5289 			DMVAR_SKIP();
   5290 		} else {
   5291 			/* Variation */
   5292 			rc2 = stat(DUMMY_FILE, &statfs1);
   5293 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file DM_AT_UID)\n",
   5294 				    szFuncName);
   5295 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   5296 					     DM_AT_UID, &fileattr);
   5297 			rc2 |= stat(DUMMY_FILE, &statfs2);
   5298 			if (rc == 0) {
   5299 				if ((rc2 == 0)
   5300 				    && (statfs1.st_uid != statfs2.st_uid)
   5301 				    && (statfs2.st_uid == DUMMY_UID)) {
   5302 					DMLOG_PRINT(DMLVL_DEBUG,
   5303 						    "%s passed with expected rc = %d and uid modified\n",
   5304 						    szFuncName, 0);
   5305 					DMVAR_PASS();
   5306 				} else {
   5307 					DMLOG_PRINT(DMLVL_ERR,
   5308 						    "%s failed with expected rc = %d but uid unmodified (%d vs %d)\n",
   5309 						    szFuncName, 0,
   5310 						    statfs1.st_uid,
   5311 						    statfs2.st_uid);
   5312 					DMVAR_FAIL();
   5313 				}
   5314 			} else {
   5315 				DMLOG_PRINT(DMLVL_ERR,
   5316 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   5317 					    szFuncName, rc, errno);
   5318 				DMVAR_FAIL();
   5319 			}
   5320 
   5321 			/* Variation clean up */
   5322 			rc = close(fd);
   5323 			rc |= remove(DUMMY_FILE);
   5324 			if (rc == -1) {
   5325 				DMLOG_PRINT(DMLVL_DEBUG,
   5326 					    "Unable to clean up variation! (errno = %d)\n",
   5327 					    errno);
   5328 			}
   5329 			dm_handle_free(hanp, hlen);
   5330 		}
   5331 	}
   5332 
   5333 	/*
   5334 	 * TEST    : dm_set_fileattr - DM_AT_GID on file
   5335 	 * EXPECTED: rc = 0
   5336 	 */
   5337 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 13)) {
   5338 		int fd;
   5339 		void *hanp;
   5340 		size_t hlen;
   5341 		dm_fileattr_t fileattr;
   5342 		struct stat statfs1, statfs2;
   5343 		int rc2;
   5344 
   5345 		/* Variation set up */
   5346 		fileattr.fa_gid = DUMMY_GID;
   5347 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   5348 		if ((rc = system(command)) == -1) {
   5349 			/* No clean up */
   5350 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   5351 			remove(DUMMY_FILE);
   5352 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   5353 			close(fd);
   5354 			remove(DUMMY_FILE);
   5355 		}
   5356 		if (fd == -1 || rc == -1) {
   5357 			DMLOG_PRINT(DMLVL_DEBUG,
   5358 				    "Unable to set up variation! (errno = %d)\n",
   5359 				    errno);
   5360 			DMVAR_SKIP();
   5361 		} else {
   5362 			/* Variation */
   5363 			rc2 = stat(DUMMY_FILE, &statfs1);
   5364 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file DM_AT_GID)\n",
   5365 				    szFuncName);
   5366 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   5367 					     DM_AT_GID, &fileattr);
   5368 			rc2 |= stat(DUMMY_FILE, &statfs2);
   5369 			if (rc == 0) {
   5370 				if ((rc2 == 0)
   5371 				    && (statfs1.st_gid != statfs2.st_gid)
   5372 				    && (statfs2.st_gid == DUMMY_GID)) {
   5373 					DMLOG_PRINT(DMLVL_DEBUG,
   5374 						    "%s passed with expected rc = %d and gid modified\n",
   5375 						    szFuncName, 0);
   5376 					DMVAR_PASS();
   5377 				} else {
   5378 					DMLOG_PRINT(DMLVL_ERR,
   5379 						    "%s failed with expected rc = %d but gid unmodified (%d vs %d)\n",
   5380 						    szFuncName, 0,
   5381 						    statfs1.st_gid,
   5382 						    statfs2.st_gid);
   5383 					DMVAR_FAIL();
   5384 				}
   5385 			} else {
   5386 				DMLOG_PRINT(DMLVL_ERR,
   5387 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   5388 					    szFuncName, rc, errno);
   5389 				DMVAR_FAIL();
   5390 			}
   5391 
   5392 			/* Variation clean up */
   5393 			rc = close(fd);
   5394 			rc |= remove(DUMMY_FILE);
   5395 			if (rc == -1) {
   5396 				DMLOG_PRINT(DMLVL_DEBUG,
   5397 					    "Unable to clean up variation! (errno = %d)\n",
   5398 					    errno);
   5399 			}
   5400 			dm_handle_free(hanp, hlen);
   5401 		}
   5402 	}
   5403 
   5404 	/*
   5405 	 * TEST    : dm_set_fileattr - DM_AT_MODE on file
   5406 	 * EXPECTED: rc = 0
   5407 	 */
   5408 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 14)) {
   5409 		int fd;
   5410 		void *hanp;
   5411 		size_t hlen;
   5412 		dm_fileattr_t fileattr;
   5413 		struct stat statfs1, statfs2;
   5414 		int rc2;
   5415 
   5416 		/* Variation set up */
   5417 		fileattr.fa_mode = DUMMY_MODE;
   5418 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   5419 		if ((rc = system(command)) == -1) {
   5420 			/* No clean up */
   5421 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   5422 			remove(DUMMY_FILE);
   5423 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   5424 			close(fd);
   5425 			remove(DUMMY_FILE);
   5426 		}
   5427 		if (fd == -1 || rc == -1) {
   5428 			DMLOG_PRINT(DMLVL_DEBUG,
   5429 				    "Unable to set up variation! (errno = %d)\n",
   5430 				    errno);
   5431 			DMVAR_SKIP();
   5432 		} else {
   5433 			/* Variation */
   5434 			rc2 = stat(DUMMY_FILE, &statfs1);
   5435 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file DM_AT_MODE)\n",
   5436 				    szFuncName);
   5437 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   5438 					     DM_AT_MODE, &fileattr);
   5439 			rc2 |= stat(DUMMY_FILE, &statfs2);
   5440 			if (rc == 0) {
   5441 				if ((rc2 == 0)
   5442 				    && (statfs1.st_mode != statfs2.st_mode)
   5443 				    && ((statfs2.st_mode & MODE_MASK) ==
   5444 					DUMMY_MODE)) {
   5445 					DMLOG_PRINT(DMLVL_DEBUG,
   5446 						    "%s passed with expected rc = %d and mode modified\n",
   5447 						    szFuncName, 0);
   5448 					DMVAR_PASS();
   5449 				} else {
   5450 					DMLOG_PRINT(DMLVL_ERR,
   5451 						    "%s failed with expected rc = %d but mode unmodified (%x vs %x)\n",
   5452 						    szFuncName, 0,
   5453 						    statfs1.st_mode,
   5454 						    statfs2.st_mode);
   5455 					DMVAR_FAIL();
   5456 				}
   5457 			} else {
   5458 				DMLOG_PRINT(DMLVL_ERR,
   5459 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   5460 					    szFuncName, rc, errno);
   5461 				DMVAR_FAIL();
   5462 			}
   5463 
   5464 			/* Variation clean up */
   5465 			rc = close(fd);
   5466 			rc |= remove(DUMMY_FILE);
   5467 			if (rc == -1) {
   5468 				DMLOG_PRINT(DMLVL_DEBUG,
   5469 					    "Unable to clean up variation! (errno = %d)\n",
   5470 					    errno);
   5471 			}
   5472 			dm_handle_free(hanp, hlen);
   5473 		}
   5474 	}
   5475 
   5476 	/*
   5477 	 * TEST    : dm_set_fileattr - DM_AT_SIZE on file, shrink
   5478 	 * EXPECTED: rc = 0
   5479 	 */
   5480 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 15)) {
   5481 		int fd;
   5482 		void *hanp;
   5483 		size_t hlen;
   5484 		dm_fileattr_t fileattr;
   5485 		struct stat statfs1, statfs2;
   5486 		int rc2;
   5487 
   5488 		/* Variation set up */
   5489 		fileattr.fa_size = TMP_FILELEN / 2;
   5490 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   5491 		if ((rc = system(command)) == -1) {
   5492 			/* No clean up */
   5493 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   5494 			remove(DUMMY_FILE);
   5495 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   5496 			close(fd);
   5497 			remove(DUMMY_FILE);
   5498 		}
   5499 		if (fd == -1 || rc == -1) {
   5500 			DMLOG_PRINT(DMLVL_DEBUG,
   5501 				    "Unable to set up variation! (errno = %d)\n",
   5502 				    errno);
   5503 			DMVAR_SKIP();
   5504 		} else {
   5505 			/* Variation */
   5506 			rc2 = stat(DUMMY_FILE, &statfs1);
   5507 			DMLOG_PRINT(DMLVL_DEBUG,
   5508 				    "%s(file DM_AT_SIZE, shrink)\n",
   5509 				    szFuncName);
   5510 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   5511 					     DM_AT_SIZE, &fileattr);
   5512 			rc2 |= stat(DUMMY_FILE, &statfs2);
   5513 			if (rc == 0) {
   5514 				if ((rc2 == 0)
   5515 				    && (statfs1.st_size != statfs2.st_size)
   5516 				    && (statfs2.st_size == TMP_FILELEN / 2)) {
   5517 					DMLOG_PRINT(DMLVL_DEBUG,
   5518 						    "%s passed with expected rc = %d and size modified\n",
   5519 						    szFuncName, 0);
   5520 					DMVAR_PASS();
   5521 				} else {
   5522 					DMLOG_PRINT(DMLVL_ERR,
   5523 						    "%s failed with expected rc = %d but size unmodified (%x vs %x)\n",
   5524 						    szFuncName, 0,
   5525 						    statfs1.st_size,
   5526 						    statfs2.st_size);
   5527 					DMVAR_FAIL();
   5528 				}
   5529 			} else {
   5530 				DMLOG_PRINT(DMLVL_ERR,
   5531 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   5532 					    szFuncName, rc, errno);
   5533 				DMVAR_FAIL();
   5534 			}
   5535 
   5536 			/* Variation clean up */
   5537 			rc = close(fd);
   5538 			rc |= remove(DUMMY_FILE);
   5539 			if (rc == -1) {
   5540 				DMLOG_PRINT(DMLVL_DEBUG,
   5541 					    "Unable to clean up variation! (errno = %d)\n",
   5542 					    errno);
   5543 			}
   5544 			dm_handle_free(hanp, hlen);
   5545 		}
   5546 	}
   5547 
   5548 	/*
   5549 	 * TEST    : dm_set_fileattr - DM_AT_SIZE on file, expand
   5550 	 * EXPECTED: rc = 0
   5551 	 */
   5552 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 16)) {
   5553 		int fd;
   5554 		void *hanp;
   5555 		size_t hlen;
   5556 		dm_fileattr_t fileattr;
   5557 		struct stat statfs1, statfs2;
   5558 		int rc2;
   5559 
   5560 		/* Variation set up */
   5561 		fileattr.fa_size = TMP_FILELEN * 2;
   5562 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   5563 		if ((rc = system(command)) == -1) {
   5564 			/* No clean up */
   5565 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   5566 			remove(DUMMY_FILE);
   5567 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   5568 			close(fd);
   5569 			remove(DUMMY_FILE);
   5570 		}
   5571 		if (fd == -1 || rc == -1) {
   5572 			DMLOG_PRINT(DMLVL_DEBUG,
   5573 				    "Unable to set up variation! (errno = %d)\n",
   5574 				    errno);
   5575 			DMVAR_SKIP();
   5576 		} else {
   5577 			/* Variation */
   5578 			rc2 = stat(DUMMY_FILE, &statfs1);
   5579 			DMLOG_PRINT(DMLVL_DEBUG,
   5580 				    "%s(file DM_AT_SIZE, expand)\n",
   5581 				    szFuncName);
   5582 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   5583 					     DM_AT_SIZE, &fileattr);
   5584 			rc2 |= stat(DUMMY_FILE, &statfs2);
   5585 			if (rc == 0) {
   5586 				if ((rc2 == 0)
   5587 				    && (statfs1.st_size != statfs2.st_size)
   5588 				    && (statfs2.st_size == TMP_FILELEN * 2)) {
   5589 					DMLOG_PRINT(DMLVL_DEBUG,
   5590 						    "%s passed with expected rc = %d and size modified\n",
   5591 						    szFuncName, 0);
   5592 					DMVAR_PASS();
   5593 				} else {
   5594 					DMLOG_PRINT(DMLVL_ERR,
   5595 						    "%s failed with expected rc = %d but size unmodified (%x vs %x)\n",
   5596 						    szFuncName, 0,
   5597 						    statfs1.st_size,
   5598 						    statfs2.st_size);
   5599 					DMVAR_FAIL();
   5600 				}
   5601 			} else {
   5602 				DMLOG_PRINT(DMLVL_ERR,
   5603 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   5604 					    szFuncName, rc, errno);
   5605 				DMVAR_FAIL();
   5606 			}
   5607 
   5608 			/* Variation clean up */
   5609 			rc = close(fd);
   5610 			rc |= remove(DUMMY_FILE);
   5611 			if (rc == -1) {
   5612 				DMLOG_PRINT(DMLVL_DEBUG,
   5613 					    "Unable to clean up variation! (errno = %d)\n",
   5614 					    errno);
   5615 			}
   5616 			dm_handle_free(hanp, hlen);
   5617 		}
   5618 	}
   5619 
   5620 	/*
   5621 	 * TEST    : dm_set_fileattr - fs handle
   5622 	 * EXPECTED: rc = -1, errno = EINVAL
   5623 	 */
   5624 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 17)) {
   5625 		int fd;
   5626 		void *hanp;
   5627 		size_t hlen;
   5628 		dm_fileattr_t fileattr;
   5629 		struct stat statfs1, statfs2;
   5630 		int rc2;
   5631 
   5632 		/* Variation set up */
   5633 		fileattr.fa_uid = DUMMY_UID;
   5634 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   5635 		if ((rc = system(command)) == -1) {
   5636 			/* No clean up */
   5637 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   5638 			remove(DUMMY_FILE);
   5639 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   5640 			   == -1) {
   5641 			close(fd);
   5642 			remove(DUMMY_FILE);
   5643 		}
   5644 		if (fd == -1 || rc == -1) {
   5645 			DMLOG_PRINT(DMLVL_DEBUG,
   5646 				    "Unable to set up variation! (errno = %d)\n",
   5647 				    errno);
   5648 			DMVAR_SKIP();
   5649 		} else {
   5650 			/* Variation */
   5651 			rc2 = stat(DUMMY_FILE, &statfs1);
   5652 			DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName);
   5653 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   5654 					     DM_AT_UID, &fileattr);
   5655 			rc2 |= stat(DUMMY_FILE, &statfs2);
   5656 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   5657 
   5658 			/* Variation clean up */
   5659 			rc = close(fd);
   5660 			rc |= remove(DUMMY_FILE);
   5661 			if (rc == -1) {
   5662 				DMLOG_PRINT(DMLVL_DEBUG,
   5663 					    "Unable to clean up variation! (errno = %d)\n",
   5664 					    errno);
   5665 			}
   5666 			dm_handle_free(hanp, hlen);
   5667 		}
   5668 	}
   5669 
   5670 	/*
   5671 	 * TEST    : dm_set_fileattr - DM_AT_ATIME on directory
   5672 	 * EXPECTED: rc = 0
   5673 	 */
   5674 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 18)) {
   5675 		void *hanp;
   5676 		size_t hlen;
   5677 		dm_fileattr_t fileattr;
   5678 		struct stat statfs1, statfs2;
   5679 		int rc2;
   5680 
   5681 		/* Variation set up */
   5682 		fileattr.fa_atime = DUMMY_TIME;
   5683 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   5684 			/* No clean up */
   5685 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   5686 			   == -1) {
   5687 			rmdir(DUMMY_SUBDIR);
   5688 		}
   5689 		if (rc == -1) {
   5690 			DMLOG_PRINT(DMLVL_DEBUG,
   5691 				    "Unable to set up variation! (errno = %d)\n",
   5692 				    errno);
   5693 			DMVAR_SKIP();
   5694 		} else {
   5695 			/* Variation */
   5696 			rc2 = stat(DUMMY_SUBDIR, &statfs1);
   5697 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir DM_AT_ATIME)\n",
   5698 				    szFuncName);
   5699 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   5700 					     DM_AT_ATIME, &fileattr);
   5701 			rc2 |= stat(DUMMY_SUBDIR, &statfs2);
   5702 			if (rc == 0) {
   5703 				if ((rc2 == 0)
   5704 				    && (statfs1.st_atime != statfs2.st_atime)
   5705 				    && (statfs2.st_atime == DUMMY_TIME)) {
   5706 					DMLOG_PRINT(DMLVL_DEBUG,
   5707 						    "%s passed with expected rc = %d and atime modified\n",
   5708 						    szFuncName, 0);
   5709 					DMVAR_PASS();
   5710 				} else {
   5711 					DMLOG_PRINT(DMLVL_ERR,
   5712 						    "%s failed with expected rc = %d but atime unmodified (%d vs %d)\n",
   5713 						    szFuncName, 0,
   5714 						    statfs1.st_atime,
   5715 						    statfs2.st_atime);
   5716 					DMVAR_FAIL();
   5717 				}
   5718 			} else {
   5719 				DMLOG_PRINT(DMLVL_ERR,
   5720 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   5721 					    szFuncName, rc, errno);
   5722 				DMVAR_FAIL();
   5723 			}
   5724 
   5725 			/* Variation clean up */
   5726 			rc = rmdir(DUMMY_SUBDIR);
   5727 			if (rc == -1) {
   5728 				DMLOG_PRINT(DMLVL_DEBUG,
   5729 					    "Unable to clean up variation! (errno = %d)\n",
   5730 					    errno);
   5731 			}
   5732 			dm_handle_free(hanp, hlen);
   5733 		}
   5734 	}
   5735 
   5736 	/*
   5737 	 * TEST    : dm_set_fileattr - DM_AT_MTIME on directory
   5738 	 * EXPECTED: rc = 0
   5739 	 */
   5740 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 19)) {
   5741 		void *hanp;
   5742 		size_t hlen;
   5743 		dm_fileattr_t fileattr;
   5744 		struct stat statfs1, statfs2;
   5745 		int rc2;
   5746 
   5747 		/* Variation set up */
   5748 		fileattr.fa_mtime = DUMMY_TIME;
   5749 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   5750 			/* No clean up */
   5751 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   5752 			   == -1) {
   5753 			rmdir(DUMMY_SUBDIR);
   5754 		}
   5755 		if (rc == -1) {
   5756 			DMLOG_PRINT(DMLVL_DEBUG,
   5757 				    "Unable to set up variation! (errno = %d)\n",
   5758 				    errno);
   5759 			DMVAR_SKIP();
   5760 		} else {
   5761 			/* Variation */
   5762 			rc2 = stat(DUMMY_SUBDIR, &statfs1);
   5763 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir DM_AT_MTIME)\n",
   5764 				    szFuncName);
   5765 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   5766 					     DM_AT_MTIME, &fileattr);
   5767 			rc2 |= stat(DUMMY_SUBDIR, &statfs2);
   5768 			if (rc == 0) {
   5769 				if ((rc2 == 0)
   5770 				    && (statfs1.st_mtime != statfs2.st_mtime)
   5771 				    && (statfs2.st_mtime == DUMMY_TIME)) {
   5772 					DMLOG_PRINT(DMLVL_DEBUG,
   5773 						    "%s passed with expected rc = %d and mtime modified\n",
   5774 						    szFuncName, 0);
   5775 					DMVAR_PASS();
   5776 				} else {
   5777 					DMLOG_PRINT(DMLVL_ERR,
   5778 						    "%s failed with expected rc = %d but mtime unmodified (%d vs %d)\n",
   5779 						    szFuncName, 0,
   5780 						    statfs1.st_mtime,
   5781 						    statfs2.st_mtime);
   5782 					DMVAR_FAIL();
   5783 				}
   5784 			} else {
   5785 				DMLOG_PRINT(DMLVL_ERR,
   5786 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   5787 					    szFuncName, rc, errno);
   5788 				DMVAR_FAIL();
   5789 			}
   5790 
   5791 			/* Variation clean up */
   5792 			rc = rmdir(DUMMY_SUBDIR);
   5793 			if (rc == -1) {
   5794 				DMLOG_PRINT(DMLVL_DEBUG,
   5795 					    "Unable to clean up variation! (errno = %d)\n",
   5796 					    errno);
   5797 			}
   5798 			dm_handle_free(hanp, hlen);
   5799 		}
   5800 	}
   5801 
   5802 	/*
   5803 	 * TEST    : dm_set_fileattr - DM_AT_CTIME on directory
   5804 	 * EXPECTED: rc = 0
   5805 	 */
   5806 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 20)) {
   5807 		void *hanp;
   5808 		size_t hlen;
   5809 		dm_fileattr_t fileattr;
   5810 		struct stat statfs1, statfs2;
   5811 		int rc2;
   5812 
   5813 		/* Variation set up */
   5814 		fileattr.fa_ctime = DUMMY_TIME;
   5815 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   5816 			/* No clean up */
   5817 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   5818 			   == -1) {
   5819 			rmdir(DUMMY_SUBDIR);
   5820 		}
   5821 		if (rc == -1) {
   5822 			DMLOG_PRINT(DMLVL_DEBUG,
   5823 				    "Unable to set up variation! (errno = %d)\n",
   5824 				    errno);
   5825 			DMVAR_SKIP();
   5826 		} else {
   5827 			/* Variation */
   5828 			rc2 = stat(DUMMY_SUBDIR, &statfs1);
   5829 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir DM_AT_CTIME)\n",
   5830 				    szFuncName);
   5831 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   5832 					     DM_AT_CTIME, &fileattr);
   5833 			rc2 |= stat(DUMMY_SUBDIR, &statfs2);
   5834 			if (rc == 0) {
   5835 				if ((rc2 == 0)
   5836 				    && (statfs1.st_ctime != statfs2.st_ctime)
   5837 				    && (statfs2.st_ctime == DUMMY_TIME)) {
   5838 					DMLOG_PRINT(DMLVL_DEBUG,
   5839 						    "%s passed with expected rc = %d and ctime modified\n",
   5840 						    szFuncName, 0);
   5841 					DMVAR_PASS();
   5842 				} else {
   5843 					DMLOG_PRINT(DMLVL_ERR,
   5844 						    "%s failed with expected rc = %d but ctime unmodified (%d vs %d)\n",
   5845 						    szFuncName, 0,
   5846 						    statfs1.st_ctime,
   5847 						    statfs2.st_ctime);
   5848 					DMVAR_FAIL();
   5849 				}
   5850 			} else {
   5851 				DMLOG_PRINT(DMLVL_ERR,
   5852 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   5853 					    szFuncName, rc, errno);
   5854 				DMVAR_FAIL();
   5855 			}
   5856 
   5857 			/* Variation clean up */
   5858 			rc = rmdir(DUMMY_SUBDIR);
   5859 			if (rc == -1) {
   5860 				DMLOG_PRINT(DMLVL_DEBUG,
   5861 					    "Unable to clean up variation! (errno = %d)\n",
   5862 					    errno);
   5863 			}
   5864 			dm_handle_free(hanp, hlen);
   5865 		}
   5866 	}
   5867 
   5868 	/*
   5869 	 * TEST    : dm_set_fileattr - DM_AT_DTIME on directory with DM attribute
   5870 	 * EXPECTED: rc = 0
   5871 	 */
   5872 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 21)) {
   5873 		void *hanp;
   5874 		size_t hlen;
   5875 		dm_fileattr_t fileattr;
   5876 		dm_attrname_t attrname;
   5877 		char buf[ATTR_LISTLEN];
   5878 		struct stat statfs1, statfs2;
   5879 		int rc2;
   5880 
   5881 		/* Variation set up */
   5882 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   5883 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   5884 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   5885 		fileattr.fa_dtime = DUMMY_TIME;
   5886 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   5887 			/* No clean up */
   5888 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   5889 			   == -1) {
   5890 			rmdir(DUMMY_SUBDIR);
   5891 		} else
   5892 		    if ((rc =
   5893 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   5894 				       0, ATTR_VALUELEN, buf)) == -1) {
   5895 			dm_handle_free(hanp, hlen);
   5896 			rmdir(DUMMY_SUBDIR);
   5897 		}
   5898 		if (rc == -1) {
   5899 			DMLOG_PRINT(DMLVL_DEBUG,
   5900 				    "Unable to set up variation! (errno = %d)\n",
   5901 				    errno);
   5902 			DMVAR_SKIP();
   5903 		} else {
   5904 			/* Variation */
   5905 			rc2 = stat(DUMMY_SUBDIR, &statfs1);
   5906 			DMLOG_PRINT(DMLVL_DEBUG,
   5907 				    "%s(dir DM_AT_DTIME with attr)\n",
   5908 				    szFuncName);
   5909 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   5910 					     DM_AT_DTIME, &fileattr);
   5911 			rc2 |= stat(DUMMY_SUBDIR, &statfs2);
   5912 			if (rc == 0) {
   5913 				if ((rc2 == 0)
   5914 				    && (statfs1.st_ctime != statfs2.st_ctime)
   5915 				    && (statfs2.st_ctime == DUMMY_TIME)) {
   5916 					DMLOG_PRINT(DMLVL_DEBUG,
   5917 						    "%s passed with expected rc = %d and ctime modified\n",
   5918 						    szFuncName, 0);
   5919 					DMVAR_PASS();
   5920 				} else {
   5921 					DMLOG_PRINT(DMLVL_ERR,
   5922 						    "%s failed with expected rc = %d but ctime unmodified (%d vs %d)\n",
   5923 						    szFuncName, 0,
   5924 						    statfs1.st_ctime,
   5925 						    statfs2.st_ctime);
   5926 					DMVAR_FAIL();
   5927 				}
   5928 			} else {
   5929 				DMLOG_PRINT(DMLVL_ERR,
   5930 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   5931 					    szFuncName, rc, errno);
   5932 				DMVAR_FAIL();
   5933 			}
   5934 
   5935 			/* Variation clean up */
   5936 			rc = rmdir(DUMMY_SUBDIR);
   5937 			if (rc == -1) {
   5938 				DMLOG_PRINT(DMLVL_DEBUG,
   5939 					    "Unable to clean up variation! (errno = %d)\n",
   5940 					    errno);
   5941 			}
   5942 			dm_handle_free(hanp, hlen);
   5943 		}
   5944 	}
   5945 
   5946 	/*
   5947 	 * TEST    : dm_set_fileattr - DM_AT_DTIME on directory without DM attribute
   5948 	 * EXPECTED: rc = -1, errno = EINVAL
   5949 	 */
   5950 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 22)) {
   5951 		void *hanp;
   5952 		size_t hlen;
   5953 		dm_fileattr_t fileattr;
   5954 		struct stat statfs1, statfs2;
   5955 		int rc2;
   5956 
   5957 		/* Variation set up */
   5958 		fileattr.fa_dtime = DUMMY_TIME;
   5959 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   5960 			/* No clean up */
   5961 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   5962 			   == -1) {
   5963 			rmdir(DUMMY_SUBDIR);
   5964 		}
   5965 		if (rc == -1) {
   5966 			DMLOG_PRINT(DMLVL_DEBUG,
   5967 				    "Unable to set up variation! (errno = %d)\n",
   5968 				    errno);
   5969 			DMVAR_SKIP();
   5970 		} else {
   5971 			/* Variation */
   5972 			rc2 = stat(DUMMY_SUBDIR, &statfs1);
   5973 			DMLOG_PRINT(DMLVL_DEBUG,
   5974 				    "%s(dir DM_AT_DTIME without attr)\n",
   5975 				    szFuncName);
   5976 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   5977 					     DM_AT_DTIME, &fileattr);
   5978 			rc2 |= stat(DUMMY_SUBDIR, &statfs2);
   5979 			if (rc == 0) {
   5980 				if ((rc2 == 0)
   5981 				    && (statfs1.st_ctime == statfs2.st_ctime)
   5982 				    && (statfs2.st_ctime != DUMMY_TIME)) {
   5983 					DMLOG_PRINT(DMLVL_DEBUG,
   5984 						    "%s passed with expected rc = %d and ctime unmodified\n",
   5985 						    szFuncName, 0);
   5986 					DMVAR_PASS();
   5987 				} else {
   5988 					DMLOG_PRINT(DMLVL_ERR,
   5989 						    "%s failed with expected rc = %d but ctime modified (%d vs %d)\n",
   5990 						    szFuncName, 0,
   5991 						    statfs1.st_ctime,
   5992 						    statfs2.st_ctime);
   5993 					DMVAR_FAIL();
   5994 				}
   5995 			} else {
   5996 				DMLOG_PRINT(DMLVL_ERR,
   5997 					    "%s failed with unexpected rc = %d\n",
   5998 					    szFuncName, rc);
   5999 				DMVAR_FAIL();
   6000 			}
   6001 
   6002 			/* Variation clean up */
   6003 			rc = rmdir(DUMMY_SUBDIR);
   6004 			if (rc == -1) {
   6005 				DMLOG_PRINT(DMLVL_DEBUG,
   6006 					    "Unable to clean up variation! (errno = %d)\n",
   6007 					    errno);
   6008 			}
   6009 			dm_handle_free(hanp, hlen);
   6010 		}
   6011 	}
   6012 
   6013 	/*
   6014 	 * TEST    : dm_set_fileattr - DM_AT_UID on directory
   6015 	 * EXPECTED: rc = 0
   6016 	 */
   6017 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 23)) {
   6018 		void *hanp;
   6019 		size_t hlen;
   6020 		dm_fileattr_t fileattr;
   6021 		struct stat statfs1, statfs2;
   6022 		int rc2;
   6023 
   6024 		/* Variation set up */
   6025 		fileattr.fa_uid = DUMMY_UID;
   6026 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   6027 			/* No clean up */
   6028 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   6029 			   == -1) {
   6030 			rmdir(DUMMY_SUBDIR);
   6031 		}
   6032 		if (rc == -1) {
   6033 			DMLOG_PRINT(DMLVL_DEBUG,
   6034 				    "Unable to set up variation! (errno = %d)\n",
   6035 				    errno);
   6036 			DMVAR_SKIP();
   6037 		} else {
   6038 			/* Variation */
   6039 			rc2 = stat(DUMMY_SUBDIR, &statfs1);
   6040 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir DM_AT_UID)\n",
   6041 				    szFuncName);
   6042 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   6043 					     DM_AT_UID, &fileattr);
   6044 			rc2 |= stat(DUMMY_SUBDIR, &statfs2);
   6045 			if (rc == 0) {
   6046 				if ((rc2 == 0)
   6047 				    && (statfs1.st_uid != statfs2.st_uid)
   6048 				    && (statfs2.st_uid == DUMMY_UID)) {
   6049 					DMLOG_PRINT(DMLVL_DEBUG,
   6050 						    "%s passed with expected rc = %d and uid modified\n",
   6051 						    szFuncName, 0);
   6052 					DMVAR_PASS();
   6053 				} else {
   6054 					DMLOG_PRINT(DMLVL_ERR,
   6055 						    "%s failed with expected rc = %d but uid unmodified (%d vs %d)\n",
   6056 						    szFuncName, 0,
   6057 						    statfs1.st_uid,
   6058 						    statfs2.st_uid);
   6059 					DMVAR_FAIL();
   6060 				}
   6061 			} else {
   6062 				DMLOG_PRINT(DMLVL_ERR,
   6063 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   6064 					    szFuncName, rc, errno);
   6065 				DMVAR_FAIL();
   6066 			}
   6067 
   6068 			/* Variation clean up */
   6069 			rc = rmdir(DUMMY_SUBDIR);
   6070 			if (rc == -1) {
   6071 				DMLOG_PRINT(DMLVL_DEBUG,
   6072 					    "Unable to clean up variation! (errno = %d)\n",
   6073 					    errno);
   6074 			}
   6075 			dm_handle_free(hanp, hlen);
   6076 		}
   6077 	}
   6078 
   6079 	/*
   6080 	 * TEST    : dm_set_fileattr - DM_AT_GID on directory
   6081 	 * EXPECTED: rc = 0
   6082 	 */
   6083 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 24)) {
   6084 		void *hanp;
   6085 		size_t hlen;
   6086 		dm_fileattr_t fileattr;
   6087 		struct stat statfs1, statfs2;
   6088 		int rc2;
   6089 
   6090 		/* Variation set up */
   6091 		fileattr.fa_gid = DUMMY_GID;
   6092 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   6093 			/* No clean up */
   6094 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   6095 			   == -1) {
   6096 			rmdir(DUMMY_SUBDIR);
   6097 		}
   6098 		if (rc == -1) {
   6099 			DMLOG_PRINT(DMLVL_DEBUG,
   6100 				    "Unable to set up variation! (errno = %d)\n",
   6101 				    errno);
   6102 			DMVAR_SKIP();
   6103 		} else {
   6104 			/* Variation */
   6105 			rc2 = stat(DUMMY_SUBDIR, &statfs1);
   6106 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir DM_AT_GID)\n",
   6107 				    szFuncName);
   6108 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   6109 					     DM_AT_GID, &fileattr);
   6110 			rc2 |= stat(DUMMY_SUBDIR, &statfs2);
   6111 			if (rc == 0) {
   6112 				if ((rc2 == 0)
   6113 				    && (statfs1.st_gid != statfs2.st_gid)
   6114 				    && (statfs2.st_gid == DUMMY_GID)) {
   6115 					DMLOG_PRINT(DMLVL_DEBUG,
   6116 						    "%s passed with expected rc = %d and gid modified\n",
   6117 						    szFuncName, 0);
   6118 					DMVAR_PASS();
   6119 				} else {
   6120 					DMLOG_PRINT(DMLVL_ERR,
   6121 						    "%s failed with expected rc = %d but gid unmodified (%d vs %d)\n",
   6122 						    szFuncName, 0,
   6123 						    statfs1.st_gid,
   6124 						    statfs2.st_gid);
   6125 					DMVAR_FAIL();
   6126 				}
   6127 			} else {
   6128 				DMLOG_PRINT(DMLVL_ERR,
   6129 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   6130 					    szFuncName, rc, errno);
   6131 				DMVAR_FAIL();
   6132 			}
   6133 
   6134 			/* Variation clean up */
   6135 			rc = rmdir(DUMMY_SUBDIR);
   6136 			if (rc == -1) {
   6137 				DMLOG_PRINT(DMLVL_DEBUG,
   6138 					    "Unable to clean up variation! (errno = %d)\n",
   6139 					    errno);
   6140 			}
   6141 			dm_handle_free(hanp, hlen);
   6142 		}
   6143 	}
   6144 
   6145 	/*
   6146 	 * TEST    : dm_set_fileattr - DM_AT_MODE on directory
   6147 	 * EXPECTED: rc = 0
   6148 	 */
   6149 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 25)) {
   6150 		void *hanp;
   6151 		size_t hlen;
   6152 		dm_fileattr_t fileattr;
   6153 		struct stat statfs1, statfs2;
   6154 		int rc2;
   6155 
   6156 		/* Variation set up */
   6157 		fileattr.fa_mode = DUMMY_MODE;
   6158 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   6159 			/* No clean up */
   6160 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   6161 			   == -1) {
   6162 			rmdir(DUMMY_SUBDIR);
   6163 		}
   6164 		if (rc == -1) {
   6165 			DMLOG_PRINT(DMLVL_DEBUG,
   6166 				    "Unable to set up variation! (errno = %d)\n",
   6167 				    errno);
   6168 			DMVAR_SKIP();
   6169 		} else {
   6170 			/* Variation */
   6171 			rc2 = stat(DUMMY_SUBDIR, &statfs1);
   6172 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir DM_AT_MODE)\n",
   6173 				    szFuncName);
   6174 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   6175 					     DM_AT_MODE, &fileattr);
   6176 			rc2 |= stat(DUMMY_SUBDIR, &statfs2);
   6177 			if (rc == 0) {
   6178 				if ((rc2 == 0)
   6179 				    && (statfs1.st_mode != statfs2.st_mode)
   6180 				    && ((statfs2.st_mode & MODE_MASK) ==
   6181 					DUMMY_MODE)) {
   6182 					DMLOG_PRINT(DMLVL_DEBUG,
   6183 						    "%s passed with expected rc = %d and mode modified\n",
   6184 						    szFuncName, 0);
   6185 					DMVAR_PASS();
   6186 				} else {
   6187 					DMLOG_PRINT(DMLVL_ERR,
   6188 						    "%s failed with expected rc = %d but mode unmodified (%x vs %x)\n",
   6189 						    szFuncName, 0,
   6190 						    statfs1.st_mode,
   6191 						    statfs2.st_mode);
   6192 					DMVAR_FAIL();
   6193 				}
   6194 			} else {
   6195 				DMLOG_PRINT(DMLVL_ERR,
   6196 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   6197 					    szFuncName, rc, errno);
   6198 				DMVAR_FAIL();
   6199 			}
   6200 
   6201 			/* Variation clean up */
   6202 			rc = rmdir(DUMMY_SUBDIR);
   6203 			if (rc == -1) {
   6204 				DMLOG_PRINT(DMLVL_DEBUG,
   6205 					    "Unable to clean up variation! (errno = %d)\n",
   6206 					    errno);
   6207 			}
   6208 			dm_handle_free(hanp, hlen);
   6209 		}
   6210 	}
   6211 
   6212 	/*
   6213 	 * TEST    : dm_set_fileattr - DM_NO_SESSION sid
   6214 	 * EXPECTED: rc = -1, errno = EINVAL
   6215 	 */
   6216 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 26)) {
   6217 		int fd;
   6218 		void *hanp;
   6219 		size_t hlen;
   6220 		dm_fileattr_t fileattr;
   6221 
   6222 		/* Variation set up */
   6223 		fileattr.fa_uid = DUMMY_UID;
   6224 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   6225 		if ((rc = system(command)) == -1) {
   6226 			/* No clean up */
   6227 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   6228 			remove(DUMMY_FILE);
   6229 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   6230 			close(fd);
   6231 			remove(DUMMY_FILE);
   6232 		}
   6233 		if (fd == -1 || rc == -1) {
   6234 			DMLOG_PRINT(DMLVL_DEBUG,
   6235 				    "Unable to set up variation! (errno = %d)\n",
   6236 				    errno);
   6237 			DMVAR_SKIP();
   6238 		} else {
   6239 			/* Variation */
   6240 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
   6241 				    szFuncName);
   6242 			rc = dm_set_fileattr(DM_NO_SESSION, hanp, hlen,
   6243 					     DM_NO_TOKEN, DM_AT_UID, &fileattr);
   6244 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   6245 
   6246 			/* Variation clean up */
   6247 			rc = close(fd);
   6248 			rc |= remove(DUMMY_FILE);
   6249 			if (rc == -1) {
   6250 				DMLOG_PRINT(DMLVL_DEBUG,
   6251 					    "Unable to clean up variation! (errno = %d)\n",
   6252 					    errno);
   6253 			}
   6254 			dm_handle_free(hanp, hlen);
   6255 		}
   6256 	}
   6257 
   6258 	/*
   6259 	 * TEST    : dm_set_fileattr - global handle
   6260 	 * EXPECTED: rc = -1, errno = EBADF
   6261 	 */
   6262 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 27)) {
   6263 		dm_fileattr_t fileattr;
   6264 
   6265 		/* Variation set up */
   6266 		fileattr.fa_uid = DUMMY_UID;
   6267 
   6268 		/* Variation */
   6269 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
   6270 		rc = dm_set_fileattr(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN,
   6271 				     DM_NO_TOKEN, DM_AT_UID, &fileattr);
   6272 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   6273 
   6274 		/* Variation clean up */
   6275 	}
   6276 
   6277 	/*
   6278 	 * TEST    : dm_set_fileattr - invalidated hanp
   6279 	 * EXPECTED: rc = -1, errno = EBADF
   6280 	 */
   6281 	if (DMVAR_EXEC(SET_FILEATTR_BASE + 28)) {
   6282 		int fd;
   6283 		void *hanp;
   6284 		size_t hlen;
   6285 		dm_fileattr_t fileattr;
   6286 
   6287 		/* Variation set up */
   6288 		fileattr.fa_uid = DUMMY_UID;
   6289 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   6290 		if ((rc = system(command)) == -1) {
   6291 			/* No clean up */
   6292 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   6293 			remove(DUMMY_FILE);
   6294 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   6295 			close(fd);
   6296 			remove(DUMMY_FILE);
   6297 		} else if ((rc = close(fd)) == -1) {
   6298 			dm_handle_free(hanp, hlen);
   6299 			remove(DUMMY_FILE);
   6300 		} else if ((rc = remove(DUMMY_FILE)) == -1) {
   6301 			dm_handle_free(hanp, hlen);
   6302 		}
   6303 		if (fd == -1 || rc == -1) {
   6304 			DMLOG_PRINT(DMLVL_DEBUG,
   6305 				    "Unable to set up variation! (errno = %d)\n",
   6306 				    errno);
   6307 			DMVAR_SKIP();
   6308 		} else {
   6309 			/* Variation */
   6310 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated hanp)\n",
   6311 				    szFuncName);
   6312 			rc = dm_set_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   6313 					     DM_AT_UID, &fileattr);
   6314 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   6315 
   6316 			/* Variation clean up */
   6317 			dm_handle_free(hanp, hlen);
   6318 		}
   6319 	}
   6320 
   6321 	szFuncName = "dm_get_fileattr";
   6322 
   6323 	/*
   6324 	 * TEST    : dm_get_fileattr - invalid sid
   6325 	 * EXPECTED: rc = -1, errno = EINVAL
   6326 	 */
   6327 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 1)) {
   6328 		int fd;
   6329 		void *hanp;
   6330 		size_t hlen;
   6331 		dm_stat_t stat;
   6332 
   6333 		/* Variation set up */
   6334 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   6335 		if ((rc = system(command)) == -1) {
   6336 			/* No clean up */
   6337 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   6338 			remove(DUMMY_FILE);
   6339 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   6340 			close(fd);
   6341 			remove(DUMMY_FILE);
   6342 		}
   6343 		if (fd == -1 || rc == -1) {
   6344 			DMLOG_PRINT(DMLVL_DEBUG,
   6345 				    "Unable to set up variation! (errno = %d)\n",
   6346 				    errno);
   6347 			DMVAR_SKIP();
   6348 		} else {
   6349 			/* Variation */
   6350 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
   6351 				    szFuncName);
   6352 			rc = dm_get_fileattr(INVALID_ADDR, hanp, hlen,
   6353 					     DM_NO_TOKEN, DM_AT_EMASK, &stat);
   6354 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   6355 
   6356 			/* Variation clean up */
   6357 			rc = close(fd);
   6358 			rc |= remove(DUMMY_FILE);
   6359 			if (rc == -1) {
   6360 				DMLOG_PRINT(DMLVL_DEBUG,
   6361 					    "Unable to clean up variation! (errno = %d)\n",
   6362 					    errno);
   6363 			}
   6364 			dm_handle_free(hanp, hlen);
   6365 		}
   6366 	}
   6367 
   6368 	/*
   6369 	 * TEST    : dm_get_fileattr - invalid hanp
   6370 	 * EXPECTED: rc = -1, errno = EFAULT
   6371 	 */
   6372 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 2)) {
   6373 		int fd;
   6374 		void *hanp;
   6375 		size_t hlen;
   6376 		dm_stat_t stat;
   6377 
   6378 		/* Variation set up */
   6379 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   6380 		if ((rc = system(command)) == -1) {
   6381 			/* No clean up */
   6382 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   6383 			remove(DUMMY_FILE);
   6384 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   6385 			close(fd);
   6386 			remove(DUMMY_FILE);
   6387 		}
   6388 		if (fd == -1 || rc == -1) {
   6389 			DMLOG_PRINT(DMLVL_DEBUG,
   6390 				    "Unable to set up variation! (errno = %d)\n",
   6391 				    errno);
   6392 			DMVAR_SKIP();
   6393 		} else {
   6394 			/* Variation */
   6395 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
   6396 				    szFuncName);
   6397 			rc = dm_get_fileattr(sid, (void *)INVALID_ADDR, hlen,
   6398 					     DM_NO_TOKEN, DM_AT_EMASK, &stat);
   6399 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   6400 
   6401 			/* Variation clean up */
   6402 			rc = close(fd);
   6403 			rc |= remove(DUMMY_FILE);
   6404 			if (rc == -1) {
   6405 				DMLOG_PRINT(DMLVL_DEBUG,
   6406 					    "Unable to clean up variation! (errno = %d)\n",
   6407 					    errno);
   6408 			}
   6409 			dm_handle_free(hanp, hlen);
   6410 		}
   6411 	}
   6412 
   6413 	/*
   6414 	 * TEST    : dm_get_fileattr - invalid hlen
   6415 	 * EXPECTED: rc = -1, errno = EBADF
   6416 	 */
   6417 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 3)) {
   6418 		int fd;
   6419 		void *hanp;
   6420 		size_t hlen;
   6421 		dm_stat_t stat;
   6422 
   6423 		/* Variation set up */
   6424 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   6425 		if ((rc = system(command)) == -1) {
   6426 			/* No clean up */
   6427 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   6428 			remove(DUMMY_FILE);
   6429 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   6430 			close(fd);
   6431 			remove(DUMMY_FILE);
   6432 		}
   6433 		if (fd == -1 || rc == -1) {
   6434 			DMLOG_PRINT(DMLVL_DEBUG,
   6435 				    "Unable to set up variation! (errno = %d)\n",
   6436 				    errno);
   6437 			DMVAR_SKIP();
   6438 		} else {
   6439 			/* Variation */
   6440 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
   6441 				    szFuncName);
   6442 			rc = dm_get_fileattr(sid, hanp, INVALID_ADDR,
   6443 					     DM_NO_TOKEN, DM_AT_EMASK, &stat);
   6444 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   6445 
   6446 			/* Variation clean up */
   6447 			rc = close(fd);
   6448 			rc |= remove(DUMMY_FILE);
   6449 			if (rc == -1) {
   6450 				DMLOG_PRINT(DMLVL_DEBUG,
   6451 					    "Unable to clean up variation! (errno = %d)\n",
   6452 					    errno);
   6453 			}
   6454 			dm_handle_free(hanp, hlen);
   6455 		}
   6456 	}
   6457 
   6458 	/*
   6459 	 * TEST    : dm_get_fileattr - invalid token
   6460 	 * EXPECTED: rc = -1, errno = EINVAL
   6461 	 */
   6462 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 4)) {
   6463 		int fd;
   6464 		void *hanp;
   6465 		size_t hlen;
   6466 		dm_stat_t stat;
   6467 
   6468 		/* Variation set up */
   6469 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   6470 		if ((rc = system(command)) == -1) {
   6471 			/* No clean up */
   6472 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   6473 			remove(DUMMY_FILE);
   6474 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   6475 			close(fd);
   6476 			remove(DUMMY_FILE);
   6477 		}
   6478 		if (fd == -1 || rc == -1) {
   6479 			DMLOG_PRINT(DMLVL_DEBUG,
   6480 				    "Unable to set up variation! (errno = %d)\n",
   6481 				    errno);
   6482 			DMVAR_SKIP();
   6483 		} else {
   6484 			/* Variation */
   6485 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
   6486 				    szFuncName);
   6487 			rc = dm_get_fileattr(sid, hanp, hlen, INVALID_ADDR,
   6488 					     DM_AT_EMASK, &stat);
   6489 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   6490 
   6491 			/* Variation clean up */
   6492 			rc = close(fd);
   6493 			rc |= remove(DUMMY_FILE);
   6494 			if (rc == -1) {
   6495 				DMLOG_PRINT(DMLVL_DEBUG,
   6496 					    "Unable to clean up variation! (errno = %d)\n",
   6497 					    errno);
   6498 			}
   6499 			dm_handle_free(hanp, hlen);
   6500 		}
   6501 	}
   6502 
   6503 	/*
   6504 	 * TEST    : dm_get_fileattr - invalid mask
   6505 	 * EXPECTED: rc = -1, errno = EINVAL
   6506 	 *
   6507 	 * This variation uncovered XFS BUG #22 (0 returned instead of -1 and
   6508 	 * EINVAL errno)
   6509 	 */
   6510 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 5)) {
   6511 		int fd;
   6512 		void *hanp;
   6513 		size_t hlen;
   6514 		dm_stat_t stat;
   6515 
   6516 		/* Variation set up */
   6517 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   6518 		if ((rc = system(command)) == -1) {
   6519 			/* No clean up */
   6520 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   6521 			remove(DUMMY_FILE);
   6522 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   6523 			close(fd);
   6524 			remove(DUMMY_FILE);
   6525 		}
   6526 		if (fd == -1 || rc == -1) {
   6527 			DMLOG_PRINT(DMLVL_DEBUG,
   6528 				    "Unable to set up variation! (errno = %d)\n",
   6529 				    errno);
   6530 			DMVAR_SKIP();
   6531 		} else {
   6532 			/* Variation */
   6533 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid mask)\n",
   6534 				    szFuncName);
   6535 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   6536 					     DM_AT_HANDLE, &stat);
   6537 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   6538 
   6539 			/* Variation clean up */
   6540 			rc = close(fd);
   6541 			rc |= remove(DUMMY_FILE);
   6542 			if (rc == -1) {
   6543 				DMLOG_PRINT(DMLVL_DEBUG,
   6544 					    "Unable to clean up variation! (errno = %d)\n",
   6545 					    errno);
   6546 			}
   6547 			dm_handle_free(hanp, hlen);
   6548 		}
   6549 	}
   6550 
   6551 	/*
   6552 	 * TEST    : dm_get_fileattr - invalid statp
   6553 	 * EXPECTED: rc = -1, errno = EFAULT
   6554 	 */
   6555 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 6)) {
   6556 		int fd;
   6557 		void *hanp;
   6558 		size_t hlen;
   6559 
   6560 		/* Variation set up */
   6561 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   6562 		if ((rc = system(command)) == -1) {
   6563 			/* No clean up */
   6564 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   6565 			remove(DUMMY_FILE);
   6566 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   6567 			close(fd);
   6568 			remove(DUMMY_FILE);
   6569 		}
   6570 		if (fd == -1 || rc == -1) {
   6571 			DMLOG_PRINT(DMLVL_DEBUG,
   6572 				    "Unable to set up variation! (errno = %d)\n",
   6573 				    errno);
   6574 			DMVAR_SKIP();
   6575 		} else {
   6576 			/* Variation */
   6577 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid statp)\n",
   6578 				    szFuncName);
   6579 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   6580 					     DM_AT_EMASK,
   6581 					     (dm_stat_t *) INVALID_ADDR);
   6582 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   6583 
   6584 			/* Variation clean up */
   6585 			rc = close(fd);
   6586 			rc |= remove(DUMMY_FILE);
   6587 			if (rc == -1) {
   6588 				DMLOG_PRINT(DMLVL_DEBUG,
   6589 					    "Unable to clean up variation! (errno = %d)\n",
   6590 					    errno);
   6591 			}
   6592 			dm_handle_free(hanp, hlen);
   6593 		}
   6594 	}
   6595 
   6596 	/*
   6597 	 * TEST    : dm_get_fileattr - DM_AT_EMASK on file
   6598 	 * EXPECTED: rc = 0
   6599 	 */
   6600 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 7)) {
   6601 		int fd;
   6602 		void *hanp;
   6603 		size_t hlen;
   6604 		dm_stat_t stat;
   6605 		dm_eventset_t eventset;
   6606 
   6607 		/* Variation set up */
   6608 		DMEV_ZERO(eventset);
   6609 		DMEV_SET(DM_EVENT_ATTRIBUTE, eventset);
   6610 		DMEV_SET(DM_EVENT_CLOSE, eventset);
   6611 		DMEV_SET(DM_EVENT_DESTROY, eventset);
   6612 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   6613 		if ((rc = system(command)) == -1) {
   6614 			/* No clean up */
   6615 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   6616 			remove(DUMMY_FILE);
   6617 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   6618 			close(fd);
   6619 			remove(DUMMY_FILE);
   6620 		} else
   6621 		    if ((rc =
   6622 			 dm_set_eventlist(sid, hanp, hlen, DM_NO_TOKEN,
   6623 					  &eventset, DM_EVENT_MAX)) == -1) {
   6624 			dm_handle_free(hanp, hlen);
   6625 			close(fd);
   6626 			remove(DUMMY_FILE);
   6627 		}
   6628 		if (fd == -1 || rc == -1) {
   6629 			DMLOG_PRINT(DMLVL_DEBUG,
   6630 				    "Unable to set up variation! (errno = %d)\n",
   6631 				    errno);
   6632 			DMVAR_SKIP();
   6633 		} else {
   6634 			/* Variation */
   6635 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file DM_AT_EMASK)\n",
   6636 				    szFuncName);
   6637 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   6638 					     DM_AT_EMASK, &stat);
   6639 			if (rc == 0) {
   6640 				if (memcmp
   6641 				    (&eventset, &stat.dt_emask,
   6642 				     sizeof(dm_eventset_t)) == 0) {
   6643 					DMLOG_PRINT(DMLVL_DEBUG,
   6644 						    "%s passed with expected rc = %d\n",
   6645 						    szFuncName, 0);
   6646 					DMVAR_PASS();
   6647 				} else {
   6648 					DMLOG_PRINT(DMLVL_ERR,
   6649 						    "%s failed with expected rc = %d but unexpected emask (%llx vs %llx)\n",
   6650 						    szFuncName, 0, eventset,
   6651 						    stat.dt_emask);
   6652 					DMVAR_FAIL();
   6653 				}
   6654 			} else {
   6655 				DMLOG_PRINT(DMLVL_ERR,
   6656 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   6657 					    szFuncName, rc, errno);
   6658 				DMVAR_FAIL();
   6659 			}
   6660 
   6661 			/* Variation clean up */
   6662 			DMEV_ZERO(eventset);
   6663 			rc |=
   6664 			    dm_set_eventlist(sid, hanp, hlen, DM_NO_TOKEN,
   6665 					     &eventset, DM_EVENT_MAX);
   6666 			rc |= close(fd);
   6667 			rc |= remove(DUMMY_FILE);
   6668 			if (rc == -1) {
   6669 				DMLOG_PRINT(DMLVL_DEBUG,
   6670 					    "Unable to clean up variation! (errno = %d)\n",
   6671 					    errno);
   6672 			}
   6673 			dm_handle_free(hanp, hlen);
   6674 		}
   6675 	}
   6676 
   6677 	/*
   6678 	 * TEST    : dm_get_fileattr - file DM_AT_PMANR with region
   6679 	 * EXPECTED: rc = 0
   6680 	 */
   6681 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 8)) {
   6682 		int fd;
   6683 		void *hanp;
   6684 		size_t hlen;
   6685 		dm_stat_t stat;
   6686 		dm_region_t region = { 0, 0, DM_REGION_READ };
   6687 		dm_boolean_t exactflag;
   6688 
   6689 		/* Variation set up */
   6690 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   6691 		if ((rc = system(command)) == -1) {
   6692 			/* No clean up */
   6693 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   6694 			remove(DUMMY_FILE);
   6695 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   6696 			close(fd);
   6697 			remove(DUMMY_FILE);
   6698 		} else
   6699 		    if ((rc =
   6700 			 dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, 1, &region,
   6701 				       &exactflag)) == -1) {
   6702 			dm_handle_free(hanp, hlen);
   6703 			close(fd);
   6704 			remove(DUMMY_FILE);
   6705 			close(fd);
   6706 			remove(DUMMY_FILE);
   6707 		}
   6708 		if (fd == -1 || rc == -1) {
   6709 			DMLOG_PRINT(DMLVL_DEBUG,
   6710 				    "Unable to set up variation! (errno = %d)\n",
   6711 				    errno);
   6712 			DMVAR_SKIP();
   6713 		} else {
   6714 			/* Variation */
   6715 			DMLOG_PRINT(DMLVL_DEBUG,
   6716 				    "%s(file DM_AT_PMANR with region)\n",
   6717 				    szFuncName);
   6718 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   6719 					     DM_AT_PMANR, &stat);
   6720 			if (rc == 0) {
   6721 				if (stat.dt_pmanreg == DM_TRUE) {
   6722 					DMLOG_PRINT(DMLVL_DEBUG,
   6723 						    "%s passed with expected rc = %d\n",
   6724 						    szFuncName, 0);
   6725 					DMVAR_PASS();
   6726 				} else {
   6727 					DMLOG_PRINT(DMLVL_ERR,
   6728 						    "%s failed with expected rc = %d but unexpected pmanreg (%d vs %d)\n",
   6729 						    szFuncName, 0, DM_TRUE,
   6730 						    stat.dt_pmanreg);
   6731 					DMVAR_FAIL();
   6732 				}
   6733 			} else {
   6734 				DMLOG_PRINT(DMLVL_ERR,
   6735 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   6736 					    szFuncName, rc, errno);
   6737 				DMVAR_FAIL();
   6738 			}
   6739 
   6740 			/* Variation clean up */
   6741 			rc = close(fd);
   6742 			rc |= remove(DUMMY_FILE);
   6743 			if (rc == -1) {
   6744 				DMLOG_PRINT(DMLVL_DEBUG,
   6745 					    "Unable to clean up variation! (errno = %d)\n",
   6746 					    errno);
   6747 			}
   6748 			dm_handle_free(hanp, hlen);
   6749 		}
   6750 	}
   6751 
   6752 	/*
   6753 	 * TEST    : dm_get_fileattr - file DM_AT_PMANR without region
   6754 	 * EXPECTED: rc = 0
   6755 	 */
   6756 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 9)) {
   6757 		int fd;
   6758 		void *hanp;
   6759 		size_t hlen;
   6760 		dm_stat_t stat;
   6761 
   6762 		/* Variation set up */
   6763 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   6764 		if ((rc = system(command)) == -1) {
   6765 			/* No clean up */
   6766 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   6767 			remove(DUMMY_FILE);
   6768 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   6769 			close(fd);
   6770 			remove(DUMMY_FILE);
   6771 		}
   6772 		if (fd == -1 || rc == -1) {
   6773 			DMLOG_PRINT(DMLVL_DEBUG,
   6774 				    "Unable to set up variation! (errno = %d)\n",
   6775 				    errno);
   6776 			DMVAR_SKIP();
   6777 		} else {
   6778 			/* Variation */
   6779 			DMLOG_PRINT(DMLVL_DEBUG,
   6780 				    "%s(file DM_AT_PMANR without region)\n",
   6781 				    szFuncName);
   6782 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   6783 					     DM_AT_PMANR, &stat);
   6784 			if (rc == 0) {
   6785 				if (stat.dt_pmanreg == DM_FALSE) {
   6786 					DMLOG_PRINT(DMLVL_DEBUG,
   6787 						    "%s passed with expected rc = %d\n",
   6788 						    szFuncName, 0);
   6789 					DMVAR_PASS();
   6790 				} else {
   6791 					DMLOG_PRINT(DMLVL_ERR,
   6792 						    "%s failed with expected rc = %d but unexpected pmanreg (%d vs %d)\n",
   6793 						    szFuncName, 0, DM_FALSE,
   6794 						    stat.dt_pmanreg);
   6795 					DMVAR_FAIL();
   6796 				}
   6797 			} else {
   6798 				DMLOG_PRINT(DMLVL_ERR,
   6799 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   6800 					    szFuncName, rc, errno);
   6801 				DMVAR_FAIL();
   6802 			}
   6803 
   6804 			/* Variation clean up */
   6805 			rc = close(fd);
   6806 			rc |= remove(DUMMY_FILE);
   6807 			if (rc == -1) {
   6808 				DMLOG_PRINT(DMLVL_DEBUG,
   6809 					    "Unable to clean up variation! (errno = %d)\n",
   6810 					    errno);
   6811 			}
   6812 			dm_handle_free(hanp, hlen);
   6813 		}
   6814 	}
   6815 
   6816 	/*
   6817 	 * TEST    : dm_get_fileattr - file DM_AT_PATTR with DM attribute
   6818 	 * EXPECTED: rc = 0
   6819 	 */
   6820 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 10)) {
   6821 		int fd;
   6822 		void *hanp;
   6823 		size_t hlen;
   6824 		dm_stat_t stat;
   6825 		dm_attrname_t attrname;
   6826 		char buf[ATTR_VALUELEN];
   6827 
   6828 		/* Variation set up */
   6829 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   6830 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   6831 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   6832 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   6833 		if ((rc = system(command)) == -1) {
   6834 			/* No clean up */
   6835 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   6836 			remove(DUMMY_FILE);
   6837 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   6838 			close(fd);
   6839 			remove(DUMMY_FILE);
   6840 		} else
   6841 		    if ((rc =
   6842 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   6843 				       0, sizeof(buf), buf)) == -1) {
   6844 			dm_handle_free(hanp, hlen);
   6845 			close(fd);
   6846 			remove(DUMMY_FILE);
   6847 		}
   6848 		if (fd == -1 || rc == -1) {
   6849 			DMLOG_PRINT(DMLVL_DEBUG,
   6850 				    "Unable to set up variation! (errno = %d)\n",
   6851 				    errno);
   6852 			DMVAR_SKIP();
   6853 		} else {
   6854 			/* Variation */
   6855 			DMLOG_PRINT(DMLVL_DEBUG,
   6856 				    "%s(file DM_AT_PATTR with attr)\n",
   6857 				    szFuncName);
   6858 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   6859 					     DM_AT_PATTR, &stat);
   6860 			if (rc == 0) {
   6861 				if (stat.dt_pers == DM_TRUE) {
   6862 					DMLOG_PRINT(DMLVL_DEBUG,
   6863 						    "%s passed with expected rc = %d\n",
   6864 						    szFuncName, 0);
   6865 					DMVAR_PASS();
   6866 				} else {
   6867 					DMLOG_PRINT(DMLVL_ERR,
   6868 						    "%s failed with expected rc = %d but unexpected pers (%d vs %d)\n",
   6869 						    szFuncName, 0, DM_TRUE,
   6870 						    stat.dt_pers);
   6871 					DMVAR_FAIL();
   6872 				}
   6873 			} else {
   6874 				DMLOG_PRINT(DMLVL_ERR,
   6875 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   6876 					    szFuncName, rc, errno);
   6877 				DMVAR_FAIL();
   6878 			}
   6879 
   6880 			/* Variation clean up */
   6881 			rc = close(fd);
   6882 			rc |= remove(DUMMY_FILE);
   6883 			if (rc == -1) {
   6884 				DMLOG_PRINT(DMLVL_DEBUG,
   6885 					    "Unable to clean up variation! (errno = %d)\n",
   6886 					    errno);
   6887 			}
   6888 			dm_handle_free(hanp, hlen);
   6889 		}
   6890 	}
   6891 
   6892 	/*
   6893 	 * TEST    : dm_get_fileattr - file DM_AT_PATTR without DM attribute
   6894 	 * EXPECTED: rc = 0
   6895 	 */
   6896 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 11)) {
   6897 		int fd;
   6898 		void *hanp;
   6899 		size_t hlen;
   6900 		dm_stat_t stat;
   6901 
   6902 		/* Variation set up */
   6903 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   6904 		if ((rc = system(command)) == -1) {
   6905 			/* No clean up */
   6906 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   6907 			remove(DUMMY_FILE);
   6908 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   6909 			close(fd);
   6910 			remove(DUMMY_FILE);
   6911 		}
   6912 		if (fd == -1 || rc == -1) {
   6913 			DMLOG_PRINT(DMLVL_DEBUG,
   6914 				    "Unable to set up variation! (errno = %d)\n",
   6915 				    errno);
   6916 			DMVAR_SKIP();
   6917 		} else {
   6918 			/* Variation */
   6919 			DMLOG_PRINT(DMLVL_DEBUG,
   6920 				    "%s(file DM_AT_PATTR without attr)\n",
   6921 				    szFuncName);
   6922 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   6923 					     DM_AT_PATTR, &stat);
   6924 			if (rc == 0) {
   6925 				if (stat.dt_pers == DM_FALSE) {
   6926 					DMLOG_PRINT(DMLVL_DEBUG,
   6927 						    "%s passed with expected rc = %d\n",
   6928 						    szFuncName, 0);
   6929 					DMVAR_PASS();
   6930 				} else {
   6931 					DMLOG_PRINT(DMLVL_ERR,
   6932 						    "%s failed with expected rc = %d but unexpected pers (%d vs %d)\n",
   6933 						    szFuncName, 0, DM_FALSE,
   6934 						    stat.dt_pers);
   6935 					DMVAR_FAIL();
   6936 				}
   6937 			} else {
   6938 				DMLOG_PRINT(DMLVL_ERR,
   6939 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   6940 					    szFuncName, rc, errno);
   6941 				DMVAR_FAIL();
   6942 			}
   6943 
   6944 			/* Variation clean up */
   6945 			rc = close(fd);
   6946 			rc |= remove(DUMMY_FILE);
   6947 			if (rc == -1) {
   6948 				DMLOG_PRINT(DMLVL_DEBUG,
   6949 					    "Unable to clean up variation! (errno = %d)\n",
   6950 					    errno);
   6951 			}
   6952 			dm_handle_free(hanp, hlen);
   6953 		}
   6954 	}
   6955 
   6956 	/*
   6957 	 * TEST    : dm_get_fileattr - file DM_AT_DTIME with DM attribute
   6958 	 * EXPECTED: rc = 0
   6959 	 */
   6960 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 12)) {
   6961 		int fd;
   6962 		void *hanp;
   6963 		size_t hlen;
   6964 		dm_stat_t stat;
   6965 		dm_attrname_t attrname;
   6966 		char buf[ATTR_VALUELEN];
   6967 
   6968 		/* Variation set up */
   6969 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   6970 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   6971 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   6972 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   6973 		if ((rc = system(command)) == -1) {
   6974 			/* No clean up */
   6975 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   6976 			remove(DUMMY_FILE);
   6977 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   6978 			close(fd);
   6979 			remove(DUMMY_FILE);
   6980 		} else
   6981 		    if ((rc =
   6982 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   6983 				       0, sizeof(buf), buf)) == -1) {
   6984 			dm_handle_free(hanp, hlen);
   6985 			close(fd);
   6986 			remove(DUMMY_FILE);
   6987 		}
   6988 		if (fd == -1 || rc == -1) {
   6989 			DMLOG_PRINT(DMLVL_DEBUG,
   6990 				    "Unable to set up variation! (errno = %d)\n",
   6991 				    errno);
   6992 			DMVAR_SKIP();
   6993 		} else {
   6994 			/* Variation */
   6995 			stat.dt_dtime = 0;
   6996 			DMLOG_PRINT(DMLVL_DEBUG,
   6997 				    "%s(file DM_AT_DTIME with attr)\n",
   6998 				    szFuncName);
   6999 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   7000 					     DM_AT_DTIME, &stat);
   7001 			if (rc == 0) {
   7002 				if (stat.dt_dtime != 0) {
   7003 					DMLOG_PRINT(DMLVL_DEBUG,
   7004 						    "%s passed with expected rc = %d\n",
   7005 						    szFuncName, 0);
   7006 					DMVAR_PASS();
   7007 				} else {
   7008 					DMLOG_PRINT(DMLVL_ERR,
   7009 						    "%s failed with expected rc = %d but dtime not set\n",
   7010 						    szFuncName, 0);
   7011 					DMVAR_FAIL();
   7012 				}
   7013 			} else {
   7014 				DMLOG_PRINT(DMLVL_ERR,
   7015 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   7016 					    szFuncName, rc, errno);
   7017 				DMVAR_FAIL();
   7018 			}
   7019 
   7020 			/* Variation clean up */
   7021 			rc = close(fd);
   7022 			rc |= remove(DUMMY_FILE);
   7023 			if (rc == -1) {
   7024 				DMLOG_PRINT(DMLVL_DEBUG,
   7025 					    "Unable to clean up variation! (errno = %d)\n",
   7026 					    errno);
   7027 			}
   7028 			dm_handle_free(hanp, hlen);
   7029 		}
   7030 	}
   7031 
   7032 	/*
   7033 	 * TEST    : dm_get_fileattr - file DM_AT_DTIME without DM attribute
   7034 	 * EXPECTED: rc = 0
   7035 	 *
   7036 	 * This variation uncovered XFS BUG #23 (dtime updated without any DM
   7037 	 * attributes)
   7038 	 */
   7039 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 13)) {
   7040 		int fd;
   7041 		void *hanp;
   7042 		size_t hlen;
   7043 		dm_stat_t stat;
   7044 
   7045 		/* Variation set up */
   7046 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   7047 		if ((rc = system(command)) == -1) {
   7048 			/* No clean up */
   7049 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   7050 			remove(DUMMY_FILE);
   7051 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   7052 			close(fd);
   7053 			remove(DUMMY_FILE);
   7054 		}
   7055 		if (fd == -1 || rc == -1) {
   7056 			DMLOG_PRINT(DMLVL_DEBUG,
   7057 				    "Unable to set up variation! (errno = %d)\n",
   7058 				    errno);
   7059 			DMVAR_SKIP();
   7060 		} else {
   7061 			/* Variation */
   7062 			stat.dt_dtime = 0;
   7063 			DMLOG_PRINT(DMLVL_DEBUG,
   7064 				    "%s(file DM_AT_DTIME without attr)\n",
   7065 				    szFuncName);
   7066 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   7067 					     DM_AT_DTIME, &stat);
   7068 			if (rc == 0) {
   7069 				if (stat.dt_dtime == 0) {
   7070 					DMLOG_PRINT(DMLVL_DEBUG,
   7071 						    "%s passed with expected rc = %d\n",
   7072 						    szFuncName, 0);
   7073 					DMVAR_PASS();
   7074 				} else {
   7075 					DMLOG_PRINT(DMLVL_ERR,
   7076 						    "%s failed with expected rc = %d but dtime set\n",
   7077 						    szFuncName, 0);
   7078 					DMVAR_FAIL();
   7079 				}
   7080 			} else {
   7081 				DMLOG_PRINT(DMLVL_ERR,
   7082 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   7083 					    szFuncName, rc, errno);
   7084 				DMVAR_FAIL();
   7085 			}
   7086 
   7087 			/* Variation clean up */
   7088 			rc = close(fd);
   7089 			rc |= remove(DUMMY_FILE);
   7090 			if (rc == -1) {
   7091 				DMLOG_PRINT(DMLVL_DEBUG,
   7092 					    "Unable to clean up variation! (errno = %d)\n",
   7093 					    errno);
   7094 			}
   7095 			dm_handle_free(hanp, hlen);
   7096 		}
   7097 	}
   7098 
   7099 	/*
   7100 	 * TEST    : dm_get_fileattr - file DM_AT_STAT
   7101 	 * EXPECTED: rc = 0
   7102 	 */
   7103 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 14)) {
   7104 		int fd;
   7105 		void *hanp;
   7106 		size_t hlen;
   7107 		dm_stat_t statdm;
   7108 		struct stat statfs;
   7109 		int varStatus;
   7110 
   7111 		/* Variation set up */
   7112 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   7113 		if ((rc = system(command)) == -1) {
   7114 			/* No clean up */
   7115 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   7116 			remove(DUMMY_FILE);
   7117 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   7118 			close(fd);
   7119 			remove(DUMMY_FILE);
   7120 		} else if ((rc = stat(DUMMY_FILE, &statfs)) == -1) {
   7121 			dm_handle_free(hanp, hlen);
   7122 			close(fd);
   7123 			remove(DUMMY_FILE);
   7124 		}
   7125 		if (fd == -1 || rc == -1) {
   7126 			DMLOG_PRINT(DMLVL_DEBUG,
   7127 				    "Unable to set up variation! (errno = %d)\n",
   7128 				    errno);
   7129 			DMVAR_SKIP();
   7130 		} else {
   7131 			/* Variation */
   7132 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file DM_AT_STAT)\n",
   7133 				    szFuncName);
   7134 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   7135 					     DM_AT_STAT, &statdm);
   7136 			if (rc == 0) {
   7137 				varStatus = DMSTAT_PASS;
   7138 				DMLOG_PRINT(DMLVL_DEBUG,
   7139 					    "%s returned expected rc = %d\n",
   7140 					    szFuncName, rc);
   7141 				if (statfs.st_dev != statdm.dt_dev) {
   7142 					DMLOG_PRINT(DMLVL_ERR,
   7143 						    "%s failed with nonmatching dev (%lld vs %lld)\n",
   7144 						    szFuncName, statfs.st_dev,
   7145 						    statdm.dt_dev);
   7146 					varStatus = DMSTAT_FAIL;
   7147 				}
   7148 				if (statfs.st_ino != statdm.dt_ino) {
   7149 					DMLOG_PRINT(DMLVL_ERR,
   7150 						    "%s failed with nonmatching ino (%lld vs %lld)\n",
   7151 						    szFuncName, statfs.st_ino,
   7152 						    statdm.dt_ino);
   7153 					varStatus = DMSTAT_FAIL;
   7154 				}
   7155 				if (statfs.st_mode != statdm.dt_mode) {
   7156 					DMLOG_PRINT(DMLVL_ERR,
   7157 						    "%s failed with nonmatching mode (%d vs %d)\n",
   7158 						    szFuncName, statfs.st_mode,
   7159 						    statdm.dt_mode);
   7160 					varStatus = DMSTAT_FAIL;
   7161 				}
   7162 				if (statfs.st_nlink != statdm.dt_nlink) {
   7163 					DMLOG_PRINT(DMLVL_ERR,
   7164 						    "%s failed with nonmatching nlink (%d vs %d)\n",
   7165 						    szFuncName, statfs.st_nlink,
   7166 						    statdm.dt_nlink);
   7167 					varStatus = DMSTAT_FAIL;
   7168 				}
   7169 				if (statfs.st_uid != statdm.dt_uid) {
   7170 					DMLOG_PRINT(DMLVL_ERR,
   7171 						    "%s failed with nonmatching uid (%d vs %d)\n",
   7172 						    szFuncName, statfs.st_uid,
   7173 						    statdm.dt_uid);
   7174 					varStatus = DMSTAT_FAIL;
   7175 				}
   7176 				if (statfs.st_gid != statdm.dt_gid) {
   7177 					DMLOG_PRINT(DMLVL_ERR,
   7178 						    "%s failed with nonmatching gid (%d vs %d)\n",
   7179 						    szFuncName, statfs.st_gid,
   7180 						    statdm.dt_gid);
   7181 					varStatus = DMSTAT_FAIL;
   7182 				}
   7183 				if (statfs.st_rdev != statdm.dt_rdev) {
   7184 					DMLOG_PRINT(DMLVL_ERR,
   7185 						    "%s failed with nonmatching rdev (%lld vs %lld)\n",
   7186 						    szFuncName, statfs.st_rdev,
   7187 						    statdm.dt_rdev);
   7188 					varStatus = DMSTAT_FAIL;
   7189 				}
   7190 				if (statfs.st_size != statdm.dt_size) {
   7191 					DMLOG_PRINT(DMLVL_ERR,
   7192 						    "%s failed with nonmatching size (%lld vs %lld)\n",
   7193 						    szFuncName, statfs.st_size,
   7194 						    statdm.dt_size);
   7195 					varStatus = DMSTAT_FAIL;
   7196 				}
   7197 				if (statfs.st_atime != statdm.dt_atime) {
   7198 					DMLOG_PRINT(DMLVL_ERR,
   7199 						    "%s failed with nonmatching atime (%d vs %d)\n",
   7200 						    szFuncName, statfs.st_atime,
   7201 						    statdm.dt_atime);
   7202 					varStatus = DMSTAT_FAIL;
   7203 				}
   7204 				if (statfs.st_mtime != statdm.dt_mtime) {
   7205 					DMLOG_PRINT(DMLVL_ERR,
   7206 						    "%s failed with nonmatching mtime (%d vs %d)\n",
   7207 						    szFuncName, statfs.st_mtime,
   7208 						    statdm.dt_mtime);
   7209 					varStatus = DMSTAT_FAIL;
   7210 				}
   7211 				if (statfs.st_ctime != statdm.dt_ctime) {
   7212 					DMLOG_PRINT(DMLVL_ERR,
   7213 						    "%s failed with nonmatching ctime (%d vs %d)\n",
   7214 						    szFuncName, statfs.st_ctime,
   7215 						    statdm.dt_ctime);
   7216 					varStatus = DMSTAT_FAIL;
   7217 				}
   7218 				if (statfs.st_blksize != statdm.dt_blksize) {
   7219 					DMLOG_PRINT(DMLVL_ERR,
   7220 						    "%s failed with nonmatching blksize (%d vs %d)\n",
   7221 						    szFuncName,
   7222 						    statfs.st_blksize,
   7223 						    statdm.dt_blksize);
   7224 					varStatus = DMSTAT_FAIL;
   7225 				}
   7226 				if (statfs.st_blocks != statdm.dt_blocks) {
   7227 					DMLOG_PRINT(DMLVL_ERR,
   7228 						    "%s failed with nonmatching blocks (%lld vs %lld)\n",
   7229 						    szFuncName,
   7230 						    statfs.st_blocks,
   7231 						    statdm.dt_blocks);
   7232 					varStatus = DMSTAT_FAIL;
   7233 				}
   7234 			} else {
   7235 				DMLOG_PRINT(DMLVL_ERR,
   7236 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   7237 					    szFuncName, rc, errno);
   7238 				varStatus = DMSTAT_FAIL;
   7239 			}
   7240 			DMVAR_END(varStatus);
   7241 
   7242 			/* Variation clean up */
   7243 			rc = close(fd);
   7244 			rc |= remove(DUMMY_FILE);
   7245 			if (rc == -1) {
   7246 				DMLOG_PRINT(DMLVL_DEBUG,
   7247 					    "Unable to clean up variation! (errno = %d)\n",
   7248 					    errno);
   7249 			}
   7250 			dm_handle_free(hanp, hlen);
   7251 		}
   7252 	}
   7253 
   7254 	/*
   7255 	 * TEST    : dm_get_fileattr - DM_AT_EMASK on directory
   7256 	 * EXPECTED: rc = 0
   7257 	 */
   7258 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 15)) {
   7259 		void *hanp;
   7260 		size_t hlen;
   7261 		dm_stat_t stat;
   7262 		dm_eventset_t eventset;
   7263 
   7264 		/* Variation set up */
   7265 		DMEV_ZERO(eventset);
   7266 		DMEV_SET(DM_EVENT_ATTRIBUTE, eventset);
   7267 		DMEV_SET(DM_EVENT_CLOSE, eventset);
   7268 		DMEV_SET(DM_EVENT_DESTROY, eventset);
   7269 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   7270 			/* No clean up */
   7271 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   7272 			   == -1) {
   7273 			rmdir(DUMMY_SUBDIR);
   7274 		} else
   7275 		    if ((rc =
   7276 			 dm_set_eventlist(sid, hanp, hlen, DM_NO_TOKEN,
   7277 					  &eventset, DM_EVENT_MAX)) == -1) {
   7278 			dm_handle_free(hanp, hlen);
   7279 			rmdir(DUMMY_SUBDIR);
   7280 		}
   7281 		if (rc == -1) {
   7282 			DMLOG_PRINT(DMLVL_DEBUG,
   7283 				    "Unable to set up variation! (errno = %d)\n",
   7284 				    errno);
   7285 			DMVAR_SKIP();
   7286 		} else {
   7287 			/* Variation */
   7288 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir DM_AT_EMASK)\n",
   7289 				    szFuncName);
   7290 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   7291 					     DM_AT_EMASK, &stat);
   7292 			if (rc == 0) {
   7293 				if (memcmp
   7294 				    (&eventset, &stat.dt_emask,
   7295 				     sizeof(dm_eventset_t)) == 0) {
   7296 					DMLOG_PRINT(DMLVL_DEBUG,
   7297 						    "%s passed with expected rc = %d\n",
   7298 						    szFuncName, 0);
   7299 					DMVAR_PASS();
   7300 				} else {
   7301 					DMLOG_PRINT(DMLVL_ERR,
   7302 						    "%s failed with expected rc = %d but unexpected emask (%llx vs %llx)\n",
   7303 						    szFuncName, 0, eventset,
   7304 						    stat.dt_emask);
   7305 					DMVAR_FAIL();
   7306 				}
   7307 			} else {
   7308 				DMLOG_PRINT(DMLVL_ERR,
   7309 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   7310 					    szFuncName, rc, errno);
   7311 				DMVAR_FAIL();
   7312 			}
   7313 
   7314 			/* Variation clean up */
   7315 			DMEV_ZERO(eventset);
   7316 			rc |=
   7317 			    dm_set_eventlist(sid, hanp, hlen, DM_NO_TOKEN,
   7318 					     &eventset, DM_EVENT_MAX);
   7319 			rc = rmdir(DUMMY_SUBDIR);
   7320 			if (rc == -1) {
   7321 				DMLOG_PRINT(DMLVL_DEBUG,
   7322 					    "Unable to clean up variation! (errno = %d)\n",
   7323 					    errno);
   7324 			}
   7325 			dm_handle_free(hanp, hlen);
   7326 		}
   7327 	}
   7328 
   7329 	/*
   7330 	 * TEST    : dm_get_fileattr - DM_AT_PMANR on directory
   7331 	 * EXPECTED: rc = 0
   7332 	 */
   7333 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 16)) {
   7334 		void *hanp;
   7335 		size_t hlen;
   7336 		dm_stat_t stat;
   7337 
   7338 		/* Variation set up */
   7339 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   7340 			/* No clean up */
   7341 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   7342 			   == -1) {
   7343 			rmdir(DUMMY_SUBDIR);
   7344 		}
   7345 		if (rc == -1) {
   7346 			DMLOG_PRINT(DMLVL_DEBUG,
   7347 				    "Unable to set up variation! (errno = %d)\n",
   7348 				    errno);
   7349 			DMVAR_SKIP();
   7350 		} else {
   7351 			/* Variation */
   7352 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir DM_AT_PMANR)\n",
   7353 				    szFuncName);
   7354 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   7355 					     DM_AT_PMANR, &stat);
   7356 			if (rc == 0) {
   7357 				if (stat.dt_pmanreg == DM_FALSE) {
   7358 					DMLOG_PRINT(DMLVL_DEBUG,
   7359 						    "%s passed with expected rc = %d\n",
   7360 						    szFuncName, 0);
   7361 					DMVAR_PASS();
   7362 				} else {
   7363 					DMLOG_PRINT(DMLVL_ERR,
   7364 						    "%s failed with expected rc = %d but unexpected pmanreg (%d vs %d)\n",
   7365 						    szFuncName, 0, DM_FALSE,
   7366 						    stat.dt_pmanreg);
   7367 					DMVAR_FAIL();
   7368 				}
   7369 			} else {
   7370 				DMLOG_PRINT(DMLVL_ERR,
   7371 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   7372 					    szFuncName, rc, errno);
   7373 				DMVAR_FAIL();
   7374 			}
   7375 
   7376 			/* Variation clean up */
   7377 			rc = rmdir(DUMMY_SUBDIR);
   7378 			if (rc == -1) {
   7379 				DMLOG_PRINT(DMLVL_DEBUG,
   7380 					    "Unable to clean up variation! (errno = %d)\n",
   7381 					    errno);
   7382 			}
   7383 			dm_handle_free(hanp, hlen);
   7384 		}
   7385 	}
   7386 
   7387 	/*
   7388 	 * TEST    : dm_get_fileattr - DM_AT_PATTR on directory with DM attribute
   7389 	 * EXPECTED: rc = 0
   7390 	 */
   7391 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 17)) {
   7392 		void *hanp;
   7393 		size_t hlen;
   7394 		dm_stat_t stat;
   7395 		dm_attrname_t attrname;
   7396 		char buf[ATTR_VALUELEN];
   7397 
   7398 		/* Variation set up */
   7399 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   7400 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   7401 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   7402 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   7403 			/* No clean up */
   7404 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   7405 			   == -1) {
   7406 			rmdir(DUMMY_SUBDIR);
   7407 		} else
   7408 		    if ((rc =
   7409 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   7410 				       0, sizeof(buf), buf)) == -1) {
   7411 			dm_handle_free(hanp, hlen);
   7412 			rmdir(DUMMY_SUBDIR);
   7413 		}
   7414 		if (rc == -1) {
   7415 			DMLOG_PRINT(DMLVL_DEBUG,
   7416 				    "Unable to set up variation! (errno = %d)\n",
   7417 				    errno);
   7418 			DMVAR_SKIP();
   7419 		} else {
   7420 			/* Variation */
   7421 			DMLOG_PRINT(DMLVL_DEBUG,
   7422 				    "%s(dir DM_AT_PATTR with attr)\n",
   7423 				    szFuncName);
   7424 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   7425 					     DM_AT_PATTR, &stat);
   7426 			if (rc == 0) {
   7427 				if (stat.dt_pers == DM_TRUE) {
   7428 					DMLOG_PRINT(DMLVL_DEBUG,
   7429 						    "%s passed with expected rc = %d\n",
   7430 						    szFuncName, 0);
   7431 					DMVAR_PASS();
   7432 				} else {
   7433 					DMLOG_PRINT(DMLVL_ERR,
   7434 						    "%s failed with expected rc = %d but unexpected pers (%d vs %d)\n",
   7435 						    szFuncName, 0, DM_TRUE,
   7436 						    stat.dt_pers);
   7437 					DMVAR_FAIL();
   7438 				}
   7439 			} else {
   7440 				DMLOG_PRINT(DMLVL_ERR,
   7441 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   7442 					    szFuncName, rc, errno);
   7443 				DMVAR_FAIL();
   7444 			}
   7445 
   7446 			/* Variation clean up */
   7447 			rc = rmdir(DUMMY_SUBDIR);
   7448 			if (rc == -1) {
   7449 				DMLOG_PRINT(DMLVL_DEBUG,
   7450 					    "Unable to clean up variation! (errno = %d)\n",
   7451 					    errno);
   7452 			}
   7453 			dm_handle_free(hanp, hlen);
   7454 		}
   7455 	}
   7456 
   7457 	/*
   7458 	 * TEST    : dm_get_fileattr - DM_AT_PATTR on directory without DM attribute
   7459 	 * EXPECTED: rc = 0
   7460 	 */
   7461 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 18)) {
   7462 		void *hanp;
   7463 		size_t hlen;
   7464 		dm_stat_t stat;
   7465 
   7466 		/* Variation set up */
   7467 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   7468 			/* No clean up */
   7469 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   7470 			   == -1) {
   7471 			rmdir(DUMMY_SUBDIR);
   7472 		}
   7473 		if (rc == -1) {
   7474 			DMLOG_PRINT(DMLVL_DEBUG,
   7475 				    "Unable to set up variation! (errno = %d)\n",
   7476 				    errno);
   7477 			DMVAR_SKIP();
   7478 		} else {
   7479 			/* Variation */
   7480 			DMLOG_PRINT(DMLVL_DEBUG,
   7481 				    "%s(dir DM_AT_PATTR without attr)\n",
   7482 				    szFuncName);
   7483 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   7484 					     DM_AT_PATTR, &stat);
   7485 			if (rc == 0) {
   7486 				if (stat.dt_pers == DM_FALSE) {
   7487 					DMLOG_PRINT(DMLVL_DEBUG,
   7488 						    "%s passed with expected rc = %d\n",
   7489 						    szFuncName, 0);
   7490 					DMVAR_PASS();
   7491 				} else {
   7492 					DMLOG_PRINT(DMLVL_ERR,
   7493 						    "%s failed with expected rc = %d but unexpected pers (%d vs %d)\n",
   7494 						    szFuncName, 0, DM_FALSE,
   7495 						    stat.dt_pers);
   7496 					DMVAR_FAIL();
   7497 				}
   7498 			} else {
   7499 				DMLOG_PRINT(DMLVL_ERR,
   7500 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   7501 					    szFuncName, rc, errno);
   7502 				DMVAR_FAIL();
   7503 			}
   7504 
   7505 			/* Variation clean up */
   7506 			rc = rmdir(DUMMY_SUBDIR);
   7507 			if (rc == -1) {
   7508 				DMLOG_PRINT(DMLVL_DEBUG,
   7509 					    "Unable to clean up variation! (errno = %d)\n",
   7510 					    errno);
   7511 			}
   7512 			dm_handle_free(hanp, hlen);
   7513 		}
   7514 	}
   7515 
   7516 	/*
   7517 	 * TEST    : dm_get_fileattr - DM_AT_DTIME on directory with DM attribute
   7518 	 * EXPECTED: rc = 0
   7519 	 */
   7520 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 19)) {
   7521 		void *hanp;
   7522 		size_t hlen;
   7523 		dm_stat_t stat;
   7524 		dm_attrname_t attrname;
   7525 		char buf[ATTR_VALUELEN];
   7526 
   7527 		/* Variation set up */
   7528 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   7529 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   7530 		memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
   7531 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   7532 			/* No clean up */
   7533 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   7534 			   == -1) {
   7535 			rmdir(DUMMY_SUBDIR);
   7536 		} else
   7537 		    if ((rc =
   7538 			 dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname,
   7539 				       0, sizeof(buf), buf)) == -1) {
   7540 			dm_handle_free(hanp, hlen);
   7541 			rmdir(DUMMY_SUBDIR);
   7542 		}
   7543 		if (rc == -1) {
   7544 			DMLOG_PRINT(DMLVL_DEBUG,
   7545 				    "Unable to set up variation! (errno = %d)\n",
   7546 				    errno);
   7547 			DMVAR_SKIP();
   7548 		} else {
   7549 			/* Variation */
   7550 			stat.dt_dtime = 0;
   7551 			DMLOG_PRINT(DMLVL_DEBUG,
   7552 				    "%s(dir DM_AT_DTIME with attr)\n",
   7553 				    szFuncName);
   7554 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   7555 					     DM_AT_DTIME, &stat);
   7556 			if (rc == 0) {
   7557 				if (stat.dt_dtime != 0) {
   7558 					DMLOG_PRINT(DMLVL_DEBUG,
   7559 						    "%s passed with expected rc = %d\n",
   7560 						    szFuncName, 0);
   7561 					DMVAR_PASS();
   7562 				} else {
   7563 					DMLOG_PRINT(DMLVL_ERR,
   7564 						    "%s failed with expected rc = %d but dtime not set\n",
   7565 						    szFuncName, 0);
   7566 					DMVAR_FAIL();
   7567 				}
   7568 			} else {
   7569 				DMLOG_PRINT(DMLVL_ERR,
   7570 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   7571 					    szFuncName, rc, errno);
   7572 				DMVAR_FAIL();
   7573 			}
   7574 
   7575 			/* Variation clean up */
   7576 			rc = rmdir(DUMMY_SUBDIR);
   7577 			if (rc == -1) {
   7578 				DMLOG_PRINT(DMLVL_DEBUG,
   7579 					    "Unable to clean up variation! (errno = %d)\n",
   7580 					    errno);
   7581 			}
   7582 			dm_handle_free(hanp, hlen);
   7583 		}
   7584 	}
   7585 
   7586 	/*
   7587 	 * TEST    : dm_get_fileattr - DM_AT_DTIME on directory without DM attribute
   7588 	 * EXPECTED: rc = 0
   7589 	 */
   7590 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 20)) {
   7591 		void *hanp;
   7592 		size_t hlen;
   7593 		dm_stat_t stat;
   7594 
   7595 		/* Variation set up */
   7596 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   7597 			/* No clean up */
   7598 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   7599 			   == -1) {
   7600 			rmdir(DUMMY_SUBDIR);
   7601 		}
   7602 		if (rc == -1) {
   7603 			DMLOG_PRINT(DMLVL_DEBUG,
   7604 				    "Unable to set up variation! (errno = %d)\n",
   7605 				    errno);
   7606 			DMVAR_SKIP();
   7607 		} else {
   7608 			/* Variation */
   7609 			stat.dt_dtime = 0;
   7610 			DMLOG_PRINT(DMLVL_DEBUG,
   7611 				    "%s(dir DM_AT_DTIME without attr)\n",
   7612 				    szFuncName);
   7613 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   7614 					     DM_AT_DTIME, &stat);
   7615 			if (rc == 0) {
   7616 				if (stat.dt_dtime == 0) {
   7617 					DMLOG_PRINT(DMLVL_DEBUG,
   7618 						    "%s passed with expected rc = %d\n",
   7619 						    szFuncName, 0);
   7620 					DMVAR_PASS();
   7621 				} else {
   7622 					DMLOG_PRINT(DMLVL_ERR,
   7623 						    "%s failed with expected rc = %d but dtime set\n",
   7624 						    szFuncName, 0);
   7625 					DMVAR_FAIL();
   7626 				}
   7627 			} else {
   7628 				DMLOG_PRINT(DMLVL_ERR,
   7629 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   7630 					    szFuncName, rc, errno);
   7631 				DMVAR_FAIL();
   7632 			}
   7633 
   7634 			/* Variation clean up */
   7635 			rc = rmdir(DUMMY_SUBDIR);
   7636 			if (rc == -1) {
   7637 				DMLOG_PRINT(DMLVL_DEBUG,
   7638 					    "Unable to clean up variation! (errno = %d)\n",
   7639 					    errno);
   7640 			}
   7641 			dm_handle_free(hanp, hlen);
   7642 		}
   7643 	}
   7644 
   7645 	/*
   7646 	 * TEST    : dm_get_fileattr - DM_AT_STAT on directory
   7647 	 * EXPECTED: rc = 0
   7648 	 */
   7649 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 21)) {
   7650 		void *hanp;
   7651 		size_t hlen;
   7652 		dm_stat_t statdm;
   7653 		struct stat statfs;
   7654 		int varStatus;
   7655 
   7656 		/* Variation set up */
   7657 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   7658 			/* No clean up */
   7659 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   7660 			   == -1) {
   7661 			rmdir(DUMMY_SUBDIR);
   7662 		} else if ((rc = stat(DUMMY_SUBDIR, &statfs)) == -1) {
   7663 			dm_handle_free(hanp, hlen);
   7664 			rmdir(DUMMY_SUBDIR);
   7665 		}
   7666 		if (rc == -1) {
   7667 			DMLOG_PRINT(DMLVL_DEBUG,
   7668 				    "Unable to set up variation! (errno = %d)\n",
   7669 				    errno);
   7670 			DMVAR_SKIP();
   7671 		} else {
   7672 			/* Variation */
   7673 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir DM_AT_STAT)\n",
   7674 				    szFuncName);
   7675 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   7676 					     DM_AT_STAT, &statdm);
   7677 			if (rc == 0) {
   7678 				varStatus = DMSTAT_PASS;
   7679 				DMLOG_PRINT(DMLVL_DEBUG,
   7680 					    "%s returned expected rc = %d\n",
   7681 					    szFuncName, rc);
   7682 				if (statfs.st_dev != statdm.dt_dev) {
   7683 					DMLOG_PRINT(DMLVL_ERR,
   7684 						    "%s failed with nonmatching dev (%lld vs %lld)\n",
   7685 						    szFuncName, statfs.st_dev,
   7686 						    statdm.dt_dev);
   7687 					varStatus = DMSTAT_FAIL;
   7688 				}
   7689 				if (statfs.st_ino != statdm.dt_ino) {
   7690 					DMLOG_PRINT(DMLVL_ERR,
   7691 						    "%s failed with nonmatching ino (%lld vs %lld)\n",
   7692 						    szFuncName, statfs.st_ino,
   7693 						    statdm.dt_ino);
   7694 					varStatus = DMSTAT_FAIL;
   7695 				}
   7696 				if (statfs.st_mode != statdm.dt_mode) {
   7697 					DMLOG_PRINT(DMLVL_ERR,
   7698 						    "%s failed with nonmatching mode (%d vs %d)\n",
   7699 						    szFuncName, statfs.st_mode,
   7700 						    statdm.dt_mode);
   7701 					varStatus = DMSTAT_FAIL;
   7702 				}
   7703 				if (statfs.st_nlink != statdm.dt_nlink) {
   7704 					DMLOG_PRINT(DMLVL_ERR,
   7705 						    "%s failed with nonmatching nlink (%d vs %d)\n",
   7706 						    szFuncName, statfs.st_nlink,
   7707 						    statdm.dt_nlink);
   7708 					varStatus = DMSTAT_FAIL;
   7709 				}
   7710 				if (statfs.st_uid != statdm.dt_uid) {
   7711 					DMLOG_PRINT(DMLVL_ERR,
   7712 						    "%s failed with nonmatching uid (%d vs %d)\n",
   7713 						    szFuncName, statfs.st_uid,
   7714 						    statdm.dt_uid);
   7715 					varStatus = DMSTAT_FAIL;
   7716 				}
   7717 				if (statfs.st_gid != statdm.dt_gid) {
   7718 					DMLOG_PRINT(DMLVL_ERR,
   7719 						    "%s failed with nonmatching gid (%d vs %d)\n",
   7720 						    szFuncName, statfs.st_gid,
   7721 						    statdm.dt_gid);
   7722 					varStatus = DMSTAT_FAIL;
   7723 				}
   7724 				if (statfs.st_rdev != statdm.dt_rdev) {
   7725 					DMLOG_PRINT(DMLVL_ERR,
   7726 						    "%s failed with nonmatching rdev (%lld vs %lld)\n",
   7727 						    szFuncName, statfs.st_rdev,
   7728 						    statdm.dt_rdev);
   7729 					varStatus = DMSTAT_FAIL;
   7730 				}
   7731 				if (statfs.st_size != statdm.dt_size) {
   7732 					DMLOG_PRINT(DMLVL_ERR,
   7733 						    "%s failed with nonmatching size (%lld vs %lld)\n",
   7734 						    szFuncName, statfs.st_size,
   7735 						    statdm.dt_size);
   7736 					varStatus = DMSTAT_FAIL;
   7737 				}
   7738 				if (statfs.st_atime != statdm.dt_atime) {
   7739 					DMLOG_PRINT(DMLVL_ERR,
   7740 						    "%s failed with nonmatching atime (%d vs %d)\n",
   7741 						    szFuncName, statfs.st_atime,
   7742 						    statdm.dt_atime);
   7743 					varStatus = DMSTAT_FAIL;
   7744 				}
   7745 				if (statfs.st_mtime != statdm.dt_mtime) {
   7746 					DMLOG_PRINT(DMLVL_ERR,
   7747 						    "%s failed with nonmatching mtime (%d vs %d)\n",
   7748 						    szFuncName, statfs.st_mtime,
   7749 						    statdm.dt_mtime);
   7750 					varStatus = DMSTAT_FAIL;
   7751 				}
   7752 				if (statfs.st_ctime != statdm.dt_ctime) {
   7753 					DMLOG_PRINT(DMLVL_ERR,
   7754 						    "%s failed with nonmatching ctime (%d vs %d)\n",
   7755 						    szFuncName, statfs.st_ctime,
   7756 						    statdm.dt_ctime);
   7757 					varStatus = DMSTAT_FAIL;
   7758 				}
   7759 				if (statfs.st_blksize != statdm.dt_blksize) {
   7760 					DMLOG_PRINT(DMLVL_ERR,
   7761 						    "%s failed with nonmatching blksize (%d vs %d)\n",
   7762 						    szFuncName,
   7763 						    statfs.st_blksize,
   7764 						    statdm.dt_blksize);
   7765 					varStatus = DMSTAT_FAIL;
   7766 				}
   7767 				if (statfs.st_blocks != statdm.dt_blocks) {
   7768 					DMLOG_PRINT(DMLVL_ERR,
   7769 						    "%s failed with nonmatching blocks (%lld vs %lld)\n",
   7770 						    szFuncName,
   7771 						    statfs.st_blocks,
   7772 						    statdm.dt_blocks);
   7773 					varStatus = DMSTAT_FAIL;
   7774 				}
   7775 			} else {
   7776 				DMLOG_PRINT(DMLVL_ERR,
   7777 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   7778 					    szFuncName, rc, errno);
   7779 				varStatus = DMSTAT_FAIL;
   7780 			}
   7781 			DMVAR_END(varStatus);
   7782 
   7783 			/* Variation clean up */
   7784 			rc = rmdir(DUMMY_SUBDIR);
   7785 			if (rc == -1) {
   7786 				DMLOG_PRINT(DMLVL_DEBUG,
   7787 					    "Unable to clean up variation! (errno = %d)\n",
   7788 					    errno);
   7789 			}
   7790 			dm_handle_free(hanp, hlen);
   7791 		}
   7792 	}
   7793 
   7794 	/*
   7795 	 * TEST    : dm_get_fileattr - fs handle
   7796 	 * EXPECTED: rc = -1, errno = EINVAL
   7797 	 */
   7798 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 22)) {
   7799 		void *hanp;
   7800 		size_t hlen;
   7801 		dm_stat_t stat;
   7802 
   7803 		/* Variation set up */
   7804 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   7805 		if ((rc = system(command)) == -1) {
   7806 			/* No clean up */
   7807 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   7808 			   == -1) {
   7809 			remove(DUMMY_FILE);
   7810 		}
   7811 		if (rc == -1) {
   7812 			DMLOG_PRINT(DMLVL_DEBUG,
   7813 				    "Unable to set up variation! (errno = %d)\n",
   7814 				    errno);
   7815 			DMVAR_SKIP();
   7816 		} else {
   7817 			/* Variation */
   7818 			DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName);
   7819 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   7820 					     DM_AT_EMASK, &stat);
   7821 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   7822 
   7823 			/* Variation clean up */
   7824 			rc = remove(DUMMY_FILE);
   7825 			if (rc == -1) {
   7826 				DMLOG_PRINT(DMLVL_DEBUG,
   7827 					    "Unable to clean up variation! (errno = %d)\n",
   7828 					    errno);
   7829 			}
   7830 			dm_handle_free(hanp, hlen);
   7831 		}
   7832 	}
   7833 
   7834 	/*
   7835 	 * TEST    : dm_get_fileattr - DM_NO_SESSION sid
   7836 	 * EXPECTED: rc = -1, errno = EINVAL
   7837 	 */
   7838 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 23)) {
   7839 		int fd;
   7840 		void *hanp;
   7841 		size_t hlen;
   7842 		dm_stat_t stat;
   7843 
   7844 		/* Variation set up */
   7845 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   7846 		if ((rc = system(command)) == -1) {
   7847 			/* No clean up */
   7848 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   7849 			remove(DUMMY_FILE);
   7850 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   7851 			close(fd);
   7852 			remove(DUMMY_FILE);
   7853 		}
   7854 		if (fd == -1 || rc == -1) {
   7855 			DMLOG_PRINT(DMLVL_DEBUG,
   7856 				    "Unable to set up variation! (errno = %d)\n",
   7857 				    errno);
   7858 			DMVAR_SKIP();
   7859 		} else {
   7860 			/* Variation */
   7861 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
   7862 				    szFuncName);
   7863 			rc = dm_get_fileattr(DM_NO_SESSION, hanp, hlen,
   7864 					     DM_NO_TOKEN, DM_AT_EMASK, &stat);
   7865 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   7866 
   7867 			/* Variation clean up */
   7868 			rc = close(fd);
   7869 			rc |= remove(DUMMY_FILE);
   7870 			if (rc == -1) {
   7871 				DMLOG_PRINT(DMLVL_DEBUG,
   7872 					    "Unable to clean up variation! (errno = %d)\n",
   7873 					    errno);
   7874 			}
   7875 			dm_handle_free(hanp, hlen);
   7876 		}
   7877 	}
   7878 
   7879 	/*
   7880 	 * TEST    : dm_get_fileattr - global handle
   7881 	 * EXPECTED: rc = -1, errno = EBADF
   7882 	 */
   7883 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 24)) {
   7884 		dm_stat_t stat;
   7885 
   7886 		/* Variation set up */
   7887 
   7888 		/* Variation */
   7889 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
   7890 		rc = dm_get_fileattr(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN,
   7891 				     DM_NO_TOKEN, DM_AT_EMASK, &stat);
   7892 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   7893 
   7894 		/* Variation clean up */
   7895 	}
   7896 
   7897 	/*
   7898 	 * TEST    : dm_get_fileattr - invalidated hanp
   7899 	 * EXPECTED: rc = -1, errno = EBADF
   7900 	 */
   7901 	if (DMVAR_EXEC(GET_FILEATTR_BASE + 25)) {
   7902 		int fd;
   7903 		void *hanp;
   7904 		size_t hlen;
   7905 		dm_stat_t stat;
   7906 
   7907 		/* Variation set up */
   7908 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   7909 		if ((rc = system(command)) == -1) {
   7910 			/* No clean up */
   7911 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   7912 			remove(DUMMY_FILE);
   7913 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
   7914 			close(fd);
   7915 			remove(DUMMY_FILE);
   7916 		} else if ((rc = close(fd)) == -1) {
   7917 			dm_handle_free(hanp, hlen);
   7918 			remove(DUMMY_FILE);
   7919 		} else if ((rc = remove(DUMMY_FILE)) == -1) {
   7920 			dm_handle_free(hanp, hlen);
   7921 		}
   7922 		if (fd == -1 || rc == -1) {
   7923 			DMLOG_PRINT(DMLVL_DEBUG,
   7924 				    "Unable to set up variation! (errno = %d)\n",
   7925 				    errno);
   7926 			DMVAR_SKIP();
   7927 		} else {
   7928 			/* Variation */
   7929 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated hanp)\n",
   7930 				    szFuncName);
   7931 			rc = dm_get_fileattr(sid, hanp, hlen, DM_NO_TOKEN,
   7932 					     DM_AT_EMASK, &stat);
   7933 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   7934 
   7935 			/* Variation clean up */
   7936 			dm_handle_free(hanp, hlen);
   7937 		}
   7938 	}
   7939 
   7940 	szFuncName = "dm_init_attrloc";
   7941 
   7942 	/*
   7943 	 * TEST    : dm_init_attrloc - invalid sid
   7944 	 * EXPECTED: rc = -1, errno = EINVAL
   7945 	 */
   7946 	if (DMVAR_EXEC(INIT_ATTRLOC_BASE + 1)) {
   7947 		void *hanp;
   7948 		size_t hlen;
   7949 		dm_attrloc_t loc;
   7950 
   7951 		/* Variation set up */
   7952 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   7953 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   7954 			/* No clean up */
   7955 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   7956 			   == -1) {
   7957 			rmdir(DUMMY_SUBDIR);
   7958 		} else if ((rc = system(command)) == -1) {
   7959 			dm_handle_free(hanp, hlen);
   7960 			rmdir(DUMMY_SUBDIR);
   7961 		}
   7962 		if (rc == -1) {
   7963 			DMLOG_PRINT(DMLVL_DEBUG,
   7964 				    "Unable to set up variation! (errno = %d)\n",
   7965 				    errno);
   7966 			DMVAR_SKIP();
   7967 		} else {
   7968 			/* Variation */
   7969 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
   7970 				    szFuncName);
   7971 			rc = dm_init_attrloc(INVALID_ADDR, hanp, hlen,
   7972 					     DM_NO_TOKEN, &loc);
   7973 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   7974 
   7975 			/* Variation clean up */
   7976 			rc = remove(DUMMY_SUBDIR_FILE);
   7977 			rc |= rmdir(DUMMY_SUBDIR);
   7978 			if (rc == -1) {
   7979 				DMLOG_PRINT(DMLVL_DEBUG,
   7980 					    "Unable to clean up variation! (errno = %d)\n",
   7981 					    errno);
   7982 			}
   7983 			dm_handle_free(hanp, hlen);
   7984 		}
   7985 	}
   7986 
   7987 	/*
   7988 	 * TEST    : dm_init_attrloc - invalid hanp
   7989 	 * EXPECTED: rc = -1, errno = EFAULT
   7990 	 */
   7991 	if (DMVAR_EXEC(INIT_ATTRLOC_BASE + 2)) {
   7992 		void *hanp;
   7993 		size_t hlen;
   7994 		dm_attrloc_t loc;
   7995 
   7996 		/* Variation set up */
   7997 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   7998 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   7999 			/* No clean up */
   8000 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8001 			   == -1) {
   8002 			rmdir(DUMMY_SUBDIR);
   8003 		} else if ((rc = system(command)) == -1) {
   8004 			dm_handle_free(hanp, hlen);
   8005 			rmdir(DUMMY_SUBDIR);
   8006 		}
   8007 		if (rc == -1) {
   8008 			DMLOG_PRINT(DMLVL_DEBUG,
   8009 				    "Unable to set up variation! (errno = %d)\n",
   8010 				    errno);
   8011 			DMVAR_SKIP();
   8012 		} else {
   8013 			/* Variation */
   8014 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
   8015 				    szFuncName);
   8016 			rc = dm_init_attrloc(sid, (void *)INVALID_ADDR, hlen,
   8017 					     DM_NO_TOKEN, &loc);
   8018 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   8019 
   8020 			/* Variation clean up */
   8021 			rc = remove(DUMMY_SUBDIR_FILE);
   8022 			rc |= rmdir(DUMMY_SUBDIR);
   8023 			if (rc == -1) {
   8024 				DMLOG_PRINT(DMLVL_DEBUG,
   8025 					    "Unable to clean up variation! (errno = %d)\n",
   8026 					    errno);
   8027 			}
   8028 			dm_handle_free(hanp, hlen);
   8029 		}
   8030 	}
   8031 
   8032 	/*
   8033 	 * TEST    : dm_init_attrloc - invalid hlen
   8034 	 * EXPECTED: rc = -1, errno = EBADF
   8035 	 */
   8036 	if (DMVAR_EXEC(INIT_ATTRLOC_BASE + 3)) {
   8037 		void *hanp;
   8038 		size_t hlen;
   8039 		dm_attrloc_t loc;
   8040 
   8041 		/* Variation set up */
   8042 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8043 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8044 			/* No clean up */
   8045 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8046 			   == -1) {
   8047 			rmdir(DUMMY_SUBDIR);
   8048 		} else if ((rc = system(command)) == -1) {
   8049 			dm_handle_free(hanp, hlen);
   8050 			rmdir(DUMMY_SUBDIR);
   8051 		}
   8052 		if (rc == -1) {
   8053 			DMLOG_PRINT(DMLVL_DEBUG,
   8054 				    "Unable to set up variation! (errno = %d)\n",
   8055 				    errno);
   8056 			DMVAR_SKIP();
   8057 		} else {
   8058 			/* Variation */
   8059 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
   8060 				    szFuncName);
   8061 			rc = dm_init_attrloc(sid, hanp, INVALID_ADDR,
   8062 					     DM_NO_TOKEN, &loc);
   8063 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   8064 
   8065 			/* Variation clean up */
   8066 			rc = remove(DUMMY_SUBDIR_FILE);
   8067 			rc |= rmdir(DUMMY_SUBDIR);
   8068 			if (rc == -1) {
   8069 				DMLOG_PRINT(DMLVL_DEBUG,
   8070 					    "Unable to clean up variation! (errno = %d)\n",
   8071 					    errno);
   8072 			}
   8073 			dm_handle_free(hanp, hlen);
   8074 		}
   8075 	}
   8076 
   8077 	/*
   8078 	 * TEST    : dm_init_attrloc - invalid token
   8079 	 * EXPECTED: rc = -1, errno = EINVAL
   8080 	 */
   8081 	if (DMVAR_EXEC(INIT_ATTRLOC_BASE + 4)) {
   8082 		void *hanp;
   8083 		size_t hlen;
   8084 		dm_attrloc_t loc;
   8085 
   8086 		/* Variation set up */
   8087 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8088 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8089 			/* No clean up */
   8090 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8091 			   == -1) {
   8092 			rmdir(DUMMY_SUBDIR);
   8093 		} else if ((rc = system(command)) == -1) {
   8094 			dm_handle_free(hanp, hlen);
   8095 			rmdir(DUMMY_SUBDIR);
   8096 		}
   8097 		if (rc == -1) {
   8098 			DMLOG_PRINT(DMLVL_DEBUG,
   8099 				    "Unable to set up variation! (errno = %d)\n",
   8100 				    errno);
   8101 			DMVAR_SKIP();
   8102 		} else {
   8103 			/* Variation */
   8104 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
   8105 				    szFuncName);
   8106 			rc = dm_init_attrloc(sid, hanp, hlen, INVALID_ADDR,
   8107 					     &loc);
   8108 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   8109 
   8110 			/* Variation clean up */
   8111 			rc = remove(DUMMY_SUBDIR_FILE);
   8112 			rc |= rmdir(DUMMY_SUBDIR);
   8113 			if (rc == -1) {
   8114 				DMLOG_PRINT(DMLVL_DEBUG,
   8115 					    "Unable to clean up variation! (errno = %d)\n",
   8116 					    errno);
   8117 			}
   8118 			dm_handle_free(hanp, hlen);
   8119 		}
   8120 	}
   8121 
   8122 	/*
   8123 	 * TEST    : dm_init_attrloc - invalid locp
   8124 	 * EXPECTED: rc = -1, errno = EFAULT
   8125 	 */
   8126 	if (DMVAR_EXEC(INIT_ATTRLOC_BASE + 5)) {
   8127 		void *hanp;
   8128 		size_t hlen;
   8129 
   8130 		/* Variation set up */
   8131 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8132 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8133 			/* No clean up */
   8134 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8135 			   == -1) {
   8136 			rmdir(DUMMY_SUBDIR);
   8137 		} else if ((rc = system(command)) == -1) {
   8138 			dm_handle_free(hanp, hlen);
   8139 			rmdir(DUMMY_SUBDIR);
   8140 		}
   8141 		if (rc == -1) {
   8142 			DMLOG_PRINT(DMLVL_DEBUG,
   8143 				    "Unable to set up variation! (errno = %d)\n",
   8144 				    errno);
   8145 			DMVAR_SKIP();
   8146 		} else {
   8147 			/* Variation */
   8148 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid locp)\n",
   8149 				    szFuncName);
   8150 			rc = dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   8151 					     (dm_attrloc_t *) INVALID_ADDR);
   8152 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   8153 
   8154 			/* Variation clean up */
   8155 			rc = remove(DUMMY_SUBDIR_FILE);
   8156 			rc |= rmdir(DUMMY_SUBDIR);
   8157 			if (rc == -1) {
   8158 				DMLOG_PRINT(DMLVL_DEBUG,
   8159 					    "Unable to clean up variation! (errno = %d)\n",
   8160 					    errno);
   8161 			}
   8162 			dm_handle_free(hanp, hlen);
   8163 		}
   8164 	}
   8165 
   8166 	/*
   8167 	 * TEST    : dm_init_attrloc - file handle
   8168 	 * EXPECTED: rc = -1, errno = EINVAL
   8169 	 */
   8170 	if (DMVAR_EXEC(INIT_ATTRLOC_BASE + 6)) {
   8171 		void *hanp;
   8172 		size_t hlen;
   8173 		dm_attrloc_t loc;
   8174 
   8175 		/* Variation set up */
   8176 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   8177 		if ((rc = system(command)) == -1) {
   8178 			/* No clean up */
   8179 		} else if ((rc = dm_path_to_handle(DUMMY_FILE, &hanp, &hlen)) ==
   8180 			   -1) {
   8181 			remove(DUMMY_FILE);
   8182 		}
   8183 		if (rc == -1) {
   8184 			DMLOG_PRINT(DMLVL_DEBUG,
   8185 				    "Unable to set up variation! (errno = %d)\n",
   8186 				    errno);
   8187 			DMVAR_SKIP();
   8188 		} else {
   8189 			/* Variation */
   8190 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file handle)\n",
   8191 				    szFuncName);
   8192 			rc = dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   8193 					     &loc);
   8194 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   8195 
   8196 			/* Variation clean up */
   8197 			rc = remove(DUMMY_FILE);
   8198 			if (rc == -1) {
   8199 				DMLOG_PRINT(DMLVL_DEBUG,
   8200 					    "Unable to clean up variation! (errno = %d)\n",
   8201 					    errno);
   8202 			}
   8203 			dm_handle_free(hanp, hlen);
   8204 		}
   8205 	}
   8206 
   8207 	/*
   8208 	 * TEST    : dm_init_attrloc - directory handle
   8209 	 * EXPECTED: rc = 0
   8210 	 */
   8211 	if (DMVAR_EXEC(INIT_ATTRLOC_BASE + 7)) {
   8212 		void *hanp;
   8213 		size_t hlen;
   8214 		dm_attrloc_t loc;
   8215 
   8216 		/* Variation set up */
   8217 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8218 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8219 			/* No clean up */
   8220 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8221 			   == -1) {
   8222 			rmdir(DUMMY_SUBDIR);
   8223 		} else if ((rc = system(command)) == -1) {
   8224 			dm_handle_free(hanp, hlen);
   8225 			rmdir(DUMMY_SUBDIR);
   8226 		}
   8227 		if (rc == -1) {
   8228 			DMLOG_PRINT(DMLVL_DEBUG,
   8229 				    "Unable to set up variation! (errno = %d)\n",
   8230 				    errno);
   8231 			DMVAR_SKIP();
   8232 		} else {
   8233 			/* Variation */
   8234 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir handle)\n",
   8235 				    szFuncName);
   8236 			rc = dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   8237 					     &loc);
   8238 			if (rc == 0) {
   8239 				DMLOG_PRINT(DMLVL_DEBUG, "loc = %lld\n", loc);
   8240 			}
   8241 			DMVAR_ENDPASSEXP(szFuncName, 0, rc);
   8242 
   8243 			/* Variation clean up */
   8244 			rc = remove(DUMMY_SUBDIR_FILE);
   8245 			rc |= rmdir(DUMMY_SUBDIR);
   8246 			if (rc == -1) {
   8247 				DMLOG_PRINT(DMLVL_DEBUG,
   8248 					    "Unable to clean up variation! (errno = %d)\n",
   8249 					    errno);
   8250 			}
   8251 			dm_handle_free(hanp, hlen);
   8252 		}
   8253 	}
   8254 
   8255 	/*
   8256 	 * TEST    : dm_init_attrloc - fs handle
   8257 	 * EXPECTED: rc = 0
   8258 	 */
   8259 	if (DMVAR_EXEC(INIT_ATTRLOC_BASE + 8)) {
   8260 		void *hanp;
   8261 		size_t hlen;
   8262 		dm_attrloc_t loc;
   8263 
   8264 		/* Variation set up */
   8265 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8266 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8267 			/* No clean up */
   8268 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8269 			   == -1) {
   8270 			rmdir(DUMMY_SUBDIR);
   8271 		} else if ((rc = system(command)) == -1) {
   8272 			dm_handle_free(hanp, hlen);
   8273 			rmdir(DUMMY_SUBDIR);
   8274 		}
   8275 		if (rc == -1) {
   8276 			DMLOG_PRINT(DMLVL_DEBUG,
   8277 				    "Unable to set up variation! (errno = %d)\n",
   8278 				    errno);
   8279 			DMVAR_SKIP();
   8280 		} else {
   8281 			/* Variation */
   8282 			DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName);
   8283 			rc = dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   8284 					     &loc);
   8285 			if (rc == 0) {
   8286 				DMLOG_PRINT(DMLVL_DEBUG, "loc = %lld\n", loc);
   8287 			}
   8288 			DMVAR_ENDPASSEXP(szFuncName, 0, rc);
   8289 
   8290 			/* Variation clean up */
   8291 			rc = remove(DUMMY_SUBDIR_FILE);
   8292 			rc |= rmdir(DUMMY_SUBDIR);
   8293 			if (rc == -1) {
   8294 				DMLOG_PRINT(DMLVL_DEBUG,
   8295 					    "Unable to clean up variation! (errno = %d)\n",
   8296 					    errno);
   8297 			}
   8298 			dm_handle_free(hanp, hlen);
   8299 		}
   8300 	}
   8301 
   8302 	/*
   8303 	 * TEST    : dm_init_attrloc - DM_NO_SESSION sid
   8304 	 * EXPECTED: rc = -1, errno = EINVAL
   8305 	 */
   8306 	if (DMVAR_EXEC(INIT_ATTRLOC_BASE + 9)) {
   8307 		void *hanp;
   8308 		size_t hlen;
   8309 		dm_attrloc_t loc;
   8310 
   8311 		/* Variation set up */
   8312 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8313 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8314 			/* No clean up */
   8315 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8316 			   == -1) {
   8317 			rmdir(DUMMY_SUBDIR);
   8318 		} else if ((rc = system(command)) == -1) {
   8319 			dm_handle_free(hanp, hlen);
   8320 			rmdir(DUMMY_SUBDIR);
   8321 		}
   8322 		if (rc == -1) {
   8323 			DMLOG_PRINT(DMLVL_DEBUG,
   8324 				    "Unable to set up variation! (errno = %d)\n",
   8325 				    errno);
   8326 			DMVAR_SKIP();
   8327 		} else {
   8328 			/* Variation */
   8329 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
   8330 				    szFuncName);
   8331 			rc = dm_init_attrloc(DM_NO_SESSION, hanp, hlen,
   8332 					     DM_NO_TOKEN, &loc);
   8333 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   8334 
   8335 			/* Variation clean up */
   8336 			rc = remove(DUMMY_SUBDIR_FILE);
   8337 			rc |= rmdir(DUMMY_SUBDIR);
   8338 			if (rc == -1) {
   8339 				DMLOG_PRINT(DMLVL_DEBUG,
   8340 					    "Unable to clean up variation! (errno = %d)\n",
   8341 					    errno);
   8342 			}
   8343 			dm_handle_free(hanp, hlen);
   8344 		}
   8345 	}
   8346 
   8347 	/*
   8348 	 * TEST    : dm_init_attrloc - global handle
   8349 	 * EXPECTED: rc = -1, errno = EBADF
   8350 	 */
   8351 	if (DMVAR_EXEC(INIT_ATTRLOC_BASE + 10)) {
   8352 		dm_attrloc_t loc;
   8353 
   8354 		/* Variation set up */
   8355 
   8356 		/* Variation */
   8357 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
   8358 		rc = dm_init_attrloc(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN,
   8359 				     DM_NO_TOKEN, &loc);
   8360 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   8361 
   8362 		/* Variation clean up */
   8363 	}
   8364 
   8365 	/*
   8366 	 * TEST    : dm_init_attrloc - invalidated hanp
   8367 	 * EXPECTED: rc = -1, errno = EBADF
   8368 	 */
   8369 	if (DMVAR_EXEC(INIT_ATTRLOC_BASE + 11)) {
   8370 		void *hanp;
   8371 		size_t hlen;
   8372 		dm_attrloc_t loc;
   8373 
   8374 		/* Variation set up */
   8375 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8376 			/* No clean up */
   8377 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8378 			   == -1) {
   8379 			rmdir(DUMMY_SUBDIR);
   8380 		} else if ((rmdir(DUMMY_SUBDIR)) == -1) {
   8381 			dm_handle_free(hanp, hlen);
   8382 		}
   8383 		if (rc == -1) {
   8384 			DMLOG_PRINT(DMLVL_DEBUG,
   8385 				    "Unable to set up variation! (errno = %d)\n",
   8386 				    errno);
   8387 			DMVAR_SKIP();
   8388 		} else {
   8389 			/* Variation */
   8390 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated hanp)\n",
   8391 				    szFuncName);
   8392 			rc = dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   8393 					     &loc);
   8394 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   8395 
   8396 			/* Variation clean up */
   8397 			dm_handle_free(hanp, hlen);
   8398 		}
   8399 	}
   8400 
   8401 	szFuncName = "dm_get_dirattrs";
   8402 
   8403 	/*
   8404 	 * TEST    : dm_get_dirattrs - invalid sid
   8405 	 * EXPECTED: rc = -1, errno = EINVAL
   8406 	 */
   8407 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 1)) {
   8408 		void *hanp;
   8409 		size_t hlen;
   8410 		dm_attrloc_t loc;
   8411 		char buf[ATTR_LISTLEN];
   8412 		size_t rlen;
   8413 
   8414 		/* Variation set up */
   8415 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8416 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8417 			/* No clean up */
   8418 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8419 			   == -1) {
   8420 			rmdir(DUMMY_SUBDIR);
   8421 		} else
   8422 		    if (((rc =
   8423 			  dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   8424 					  &loc)) == -1)
   8425 			|| ((rc = system(command)) == -1)) {
   8426 			dm_handle_free(hanp, hlen);
   8427 			rmdir(DUMMY_SUBDIR);
   8428 		}
   8429 		if (rc == -1) {
   8430 			DMLOG_PRINT(DMLVL_DEBUG,
   8431 				    "Unable to set up variation! (errno = %d)\n",
   8432 				    errno);
   8433 			DMVAR_SKIP();
   8434 		} else {
   8435 			/* Variation */
   8436 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
   8437 				    szFuncName);
   8438 			rc = dm_get_dirattrs(INVALID_ADDR, hanp, hlen,
   8439 					     DM_NO_TOKEN, DM_AT_EMASK, &loc,
   8440 					     sizeof(buf), buf, &rlen);
   8441 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   8442 
   8443 			/* Variation clean up */
   8444 			rc = remove(DUMMY_SUBDIR_FILE);
   8445 			rc |= rmdir(DUMMY_SUBDIR);
   8446 			if (rc == -1) {
   8447 				DMLOG_PRINT(DMLVL_DEBUG,
   8448 					    "Unable to clean up variation! (errno = %d)\n",
   8449 					    errno);
   8450 			}
   8451 			dm_handle_free(hanp, hlen);
   8452 		}
   8453 	}
   8454 
   8455 	/*
   8456 	 * TEST    : dm_get_dirattrs - invalid hanp
   8457 	 * EXPECTED: rc = -1, errno = EFAULT
   8458 	 */
   8459 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 2)) {
   8460 		void *hanp;
   8461 		size_t hlen;
   8462 		dm_attrloc_t loc;
   8463 		char buf[ATTR_LISTLEN];
   8464 		size_t rlen;
   8465 
   8466 		/* Variation set up */
   8467 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8468 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8469 			/* No clean up */
   8470 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8471 			   == -1) {
   8472 			rmdir(DUMMY_SUBDIR);
   8473 		} else
   8474 		    if (((rc =
   8475 			  dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   8476 					  &loc)) == -1)
   8477 			|| ((rc = system(command)) == -1)) {
   8478 			dm_handle_free(hanp, hlen);
   8479 			rmdir(DUMMY_SUBDIR);
   8480 		}
   8481 		if (rc == -1) {
   8482 			DMLOG_PRINT(DMLVL_DEBUG,
   8483 				    "Unable to set up variation! (errno = %d)\n",
   8484 				    errno);
   8485 			DMVAR_SKIP();
   8486 		} else {
   8487 			/* Variation */
   8488 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
   8489 				    szFuncName);
   8490 			rc = dm_get_dirattrs(sid, (void *)INVALID_ADDR, hlen,
   8491 					     DM_NO_TOKEN, DM_AT_EMASK, &loc,
   8492 					     sizeof(buf), buf, &rlen);
   8493 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   8494 
   8495 			/* Variation clean up */
   8496 			rc = remove(DUMMY_SUBDIR_FILE);
   8497 			rc |= rmdir(DUMMY_SUBDIR);
   8498 			if (rc == -1) {
   8499 				DMLOG_PRINT(DMLVL_DEBUG,
   8500 					    "Unable to clean up variation! (errno = %d)\n",
   8501 					    errno);
   8502 			}
   8503 			dm_handle_free(hanp, hlen);
   8504 		}
   8505 	}
   8506 
   8507 	/*
   8508 	 * TEST    : dm_get_dirattrs - invalid hlen
   8509 	 * EXPECTED: rc = -1, errno = EINVAL
   8510 	 */
   8511 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 3)) {
   8512 		void *hanp;
   8513 		size_t hlen;
   8514 		dm_attrloc_t loc;
   8515 		char buf[ATTR_LISTLEN];
   8516 		size_t rlen;
   8517 
   8518 		/* Variation set up */
   8519 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8520 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8521 			/* No clean up */
   8522 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8523 			   == -1) {
   8524 			rmdir(DUMMY_SUBDIR);
   8525 		} else
   8526 		    if (((rc =
   8527 			  dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   8528 					  &loc)) == -1)
   8529 			|| ((rc = system(command)) == -1)) {
   8530 			dm_handle_free(hanp, hlen);
   8531 			rmdir(DUMMY_SUBDIR);
   8532 		}
   8533 		if (rc == -1) {
   8534 			DMLOG_PRINT(DMLVL_DEBUG,
   8535 				    "Unable to set up variation! (errno = %d)\n",
   8536 				    errno);
   8537 			DMVAR_SKIP();
   8538 		} else {
   8539 			/* Variation */
   8540 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
   8541 				    szFuncName);
   8542 			rc = dm_get_dirattrs(sid, hanp, INVALID_ADDR,
   8543 					     DM_NO_TOKEN, DM_AT_EMASK, &loc,
   8544 					     sizeof(buf), buf, &rlen);
   8545 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   8546 
   8547 			/* Variation clean up */
   8548 			rc = remove(DUMMY_SUBDIR_FILE);
   8549 			rc |= rmdir(DUMMY_SUBDIR);
   8550 			if (rc == -1) {
   8551 				DMLOG_PRINT(DMLVL_DEBUG,
   8552 					    "Unable to clean up variation! (errno = %d)\n",
   8553 					    errno);
   8554 			}
   8555 			dm_handle_free(hanp, hlen);
   8556 		}
   8557 	}
   8558 
   8559 	/*
   8560 	 * TEST    : dm_get_dirattrs - invalid token
   8561 	 * EXPECTED: rc = -1, errno = EINVAL
   8562 	 */
   8563 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 4)) {
   8564 		void *hanp;
   8565 		size_t hlen;
   8566 		dm_attrloc_t loc;
   8567 		char buf[ATTR_LISTLEN];
   8568 		size_t rlen;
   8569 
   8570 		/* Variation set up */
   8571 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8572 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8573 			/* No clean up */
   8574 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8575 			   == -1) {
   8576 			rmdir(DUMMY_SUBDIR);
   8577 		} else
   8578 		    if (((rc =
   8579 			  dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   8580 					  &loc)) == -1)
   8581 			|| ((rc = system(command)) == -1)) {
   8582 			dm_handle_free(hanp, hlen);
   8583 			rmdir(DUMMY_SUBDIR);
   8584 		}
   8585 		if (rc == -1) {
   8586 			DMLOG_PRINT(DMLVL_DEBUG,
   8587 				    "Unable to set up variation! (errno = %d)\n",
   8588 				    errno);
   8589 			DMVAR_SKIP();
   8590 		} else {
   8591 			/* Variation */
   8592 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
   8593 				    szFuncName);
   8594 			rc = dm_get_dirattrs(sid, hanp, hlen, INVALID_ADDR,
   8595 					     DM_AT_EMASK, &loc, sizeof(buf),
   8596 					     buf, &rlen);
   8597 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   8598 
   8599 			/* Variation clean up */
   8600 			rc = remove(DUMMY_SUBDIR_FILE);
   8601 			rc |= rmdir(DUMMY_SUBDIR);
   8602 			if (rc == -1) {
   8603 				DMLOG_PRINT(DMLVL_DEBUG,
   8604 					    "Unable to clean up variation! (errno = %d)\n",
   8605 					    errno);
   8606 			}
   8607 			dm_handle_free(hanp, hlen);
   8608 		}
   8609 	}
   8610 
   8611 	/*
   8612 	 * TEST    : dm_get_dirattrs - invalid mask
   8613 	 * EXPECTED: rc = -1, errno = EINVAL
   8614 	 *
   8615 	 * This variation uncovered XFS BUG #24 (0 returned instead of -1 and
   8616 	 * EINVAL errno)
   8617 	 */
   8618 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 5)) {
   8619 		void *hanp;
   8620 		size_t hlen;
   8621 		dm_attrloc_t loc;
   8622 		char buf[ATTR_LISTLEN];
   8623 		size_t rlen;
   8624 
   8625 		/* Variation set up */
   8626 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8627 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8628 			/* No clean up */
   8629 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8630 			   == -1) {
   8631 			rmdir(DUMMY_SUBDIR);
   8632 		} else
   8633 		    if (((rc =
   8634 			  dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   8635 					  &loc)) == -1)
   8636 			|| ((rc = system(command)) == -1)) {
   8637 			dm_handle_free(hanp, hlen);
   8638 			rmdir(DUMMY_SUBDIR);
   8639 		}
   8640 		if (rc == -1) {
   8641 			DMLOG_PRINT(DMLVL_DEBUG,
   8642 				    "Unable to set up variation! (errno = %d)\n",
   8643 				    errno);
   8644 			DMVAR_SKIP();
   8645 		} else {
   8646 			/* Variation */
   8647 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid mask)\n",
   8648 				    szFuncName);
   8649 			rc = dm_get_dirattrs(sid, hanp, hlen, DM_NO_TOKEN,
   8650 					     DM_AT_SIZE, &loc, sizeof(buf), buf,
   8651 					     &rlen);
   8652 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   8653 
   8654 			/* Variation clean up */
   8655 			rc = remove(DUMMY_SUBDIR_FILE);
   8656 			rc |= rmdir(DUMMY_SUBDIR);
   8657 			if (rc == -1) {
   8658 				DMLOG_PRINT(DMLVL_DEBUG,
   8659 					    "Unable to clean up variation! (errno = %d)\n",
   8660 					    errno);
   8661 			}
   8662 			dm_handle_free(hanp, hlen);
   8663 		}
   8664 	}
   8665 
   8666 	/*
   8667 	 * TEST    : dm_get_dirattrs - invalid locp
   8668 	 * EXPECTED: rc = -1, errno = EFAULT
   8669 	 */
   8670 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 6)) {
   8671 		void *hanp;
   8672 		size_t hlen;
   8673 		char buf[ATTR_LISTLEN];
   8674 		size_t rlen;
   8675 
   8676 		/* Variation set up */
   8677 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8678 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8679 			/* No clean up */
   8680 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8681 			   == -1) {
   8682 			rmdir(DUMMY_SUBDIR);
   8683 		} else if ((rc = system(command)) == -1) {
   8684 			dm_handle_free(hanp, hlen);
   8685 			rmdir(DUMMY_SUBDIR);
   8686 		}
   8687 		if (rc == -1) {
   8688 			DMLOG_PRINT(DMLVL_DEBUG,
   8689 				    "Unable to set up variation! (errno = %d)\n",
   8690 				    errno);
   8691 			DMVAR_SKIP();
   8692 		} else {
   8693 			/* Variation */
   8694 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid locp)\n",
   8695 				    szFuncName);
   8696 			rc = dm_get_dirattrs(sid, hanp, hlen, DM_NO_TOKEN,
   8697 					     DM_AT_EMASK,
   8698 					     (dm_attrloc_t *) INVALID_ADDR,
   8699 					     sizeof(buf), buf, &rlen);
   8700 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   8701 
   8702 			/* Variation clean up */
   8703 			rc = remove(DUMMY_SUBDIR_FILE);
   8704 			rc |= rmdir(DUMMY_SUBDIR);
   8705 			if (rc == -1) {
   8706 				DMLOG_PRINT(DMLVL_DEBUG,
   8707 					    "Unable to clean up variation! (errno = %d)\n",
   8708 					    errno);
   8709 			}
   8710 			dm_handle_free(hanp, hlen);
   8711 		}
   8712 	}
   8713 
   8714 	/*
   8715 	 * TEST    : dm_get_dirattrs - invalid loc
   8716 	 * EXPECTED: rc = -1, errno = EINVAL
   8717 	 */
   8718 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 7)) {
   8719 		void *hanp;
   8720 		size_t hlen;
   8721 		dm_attrloc_t loc;
   8722 		char buf[ATTR_LISTLEN];
   8723 		size_t rlen;
   8724 
   8725 		/* Variation set up */
   8726 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8727 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8728 			/* No clean up */
   8729 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8730 			   == -1) {
   8731 			rmdir(DUMMY_SUBDIR);
   8732 		} else
   8733 		    if (((rc =
   8734 			  dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   8735 					  &loc)) == -1)
   8736 			|| ((rc = system(command)) == -1)) {
   8737 			dm_handle_free(hanp, hlen);
   8738 			rmdir(DUMMY_SUBDIR);
   8739 		}
   8740 		if (rc == -1) {
   8741 			DMLOG_PRINT(DMLVL_DEBUG,
   8742 				    "Unable to set up variation! (errno = %d)\n",
   8743 				    errno);
   8744 			DMVAR_SKIP();
   8745 		} else {
   8746 			/* Variation */
   8747 			loc = INVALID_ADDR;
   8748 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid loc)\n",
   8749 				    szFuncName);
   8750 			rc = dm_get_dirattrs(sid, hanp, hlen, DM_NO_TOKEN,
   8751 					     DM_AT_EMASK, &loc, sizeof(buf),
   8752 					     buf, &rlen);
   8753 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   8754 
   8755 			/* Variation clean up */
   8756 			rc = remove(DUMMY_SUBDIR_FILE);
   8757 			rc |= rmdir(DUMMY_SUBDIR);
   8758 			if (rc == -1) {
   8759 				DMLOG_PRINT(DMLVL_DEBUG,
   8760 					    "Unable to clean up variation! (errno = %d)\n",
   8761 					    errno);
   8762 			}
   8763 			dm_handle_free(hanp, hlen);
   8764 		}
   8765 	}
   8766 
   8767 	/*
   8768 	 * TEST    : dm_get_dirattrs - invalid buflen
   8769 	 * EXPECTED: rc = 1
   8770 	 *
   8771 	 * This variation uncovered XFS BUG #26 (-1 and E2BIG errno returned
   8772 	 * instead of 1)
   8773 	 */
   8774 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 8)) {
   8775 		void *hanp;
   8776 		size_t hlen;
   8777 		dm_attrloc_t loc;
   8778 		char buf[ATTR_LISTLEN];
   8779 		size_t rlen;
   8780 
   8781 		/* Variation set up */
   8782 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8783 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8784 			/* No clean up */
   8785 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8786 			   == -1) {
   8787 			rmdir(DUMMY_SUBDIR);
   8788 		} else
   8789 		    if (((rc =
   8790 			  dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   8791 					  &loc)) == -1)
   8792 			|| ((rc = system(command)) == -1)) {
   8793 			dm_handle_free(hanp, hlen);
   8794 			rmdir(DUMMY_SUBDIR);
   8795 		}
   8796 		if (rc == -1) {
   8797 			DMLOG_PRINT(DMLVL_DEBUG,
   8798 				    "Unable to set up variation! (errno = %d)\n",
   8799 				    errno);
   8800 			DMVAR_SKIP();
   8801 		} else {
   8802 			/* Variation */
   8803 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid buflen)\n",
   8804 				    szFuncName);
   8805 			rc = dm_get_dirattrs(sid, hanp, hlen, DM_NO_TOKEN,
   8806 					     DM_AT_EMASK, &loc, 0, buf, &rlen);
   8807 			DMLOG_PRINT(DMLVL_DEBUG,
   8808 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   8809 				    rlen);
   8810 			DMVAR_ENDPASSEXP(szFuncName, 1, rc);
   8811 
   8812 			/* Variation clean up */
   8813 			rc = remove(DUMMY_SUBDIR_FILE);
   8814 			rc |= rmdir(DUMMY_SUBDIR);
   8815 			if (rc == -1) {
   8816 				DMLOG_PRINT(DMLVL_DEBUG,
   8817 					    "Unable to clean up variation! (errno = %d)\n",
   8818 					    errno);
   8819 			}
   8820 			dm_handle_free(hanp, hlen);
   8821 		}
   8822 	}
   8823 
   8824 	/*
   8825 	 * TEST    : dm_get_dirattrs - invalid bufp
   8826 	 * EXPECTED: rc = -1, errno = EFAULT
   8827 	 */
   8828 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 9)) {
   8829 		void *hanp;
   8830 		size_t hlen;
   8831 		dm_attrloc_t loc;
   8832 		char buf[ATTR_LISTLEN];
   8833 		size_t rlen;
   8834 
   8835 		/* Variation set up */
   8836 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8837 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8838 			/* No clean up */
   8839 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8840 			   == -1) {
   8841 			rmdir(DUMMY_SUBDIR);
   8842 		} else
   8843 		    if (((rc =
   8844 			  dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   8845 					  &loc)) == -1)
   8846 			|| ((rc = system(command)) == -1)) {
   8847 			dm_handle_free(hanp, hlen);
   8848 			rmdir(DUMMY_SUBDIR);
   8849 		}
   8850 		if (rc == -1) {
   8851 			DMLOG_PRINT(DMLVL_DEBUG,
   8852 				    "Unable to set up variation! (errno = %d)\n",
   8853 				    errno);
   8854 			DMVAR_SKIP();
   8855 		} else {
   8856 			/* Variation */
   8857 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid bufp)\n",
   8858 				    szFuncName);
   8859 			rc = dm_get_dirattrs(sid, hanp, hlen, DM_NO_TOKEN,
   8860 					     DM_AT_EMASK, &loc, sizeof(buf),
   8861 					     (void *)INVALID_ADDR, &rlen);
   8862 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   8863 
   8864 			/* Variation clean up */
   8865 			rc = remove(DUMMY_SUBDIR_FILE);
   8866 			rc |= rmdir(DUMMY_SUBDIR);
   8867 			if (rc == -1) {
   8868 				DMLOG_PRINT(DMLVL_DEBUG,
   8869 					    "Unable to clean up variation! (errno = %d)\n",
   8870 					    errno);
   8871 			}
   8872 			dm_handle_free(hanp, hlen);
   8873 		}
   8874 	}
   8875 
   8876 	/*
   8877 	 * TEST    : dm_get_dirattrs - invalid rlenp
   8878 	 * EXPECTED: rc = -1, errno = EFAULT
   8879 	 */
   8880 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 10)) {
   8881 		void *hanp;
   8882 		size_t hlen;
   8883 		dm_attrloc_t loc;
   8884 		char buf[ATTR_LISTLEN];
   8885 
   8886 		/* Variation set up */
   8887 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8888 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8889 			/* No clean up */
   8890 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   8891 			   == -1) {
   8892 			rmdir(DUMMY_SUBDIR);
   8893 		} else
   8894 		    if (((rc =
   8895 			  dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   8896 					  &loc)) == -1)
   8897 			|| ((rc = system(command)) == -1)) {
   8898 			dm_handle_free(hanp, hlen);
   8899 			rmdir(DUMMY_SUBDIR);
   8900 		}
   8901 		if (rc == -1) {
   8902 			DMLOG_PRINT(DMLVL_DEBUG,
   8903 				    "Unable to set up variation! (errno = %d)\n",
   8904 				    errno);
   8905 			DMVAR_SKIP();
   8906 		} else {
   8907 			/* Variation */
   8908 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid rlenp)\n",
   8909 				    szFuncName);
   8910 			rc = dm_get_dirattrs(sid, hanp, hlen, DM_NO_TOKEN,
   8911 					     DM_AT_EMASK, &loc, sizeof(buf),
   8912 					     buf, (size_t *) INVALID_ADDR);
   8913 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   8914 
   8915 			/* Variation clean up */
   8916 			rc = remove(DUMMY_SUBDIR_FILE);
   8917 			rc |= rmdir(DUMMY_SUBDIR);
   8918 			if (rc == -1) {
   8919 				DMLOG_PRINT(DMLVL_DEBUG,
   8920 					    "Unable to clean up variation! (errno = %d)\n",
   8921 					    errno);
   8922 			}
   8923 			dm_handle_free(hanp, hlen);
   8924 		}
   8925 	}
   8926 
   8927 	/*
   8928 	 * TEST    : dm_get_dirattrs - file handle
   8929 	 * EXPECTED: rc = -1, errno = EINVAL
   8930 	 */
   8931 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 11)) {
   8932 		void *hanp;
   8933 		size_t hlen;
   8934 		dm_attrloc_t loc;
   8935 		char buf[ATTR_LISTLEN];
   8936 		size_t rlen;
   8937 
   8938 		/* Variation set up */
   8939 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   8940 		if ((rc = system(command)) == -1) {
   8941 			/* No clean up */
   8942 		} else if ((rc = dm_path_to_handle(DUMMY_FILE, &hanp, &hlen)) ==
   8943 			   -1) {
   8944 			remove(DUMMY_FILE);
   8945 		}
   8946 		if (rc == -1) {
   8947 			DMLOG_PRINT(DMLVL_DEBUG,
   8948 				    "Unable to set up variation! (errno = %d)\n",
   8949 				    errno);
   8950 			DMVAR_SKIP();
   8951 		} else {
   8952 			/* Variation */
   8953 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file handle)\n",
   8954 				    szFuncName);
   8955 			rc = dm_get_dirattrs(sid, hanp, hlen, DM_NO_TOKEN,
   8956 					     DM_AT_EMASK, &loc, sizeof(buf),
   8957 					     buf, &rlen);
   8958 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   8959 
   8960 			/* Variation clean up */
   8961 			rc = remove(DUMMY_FILE);
   8962 			if (rc == -1) {
   8963 				DMLOG_PRINT(DMLVL_DEBUG,
   8964 					    "Unable to clean up variation! (errno = %d)\n",
   8965 					    errno);
   8966 			}
   8967 			dm_handle_free(hanp, hlen);
   8968 		}
   8969 	}
   8970 
   8971 	/*
   8972 	 * TEST    : dm_get_dirattrs - DM_AT_HANDLE
   8973 	 * EXPECTED: rc = 0
   8974 	 */
   8975 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 12)) {
   8976 		void *dhanp, *fhanp;
   8977 		size_t dhlen, fhlen;
   8978 		dm_attrloc_t loc;
   8979 		char buf[ATTR_LISTLEN];
   8980 		size_t rlen;
   8981 
   8982 		/* Variation set up */
   8983 		memset(buf, 0, ATTR_LISTLEN);
   8984 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   8985 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   8986 			/* No clean up */
   8987 		} else
   8988 		    if ((rc =
   8989 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   8990 					   &dhlen)) == -1) {
   8991 			rmdir(DUMMY_SUBDIR);
   8992 		} else if ((rc = system(command)) == -1) {
   8993 			dm_handle_free(dhanp, dhlen);
   8994 			rmdir(DUMMY_SUBDIR);
   8995 		} else
   8996 		    if ((rc =
   8997 			 dm_path_to_handle(DUMMY_SUBDIR_FILE, &fhanp,
   8998 					   &fhlen)) == -1) {
   8999 			remove(DUMMY_SUBDIR_FILE);
   9000 			dm_handle_free(dhanp, dhlen);
   9001 			rmdir(DUMMY_SUBDIR);
   9002 		} else
   9003 		    if ((rc =
   9004 			 dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   9005 					 &loc)) == -1) {
   9006 			dm_handle_free(fhanp, fhlen);
   9007 			remove(DUMMY_SUBDIR_FILE);
   9008 			dm_handle_free(dhanp, dhlen);
   9009 			rmdir(DUMMY_SUBDIR);
   9010 		}
   9011 		if (rc == -1) {
   9012 			DMLOG_PRINT(DMLVL_DEBUG,
   9013 				    "Unable to set up variation! (errno = %d)\n",
   9014 				    errno);
   9015 			DMVAR_SKIP();
   9016 		} else {
   9017 			/* Variation */
   9018 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_AT_HANDLE)\n",
   9019 				    szFuncName);
   9020 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   9021 					     DM_AT_HANDLE, &loc, sizeof(buf),
   9022 					     buf, &rlen);
   9023 			DMLOG_PRINT(DMLVL_DEBUG,
   9024 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   9025 				    rlen);
   9026 			if (rc == 0) {
   9027 				dm_stat_t *entry = GetDirEntry(buf, DUMMY_FILE);
   9028 				LogDirAttrs(buf, DM_AT_HANDLE);
   9029 				if (entry != NULL) {
   9030 					if (dm_handle_cmp
   9031 					    (fhanp, fhlen,
   9032 					     DM_GET_VALUE(entry, dt_handle,
   9033 							  void *),
   9034 					     DM_GET_LEN(entry,
   9035 							dt_handle)) == 0) {
   9036 						DMLOG_PRINT(DMLVL_DEBUG,
   9037 							    "%s passed with expected rc = %d\n",
   9038 							    szFuncName, 0);
   9039 						DMVAR_PASS();
   9040 					} else {
   9041 						DMLOG_PRINT(DMLVL_ERR,
   9042 							    "%s failed with expected rc = %d but handles NOT same\n",
   9043 							    szFuncName, 0);
   9044 						DMVAR_FAIL();
   9045 					}
   9046 				} else {
   9047 					DMLOG_PRINT(DMLVL_ERR,
   9048 						    "%s failed with expected rc = %d but unable to find entry %s",
   9049 						    szFuncName, 0, DUMMY_FILE);
   9050 					DMVAR_FAIL();
   9051 				}
   9052 			} else {
   9053 				DMLOG_PRINT(DMLVL_ERR,
   9054 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   9055 					    szFuncName, rc, errno);
   9056 				DMVAR_FAIL();
   9057 			}
   9058 
   9059 			/* Variation clean up */
   9060 			rc = remove(DUMMY_SUBDIR_FILE);
   9061 			rc |= rmdir(DUMMY_SUBDIR);
   9062 			if (rc == -1) {
   9063 				DMLOG_PRINT(DMLVL_DEBUG,
   9064 					    "Unable to clean up variation! (errno = %d)\n",
   9065 					    errno);
   9066 			}
   9067 			dm_handle_free(dhanp, dhlen);
   9068 			dm_handle_free(fhanp, fhlen);
   9069 		}
   9070 	}
   9071 
   9072 	/*
   9073 	 * TEST    : dm_get_dirattrs - DM_AT_EMASK
   9074 	 * EXPECTED: rc = 0
   9075 	 */
   9076 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 13)) {
   9077 		void *dhanp, *fhanp;
   9078 		size_t dhlen, fhlen;
   9079 		dm_attrloc_t loc;
   9080 		char buf[ATTR_LISTLEN];
   9081 		size_t rlen;
   9082 		dm_eventset_t eventset;
   9083 
   9084 		/* Variation set up */
   9085 		memset(buf, 0, ATTR_LISTLEN);
   9086 		DMEV_ZERO(eventset);
   9087 		DMEV_SET(DM_EVENT_ATTRIBUTE, eventset);
   9088 		DMEV_SET(DM_EVENT_CLOSE, eventset);
   9089 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   9090 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   9091 			/* No clean up */
   9092 		} else
   9093 		    if ((rc =
   9094 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   9095 					   &dhlen)) == -1) {
   9096 			rmdir(DUMMY_SUBDIR);
   9097 		} else if ((rc = system(command)) == -1) {
   9098 			dm_handle_free(dhanp, dhlen);
   9099 			rmdir(DUMMY_SUBDIR);
   9100 		} else
   9101 		    if ((rc =
   9102 			 dm_path_to_handle(DUMMY_SUBDIR_FILE, &fhanp,
   9103 					   &fhlen)) == -1) {
   9104 			remove(DUMMY_SUBDIR_FILE);
   9105 			dm_handle_free(dhanp, dhlen);
   9106 			rmdir(DUMMY_SUBDIR);
   9107 		} else
   9108 		    if (((rc =
   9109 			  dm_set_eventlist(sid, fhanp, fhlen, DM_NO_TOKEN,
   9110 					   &eventset, DM_EVENT_MAX)) == -1)
   9111 			||
   9112 			((rc =
   9113 			  dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   9114 					  &loc)) == -1)) {
   9115 			dm_handle_free(fhanp, fhlen);
   9116 			remove(DUMMY_SUBDIR_FILE);
   9117 			dm_handle_free(dhanp, dhlen);
   9118 			rmdir(DUMMY_SUBDIR);
   9119 		}
   9120 		if (rc == -1) {
   9121 			DMLOG_PRINT(DMLVL_DEBUG,
   9122 				    "Unable to set up variation! (errno = %d)\n",
   9123 				    errno);
   9124 			DMVAR_SKIP();
   9125 		} else {
   9126 			/* Variation */
   9127 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_AT_EMASK)\n",
   9128 				    szFuncName);
   9129 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   9130 					     DM_AT_EMASK, &loc, sizeof(buf),
   9131 					     buf, &rlen);
   9132 			DMLOG_PRINT(DMLVL_DEBUG,
   9133 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   9134 				    rlen);
   9135 			if (rc == 0) {
   9136 				dm_stat_t *entry = GetDirEntry(buf, DUMMY_FILE);
   9137 				LogDirAttrs(buf, DM_AT_EMASK);
   9138 				if (entry != NULL) {
   9139 					if (eventset == entry->dt_emask) {
   9140 						DMLOG_PRINT(DMLVL_DEBUG,
   9141 							    "%s passed with expected rc = %d\n",
   9142 							    szFuncName, 0);
   9143 						DMVAR_PASS();
   9144 					} else {
   9145 						DMLOG_PRINT(DMLVL_ERR,
   9146 							    "%s failed with expected rc = %d but emasks NOT same (%llx vs %llx)\n",
   9147 							    szFuncName, 0,
   9148 							    eventset,
   9149 							    entry->dt_emask);
   9150 						DMVAR_FAIL();
   9151 					}
   9152 				} else {
   9153 					DMLOG_PRINT(DMLVL_ERR,
   9154 						    "%s failed with expected rc = %d but unable to find entry %s",
   9155 						    szFuncName, 0, DUMMY_FILE);
   9156 					DMVAR_FAIL();
   9157 				}
   9158 			} else {
   9159 				DMLOG_PRINT(DMLVL_ERR,
   9160 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   9161 					    szFuncName, rc, errno);
   9162 				DMVAR_FAIL();
   9163 			}
   9164 
   9165 			/* Variation clean up */
   9166 			rc = remove(DUMMY_SUBDIR_FILE);
   9167 			rc |= rmdir(DUMMY_SUBDIR);
   9168 			if (rc == -1) {
   9169 				DMLOG_PRINT(DMLVL_DEBUG,
   9170 					    "Unable to clean up variation! (errno = %d)\n",
   9171 					    errno);
   9172 			}
   9173 			dm_handle_free(dhanp, dhlen);
   9174 			dm_handle_free(fhanp, fhlen);
   9175 		}
   9176 	}
   9177 
   9178 	/*
   9179 	 * TEST    : dm_get_dirattrs - DM_AT_PMANR with region
   9180 	 * EXPECTED: rc = 0
   9181 	 */
   9182 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 14)) {
   9183 		void *dhanp, *fhanp;
   9184 		size_t dhlen, fhlen;
   9185 		dm_attrloc_t loc;
   9186 		char buf[ATTR_LISTLEN];
   9187 		size_t rlen;
   9188 		dm_region_t region = { 0, 0, DM_REGION_READ };
   9189 		dm_boolean_t exactflag;
   9190 
   9191 		/* Variation set up */
   9192 		memset(buf, 0, ATTR_LISTLEN);
   9193 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   9194 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   9195 			/* No clean up */
   9196 		} else
   9197 		    if ((rc =
   9198 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   9199 					   &dhlen)) == -1) {
   9200 			rmdir(DUMMY_SUBDIR);
   9201 		} else if ((rc = system(command)) == -1) {
   9202 			dm_handle_free(dhanp, dhlen);
   9203 			rmdir(DUMMY_SUBDIR);
   9204 		} else
   9205 		    if ((rc =
   9206 			 dm_path_to_handle(DUMMY_SUBDIR_FILE, &fhanp,
   9207 					   &fhlen)) == -1) {
   9208 			remove(DUMMY_SUBDIR_FILE);
   9209 			dm_handle_free(dhanp, dhlen);
   9210 			rmdir(DUMMY_SUBDIR);
   9211 		} else
   9212 		    if (((rc =
   9213 			  dm_set_region(sid, fhanp, fhlen, DM_NO_TOKEN, 1,
   9214 					&region, &exactflag)) == -1)
   9215 			||
   9216 			((rc =
   9217 			  dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   9218 					  &loc)) == -1)) {
   9219 			dm_handle_free(fhanp, fhlen);
   9220 			remove(DUMMY_SUBDIR_FILE);
   9221 			dm_handle_free(dhanp, dhlen);
   9222 			rmdir(DUMMY_SUBDIR);
   9223 		}
   9224 		if (rc == -1) {
   9225 			DMLOG_PRINT(DMLVL_DEBUG,
   9226 				    "Unable to set up variation! (errno = %d)\n",
   9227 				    errno);
   9228 			DMVAR_SKIP();
   9229 		} else {
   9230 			/* Variation */
   9231 			DMLOG_PRINT(DMLVL_DEBUG,
   9232 				    "%s(DM_AT_PMANR with region)\n",
   9233 				    szFuncName);
   9234 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   9235 					     DM_AT_PMANR, &loc, sizeof(buf),
   9236 					     buf, &rlen);
   9237 			DMLOG_PRINT(DMLVL_DEBUG,
   9238 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   9239 				    rlen);
   9240 			if (rc == 0) {
   9241 				dm_stat_t *entry = GetDirEntry(buf, DUMMY_FILE);
   9242 				LogDirAttrs(buf, DM_AT_PMANR);
   9243 				if (entry != NULL) {
   9244 					if (entry->dt_pmanreg == DM_TRUE) {
   9245 						DMLOG_PRINT(DMLVL_DEBUG,
   9246 							    "%s passed with expected rc = %d\n",
   9247 							    szFuncName, 0);
   9248 						DMVAR_PASS();
   9249 					} else {
   9250 						DMLOG_PRINT(DMLVL_ERR,
   9251 							    "%s failed with expected rc = %d but pmanreg NOT same (%d vs %d)\n",
   9252 							    szFuncName, 0,
   9253 							    entry->dt_pmanreg,
   9254 							    DM_TRUE);
   9255 						DMVAR_FAIL();
   9256 					}
   9257 				} else {
   9258 					DMLOG_PRINT(DMLVL_ERR,
   9259 						    "%s failed with expected rc = %d but unable to find entry %s",
   9260 						    szFuncName, 0, DUMMY_FILE);
   9261 					DMVAR_FAIL();
   9262 				}
   9263 			} else {
   9264 				DMLOG_PRINT(DMLVL_ERR,
   9265 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   9266 					    szFuncName, rc, errno);
   9267 				DMVAR_FAIL();
   9268 			}
   9269 
   9270 			/* Variation clean up */
   9271 			rc = remove(DUMMY_SUBDIR_FILE);
   9272 			rc |= rmdir(DUMMY_SUBDIR);
   9273 			if (rc == -1) {
   9274 				DMLOG_PRINT(DMLVL_DEBUG,
   9275 					    "Unable to clean up variation! (errno = %d)\n",
   9276 					    errno);
   9277 			}
   9278 			dm_handle_free(dhanp, dhlen);
   9279 			dm_handle_free(fhanp, fhlen);
   9280 		}
   9281 	}
   9282 
   9283 	/*
   9284 	 * TEST    : dm_get_dirattrs - DM_AT_PMANR without region
   9285 	 * EXPECTED: rc = 0
   9286 	 */
   9287 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 15)) {
   9288 		void *dhanp;
   9289 		size_t dhlen;
   9290 		dm_attrloc_t loc;
   9291 		char buf[ATTR_LISTLEN];
   9292 		size_t rlen;
   9293 
   9294 		/* Variation set up */
   9295 		memset(buf, 0, ATTR_LISTLEN);
   9296 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   9297 		rc |= dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN, &loc);
   9298 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   9299 			/* No clean up */
   9300 		} else
   9301 		    if ((rc =
   9302 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   9303 					   &dhlen)) == -1) {
   9304 			rmdir(DUMMY_SUBDIR);
   9305 		} else if ((rc = system(command)) == -1) {
   9306 			dm_handle_free(dhanp, dhlen);
   9307 			rmdir(DUMMY_SUBDIR);
   9308 		} else
   9309 		    if ((rc =
   9310 			 dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   9311 					 &loc)) == -1) {
   9312 			remove(DUMMY_SUBDIR_FILE);
   9313 			dm_handle_free(dhanp, dhlen);
   9314 			rmdir(DUMMY_SUBDIR);
   9315 		}
   9316 		if (rc == -1) {
   9317 			DMLOG_PRINT(DMLVL_DEBUG,
   9318 				    "Unable to set up variation! (errno = %d)\n",
   9319 				    errno);
   9320 			DMVAR_SKIP();
   9321 		} else {
   9322 			/* Variation */
   9323 			DMLOG_PRINT(DMLVL_DEBUG,
   9324 				    "%s(DM_AT_PMANR without region)\n",
   9325 				    szFuncName);
   9326 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   9327 					     DM_AT_PMANR, &loc, sizeof(buf),
   9328 					     buf, &rlen);
   9329 			DMLOG_PRINT(DMLVL_DEBUG,
   9330 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   9331 				    rlen);
   9332 			if (rc == 0) {
   9333 				dm_stat_t *entry = GetDirEntry(buf, DUMMY_FILE);
   9334 				LogDirAttrs(buf, DM_AT_PMANR);
   9335 				if (entry != NULL) {
   9336 					if (entry->dt_pmanreg == DM_FALSE) {
   9337 						DMLOG_PRINT(DMLVL_DEBUG,
   9338 							    "%s passed with expected rc = %d\n",
   9339 							    szFuncName, 0);
   9340 						DMVAR_PASS();
   9341 					} else {
   9342 						DMLOG_PRINT(DMLVL_ERR,
   9343 							    "%s failed with expected rc = %d but pmanreg NOT same (%d vs %d)\n",
   9344 							    szFuncName, 0,
   9345 							    entry->dt_pmanreg,
   9346 							    DM_FALSE);
   9347 						DMVAR_FAIL();
   9348 					}
   9349 				} else {
   9350 					DMLOG_PRINT(DMLVL_ERR,
   9351 						    "%s failed with expected rc = %d but unable to find entry %s",
   9352 						    szFuncName, 0, DUMMY_FILE);
   9353 					DMVAR_FAIL();
   9354 				}
   9355 			} else {
   9356 				DMLOG_PRINT(DMLVL_ERR,
   9357 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   9358 					    szFuncName, rc, errno);
   9359 				DMVAR_FAIL();
   9360 			}
   9361 
   9362 			/* Variation clean up */
   9363 			rc = remove(DUMMY_SUBDIR_FILE);
   9364 			rc |= rmdir(DUMMY_SUBDIR);
   9365 			if (rc == -1) {
   9366 				DMLOG_PRINT(DMLVL_DEBUG,
   9367 					    "Unable to clean up variation! (errno = %d)\n",
   9368 					    errno);
   9369 			}
   9370 			dm_handle_free(dhanp, dhlen);
   9371 		}
   9372 	}
   9373 
   9374 	/*
   9375 	 * TEST    : dm_get_dirattrs - DM_AT_PATTR with DM attribute
   9376 	 * EXPECTED: rc = 0
   9377 	 */
   9378 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 16)) {
   9379 		void *dhanp, *fhanp;
   9380 		size_t dhlen, fhlen;
   9381 		dm_attrloc_t loc;
   9382 		char buf[ATTR_LISTLEN];
   9383 		size_t rlen;
   9384 		dm_attrname_t attrname;
   9385 		char attrbuf[ATTR_VALUELEN];
   9386 
   9387 		/* Variation set up */
   9388 		memset(buf, 0, ATTR_LISTLEN);
   9389 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   9390 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   9391 		memcpy(attrbuf, ATTR_VALUE, ATTR_VALUELEN);
   9392 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   9393 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   9394 			/* No clean up */
   9395 		} else
   9396 		    if ((rc =
   9397 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   9398 					   &dhlen)) == -1) {
   9399 			rmdir(DUMMY_SUBDIR);
   9400 		} else if ((rc = system(command)) == -1) {
   9401 			dm_handle_free(dhanp, dhlen);
   9402 			rmdir(DUMMY_SUBDIR);
   9403 		} else
   9404 		    if ((rc =
   9405 			 dm_path_to_handle(DUMMY_SUBDIR_FILE, &fhanp,
   9406 					   &fhlen)) == -1) {
   9407 			remove(DUMMY_SUBDIR_FILE);
   9408 			dm_handle_free(dhanp, dhlen);
   9409 			rmdir(DUMMY_SUBDIR);
   9410 		} else
   9411 		    if (((rc =
   9412 			  dm_set_dmattr(sid, fhanp, fhlen, DM_NO_TOKEN,
   9413 					&attrname, 0, sizeof(attrbuf),
   9414 					attrbuf)) == -1)
   9415 			||
   9416 			((rc =
   9417 			  dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   9418 					  &loc)) == -1)) {
   9419 			dm_handle_free(fhanp, fhlen);
   9420 			remove(DUMMY_SUBDIR_FILE);
   9421 			dm_handle_free(dhanp, dhlen);
   9422 			rmdir(DUMMY_SUBDIR);
   9423 		}
   9424 		if (rc == -1) {
   9425 			DMLOG_PRINT(DMLVL_DEBUG,
   9426 				    "Unable to set up variation! (errno = %d)\n",
   9427 				    errno);
   9428 			DMVAR_SKIP();
   9429 		} else {
   9430 			/* Variation */
   9431 			DMLOG_PRINT(DMLVL_DEBUG,
   9432 				    "%s(DM_AT_PATTR with DM attr)\n",
   9433 				    szFuncName);
   9434 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   9435 					     DM_AT_PATTR, &loc, sizeof(buf),
   9436 					     buf, &rlen);
   9437 			DMLOG_PRINT(DMLVL_DEBUG,
   9438 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   9439 				    rlen);
   9440 			if (rc == 0) {
   9441 				dm_stat_t *entry = GetDirEntry(buf, DUMMY_FILE);
   9442 				LogDirAttrs(buf, DM_AT_PATTR);
   9443 				if (entry != NULL) {
   9444 					if (entry->dt_pers == DM_TRUE) {
   9445 						DMLOG_PRINT(DMLVL_DEBUG,
   9446 							    "%s passed with expected rc = %d\n",
   9447 							    szFuncName, 0);
   9448 						DMVAR_PASS();
   9449 					} else {
   9450 						DMLOG_PRINT(DMLVL_ERR,
   9451 							    "%s failed with expected rc = %d but pers NOT same (%d vs %d)\n",
   9452 							    szFuncName, 0,
   9453 							    entry->dt_pers,
   9454 							    DM_TRUE);
   9455 						DMVAR_FAIL();
   9456 					}
   9457 				} else {
   9458 					DMLOG_PRINT(DMLVL_ERR,
   9459 						    "%s failed with expected rc = %d but unable to find entry %s",
   9460 						    szFuncName, 0, DUMMY_FILE);
   9461 					DMVAR_FAIL();
   9462 				}
   9463 			} else {
   9464 				DMLOG_PRINT(DMLVL_ERR,
   9465 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   9466 					    szFuncName, rc, errno);
   9467 				DMVAR_FAIL();
   9468 			}
   9469 
   9470 			/* Variation clean up */
   9471 			rc = remove(DUMMY_SUBDIR_FILE);
   9472 			rc |= rmdir(DUMMY_SUBDIR);
   9473 			if (rc == -1) {
   9474 				DMLOG_PRINT(DMLVL_DEBUG,
   9475 					    "Unable to clean up variation! (errno = %d)\n",
   9476 					    errno);
   9477 			}
   9478 			dm_handle_free(dhanp, dhlen);
   9479 			dm_handle_free(fhanp, fhlen);
   9480 		}
   9481 	}
   9482 
   9483 	/*
   9484 	 * TEST    : dm_get_dirattrs - DM_AT_PATTR without DM attribute
   9485 	 * EXPECTED: rc = 0
   9486 	 */
   9487 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 17)) {
   9488 		void *dhanp;
   9489 		size_t dhlen;
   9490 		dm_attrloc_t loc;
   9491 		char buf[ATTR_LISTLEN];
   9492 		size_t rlen;
   9493 
   9494 		/* Variation set up */
   9495 		memset(buf, 0, ATTR_LISTLEN);
   9496 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   9497 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   9498 			/* No clean up */
   9499 		} else
   9500 		    if ((rc =
   9501 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   9502 					   &dhlen)) == -1) {
   9503 			rmdir(DUMMY_SUBDIR);
   9504 		} else if ((rc = system(command)) == -1) {
   9505 			dm_handle_free(dhanp, dhlen);
   9506 			rmdir(DUMMY_SUBDIR);
   9507 		} else
   9508 		    if ((rc =
   9509 			 dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   9510 					 &loc)) == -1) {
   9511 			remove(DUMMY_SUBDIR_FILE);
   9512 			dm_handle_free(dhanp, dhlen);
   9513 			rmdir(DUMMY_SUBDIR);
   9514 		}
   9515 		if (rc == -1) {
   9516 			DMLOG_PRINT(DMLVL_DEBUG,
   9517 				    "Unable to set up variation! (errno = %d)\n",
   9518 				    errno);
   9519 			DMVAR_SKIP();
   9520 		} else {
   9521 			/* Variation */
   9522 			DMLOG_PRINT(DMLVL_DEBUG,
   9523 				    "%s(DM_AT_PATTR without DM attr)\n",
   9524 				    szFuncName);
   9525 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   9526 					     DM_AT_PATTR, &loc, sizeof(buf),
   9527 					     buf, &rlen);
   9528 			DMLOG_PRINT(DMLVL_DEBUG,
   9529 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   9530 				    rlen);
   9531 			if (rc == 0) {
   9532 				dm_stat_t *entry = GetDirEntry(buf, DUMMY_FILE);
   9533 				LogDirAttrs(buf, DM_AT_PATTR);
   9534 				if (entry != NULL) {
   9535 					if (entry->dt_pers == DM_FALSE) {
   9536 						DMLOG_PRINT(DMLVL_DEBUG,
   9537 							    "%s passed with expected rc = %d\n",
   9538 							    szFuncName, 0);
   9539 						DMVAR_PASS();
   9540 					} else {
   9541 						DMLOG_PRINT(DMLVL_ERR,
   9542 							    "%s failed with expected rc = %d but pers NOT same (%d vs %d)\n",
   9543 							    szFuncName, 0,
   9544 							    entry->dt_pers,
   9545 							    DM_FALSE);
   9546 						DMVAR_FAIL();
   9547 					}
   9548 				} else {
   9549 					DMLOG_PRINT(DMLVL_ERR,
   9550 						    "%s failed with expected rc = %d but unable to find entry %s",
   9551 						    szFuncName, 0, DUMMY_FILE);
   9552 					DMVAR_FAIL();
   9553 				}
   9554 			} else {
   9555 				DMLOG_PRINT(DMLVL_ERR,
   9556 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   9557 					    szFuncName, rc, errno);
   9558 				DMVAR_FAIL();
   9559 			}
   9560 
   9561 			/* Variation clean up */
   9562 			rc = remove(DUMMY_SUBDIR_FILE);
   9563 			rc |= rmdir(DUMMY_SUBDIR);
   9564 			if (rc == -1) {
   9565 				DMLOG_PRINT(DMLVL_DEBUG,
   9566 					    "Unable to clean up variation! (errno = %d)\n",
   9567 					    errno);
   9568 			}
   9569 			dm_handle_free(dhanp, dhlen);
   9570 		}
   9571 	}
   9572 
   9573 	/*
   9574 	 * TEST    : dm_get_dirattrs - DM_AT_DTIME with DM attribute
   9575 	 * EXPECTED: rc = 0
   9576 	 */
   9577 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 18)) {
   9578 		void *dhanp, *fhanp;
   9579 		size_t dhlen, fhlen;
   9580 		dm_attrloc_t loc;
   9581 		char buf[ATTR_LISTLEN];
   9582 		size_t rlen;
   9583 		dm_attrname_t attrname;
   9584 		char attrbuf[ATTR_VALUELEN];
   9585 		struct stat statfs;
   9586 
   9587 		/* Variation set up */
   9588 		memset(buf, 0, ATTR_LISTLEN);
   9589 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   9590 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   9591 		memcpy(attrbuf, ATTR_VALUE, ATTR_VALUELEN);
   9592 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   9593 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   9594 			/* No clean up */
   9595 		} else
   9596 		    if ((rc =
   9597 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   9598 					   &dhlen)) == -1) {
   9599 			rmdir(DUMMY_SUBDIR);
   9600 		} else if ((rc = system(command)) == -1) {
   9601 			dm_handle_free(dhanp, dhlen);
   9602 			rmdir(DUMMY_SUBDIR);
   9603 		} else
   9604 		    if ((rc =
   9605 			 dm_path_to_handle(DUMMY_SUBDIR_FILE, &fhanp,
   9606 					   &fhlen)) == -1) {
   9607 			remove(DUMMY_SUBDIR_FILE);
   9608 			dm_handle_free(dhanp, dhlen);
   9609 			rmdir(DUMMY_SUBDIR);
   9610 		} else if (((rc = stat(DUMMY_SUBDIR_FILE, &statfs)) == -1) ||
   9611 			   ((rc =
   9612 			     dm_set_dmattr(sid, fhanp, fhlen, DM_NO_TOKEN,
   9613 					   &attrname, 0, sizeof(attrbuf),
   9614 					   attrbuf)) == -1)
   9615 			   ||
   9616 			   ((rc =
   9617 			     dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   9618 					     &loc)) == -1)) {
   9619 			dm_handle_free(fhanp, fhlen);
   9620 			remove(DUMMY_SUBDIR_FILE);
   9621 			dm_handle_free(dhanp, dhlen);
   9622 			rmdir(DUMMY_SUBDIR);
   9623 		}
   9624 		if (rc == -1) {
   9625 			DMLOG_PRINT(DMLVL_DEBUG,
   9626 				    "Unable to set up variation! (errno = %d)\n",
   9627 				    errno);
   9628 			DMVAR_SKIP();
   9629 		} else {
   9630 			/* Variation */
   9631 			DMLOG_PRINT(DMLVL_DEBUG,
   9632 				    "%s(DM_AT_DTIME with DM attr)\n",
   9633 				    szFuncName);
   9634 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   9635 					     DM_AT_DTIME, &loc, sizeof(buf),
   9636 					     buf, &rlen);
   9637 			DMLOG_PRINT(DMLVL_DEBUG,
   9638 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   9639 				    rlen);
   9640 			if (rc == 0) {
   9641 				dm_stat_t *entry = GetDirEntry(buf, DUMMY_FILE);
   9642 				LogDirAttrs(buf, DM_AT_DTIME);
   9643 				if (entry != NULL) {
   9644 					if (entry->dt_dtime == statfs.st_ctime) {
   9645 						DMLOG_PRINT(DMLVL_DEBUG,
   9646 							    "%s passed with expected rc = %d\n",
   9647 							    szFuncName, 0);
   9648 						DMVAR_PASS();
   9649 					} else {
   9650 						DMLOG_PRINT(DMLVL_ERR,
   9651 							    "%s failed with expected rc = %d but dtime NOT same (%d vs %d)\n",
   9652 							    szFuncName, 0,
   9653 							    entry->dt_dtime,
   9654 							    statfs.st_ctime);
   9655 						DMVAR_FAIL();
   9656 					}
   9657 				} else {
   9658 					DMLOG_PRINT(DMLVL_ERR,
   9659 						    "%s failed with expected rc = %d but unable to find entry %s",
   9660 						    szFuncName, 0, DUMMY_FILE);
   9661 					DMVAR_FAIL();
   9662 				}
   9663 			} else {
   9664 				DMLOG_PRINT(DMLVL_ERR,
   9665 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   9666 					    szFuncName, rc, errno);
   9667 				DMVAR_FAIL();
   9668 			}
   9669 
   9670 			/* Variation clean up */
   9671 			rc = remove(DUMMY_SUBDIR_FILE);
   9672 			rc |= rmdir(DUMMY_SUBDIR);
   9673 			if (rc == -1) {
   9674 				DMLOG_PRINT(DMLVL_DEBUG,
   9675 					    "Unable to clean up variation! (errno = %d)\n",
   9676 					    errno);
   9677 			}
   9678 			dm_handle_free(dhanp, dhlen);
   9679 			dm_handle_free(fhanp, fhlen);
   9680 		}
   9681 	}
   9682 
   9683 	/*
   9684 	 * TEST    : dm_get_dirattrs - DM_AT_DTIME without DM attribute
   9685 	 * EXPECTED: rc = 0
   9686 	 *
   9687 	 * This variation uncovered XFS BUG #25 (dtime updated without any DM
   9688 	 * attributes)
   9689 	 */
   9690 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 19)) {
   9691 		void *dhanp;
   9692 		size_t dhlen;
   9693 		dm_attrloc_t loc;
   9694 		char buf[ATTR_LISTLEN];
   9695 		size_t rlen;
   9696 		struct stat statfs;
   9697 
   9698 		/* Variation set up */
   9699 		memset(buf, 0, ATTR_LISTLEN);
   9700 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   9701 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   9702 			/* No clean up */
   9703 		} else
   9704 		    if ((rc =
   9705 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   9706 					   &dhlen)) == -1) {
   9707 			rmdir(DUMMY_SUBDIR);
   9708 		} else if ((rc = system(command)) == -1) {
   9709 			dm_handle_free(dhanp, dhlen);
   9710 			rmdir(DUMMY_SUBDIR);
   9711 		} else if (((rc = stat(DUMMY_SUBDIR_FILE, &statfs)) == -1) ||
   9712 			   ((rc =
   9713 			     dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   9714 					     &loc)) == -1)) {
   9715 			remove(DUMMY_SUBDIR_FILE);
   9716 			dm_handle_free(dhanp, dhlen);
   9717 			rmdir(DUMMY_SUBDIR);
   9718 		}
   9719 		if (rc == -1) {
   9720 			DMLOG_PRINT(DMLVL_DEBUG,
   9721 				    "Unable to set up variation! (errno = %d)\n",
   9722 				    errno);
   9723 			DMVAR_SKIP();
   9724 		} else {
   9725 			/* Variation */
   9726 			DMLOG_PRINT(DMLVL_DEBUG,
   9727 				    "%s(DM_AT_DTIME without DM attr)\n",
   9728 				    szFuncName);
   9729 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   9730 					     DM_AT_DTIME, &loc, sizeof(buf),
   9731 					     buf, &rlen);
   9732 			DMLOG_PRINT(DMLVL_DEBUG,
   9733 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   9734 				    rlen);
   9735 			if (rc == 0) {
   9736 				dm_stat_t *entry = GetDirEntry(buf, DUMMY_FILE);
   9737 				LogDirAttrs(buf, DM_AT_DTIME);
   9738 				if (entry != NULL) {
   9739 					if (entry->dt_dtime != statfs.st_ctime) {
   9740 						DMLOG_PRINT(DMLVL_DEBUG,
   9741 							    "%s passed with expected rc = %d\n",
   9742 							    szFuncName, 0);
   9743 						DMVAR_PASS();
   9744 					} else {
   9745 						DMLOG_PRINT(DMLVL_ERR,
   9746 							    "%s failed with expected rc = %d but dtime same (%d vs %d)\n",
   9747 							    szFuncName, 0,
   9748 							    entry->dt_dtime,
   9749 							    statfs.st_ctime);
   9750 						DMVAR_FAIL();
   9751 					}
   9752 				} else {
   9753 					DMLOG_PRINT(DMLVL_ERR,
   9754 						    "%s failed with expected rc = %d but unable to find entry %s",
   9755 						    szFuncName, 0, DUMMY_FILE);
   9756 					DMVAR_FAIL();
   9757 				}
   9758 			} else {
   9759 				DMLOG_PRINT(DMLVL_ERR,
   9760 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   9761 					    szFuncName, rc, errno);
   9762 				DMVAR_FAIL();
   9763 			}
   9764 
   9765 			/* Variation clean up */
   9766 			rc = remove(DUMMY_SUBDIR_FILE);
   9767 			rc |= rmdir(DUMMY_SUBDIR);
   9768 			if (rc == -1) {
   9769 				DMLOG_PRINT(DMLVL_DEBUG,
   9770 					    "Unable to clean up variation! (errno = %d)\n",
   9771 					    errno);
   9772 			}
   9773 			dm_handle_free(dhanp, dhlen);
   9774 		}
   9775 	}
   9776 
   9777 	/*
   9778 	 * TEST    : dm_get_dirattrs - DM_AT_CFLAG with no change
   9779 	 * EXPECTED: rc = 0
   9780 	 */
   9781 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 20)) {
   9782 		void *dhanp;
   9783 		size_t dhlen;
   9784 		dm_attrloc_t loc;
   9785 		char buf1[ATTR_LISTLEN], buf2[ATTR_LISTLEN];
   9786 		size_t rlen;
   9787 
   9788 		/* Variation set up */
   9789 		memset(buf1, 0, ATTR_LISTLEN);
   9790 		memset(buf2, 0, ATTR_LISTLEN);
   9791 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   9792 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   9793 			/* No clean up */
   9794 		} else
   9795 		    if ((rc =
   9796 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   9797 					   &dhlen)) == -1) {
   9798 			rmdir(DUMMY_SUBDIR);
   9799 		} else if ((rc = system(command)) == -1) {
   9800 			dm_handle_free(dhanp, dhlen);
   9801 			rmdir(DUMMY_SUBDIR);
   9802 		} else
   9803 		    if (((rc =
   9804 			  dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   9805 					  &loc)) == -1)
   9806 			||
   9807 			((rc =
   9808 			  dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   9809 					  DM_AT_CFLAG, &loc, sizeof(buf1), buf1,
   9810 					  &rlen)) == -1)
   9811 			||
   9812 			((rc =
   9813 			  dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   9814 					  &loc)) == -1)) {
   9815 			remove(DUMMY_SUBDIR_FILE);
   9816 			dm_handle_free(dhanp, dhlen);
   9817 			rmdir(DUMMY_SUBDIR);
   9818 		}
   9819 		if (rc == -1) {
   9820 			DMLOG_PRINT(DMLVL_DEBUG,
   9821 				    "Unable to set up variation! (errno = %d)\n",
   9822 				    errno);
   9823 			DMVAR_SKIP();
   9824 		} else {
   9825 			/* Variation */
   9826 			DMLOG_PRINT(DMLVL_DEBUG,
   9827 				    "%s(DM_AT_CFLAG with no change)\n",
   9828 				    szFuncName);
   9829 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   9830 					     DM_AT_CFLAG, &loc, sizeof(buf2),
   9831 					     buf2, &rlen);
   9832 			DMLOG_PRINT(DMLVL_DEBUG,
   9833 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   9834 				    rlen);
   9835 			if (rc == 0) {
   9836 				dm_stat_t *entry1 =
   9837 				    GetDirEntry(buf1, DUMMY_FILE);
   9838 				dm_stat_t *entry2 =
   9839 				    GetDirEntry(buf2, DUMMY_FILE);
   9840 				LogDirAttrs(buf2, DM_AT_CFLAG);
   9841 				if ((entry1 != NULL) && (entry2 != NULL)) {
   9842 					if (entry1->dt_change ==
   9843 					    entry2->dt_change) {
   9844 						DMLOG_PRINT(DMLVL_DEBUG,
   9845 							    "%s passed with expected rc = %d\n",
   9846 							    szFuncName, 0);
   9847 						DMVAR_PASS();
   9848 					} else {
   9849 						DMLOG_PRINT(DMLVL_ERR,
   9850 							    "%s failed with expected rc = %d but change not same (%d vs %d)\n",
   9851 							    szFuncName, 0,
   9852 							    entry1->dt_change,
   9853 							    entry2->dt_change);
   9854 						DMVAR_FAIL();
   9855 					}
   9856 				} else {
   9857 					DMLOG_PRINT(DMLVL_ERR,
   9858 						    "%s failed with expected rc = %d but unable to find entry %s",
   9859 						    szFuncName, 0, DUMMY_FILE);
   9860 					DMVAR_FAIL();
   9861 				}
   9862 			} else {
   9863 				DMLOG_PRINT(DMLVL_ERR,
   9864 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   9865 					    szFuncName, rc, errno);
   9866 				DMVAR_FAIL();
   9867 			}
   9868 
   9869 			/* Variation clean up */
   9870 			rc = remove(DUMMY_SUBDIR_FILE);
   9871 			rc |= rmdir(DUMMY_SUBDIR);
   9872 			if (rc == -1) {
   9873 				DMLOG_PRINT(DMLVL_DEBUG,
   9874 					    "Unable to clean up variation! (errno = %d)\n",
   9875 					    errno);
   9876 			}
   9877 			dm_handle_free(dhanp, dhlen);
   9878 		}
   9879 	}
   9880 
   9881 	/*
   9882 	 * TEST    : dm_get_dirattrs - DM_AT_CFLAG with data change
   9883 	 * EXPECTED: rc = 0
   9884 	 */
   9885 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 21)) {
   9886 		int fd;
   9887 		void *dhanp;
   9888 		size_t dhlen;
   9889 		dm_attrloc_t loc;
   9890 		char buf1[ATTR_LISTLEN], buf2[ATTR_LISTLEN];
   9891 		size_t rlen;
   9892 
   9893 		/* Variation set up */
   9894 		memset(buf1, 0, ATTR_LISTLEN);
   9895 		memset(buf2, 0, ATTR_LISTLEN);
   9896 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   9897 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   9898 			/* No clean up */
   9899 		} else
   9900 		    if ((rc =
   9901 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   9902 					   &dhlen)) == -1) {
   9903 			rmdir(DUMMY_SUBDIR);
   9904 		} else if ((rc = system(command)) == -1) {
   9905 			dm_handle_free(dhanp, dhlen);
   9906 			rmdir(DUMMY_SUBDIR);
   9907 		} else if ((fd = open(DUMMY_SUBDIR_FILE, O_RDWR | O_CREAT,
   9908 				      DUMMY_FILE_RW_MODE)) == -1) {
   9909 			remove(DUMMY_SUBDIR_FILE);
   9910 			dm_handle_free(dhanp, dhlen);
   9911 			rmdir(DUMMY_SUBDIR);
   9912 		} else
   9913 		    if (((rc =
   9914 			  dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   9915 					  &loc)) == -1)
   9916 			||
   9917 			((rc =
   9918 			  dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   9919 					  DM_AT_CFLAG, &loc, sizeof(buf1), buf1,
   9920 					  &rlen)) == -1)
   9921 			||
   9922 			((rc =
   9923 			  dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   9924 					  &loc)) == -1)
   9925 			||
   9926 			((rc =
   9927 			  (write(fd, DUMMY_STRING, DUMMY_STRLEN) !=
   9928 			   DUMMY_STRLEN ? -1 : 0) == 1))) {
   9929 			close(fd);
   9930 			remove(DUMMY_SUBDIR_FILE);
   9931 			dm_handle_free(dhanp, dhlen);
   9932 			rmdir(DUMMY_SUBDIR);
   9933 		}
   9934 		if (fd == -1 || rc == -1) {
   9935 			DMLOG_PRINT(DMLVL_DEBUG,
   9936 				    "Unable to set up variation! (errno = %d)\n",
   9937 				    errno);
   9938 			DMVAR_SKIP();
   9939 		} else {
   9940 			/* Variation */
   9941 			DMLOG_PRINT(DMLVL_DEBUG,
   9942 				    "%s(DM_AT_CFLAG with data change)\n",
   9943 				    szFuncName);
   9944 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   9945 					     DM_AT_CFLAG, &loc, sizeof(buf2),
   9946 					     buf2, &rlen);
   9947 			DMLOG_PRINT(DMLVL_DEBUG,
   9948 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   9949 				    rlen);
   9950 			if (rc == 0) {
   9951 				dm_stat_t *entry1 =
   9952 				    GetDirEntry(buf1, DUMMY_FILE);
   9953 				dm_stat_t *entry2 =
   9954 				    GetDirEntry(buf2, DUMMY_FILE);
   9955 				LogDirAttrs(buf2, DM_AT_CFLAG);
   9956 				if ((entry1 != NULL) && (entry2 != NULL)) {
   9957 					if (entry1->dt_change !=
   9958 					    entry2->dt_change) {
   9959 						DMLOG_PRINT(DMLVL_DEBUG,
   9960 							    "%s passed with expected rc = %d\n",
   9961 							    szFuncName, 0);
   9962 						DMVAR_PASS();
   9963 					} else {
   9964 						DMLOG_PRINT(DMLVL_ERR,
   9965 							    "%s failed with expected rc = %d but change same (%d vs %d)\n",
   9966 							    szFuncName, 0,
   9967 							    entry1->dt_change,
   9968 							    entry2->dt_change);
   9969 						DMVAR_FAIL();
   9970 					}
   9971 				} else {
   9972 					DMLOG_PRINT(DMLVL_ERR,
   9973 						    "%s failed with expected rc = %d but unable to find entry %s",
   9974 						    szFuncName, 0, DUMMY_FILE);
   9975 					DMVAR_FAIL();
   9976 				}
   9977 			} else {
   9978 				DMLOG_PRINT(DMLVL_ERR,
   9979 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   9980 					    szFuncName, rc, errno);
   9981 				DMVAR_FAIL();
   9982 			}
   9983 
   9984 			/* Variation clean up */
   9985 			rc = remove(DUMMY_SUBDIR_FILE);
   9986 			rc |= rmdir(DUMMY_SUBDIR);
   9987 			if (rc == -1) {
   9988 				DMLOG_PRINT(DMLVL_DEBUG,
   9989 					    "Unable to clean up variation! (errno = %d)\n",
   9990 					    errno);
   9991 			}
   9992 			dm_handle_free(dhanp, dhlen);
   9993 		}
   9994 	}
   9995 
   9996 	/*
   9997 	 * TEST    : dm_get_dirattrs - DM_AT_CFLAG with metadata change
   9998 	 * EXPECTED: rc = 0
   9999 	 */
   10000 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 22)) {
   10001 		void *dhanp;
   10002 		size_t dhlen;
   10003 		dm_attrloc_t loc;
   10004 		char buf1[ATTR_LISTLEN], buf2[ATTR_LISTLEN];
   10005 		size_t rlen;
   10006 
   10007 		/* Variation set up */
   10008 		memset(buf1, 0, ATTR_LISTLEN);
   10009 		memset(buf2, 0, ATTR_LISTLEN);
   10010 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   10011 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   10012 			/* No clean up */
   10013 		} else
   10014 		    if ((rc =
   10015 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   10016 					   &dhlen)) == -1) {
   10017 			rmdir(DUMMY_SUBDIR);
   10018 		} else if ((rc = system(command)) == -1) {
   10019 			dm_handle_free(dhanp, dhlen);
   10020 			rmdir(DUMMY_SUBDIR);
   10021 		} else
   10022 		    if (((rc =
   10023 			  dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   10024 					  &loc)) == -1)
   10025 			||
   10026 			((rc =
   10027 			  dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   10028 					  DM_AT_CFLAG, &loc, sizeof(buf1), buf1,
   10029 					  &rlen)) == -1)
   10030 			||
   10031 			((rc =
   10032 			  dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   10033 					  &loc)) == -1)
   10034 			||
   10035 			((rc =
   10036 			  chown(DUMMY_SUBDIR_FILE, DUMMY_UID,
   10037 				DUMMY_GID)) == -1)) {
   10038 			remove(DUMMY_SUBDIR_FILE);
   10039 			dm_handle_free(dhanp, dhlen);
   10040 			rmdir(DUMMY_SUBDIR);
   10041 		}
   10042 		if (rc == -1) {
   10043 			DMLOG_PRINT(DMLVL_DEBUG,
   10044 				    "Unable to set up variation! (errno = %d)\n",
   10045 				    errno);
   10046 			DMVAR_SKIP();
   10047 		} else {
   10048 			/* Variation */
   10049 			DMLOG_PRINT(DMLVL_DEBUG,
   10050 				    "%s(DM_AT_CFLAG with metadata change)\n",
   10051 				    szFuncName);
   10052 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   10053 					     DM_AT_CFLAG, &loc, sizeof(buf2),
   10054 					     buf2, &rlen);
   10055 			DMLOG_PRINT(DMLVL_DEBUG,
   10056 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   10057 				    rlen);
   10058 			if (rc == 0) {
   10059 				dm_stat_t *entry1 =
   10060 				    GetDirEntry(buf1, DUMMY_FILE);
   10061 				dm_stat_t *entry2 =
   10062 				    GetDirEntry(buf2, DUMMY_FILE);
   10063 				LogDirAttrs(buf2, DM_AT_CFLAG);
   10064 				if ((entry1 != NULL) && (entry2 != NULL)) {
   10065 					if (entry1->dt_change !=
   10066 					    entry2->dt_change) {
   10067 						DMLOG_PRINT(DMLVL_DEBUG,
   10068 							    "%s passed with expected rc = %d\n",
   10069 							    szFuncName, 0);
   10070 						DMVAR_PASS();
   10071 					} else {
   10072 						DMLOG_PRINT(DMLVL_ERR,
   10073 							    "%s failed with expected rc = %d but change same (%d vs %d)\n",
   10074 							    szFuncName, 0,
   10075 							    entry1->dt_change,
   10076 							    entry2->dt_change);
   10077 						DMVAR_FAIL();
   10078 					}
   10079 				} else {
   10080 					DMLOG_PRINT(DMLVL_ERR,
   10081 						    "%s failed with expected rc = %d but unable to find entry %s",
   10082 						    szFuncName, 0, DUMMY_FILE);
   10083 					DMVAR_FAIL();
   10084 				}
   10085 			} else {
   10086 				DMLOG_PRINT(DMLVL_ERR,
   10087 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   10088 					    szFuncName, rc, errno);
   10089 				DMVAR_FAIL();
   10090 			}
   10091 
   10092 			/* Variation clean up */
   10093 			rc = remove(DUMMY_SUBDIR_FILE);
   10094 			rc |= rmdir(DUMMY_SUBDIR);
   10095 			if (rc == -1) {
   10096 				DMLOG_PRINT(DMLVL_DEBUG,
   10097 					    "Unable to clean up variation! (errno = %d)\n",
   10098 					    errno);
   10099 			}
   10100 			dm_handle_free(dhanp, dhlen);
   10101 		}
   10102 	}
   10103 
   10104 	/*
   10105 	 * TEST    : dm_get_dirattrs - DM_AT_CFLAG with DM attribute change
   10106 	 * EXPECTED: rc = 0
   10107 	 */
   10108 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 23)) {
   10109 		void *dhanp, *fhanp;
   10110 		size_t dhlen, fhlen;
   10111 		dm_attrloc_t loc;
   10112 		char buf1[ATTR_LISTLEN], buf2[ATTR_LISTLEN];
   10113 		size_t rlen;
   10114 		dm_attrname_t attrname;
   10115 
   10116 		/* Variation set up */
   10117 		memset(buf1, 0, ATTR_LISTLEN);
   10118 		memset(buf2, 0, ATTR_LISTLEN);
   10119 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   10120 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   10121 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   10122 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   10123 			/* No clean up */
   10124 		} else
   10125 		    if ((rc =
   10126 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   10127 					   &dhlen)) == -1) {
   10128 			rmdir(DUMMY_SUBDIR);
   10129 		} else if ((rc = system(command)) == -1) {
   10130 			dm_handle_free(dhanp, dhlen);
   10131 			rmdir(DUMMY_SUBDIR);
   10132 		} else
   10133 		    if ((rc =
   10134 			 dm_path_to_handle(DUMMY_SUBDIR_FILE, &fhanp,
   10135 					   &fhlen)) == -1) {
   10136 			remove(DUMMY_SUBDIR_FILE);
   10137 			dm_handle_free(dhanp, dhlen);
   10138 			rmdir(DUMMY_SUBDIR);
   10139 		} else
   10140 		    if (((rc =
   10141 			  dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   10142 					  &loc)) == -1)
   10143 			||
   10144 			((rc =
   10145 			  dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   10146 					  DM_AT_CFLAG, &loc, sizeof(buf1), buf1,
   10147 					  &rlen)) == -1)
   10148 			||
   10149 			((rc =
   10150 			  dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   10151 					  &loc)) == -1)
   10152 			||
   10153 			((rc =
   10154 			  dm_set_dmattr(sid, fhanp, fhlen, DM_NO_TOKEN,
   10155 					&attrname, 0, 0, NULL)) == -1)) {
   10156 			dm_handle_free(fhanp, fhlen);
   10157 			remove(DUMMY_SUBDIR_FILE);
   10158 			dm_handle_free(dhanp, dhlen);
   10159 			rmdir(DUMMY_SUBDIR);
   10160 		}
   10161 		if (rc == -1) {
   10162 			DMLOG_PRINT(DMLVL_DEBUG,
   10163 				    "Unable to set up variation! (errno = %d)\n",
   10164 				    errno);
   10165 			DMVAR_SKIP();
   10166 		} else {
   10167 			/* Variation */
   10168 			DMLOG_PRINT(DMLVL_DEBUG,
   10169 				    "%s(DM_AT_CFLAG with DM attr change)\n",
   10170 				    szFuncName);
   10171 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   10172 					     DM_AT_CFLAG, &loc, sizeof(buf2),
   10173 					     buf2, &rlen);
   10174 			DMLOG_PRINT(DMLVL_DEBUG,
   10175 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   10176 				    rlen);
   10177 			if (rc == 0) {
   10178 				dm_stat_t *entry1 =
   10179 				    GetDirEntry(buf1, DUMMY_FILE);
   10180 				dm_stat_t *entry2 =
   10181 				    GetDirEntry(buf2, DUMMY_FILE);
   10182 				LogDirAttrs(buf2, DM_AT_CFLAG);
   10183 				if ((entry1 != NULL) && (entry2 != NULL)) {
   10184 					if (entry1->dt_change !=
   10185 					    entry2->dt_change) {
   10186 						DMLOG_PRINT(DMLVL_DEBUG,
   10187 							    "%s passed with expected rc = %d\n",
   10188 							    szFuncName, 0);
   10189 						DMVAR_PASS();
   10190 					} else {
   10191 						DMLOG_PRINT(DMLVL_ERR,
   10192 							    "%s failed with expected rc = %d but change same (%d vs %d)\n",
   10193 							    szFuncName, 0,
   10194 							    entry1->dt_change,
   10195 							    entry2->dt_change);
   10196 						DMVAR_FAIL();
   10197 					}
   10198 				} else {
   10199 					DMLOG_PRINT(DMLVL_ERR,
   10200 						    "%s failed with expected rc = %d but unable to find entry %s",
   10201 						    szFuncName, 0, DUMMY_FILE);
   10202 					DMVAR_FAIL();
   10203 				}
   10204 			} else {
   10205 				DMLOG_PRINT(DMLVL_ERR,
   10206 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   10207 					    szFuncName, rc, errno);
   10208 				DMVAR_FAIL();
   10209 			}
   10210 
   10211 			/* Variation clean up */
   10212 			rc = remove(DUMMY_SUBDIR_FILE);
   10213 			rc |= rmdir(DUMMY_SUBDIR);
   10214 			if (rc == -1) {
   10215 				DMLOG_PRINT(DMLVL_DEBUG,
   10216 					    "Unable to clean up variation! (errno = %d)\n",
   10217 					    errno);
   10218 			}
   10219 			dm_handle_free(dhanp, dhlen);
   10220 			dm_handle_free(fhanp, fhlen);
   10221 		}
   10222 	}
   10223 
   10224 	/*
   10225 	 * TEST    : dm_get_dirattrs - DM_AT_CFLAG with non-DM attribute change
   10226 	 * EXPECTED: rc = 0
   10227 	 */
   10228 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 23)) {
   10229 		void *dhanp, *fhanp;
   10230 		size_t dhlen, fhlen;
   10231 		dm_attrloc_t loc;
   10232 		char buf1[ATTR_LISTLEN], buf2[ATTR_LISTLEN];
   10233 		size_t rlen;
   10234 		dm_attrname_t attrname;
   10235 
   10236 		/* Variation set up */
   10237 		memset(buf1, 0, ATTR_LISTLEN);
   10238 		memset(buf2, 0, ATTR_LISTLEN);
   10239 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   10240 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   10241 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   10242 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   10243 			/* No clean up */
   10244 		} else
   10245 		    if ((rc =
   10246 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   10247 					   &dhlen)) == -1) {
   10248 			rmdir(DUMMY_SUBDIR);
   10249 		} else if ((rc = system(command)) == -1) {
   10250 			dm_handle_free(dhanp, dhlen);
   10251 			rmdir(DUMMY_SUBDIR);
   10252 		} else
   10253 		    if ((rc =
   10254 			 dm_path_to_handle(DUMMY_SUBDIR_FILE, &fhanp,
   10255 					   &fhlen)) == -1) {
   10256 			remove(DUMMY_SUBDIR_FILE);
   10257 			dm_handle_free(dhanp, dhlen);
   10258 			rmdir(DUMMY_SUBDIR);
   10259 		} else
   10260 		    if (((rc =
   10261 			  dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   10262 					  &loc)) == -1)
   10263 			||
   10264 			((rc =
   10265 			  dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   10266 					  DM_AT_CFLAG, &loc, sizeof(buf1), buf1,
   10267 					  &rlen)) == -1)
   10268 			||
   10269 			((rc =
   10270 			  dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   10271 					  &loc)) == -1)
   10272 			||
   10273 			((rc =
   10274 			  setxattr(DUMMY_SUBDIR_FILE, NON_DM_ATTR_NAME,
   10275 				   NON_DM_ATTR_VALUE, sizeof(NON_DM_ATTR_VALUE),
   10276 				   0)) == -1)) {
   10277 			dm_handle_free(fhanp, fhlen);
   10278 			remove(DUMMY_SUBDIR_FILE);
   10279 			dm_handle_free(dhanp, dhlen);
   10280 			rmdir(DUMMY_SUBDIR);
   10281 		}
   10282 		if (rc == -1) {
   10283 			DMLOG_PRINT(DMLVL_DEBUG,
   10284 				    "Unable to set up variation! (errno = %d)\n",
   10285 				    errno);
   10286 			DMVAR_SKIP();
   10287 		} else {
   10288 			/* Variation */
   10289 			DMLOG_PRINT(DMLVL_DEBUG,
   10290 				    "%s(DM_AT_CFLAG with non-DM attr change)\n",
   10291 				    szFuncName);
   10292 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   10293 					     DM_AT_CFLAG, &loc, sizeof(buf2),
   10294 					     buf2, &rlen);
   10295 			DMLOG_PRINT(DMLVL_DEBUG,
   10296 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   10297 				    rlen);
   10298 			if (rc == 0) {
   10299 				dm_stat_t *entry1 =
   10300 				    GetDirEntry(buf1, DUMMY_FILE);
   10301 				dm_stat_t *entry2 =
   10302 				    GetDirEntry(buf2, DUMMY_FILE);
   10303 				LogDirAttrs(buf2, DM_AT_CFLAG);
   10304 				if ((entry1 != NULL) && (entry2 != NULL)) {
   10305 					if (entry1->dt_change !=
   10306 					    entry2->dt_change) {
   10307 						DMLOG_PRINT(DMLVL_DEBUG,
   10308 							    "%s passed with expected rc = %d\n",
   10309 							    szFuncName, 0);
   10310 						DMVAR_PASS();
   10311 					} else {
   10312 						DMLOG_PRINT(DMLVL_ERR,
   10313 							    "%s failed with expected rc = %d but change same (%d vs %d)\n",
   10314 							    szFuncName, 0,
   10315 							    entry1->dt_change,
   10316 							    entry2->dt_change);
   10317 						DMVAR_FAIL();
   10318 					}
   10319 				} else {
   10320 					DMLOG_PRINT(DMLVL_ERR,
   10321 						    "%s failed with expected rc = %d but unable to find entry %s",
   10322 						    szFuncName, 0, DUMMY_FILE);
   10323 					DMVAR_FAIL();
   10324 				}
   10325 			} else {
   10326 				DMLOG_PRINT(DMLVL_ERR,
   10327 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   10328 					    szFuncName, rc, errno);
   10329 				DMVAR_FAIL();
   10330 			}
   10331 
   10332 			/* Variation clean up */
   10333 			rc = remove(DUMMY_SUBDIR_FILE);
   10334 			rc |= rmdir(DUMMY_SUBDIR);
   10335 			if (rc == -1) {
   10336 				DMLOG_PRINT(DMLVL_DEBUG,
   10337 					    "Unable to clean up variation! (errno = %d)\n",
   10338 					    errno);
   10339 			}
   10340 			dm_handle_free(dhanp, dhlen);
   10341 			dm_handle_free(fhanp, fhlen);
   10342 		}
   10343 	}
   10344 
   10345 	/*
   10346 	 * TEST    : dm_get_dirattrs - DM_AT_STAT
   10347 	 * EXPECTED: rc = 0
   10348 	 */
   10349 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 24)) {
   10350 		void *dhanp;
   10351 		size_t dhlen;
   10352 		dm_attrloc_t loc;
   10353 		char buf[ATTR_LISTLEN];
   10354 		size_t rlen;
   10355 		struct stat statfs;
   10356 		int varStatus;
   10357 
   10358 		/* Variation set up */
   10359 		memset(buf, 0, ATTR_LISTLEN);
   10360 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   10361 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   10362 			/* No clean up */
   10363 		} else
   10364 		    if ((rc =
   10365 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   10366 					   &dhlen)) == -1) {
   10367 			rmdir(DUMMY_SUBDIR);
   10368 		} else if ((rc = system(command)) == -1) {
   10369 			dm_handle_free(dhanp, dhlen);
   10370 			rmdir(DUMMY_SUBDIR);
   10371 		} else
   10372 		    if (((rc =
   10373 			  dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   10374 					  &loc)) == -1)
   10375 			|| ((rc = stat(DUMMY_SUBDIR_FILE, &statfs)) == -1)) {
   10376 			remove(DUMMY_SUBDIR_FILE);
   10377 			dm_handle_free(dhanp, dhlen);
   10378 			rmdir(DUMMY_SUBDIR);
   10379 		}
   10380 		if (rc == -1) {
   10381 			DMLOG_PRINT(DMLVL_DEBUG,
   10382 				    "Unable to set up variation! (errno = %d)\n",
   10383 				    errno);
   10384 			DMVAR_SKIP();
   10385 		} else {
   10386 			/* Variation */
   10387 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_AT_STAT)\n",
   10388 				    szFuncName);
   10389 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   10390 					     DM_AT_STAT, &loc, sizeof(buf), buf,
   10391 					     &rlen);
   10392 			DMLOG_PRINT(DMLVL_DEBUG,
   10393 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   10394 				    rlen);
   10395 			if (rc == 0) {
   10396 				dm_stat_t *entry = GetDirEntry(buf, DUMMY_FILE);
   10397 				LogDirAttrs(buf, DM_AT_STAT);
   10398 				if (entry != NULL) {
   10399 					varStatus = DMSTAT_PASS;
   10400 					DMLOG_PRINT(DMLVL_DEBUG,
   10401 						    "%s returned expected rc = %d\n",
   10402 						    szFuncName, rc);
   10403 					if (statfs.st_dev != entry->dt_dev) {
   10404 						DMLOG_PRINT(DMLVL_ERR,
   10405 							    "%s failed with nonmatching dev (%lld vs %lld)\n",
   10406 							    szFuncName,
   10407 							    statfs.st_dev,
   10408 							    entry->dt_dev);
   10409 						varStatus = DMSTAT_FAIL;
   10410 					}
   10411 					if (statfs.st_ino != entry->dt_ino) {
   10412 						DMLOG_PRINT(DMLVL_ERR,
   10413 							    "%s failed with nonmatching ino (%lld vs %lld)\n",
   10414 							    szFuncName,
   10415 							    statfs.st_ino,
   10416 							    entry->dt_ino);
   10417 						varStatus = DMSTAT_FAIL;
   10418 					}
   10419 					if (statfs.st_mode != entry->dt_mode) {
   10420 						DMLOG_PRINT(DMLVL_ERR,
   10421 							    "%s failed with nonmatching mode (%d vs %d)\n",
   10422 							    szFuncName,
   10423 							    statfs.st_mode,
   10424 							    entry->dt_mode);
   10425 						varStatus = DMSTAT_FAIL;
   10426 					}
   10427 					if (statfs.st_nlink != entry->dt_nlink) {
   10428 						DMLOG_PRINT(DMLVL_ERR,
   10429 							    "%s failed with nonmatching nlink (%d vs %d)\n",
   10430 							    szFuncName,
   10431 							    statfs.st_nlink,
   10432 							    entry->dt_nlink);
   10433 						varStatus = DMSTAT_FAIL;
   10434 					}
   10435 					if (statfs.st_uid != entry->dt_uid) {
   10436 						DMLOG_PRINT(DMLVL_ERR,
   10437 							    "%s failed with nonmatching uid (%d vs %d)\n",
   10438 							    szFuncName,
   10439 							    statfs.st_uid,
   10440 							    entry->dt_uid);
   10441 						varStatus = DMSTAT_FAIL;
   10442 					}
   10443 					if (statfs.st_gid != entry->dt_gid) {
   10444 						DMLOG_PRINT(DMLVL_ERR,
   10445 							    "%s failed with nonmatching gid (%d vs %d)\n",
   10446 							    szFuncName,
   10447 							    statfs.st_gid,
   10448 							    entry->dt_gid);
   10449 						varStatus = DMSTAT_FAIL;
   10450 					}
   10451 					if (statfs.st_rdev != entry->dt_rdev) {
   10452 						DMLOG_PRINT(DMLVL_ERR,
   10453 							    "%s failed with nonmatching rdev (%lld vs %lld)\n",
   10454 							    szFuncName,
   10455 							    statfs.st_rdev,
   10456 							    entry->dt_rdev);
   10457 						varStatus = DMSTAT_FAIL;
   10458 					}
   10459 					if (statfs.st_size != entry->dt_size) {
   10460 						DMLOG_PRINT(DMLVL_ERR,
   10461 							    "%s failed with nonmatching size (%lld vs %lld)\n",
   10462 							    szFuncName,
   10463 							    statfs.st_size,
   10464 							    entry->dt_size);
   10465 						varStatus = DMSTAT_FAIL;
   10466 					}
   10467 					if (statfs.st_atime != entry->dt_atime) {
   10468 						DMLOG_PRINT(DMLVL_ERR,
   10469 							    "%s failed with nonmatching atime (%d vs %d)\n",
   10470 							    szFuncName,
   10471 							    statfs.st_atime,
   10472 							    entry->dt_atime);
   10473 						varStatus = DMSTAT_FAIL;
   10474 					}
   10475 					if (statfs.st_mtime != entry->dt_mtime) {
   10476 						DMLOG_PRINT(DMLVL_ERR,
   10477 							    "%s failed with nonmatching mtime (%d vs %d)\n",
   10478 							    szFuncName,
   10479 							    statfs.st_mtime,
   10480 							    entry->dt_mtime);
   10481 						varStatus = DMSTAT_FAIL;
   10482 					}
   10483 					if (statfs.st_ctime != entry->dt_ctime) {
   10484 						DMLOG_PRINT(DMLVL_ERR,
   10485 							    "%s failed with nonmatching ctime (%d vs %d)\n",
   10486 							    szFuncName,
   10487 							    statfs.st_ctime,
   10488 							    entry->dt_ctime);
   10489 						varStatus = DMSTAT_FAIL;
   10490 					}
   10491 					if (statfs.st_blksize !=
   10492 					    entry->dt_blksize) {
   10493 						DMLOG_PRINT(DMLVL_ERR,
   10494 							    "%s failed with nonmatching blksize (%d vs %d)\n",
   10495 							    szFuncName,
   10496 							    statfs.st_blksize,
   10497 							    entry->dt_blksize);
   10498 						varStatus = DMSTAT_FAIL;
   10499 					}
   10500 					if (statfs.st_blocks !=
   10501 					    entry->dt_blocks) {
   10502 						DMLOG_PRINT(DMLVL_ERR,
   10503 							    "%s failed with nonmatching blocks (%lld vs %lld)\n",
   10504 							    szFuncName,
   10505 							    statfs.st_blocks,
   10506 							    entry->dt_blocks);
   10507 						varStatus = DMSTAT_FAIL;
   10508 					}
   10509 				} else {
   10510 					DMLOG_PRINT(DMLVL_ERR,
   10511 						    "%s failed with expected rc = %d but unable to find entry %s",
   10512 						    szFuncName, 0, DUMMY_FILE);
   10513 					varStatus = DMSTAT_FAIL;
   10514 				}
   10515 			} else {
   10516 				DMLOG_PRINT(DMLVL_ERR,
   10517 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   10518 					    szFuncName, rc, errno);
   10519 				varStatus = DMSTAT_FAIL;
   10520 			}
   10521 			DMVAR_END(varStatus);
   10522 
   10523 			/* Variation clean up */
   10524 			rc = remove(DUMMY_SUBDIR_FILE);
   10525 			rc |= rmdir(DUMMY_SUBDIR);
   10526 			if (rc == -1) {
   10527 				DMLOG_PRINT(DMLVL_DEBUG,
   10528 					    "Unable to clean up variation! (errno = %d)\n",
   10529 					    errno);
   10530 			}
   10531 			dm_handle_free(dhanp, dhlen);
   10532 		}
   10533 	}
   10534 
   10535 	/*
   10536 	 * TEST    : dm_get_dirattrs - DM_AT_STAT returned over two calls
   10537 	 * EXPECTED: rc = 1, 0
   10538 	 */
   10539 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 25)) {
   10540 		void *dhanp;
   10541 		size_t dhlen;
   10542 		dm_attrloc_t loc;
   10543 		char buf1[2 * ATTR_SMALLLEN];
   10544 		char buf2[ATTR_SMALLLEN + 1];
   10545 		size_t rlen1, rlen2;
   10546 		dm_stat_t *entry;
   10547 		int rc1, rc2;
   10548 		int varStatus;
   10549 		int num;
   10550 
   10551 		/* Variation set up */
   10552 		memset(buf1, 0, sizeof(buf1));
   10553 		memset(buf2, 0, sizeof(buf2));
   10554 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   10555 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   10556 			/* No clean up */
   10557 		} else
   10558 		    if ((rc =
   10559 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   10560 					   &dhlen)) == -1) {
   10561 			rmdir(DUMMY_SUBDIR);
   10562 		} else if ((rc = system(command)) == -1) {
   10563 			dm_handle_free(dhanp, dhlen);
   10564 			rmdir(DUMMY_SUBDIR);
   10565 		} else
   10566 		    if ((rc =
   10567 			 dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   10568 					 &loc)) == -1) {
   10569 			remove(DUMMY_SUBDIR_FILE);
   10570 			dm_handle_free(dhanp, dhlen);
   10571 			rmdir(DUMMY_SUBDIR);
   10572 		}
   10573 		if (rc == -1) {
   10574 			DMLOG_PRINT(DMLVL_DEBUG,
   10575 				    "Unable to set up variation! (errno = %d)\n",
   10576 				    errno);
   10577 			DMVAR_SKIP();
   10578 		} else {
   10579 			/* Variation */
   10580 			DMLOG_PRINT(DMLVL_DEBUG,
   10581 				    "%s(DM_AT_STAT over two calls)\n",
   10582 				    szFuncName);
   10583 			rc1 =
   10584 			    dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   10585 					    DM_AT_STAT, &loc, sizeof(buf1),
   10586 					    buf1, &rlen1);
   10587 			DMLOG_PRINT(DMLVL_DEBUG,
   10588 				    "1st call: rc %d, rlen %d, loc %llx\n", rc1,
   10589 				    rlen1, loc);
   10590 			rc2 =
   10591 			    dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   10592 					    DM_AT_STAT, &loc, sizeof(buf2),
   10593 					    buf2, &rlen2);
   10594 			DMLOG_PRINT(DMLVL_DEBUG,
   10595 				    "2nd call: rc %d, rlen %d, loc %llx\n", rc2,
   10596 				    rlen2, loc);
   10597 			varStatus = DMSTAT_PASS;
   10598 			if (rc1 == 1) {
   10599 				if (((num = GetNumDirEntry(buf1)) == 2)
   10600 				    && (rlen1 >= 2 * MIN_ENTRYLEN)) {
   10601 					DMLOG_PRINT(DMLVL_DEBUG,
   10602 						    "1st call attrs:\n");
   10603 					LogDirAttrs(buf1, DM_AT_STAT);
   10604 					if (((entry =
   10605 					      GetDirEntry(buf1,
   10606 							  CURRENT_DIR)) != NULL)
   10607 					    &&
   10608 					    ((entry =
   10609 					      GetDirEntry(buf1,
   10610 							  PARENT_DIR)) !=
   10611 					     NULL)) {
   10612 						DMLOG_PRINT(DMLVL_DEBUG,
   10613 							    "%s 1st call returned expected rc = %d and %d entries %s and %s in buffer\n",
   10614 							    szFuncName, rc1,
   10615 							    num, CURRENT_DIR,
   10616 							    PARENT_DIR);
   10617 					} else {
   10618 						DMLOG_PRINT(DMLVL_ERR,
   10619 							    "%s 1st call returned expected rc = %d but entries %s and/or %s not in buffer\n",
   10620 							    szFuncName, rc1,
   10621 							    CURRENT_DIR,
   10622 							    PARENT_DIR);
   10623 						varStatus = DMSTAT_FAIL;
   10624 					}
   10625 				} else {
   10626 					DMLOG_PRINT(DMLVL_ERR,
   10627 						    "%s 1st call returned expected rc = %d but unexpected rlen = %d and/or number of entries in buffer %d\n",
   10628 						    szFuncName, rc1, rlen1,
   10629 						    num);
   10630 					varStatus = DMSTAT_FAIL;
   10631 				}
   10632 			} else {
   10633 				DMLOG_PRINT(DMLVL_ERR,
   10634 					    "%s 1st call returned unexpected rc = %d\n",
   10635 					    szFuncName, rc1);
   10636 				varStatus = DMSTAT_FAIL;
   10637 			}
   10638 			if (rc2 == 0) {
   10639 				if (((num = GetNumDirEntry(buf2)) == 1)
   10640 				    && (rlen2 >= MIN_ENTRYLEN)) {
   10641 					DMLOG_PRINT(DMLVL_DEBUG,
   10642 						    "2nd call attrs:\n");
   10643 					LogDirAttrs(buf2, DM_AT_STAT);
   10644 					if ((entry =
   10645 					     GetDirEntry(buf2,
   10646 							 DUMMY_FILE)) != NULL) {
   10647 						DMLOG_PRINT(DMLVL_DEBUG,
   10648 							    "%s 2nd call returned expected rc = %d and %d entry %s in buffer\n",
   10649 							    szFuncName, rc2,
   10650 							    num, DUMMY_FILE);
   10651 					} else {
   10652 						DMLOG_PRINT(DMLVL_ERR,
   10653 							    "%s 2nd call returned expected rc = %d but entry %s not in buffer\n",
   10654 							    szFuncName, rc2,
   10655 							    DUMMY_FILE);
   10656 						varStatus = DMSTAT_FAIL;
   10657 					}
   10658 				} else {
   10659 					DMLOG_PRINT(DMLVL_ERR,
   10660 						    "%s 2nd call returned expected rc = %d but unexpected rlen = %d and/or number of entries in buffer %d\n",
   10661 						    szFuncName, rc2, rlen2,
   10662 						    num);
   10663 					varStatus = DMSTAT_FAIL;
   10664 				}
   10665 			} else {
   10666 				DMLOG_PRINT(DMLVL_ERR,
   10667 					    "%s 2nd call returned unexpected rc = %d\n",
   10668 					    szFuncName, rc2);
   10669 				varStatus = DMSTAT_FAIL;
   10670 			}
   10671 			DMVAR_END(varStatus);
   10672 
   10673 			/* Variation clean up */
   10674 			rc = remove(DUMMY_SUBDIR_FILE);
   10675 			rc |= rmdir(DUMMY_SUBDIR);
   10676 			if (rc == -1) {
   10677 				DMLOG_PRINT(DMLVL_DEBUG,
   10678 					    "Unable to clean up variation! (errno = %d)\n",
   10679 					    errno);
   10680 			}
   10681 			dm_handle_free(dhanp, dhlen);
   10682 		}
   10683 	}
   10684 
   10685 	/*
   10686 	 * TEST    : dm_get_dirattrs - DM_AT_STAT returned over three calls,
   10687 	 *              third buffer too small
   10688 	 * EXPECTED: rc = 1, 1, 1
   10689 	 */
   10690 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 26)) {
   10691 		void *dhanp;
   10692 		size_t dhlen;
   10693 		dm_attrloc_t loc;
   10694 		char buf1[ATTR_SMALLLEN];
   10695 		char buf2[ATTR_SMALLLEN];
   10696 		char buf3[ATTR_SMALLLEN / 2];
   10697 		size_t rlen1, rlen2, rlen3;
   10698 		dm_stat_t *entry;
   10699 		int rc1, rc2, rc3;
   10700 		int varStatus;
   10701 		int num;
   10702 
   10703 		/* Variation set up */
   10704 		memset(buf1, 0, sizeof(buf1));
   10705 		memset(buf2, 0, sizeof(buf2));
   10706 		memset(buf3, 0, sizeof(buf3));
   10707 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   10708 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   10709 			/* No clean up */
   10710 		} else
   10711 		    if ((rc =
   10712 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   10713 					   &dhlen)) == -1) {
   10714 			rmdir(DUMMY_SUBDIR);
   10715 		} else if ((rc = system(command)) == -1) {
   10716 			dm_handle_free(dhanp, dhlen);
   10717 			rmdir(DUMMY_SUBDIR);
   10718 		} else
   10719 		    if ((rc =
   10720 			 dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   10721 					 &loc)) == -1) {
   10722 			remove(DUMMY_SUBDIR_FILE);
   10723 			dm_handle_free(dhanp, dhlen);
   10724 			rmdir(DUMMY_SUBDIR);
   10725 		}
   10726 		if (rc == -1) {
   10727 			DMLOG_PRINT(DMLVL_DEBUG,
   10728 				    "Unable to set up variation! (errno = %d)\n",
   10729 				    errno);
   10730 			DMVAR_SKIP();
   10731 		} else {
   10732 			/* Variation */
   10733 			DMLOG_PRINT(DMLVL_DEBUG,
   10734 				    "%s(DM_AT_STAT over three calls, third buf too small)\n",
   10735 				    szFuncName);
   10736 			rc1 =
   10737 			    dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   10738 					    DM_AT_STAT, &loc, sizeof(buf1),
   10739 					    buf1, &rlen1);
   10740 			DMLOG_PRINT(DMLVL_DEBUG,
   10741 				    "1st call: rc %d, rlen %d, loc %llx\n", rc1,
   10742 				    rlen1, loc);
   10743 			rc2 =
   10744 			    dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   10745 					    DM_AT_STAT, &loc, sizeof(buf2),
   10746 					    buf2, &rlen2);
   10747 			DMLOG_PRINT(DMLVL_DEBUG,
   10748 				    "2nd call: rc %d, rlen %d, loc %llx\n", rc2,
   10749 				    rlen2, loc);
   10750 			rc3 =
   10751 			    dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   10752 					    DM_AT_STAT, &loc, sizeof(buf3),
   10753 					    buf3, &rlen3);
   10754 			DMLOG_PRINT(DMLVL_DEBUG,
   10755 				    "3rd call: rc %d, rlen %d, loc %llx\n", rc3,
   10756 				    rlen3, loc);
   10757 			varStatus = DMSTAT_PASS;
   10758 			if (rc1 == 1) {
   10759 				if (((num = GetNumDirEntry(buf1)) == 1)
   10760 				    && (rlen1 >= MIN_ENTRYLEN)) {
   10761 					DMLOG_PRINT(DMLVL_DEBUG,
   10762 						    "1st call attrs:\n");
   10763 					LogDirAttrs(buf1, DM_AT_STAT);
   10764 					if ((entry =
   10765 					     GetDirEntry(buf1,
   10766 							 CURRENT_DIR)) !=
   10767 					    NULL) {
   10768 						DMLOG_PRINT(DMLVL_DEBUG,
   10769 							    "%s 1st call returned expected rc = %d and %d entry %s in buffer\n",
   10770 							    szFuncName, rc1,
   10771 							    num, CURRENT_DIR);
   10772 					} else {
   10773 						DMLOG_PRINT(DMLVL_ERR,
   10774 							    "%s 1st call returned expected rc = %d but entry %s not in buffer\n",
   10775 							    szFuncName, rc1,
   10776 							    CURRENT_DIR);
   10777 						varStatus = DMSTAT_FAIL;
   10778 					}
   10779 				} else {
   10780 					DMLOG_PRINT(DMLVL_ERR,
   10781 						    "%s 1st call returned expected rc = %d but unexpected rlen = %d and/or number of entries in buffer %d\n",
   10782 						    szFuncName, rc1, rlen1,
   10783 						    num);
   10784 					varStatus = DMSTAT_FAIL;
   10785 				}
   10786 			} else {
   10787 				DMLOG_PRINT(DMLVL_ERR,
   10788 					    "%s 1st call returned unexpected rc = %d\n",
   10789 					    szFuncName, rc1);
   10790 				varStatus = DMSTAT_FAIL;
   10791 			}
   10792 			if (rc2 == 1) {
   10793 				if (((num = GetNumDirEntry(buf2)) == 1)
   10794 				    && (rlen2 >= MIN_ENTRYLEN)) {
   10795 					DMLOG_PRINT(DMLVL_DEBUG,
   10796 						    "2nd call attrs:\n");
   10797 					LogDirAttrs(buf2, DM_AT_STAT);
   10798 					if ((entry =
   10799 					     GetDirEntry(buf2,
   10800 							 PARENT_DIR)) != NULL) {
   10801 						DMLOG_PRINT(DMLVL_DEBUG,
   10802 							    "%s 2nd call returned expected rc = %d and %d entry %s in buffer\n",
   10803 							    szFuncName, rc2,
   10804 							    num, PARENT_DIR);
   10805 					} else {
   10806 						DMLOG_PRINT(DMLVL_ERR,
   10807 							    "%s 2nd call returned expected rc = %d but entry %s not in buffer\n",
   10808 							    szFuncName, rc2,
   10809 							    PARENT_DIR);
   10810 						varStatus = DMSTAT_FAIL;
   10811 					}
   10812 				} else {
   10813 					DMLOG_PRINT(DMLVL_ERR,
   10814 						    "%s 2nd call returned expected rc = %d but unexpected rlen = %d and/or number of entries in buffer %d\n",
   10815 						    szFuncName, rc2, rlen2,
   10816 						    num);
   10817 					varStatus = DMSTAT_FAIL;
   10818 				}
   10819 			} else {
   10820 				DMLOG_PRINT(DMLVL_ERR,
   10821 					    "%s 2nd call returned unexpected rc = %d\n",
   10822 					    szFuncName, rc2);
   10823 				varStatus = DMSTAT_FAIL;
   10824 			}
   10825 			if (rc3 == 1) {
   10826 				if (rlen3 == 0) {
   10827 					DMLOG_PRINT(DMLVL_DEBUG,
   10828 						    "%s 3rd call returned expected rc = %d and empty buffer\n",
   10829 						    szFuncName, rc3);
   10830 				} else {
   10831 					DMLOG_PRINT(DMLVL_ERR,
   10832 						    "%s 3rd call returned expected rc = %d but unexpected rlen = %d\n",
   10833 						    szFuncName, rc3, rlen3);
   10834 					varStatus = DMSTAT_FAIL;
   10835 				}
   10836 			} else {
   10837 				DMLOG_PRINT(DMLVL_ERR,
   10838 					    "%s 3rd call returned unexpected rc = %d\n",
   10839 					    szFuncName, rc3);
   10840 				varStatus = DMSTAT_FAIL;
   10841 			}
   10842 			DMVAR_END(varStatus);
   10843 
   10844 			/* Variation clean up */
   10845 			rc = remove(DUMMY_SUBDIR_FILE);
   10846 			rc |= rmdir(DUMMY_SUBDIR);
   10847 			if (rc == -1) {
   10848 				DMLOG_PRINT(DMLVL_DEBUG,
   10849 					    "Unable to clean up variation! (errno = %d)\n",
   10850 					    errno);
   10851 			}
   10852 			dm_handle_free(dhanp, dhlen);
   10853 		}
   10854 	}
   10855 
   10856 	/*
   10857 	 * TEST    : dm_get_dirattrs - DM_AT_STAT returned over three calls
   10858 	 * EXPECTED: rc = 1, 1, 0
   10859 	 */
   10860 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 27)) {
   10861 		void *dhanp;
   10862 		size_t dhlen;
   10863 		dm_attrloc_t loc;
   10864 		char buf1[ATTR_SMALLLEN];
   10865 		char buf2[ATTR_SMALLLEN];
   10866 		char buf3[ATTR_SMALLLEN];
   10867 		size_t rlen1, rlen2, rlen3;
   10868 		dm_stat_t *entry;
   10869 		int rc1, rc2, rc3;
   10870 		int varStatus;
   10871 		int num;
   10872 
   10873 		/* Variation set up */
   10874 		memset(buf1, 0, sizeof(buf1));
   10875 		memset(buf2, 0, sizeof(buf2));
   10876 		memset(buf3, 0, sizeof(buf3));
   10877 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   10878 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   10879 			/* No clean up */
   10880 		} else
   10881 		    if ((rc =
   10882 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   10883 					   &dhlen)) == -1) {
   10884 			rmdir(DUMMY_SUBDIR);
   10885 		} else if ((rc = system(command)) == -1) {
   10886 			dm_handle_free(dhanp, dhlen);
   10887 			rmdir(DUMMY_SUBDIR);
   10888 		} else
   10889 		    if ((rc =
   10890 			 dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   10891 					 &loc)) == -1) {
   10892 			remove(DUMMY_SUBDIR_FILE);
   10893 			dm_handle_free(dhanp, dhlen);
   10894 			rmdir(DUMMY_SUBDIR);
   10895 		}
   10896 		if (rc == -1) {
   10897 			DMLOG_PRINT(DMLVL_DEBUG,
   10898 				    "Unable to set up variation! (errno = %d)\n",
   10899 				    errno);
   10900 			DMVAR_SKIP();
   10901 		} else {
   10902 			/* Variation */
   10903 			DMLOG_PRINT(DMLVL_DEBUG,
   10904 				    "%s(DM_AT_STAT over three calls)\n",
   10905 				    szFuncName);
   10906 			rc1 =
   10907 			    dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   10908 					    DM_AT_STAT, &loc, sizeof(buf1),
   10909 					    buf1, &rlen1);
   10910 			DMLOG_PRINT(DMLVL_DEBUG,
   10911 				    "1st call: rc %d, rlen %d, loc %llx\n", rc1,
   10912 				    rlen1, loc);
   10913 			rc2 =
   10914 			    dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   10915 					    DM_AT_STAT, &loc, sizeof(buf2),
   10916 					    buf2, &rlen2);
   10917 			DMLOG_PRINT(DMLVL_DEBUG,
   10918 				    "2nd call: rc %d, rlen %d, loc %llx\n", rc2,
   10919 				    rlen2, loc);
   10920 			rc3 =
   10921 			    dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   10922 					    DM_AT_STAT, &loc, sizeof(buf3),
   10923 					    buf3, &rlen3);
   10924 			DMLOG_PRINT(DMLVL_DEBUG,
   10925 				    "3rd call: rc %d, rlen %d, loc %llx\n", rc3,
   10926 				    rlen3, loc);
   10927 			varStatus = DMSTAT_PASS;
   10928 			if (rc1 == 1) {
   10929 				if (((num = GetNumDirEntry(buf1)) == 1)
   10930 				    && (rlen1 >= MIN_ENTRYLEN)) {
   10931 					DMLOG_PRINT(DMLVL_DEBUG,
   10932 						    "1st call attrs:\n");
   10933 					LogDirAttrs(buf1, DM_AT_STAT);
   10934 					if ((entry =
   10935 					     GetDirEntry(buf1,
   10936 							 CURRENT_DIR)) !=
   10937 					    NULL) {
   10938 						DMLOG_PRINT(DMLVL_DEBUG,
   10939 							    "%s 1st call returned expected rc = %d and %d entry %s in buffer\n",
   10940 							    szFuncName, rc1,
   10941 							    num, CURRENT_DIR);
   10942 					} else {
   10943 						DMLOG_PRINT(DMLVL_ERR,
   10944 							    "%s 1st call returned expected rc = %d but entry %s not in buffer\n",
   10945 							    szFuncName, rc1,
   10946 							    CURRENT_DIR);
   10947 						varStatus = DMSTAT_FAIL;
   10948 					}
   10949 				} else {
   10950 					DMLOG_PRINT(DMLVL_ERR,
   10951 						    "%s 1st call returned expected rc = %d but unexpected rlen = %d\n and/or number of entries in buffer %d",
   10952 						    szFuncName, rc1, rlen1,
   10953 						    num);
   10954 					varStatus = DMSTAT_FAIL;
   10955 				}
   10956 			} else {
   10957 				DMLOG_PRINT(DMLVL_ERR,
   10958 					    "%s 1st call returned unexpected rc = %d\n",
   10959 					    szFuncName, rc1);
   10960 				varStatus = DMSTAT_FAIL;
   10961 			}
   10962 			if (rc2 == 1) {
   10963 				if (((num = GetNumDirEntry(buf2)) == 1)
   10964 				    && (rlen2 >= MIN_ENTRYLEN)) {
   10965 					DMLOG_PRINT(DMLVL_DEBUG,
   10966 						    "2nd call attrs:\n");
   10967 					LogDirAttrs(buf2, DM_AT_STAT);
   10968 					if ((entry =
   10969 					     GetDirEntry(buf2,
   10970 							 PARENT_DIR)) != NULL) {
   10971 						DMLOG_PRINT(DMLVL_DEBUG,
   10972 							    "%s 2nd call returned expected rc = %d and %d entry %s in buffer\n",
   10973 							    szFuncName, rc2,
   10974 							    num, PARENT_DIR);
   10975 					} else {
   10976 						DMLOG_PRINT(DMLVL_ERR,
   10977 							    "%s 2nd call returned expected rc = %d but entry %s not in buffer\n",
   10978 							    szFuncName, rc2,
   10979 							    PARENT_DIR);
   10980 						varStatus = DMSTAT_FAIL;
   10981 					}
   10982 				} else {
   10983 					DMLOG_PRINT(DMLVL_ERR,
   10984 						    "%s 2nd call returned expected rc = %d but unexpected rlen = %d and/or number of entries in buffer %d\n",
   10985 						    szFuncName, rc2, rlen2,
   10986 						    num);
   10987 					varStatus = DMSTAT_FAIL;
   10988 				}
   10989 			} else {
   10990 				DMLOG_PRINT(DMLVL_ERR,
   10991 					    "%s 2nd call returned unexpected rc = %d\n",
   10992 					    szFuncName, rc2);
   10993 				varStatus = DMSTAT_FAIL;
   10994 			}
   10995 			if (rc3 == 0) {
   10996 				if (((num = GetNumDirEntry(buf3)) == 1)
   10997 				    && (rlen3 >= MIN_ENTRYLEN)) {
   10998 					DMLOG_PRINT(DMLVL_DEBUG,
   10999 						    "3rd call attrs:\n");
   11000 					LogDirAttrs(buf3, DM_AT_STAT);
   11001 					if ((entry =
   11002 					     GetDirEntry(buf3,
   11003 							 DUMMY_FILE)) != NULL) {
   11004 						DMLOG_PRINT(DMLVL_DEBUG,
   11005 							    "%s 3rd call returned expected rc = %d and %d entry %s in buffer\n",
   11006 							    szFuncName, rc3,
   11007 							    num, DUMMY_FILE);
   11008 					} else {
   11009 						DMLOG_PRINT(DMLVL_ERR,
   11010 							    "%s 3rd call returned expected rc = %d but entry %s not in buffer\n",
   11011 							    szFuncName, rc3,
   11012 							    DUMMY_FILE);
   11013 						varStatus = DMSTAT_FAIL;
   11014 					}
   11015 				} else {
   11016 					DMLOG_PRINT(DMLVL_ERR,
   11017 						    "%s 3rd call returned expected rc = %d but unexpected rlen = %d and/or number of entries in buffer %d\n",
   11018 						    szFuncName, rc3, rlen3,
   11019 						    num);
   11020 					varStatus = DMSTAT_FAIL;
   11021 				}
   11022 			} else {
   11023 				DMLOG_PRINT(DMLVL_ERR,
   11024 					    "%s 3rd call returned unexpected rc = %d\n",
   11025 					    szFuncName, rc3);
   11026 				varStatus = DMSTAT_FAIL;
   11027 			}
   11028 			DMVAR_END(varStatus);
   11029 
   11030 			/* Variation clean up */
   11031 			rc = remove(DUMMY_SUBDIR_FILE);
   11032 			rc |= rmdir(DUMMY_SUBDIR);
   11033 			if (rc == -1) {
   11034 				DMLOG_PRINT(DMLVL_DEBUG,
   11035 					    "Unable to clean up variation! (errno = %d)\n",
   11036 					    errno);
   11037 			}
   11038 			dm_handle_free(dhanp, dhlen);
   11039 		}
   11040 	}
   11041 
   11042 	/*
   11043 	 * TEST    : dm_get_dirattrs - DM_AT_STAT with one buffer (files
   11044 	 *              returned from jfs_readdir > files fit in buffer)
   11045 	 * EXPECTED: rc = 1
   11046 	 */
   11047 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 28)) {
   11048 		void *dhanp;
   11049 		size_t dhlen;
   11050 		dm_attrloc_t loc;
   11051 		char buf[ATTR_SMALLLEN * (DIRENTS_FILES - 1)];
   11052 		size_t rlen;
   11053 		dm_stat_t *entry;
   11054 		int varStatus;
   11055 		int i;
   11056 		char *filename;
   11057 		int num;
   11058 
   11059 		/* Variation set up */
   11060 		memset(buf, 0, sizeof(buf));
   11061 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   11062 			/* No clean up */
   11063 		} else
   11064 		    if ((rc =
   11065 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   11066 					   &dhlen)) == -1) {
   11067 			rmdir(DUMMY_SUBDIR);
   11068 		} else {
   11069 			for (i = 0; i < NUM_FILES && rc == 0; i++) {
   11070 				sprintf(command, "cp %s %s.%3.3d", DUMMY_TMP,
   11071 					DUMMY_SUBDIR_FILE, i);
   11072 				rc = system(command);
   11073 			}
   11074 			if ((rc == -1) ||
   11075 			    ((rc =
   11076 			      dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   11077 					      &loc)) == -1)) {
   11078 				sprintf(command, "rm -rf %s", DUMMY_SUBDIR);
   11079 				rc = system(command);
   11080 			}
   11081 		}
   11082 		if (rc == -1) {
   11083 			DMLOG_PRINT(DMLVL_DEBUG,
   11084 				    "Unable to set up variation! (errno = %d)\n",
   11085 				    errno);
   11086 			DMVAR_SKIP();
   11087 		} else {
   11088 			/* Variation */
   11089 			DMLOG_PRINT(DMLVL_DEBUG,
   11090 				    "%s(DM_AT_STAT with %d files)\n",
   11091 				    szFuncName, DIRENTS_FILES - 1);
   11092 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   11093 					     DM_AT_STAT, &loc, sizeof(buf), buf,
   11094 					     &rlen);
   11095 			DMLOG_PRINT(DMLVL_DEBUG,
   11096 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   11097 				    rlen);
   11098 			varStatus = DMSTAT_PASS;
   11099 			if (rc == 1) {
   11100 				if (((num =
   11101 				      GetNumDirEntry(buf)) == DIRENTS_FILES - 1)
   11102 				    && (rlen >=
   11103 					(DIRENTS_FILES - 1) * MIN_ENTRYLEN)) {
   11104 					filename = strchr(command, '/') + 1;
   11105 					DMLOG_PRINT(DMLVL_DEBUG, "attrs:\n");
   11106 					LogDirAttrs(buf, DM_AT_STAT);
   11107 					if ((entry =
   11108 					     GetDirEntry(buf,
   11109 							 filename)) == NULL) {
   11110 						if (((entry =
   11111 						      GetLastDirEntry(buf)) !=
   11112 						     NULL)
   11113 						    && (entry->dt_compname.
   11114 							vd_length > 0)) {
   11115 							DMLOG_PRINT(DMLVL_DEBUG,
   11116 								    "%s returned expected rc = %d, expected number of entries in buffer %d, and neither entry %s nor empty entry in buffer\n",
   11117 								    szFuncName,
   11118 								    rc, num,
   11119 								    filename);
   11120 						} else {
   11121 							DMLOG_PRINT(DMLVL_ERR,
   11122 								    "%s returned expected rc = %d but empty entry in buffer\n",
   11123 								    szFuncName,
   11124 								    rc,
   11125 								    filename);
   11126 							varStatus = DMSTAT_FAIL;
   11127 						}
   11128 					} else {
   11129 						DMLOG_PRINT(DMLVL_ERR,
   11130 							    "%s returned expected rc = %d but entry %s in buffer\n",
   11131 							    szFuncName, rc,
   11132 							    filename);
   11133 						varStatus = DMSTAT_FAIL;
   11134 					}
   11135 				} else {
   11136 					DMLOG_PRINT(DMLVL_ERR,
   11137 						    "%s returned expected rc = %d but unexpected rlen = %d and/or number of entries in buffer %d\n",
   11138 						    szFuncName, rc, rlen, num);
   11139 					varStatus = DMSTAT_FAIL;
   11140 				}
   11141 			} else {
   11142 				DMLOG_PRINT(DMLVL_ERR,
   11143 					    "%s returned unexpected rc = %d\n",
   11144 					    szFuncName, rc);
   11145 				varStatus = DMSTAT_FAIL;
   11146 			}
   11147 			DMVAR_END(varStatus);
   11148 
   11149 			/* Variation clean up */
   11150 			sprintf(command, "rm -rf %s", DUMMY_SUBDIR);
   11151 			rc = system(command);
   11152 			if (rc == -1) {
   11153 				DMLOG_PRINT(DMLVL_DEBUG,
   11154 					    "Unable to clean up variation! (errno = %d)\n",
   11155 					    errno);
   11156 			}
   11157 			dm_handle_free(dhanp, dhlen);
   11158 		}
   11159 	}
   11160 
   11161 	/*
   11162 	 * TEST    : dm_get_dirattrs - DM_AT_STAT with one buffer (files
   11163 	 *              returned from jfs_readdir > files fit in buffer)
   11164 	 * EXPECTED: rc = 1
   11165 	 */
   11166 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 29)) {
   11167 		void *dhanp;
   11168 		size_t dhlen;
   11169 		dm_attrloc_t loc;
   11170 		char buf[ATTR_SMALLLEN * DIRENTS_FILES];
   11171 		size_t rlen;
   11172 		dm_stat_t *entry;
   11173 		int varStatus;
   11174 		int i;
   11175 		char *filename;
   11176 		int num;
   11177 
   11178 		/* Variation set up */
   11179 		memset(buf, 0, sizeof(buf));
   11180 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   11181 			/* No clean up */
   11182 		} else
   11183 		    if ((rc =
   11184 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   11185 					   &dhlen)) == -1) {
   11186 			rmdir(DUMMY_SUBDIR);
   11187 		} else {
   11188 			for (i = 0; i < NUM_FILES && rc == 0; i++) {
   11189 				sprintf(command, "cp %s %s.%3.3d", DUMMY_TMP,
   11190 					DUMMY_SUBDIR_FILE, i);
   11191 				rc = system(command);
   11192 			}
   11193 			if ((rc == -1) ||
   11194 			    ((rc =
   11195 			      dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   11196 					      &loc)) == -1)) {
   11197 				sprintf(command, "rm -rf %s", DUMMY_SUBDIR);
   11198 				rc = system(command);
   11199 			}
   11200 		}
   11201 		if (rc == -1) {
   11202 			DMLOG_PRINT(DMLVL_DEBUG,
   11203 				    "Unable to set up variation! (errno = %d)\n",
   11204 				    errno);
   11205 			DMVAR_SKIP();
   11206 		} else {
   11207 			/* Variation */
   11208 			DMLOG_PRINT(DMLVL_DEBUG,
   11209 				    "%s(DM_AT_STAT with %d files)\n",
   11210 				    szFuncName, DIRENTS_FILES);
   11211 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   11212 					     DM_AT_STAT, &loc, sizeof(buf), buf,
   11213 					     &rlen);
   11214 			DMLOG_PRINT(DMLVL_DEBUG,
   11215 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   11216 				    rlen);
   11217 			varStatus = DMSTAT_PASS;
   11218 			if (rc == 1) {
   11219 				if (((num =
   11220 				      GetNumDirEntry(buf)) == DIRENTS_FILES)
   11221 				    && (rlen >= DIRENTS_FILES * MIN_ENTRYLEN)) {
   11222 					filename = strchr(command, '/') + 1;
   11223 					DMLOG_PRINT(DMLVL_DEBUG, "attrs:\n");
   11224 					LogDirAttrs(buf, DM_AT_STAT);
   11225 					if ((entry =
   11226 					     GetDirEntry(buf,
   11227 							 filename)) == NULL) {
   11228 						if (((entry =
   11229 						      GetLastDirEntry(buf)) !=
   11230 						     NULL)
   11231 						    && (entry->dt_compname.
   11232 							vd_length > 0)) {
   11233 							DMLOG_PRINT(DMLVL_DEBUG,
   11234 								    "%s returned expected rc = %d, expected number of entries in buffer %d, and neither entry %s nor empty entry in buffer\n",
   11235 								    szFuncName,
   11236 								    rc, num,
   11237 								    filename);
   11238 						} else {
   11239 							DMLOG_PRINT(DMLVL_ERR,
   11240 								    "%s returned expected rc = %d but empty entry in buffer\n",
   11241 								    szFuncName,
   11242 								    rc,
   11243 								    filename);
   11244 							varStatus = DMSTAT_FAIL;
   11245 						}
   11246 					} else {
   11247 						DMLOG_PRINT(DMLVL_ERR,
   11248 							    "%s returned expected rc = %d but entry %s in buffer\n",
   11249 							    szFuncName, rc,
   11250 							    filename);
   11251 						varStatus = DMSTAT_FAIL;
   11252 					}
   11253 				} else {
   11254 					DMLOG_PRINT(DMLVL_ERR,
   11255 						    "%s returned expected rc = %d but unexpected rlen = %d and/or number of entries in buffer %d\n",
   11256 						    szFuncName, rc, rlen, num);
   11257 					varStatus = DMSTAT_FAIL;
   11258 				}
   11259 			} else {
   11260 				DMLOG_PRINT(DMLVL_ERR,
   11261 					    "%s returned unexpected rc = %d\n",
   11262 					    szFuncName, rc);
   11263 				varStatus = DMSTAT_FAIL;
   11264 			}
   11265 			DMVAR_END(varStatus);
   11266 
   11267 			/* Variation clean up */
   11268 			sprintf(command, "rm -rf %s", DUMMY_SUBDIR);
   11269 			rc = system(command);
   11270 			if (rc == -1) {
   11271 				DMLOG_PRINT(DMLVL_DEBUG,
   11272 					    "Unable to clean up variation! (errno = %d)\n",
   11273 					    errno);
   11274 			}
   11275 			dm_handle_free(dhanp, dhlen);
   11276 		}
   11277 	}
   11278 
   11279 	/*
   11280 	 * TEST    : dm_get_dirattrs - DM_AT_STAT with one buffer (files
   11281 	 *              returned from jfs_readdir > files fit in buffer)
   11282 	 * EXPECTED: rc = 1
   11283 	 */
   11284 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 30)) {
   11285 		void *dhanp;
   11286 		size_t dhlen;
   11287 		dm_attrloc_t loc;
   11288 		char buf[ATTR_SMALLLEN * (DIRENTS_FILES + 1)];
   11289 		size_t rlen;
   11290 		dm_stat_t *entry;
   11291 		int varStatus;
   11292 		int i;
   11293 		char *filename;
   11294 		int num;
   11295 
   11296 		/* Variation set up */
   11297 		memset(buf, 0, sizeof(buf));
   11298 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   11299 			/* No clean up */
   11300 		} else
   11301 		    if ((rc =
   11302 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   11303 					   &dhlen)) == -1) {
   11304 			rmdir(DUMMY_SUBDIR);
   11305 		} else {
   11306 			for (i = 0; i < NUM_FILES && rc == 0; i++) {
   11307 				sprintf(command, "cp %s %s.%3.3d", DUMMY_TMP,
   11308 					DUMMY_SUBDIR_FILE, i);
   11309 				rc = system(command);
   11310 			}
   11311 			if ((rc == -1) ||
   11312 			    ((rc =
   11313 			      dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   11314 					      &loc)) == -1)) {
   11315 				sprintf(command, "rm -rf %s", DUMMY_SUBDIR);
   11316 				rc = system(command);
   11317 			}
   11318 		}
   11319 		if (rc == -1) {
   11320 			DMLOG_PRINT(DMLVL_DEBUG,
   11321 				    "Unable to set up variation! (errno = %d)\n",
   11322 				    errno);
   11323 			DMVAR_SKIP();
   11324 		} else {
   11325 			/* Variation */
   11326 			DMLOG_PRINT(DMLVL_DEBUG,
   11327 				    "%s(DM_AT_STAT with %d files)\n",
   11328 				    szFuncName, DIRENTS_FILES + 1);
   11329 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   11330 					     DM_AT_STAT, &loc, sizeof(buf), buf,
   11331 					     &rlen);
   11332 			DMLOG_PRINT(DMLVL_DEBUG,
   11333 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   11334 				    rlen);
   11335 			varStatus = DMSTAT_PASS;
   11336 			if (rc == 1) {
   11337 				if (((num =
   11338 				      GetNumDirEntry(buf)) == DIRENTS_FILES + 1)
   11339 				    && (rlen >=
   11340 					(DIRENTS_FILES + 1) * MIN_ENTRYLEN)) {
   11341 					filename = strchr(command, '/') + 1;
   11342 					DMLOG_PRINT(DMLVL_DEBUG, "attrs:\n");
   11343 					LogDirAttrs(buf, DM_AT_STAT);
   11344 					if ((entry =
   11345 					     GetDirEntry(buf,
   11346 							 filename)) == NULL) {
   11347 						if (((entry =
   11348 						      GetLastDirEntry(buf)) !=
   11349 						     NULL)
   11350 						    && (entry->dt_compname.
   11351 							vd_length > 0)) {
   11352 							DMLOG_PRINT(DMLVL_DEBUG,
   11353 								    "%s returned expected rc = %d, expected number of entries in buffer %d, and neither entry %s nor empty entry in buffer\n",
   11354 								    szFuncName,
   11355 								    rc, num,
   11356 								    filename);
   11357 						} else {
   11358 							DMLOG_PRINT(DMLVL_ERR,
   11359 								    "%s returned expected rc = %d but empty entry in buffer\n",
   11360 								    szFuncName,
   11361 								    rc,
   11362 								    filename);
   11363 							varStatus = DMSTAT_FAIL;
   11364 						}
   11365 					} else {
   11366 						DMLOG_PRINT(DMLVL_ERR,
   11367 							    "%s returned expected rc = %d but entry %s in buffer\n",
   11368 							    szFuncName, rc,
   11369 							    filename);
   11370 						varStatus = DMSTAT_FAIL;
   11371 					}
   11372 				} else {
   11373 					DMLOG_PRINT(DMLVL_ERR,
   11374 						    "%s returned expected rc = %d but unexpected rlen = %d and/or number of entries in buffer %d\n",
   11375 						    szFuncName, rc, rlen, num);
   11376 					varStatus = DMSTAT_FAIL;
   11377 				}
   11378 			} else {
   11379 				DMLOG_PRINT(DMLVL_ERR,
   11380 					    "%s returned unexpected rc = %d\n",
   11381 					    szFuncName, rc);
   11382 				varStatus = DMSTAT_FAIL;
   11383 			}
   11384 			DMVAR_END(varStatus);
   11385 
   11386 			/* Variation clean up */
   11387 			sprintf(command, "rm -rf %s", DUMMY_SUBDIR);
   11388 			rc = system(command);
   11389 			if (rc == -1) {
   11390 				DMLOG_PRINT(DMLVL_DEBUG,
   11391 					    "Unable to clean up variation! (errno = %d)\n",
   11392 					    errno);
   11393 			}
   11394 			dm_handle_free(dhanp, dhlen);
   11395 		}
   11396 	}
   11397 
   11398 	/*
   11399 	 * TEST    : dm_get_dirattrs - DM_AT_STAT with one buffer (files
   11400 	 *              returned from jfs_readdir > files fit in buffer)
   11401 	 * EXPECTED: rc = 1
   11402 	 */
   11403 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 31)) {
   11404 		void *dhanp;
   11405 		size_t dhlen;
   11406 		dm_attrloc_t loc;
   11407 		char buf[ATTR_SMALLLEN * ((2 * DIRENTS_FILES) - 1)];
   11408 		size_t rlen;
   11409 		dm_stat_t *entry;
   11410 		int varStatus;
   11411 		int i;
   11412 		char *filename;
   11413 		int num;
   11414 
   11415 		/* Variation set up */
   11416 		memset(buf, 0, sizeof(buf));
   11417 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   11418 			/* No clean up */
   11419 		} else
   11420 		    if ((rc =
   11421 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   11422 					   &dhlen)) == -1) {
   11423 			rmdir(DUMMY_SUBDIR);
   11424 		} else {
   11425 			for (i = 0; i < NUM_FILES && rc == 0; i++) {
   11426 				sprintf(command, "cp %s %s.%3.3d", DUMMY_TMP,
   11427 					DUMMY_SUBDIR_FILE, i);
   11428 				rc = system(command);
   11429 			}
   11430 			if ((rc == -1) ||
   11431 			    ((rc =
   11432 			      dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   11433 					      &loc)) == -1)) {
   11434 				sprintf(command, "rm -rf %s", DUMMY_SUBDIR);
   11435 				rc = system(command);
   11436 			}
   11437 		}
   11438 		if (rc == -1) {
   11439 			DMLOG_PRINT(DMLVL_DEBUG,
   11440 				    "Unable to set up variation! (errno = %d)\n",
   11441 				    errno);
   11442 			DMVAR_SKIP();
   11443 		} else {
   11444 			/* Variation */
   11445 			DMLOG_PRINT(DMLVL_DEBUG,
   11446 				    "%s(DM_AT_STAT with %d files)\n",
   11447 				    szFuncName, (2 * DIRENTS_FILES) - 1);
   11448 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   11449 					     DM_AT_STAT, &loc, sizeof(buf), buf,
   11450 					     &rlen);
   11451 			DMLOG_PRINT(DMLVL_DEBUG,
   11452 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   11453 				    rlen);
   11454 			varStatus = DMSTAT_PASS;
   11455 			if (rc == 1) {
   11456 				if (((num =
   11457 				      GetNumDirEntry(buf)) ==
   11458 				     (2 * DIRENTS_FILES) - 1)
   11459 				    && (rlen >=
   11460 					((2 * DIRENTS_FILES) -
   11461 					 1) * MIN_ENTRYLEN)) {
   11462 					filename = strchr(command, '/') + 1;
   11463 					DMLOG_PRINT(DMLVL_DEBUG, "attrs:\n");
   11464 					LogDirAttrs(buf, DM_AT_STAT);
   11465 					if ((entry =
   11466 					     GetDirEntry(buf,
   11467 							 filename)) == NULL) {
   11468 						if (((entry =
   11469 						      GetLastDirEntry(buf)) !=
   11470 						     NULL)
   11471 						    && (entry->dt_compname.
   11472 							vd_length > 0)) {
   11473 							DMLOG_PRINT(DMLVL_DEBUG,
   11474 								    "%s returned expected rc = %d, expected number of entries in buffer %d, and neither entry %s nor empty entry in buffer\n",
   11475 								    szFuncName,
   11476 								    rc, num,
   11477 								    filename);
   11478 						} else {
   11479 							DMLOG_PRINT(DMLVL_ERR,
   11480 								    "%s returned expected rc = %d but empty entry in buffer\n",
   11481 								    szFuncName,
   11482 								    rc,
   11483 								    filename);
   11484 							varStatus = DMSTAT_FAIL;
   11485 						}
   11486 					} else {
   11487 						DMLOG_PRINT(DMLVL_ERR,
   11488 							    "%s returned expected rc = %d but entry %s in buffer\n",
   11489 							    szFuncName, rc,
   11490 							    filename);
   11491 						varStatus = DMSTAT_FAIL;
   11492 					}
   11493 				} else {
   11494 					DMLOG_PRINT(DMLVL_ERR,
   11495 						    "%s returned expected rc = %d but unexpected rlen = %d and/or number of entries in buffer %d\n",
   11496 						    szFuncName, rc, rlen, num);
   11497 					varStatus = DMSTAT_FAIL;
   11498 				}
   11499 			} else {
   11500 				DMLOG_PRINT(DMLVL_ERR,
   11501 					    "%s returned unexpected rc = %d\n",
   11502 					    szFuncName, rc);
   11503 				varStatus = DMSTAT_FAIL;
   11504 			}
   11505 			DMVAR_END(varStatus);
   11506 
   11507 			/* Variation clean up */
   11508 			sprintf(command, "rm -rf %s", DUMMY_SUBDIR);
   11509 			rc = system(command);
   11510 			if (rc == -1) {
   11511 				DMLOG_PRINT(DMLVL_DEBUG,
   11512 					    "Unable to clean up variation! (errno = %d)\n",
   11513 					    errno);
   11514 			}
   11515 			dm_handle_free(dhanp, dhlen);
   11516 		}
   11517 	}
   11518 
   11519 	/*
   11520 	 * TEST    : dm_get_dirattrs - DM_AT_STAT with one buffer (files
   11521 	 *              returned from jfs_readdir > files fit in buffer)
   11522 	 * EXPECTED: rc = 1
   11523 	 */
   11524 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 32)) {
   11525 		void *dhanp;
   11526 		size_t dhlen;
   11527 		dm_attrloc_t loc;
   11528 		char buf[ATTR_SMALLLEN * (2 * DIRENTS_FILES)];
   11529 		size_t rlen;
   11530 		dm_stat_t *entry;
   11531 		int varStatus;
   11532 		int i;
   11533 		char *filename;
   11534 		int num;
   11535 
   11536 		/* Variation set up */
   11537 		memset(buf, 0, sizeof(buf));
   11538 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   11539 			/* No clean up */
   11540 		} else
   11541 		    if ((rc =
   11542 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   11543 					   &dhlen)) == -1) {
   11544 			rmdir(DUMMY_SUBDIR);
   11545 		} else {
   11546 			for (i = 0; i < NUM_FILES && rc == 0; i++) {
   11547 				sprintf(command, "cp %s %s.%3.3d", DUMMY_TMP,
   11548 					DUMMY_SUBDIR_FILE, i);
   11549 				rc = system(command);
   11550 			}
   11551 			if ((rc == -1) ||
   11552 			    ((rc =
   11553 			      dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   11554 					      &loc)) == -1)) {
   11555 				sprintf(command, "rm -rf %s", DUMMY_SUBDIR);
   11556 				rc = system(command);
   11557 			}
   11558 		}
   11559 		if (rc == -1) {
   11560 			DMLOG_PRINT(DMLVL_DEBUG,
   11561 				    "Unable to set up variation! (errno = %d)\n",
   11562 				    errno);
   11563 			DMVAR_SKIP();
   11564 		} else {
   11565 			/* Variation */
   11566 			DMLOG_PRINT(DMLVL_DEBUG,
   11567 				    "%s(DM_AT_STAT with %d files)\n",
   11568 				    szFuncName, 2 * DIRENTS_FILES);
   11569 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   11570 					     DM_AT_STAT, &loc, sizeof(buf), buf,
   11571 					     &rlen);
   11572 			DMLOG_PRINT(DMLVL_DEBUG,
   11573 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   11574 				    rlen);
   11575 			varStatus = DMSTAT_PASS;
   11576 			if (rc == 1) {
   11577 				if (((num =
   11578 				      GetNumDirEntry(buf)) == 2 * DIRENTS_FILES)
   11579 				    && (rlen >=
   11580 					(2 * DIRENTS_FILES) * MIN_ENTRYLEN)) {
   11581 					filename = strchr(command, '/') + 1;
   11582 					DMLOG_PRINT(DMLVL_DEBUG, "attrs:\n");
   11583 					LogDirAttrs(buf, DM_AT_STAT);
   11584 					if ((entry =
   11585 					     GetDirEntry(buf,
   11586 							 filename)) == NULL) {
   11587 						if (((entry =
   11588 						      GetLastDirEntry(buf)) !=
   11589 						     NULL)
   11590 						    && (entry->dt_compname.
   11591 							vd_length > 0)) {
   11592 							DMLOG_PRINT(DMLVL_DEBUG,
   11593 								    "%s returned expected rc = %d, expected number of entries in buffer %d, and neither entry %s nor empty entry in buffer\n",
   11594 								    szFuncName,
   11595 								    rc, num,
   11596 								    filename);
   11597 						} else {
   11598 							DMLOG_PRINT(DMLVL_ERR,
   11599 								    "%s returned expected rc = %d but empty entry in buffer\n",
   11600 								    szFuncName,
   11601 								    rc,
   11602 								    filename);
   11603 							varStatus = DMSTAT_FAIL;
   11604 						}
   11605 					} else {
   11606 						DMLOG_PRINT(DMLVL_ERR,
   11607 							    "%s returned expected rc = %d but entry %s in buffer\n",
   11608 							    szFuncName, rc,
   11609 							    filename);
   11610 						varStatus = DMSTAT_FAIL;
   11611 					}
   11612 				} else {
   11613 					DMLOG_PRINT(DMLVL_ERR,
   11614 						    "%s returned expected rc = %d but unexpected rlen = %d and/or number of entries in buffer %d\n",
   11615 						    szFuncName, rc, rlen, num);
   11616 					varStatus = DMSTAT_FAIL;
   11617 				}
   11618 			} else {
   11619 				DMLOG_PRINT(DMLVL_ERR,
   11620 					    "%s returned unexpected rc = %d\n",
   11621 					    szFuncName, rc);
   11622 				varStatus = DMSTAT_FAIL;
   11623 			}
   11624 			DMVAR_END(varStatus);
   11625 
   11626 			/* Variation clean up */
   11627 			sprintf(command, "rm -rf %s", DUMMY_SUBDIR);
   11628 			rc = system(command);
   11629 			if (rc == -1) {
   11630 				DMLOG_PRINT(DMLVL_DEBUG,
   11631 					    "Unable to clean up variation! (errno = %d)\n",
   11632 					    errno);
   11633 			}
   11634 			dm_handle_free(dhanp, dhlen);
   11635 		}
   11636 	}
   11637 
   11638 	/*
   11639 	 * TEST    : dm_get_dirattrs - DM_AT_STAT with one buffer (files
   11640 	 *              returned from jfs_readdir > files fit in buffer)
   11641 	 * EXPECTED: rc = 1
   11642 	 */
   11643 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 33)) {
   11644 		void *dhanp;
   11645 		size_t dhlen;
   11646 		dm_attrloc_t loc;
   11647 		char buf[ATTR_SMALLLEN * ((2 * DIRENTS_FILES) + 1)];
   11648 		size_t rlen;
   11649 		dm_stat_t *entry;
   11650 		int varStatus;
   11651 		int i;
   11652 		char *filename;
   11653 		int num;
   11654 
   11655 		/* Variation set up */
   11656 		memset(buf, 0, sizeof(buf));
   11657 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   11658 			/* No clean up */
   11659 		} else
   11660 		    if ((rc =
   11661 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   11662 					   &dhlen)) == -1) {
   11663 			rmdir(DUMMY_SUBDIR);
   11664 		} else {
   11665 			for (i = 0; i < NUM_FILES && rc == 0; i++) {
   11666 				sprintf(command, "cp %s %s.%3.3d", DUMMY_TMP,
   11667 					DUMMY_SUBDIR_FILE, i);
   11668 				rc = system(command);
   11669 			}
   11670 			if ((rc == -1) ||
   11671 			    ((rc =
   11672 			      dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   11673 					      &loc)) == -1)) {
   11674 				sprintf(command, "rm -rf %s", DUMMY_SUBDIR);
   11675 				rc = system(command);
   11676 			}
   11677 		}
   11678 		if (rc == -1) {
   11679 			DMLOG_PRINT(DMLVL_DEBUG,
   11680 				    "Unable to set up variation! (errno = %d)\n",
   11681 				    errno);
   11682 			DMVAR_SKIP();
   11683 		} else {
   11684 			/* Variation */
   11685 			DMLOG_PRINT(DMLVL_DEBUG,
   11686 				    "%s(DM_AT_STAT with %d files)\n",
   11687 				    szFuncName, (2 * DIRENTS_FILES) + 1);
   11688 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   11689 					     DM_AT_STAT, &loc, sizeof(buf), buf,
   11690 					     &rlen);
   11691 			DMLOG_PRINT(DMLVL_DEBUG,
   11692 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   11693 				    rlen);
   11694 			varStatus = DMSTAT_PASS;
   11695 			if (rc == 1) {
   11696 				if (((num =
   11697 				      GetNumDirEntry(buf)) ==
   11698 				     (2 * DIRENTS_FILES) + 1)
   11699 				    && (rlen >=
   11700 					((2 * DIRENTS_FILES) +
   11701 					 1) * MIN_ENTRYLEN)) {
   11702 					filename = strchr(command, '/') + 1;
   11703 					DMLOG_PRINT(DMLVL_DEBUG, "attrs:\n");
   11704 					LogDirAttrs(buf, DM_AT_STAT);
   11705 					if ((entry =
   11706 					     GetDirEntry(buf,
   11707 							 filename)) == NULL) {
   11708 						if (((entry =
   11709 						      GetLastDirEntry(buf)) !=
   11710 						     NULL)
   11711 						    && (entry->dt_compname.
   11712 							vd_length > 0)) {
   11713 							DMLOG_PRINT(DMLVL_DEBUG,
   11714 								    "%s returned expected rc = %d, expected number of entries in buffer %d, and neither entry %s nor empty entry in buffer\n",
   11715 								    szFuncName,
   11716 								    rc, num,
   11717 								    filename);
   11718 						} else {
   11719 							DMLOG_PRINT(DMLVL_ERR,
   11720 								    "%s returned expected rc = %d but empty entry in buffer\n",
   11721 								    szFuncName,
   11722 								    rc,
   11723 								    filename);
   11724 							varStatus = DMSTAT_FAIL;
   11725 						}
   11726 					} else {
   11727 						DMLOG_PRINT(DMLVL_ERR,
   11728 							    "%s returned expected rc = %d but entry %s in buffer\n",
   11729 							    szFuncName, rc,
   11730 							    filename);
   11731 						varStatus = DMSTAT_FAIL;
   11732 					}
   11733 				} else {
   11734 					DMLOG_PRINT(DMLVL_ERR,
   11735 						    "%s returned expected rc = %d but unexpected rlen = %d and/or number of entries in buffer %d\n",
   11736 						    szFuncName, rc, rlen, num);
   11737 					varStatus = DMSTAT_FAIL;
   11738 				}
   11739 			} else {
   11740 				DMLOG_PRINT(DMLVL_ERR,
   11741 					    "%s returned unexpected rc = %d\n",
   11742 					    szFuncName, rc);
   11743 				varStatus = DMSTAT_FAIL;
   11744 			}
   11745 			DMVAR_END(varStatus);
   11746 
   11747 			/* Variation clean up */
   11748 			sprintf(command, "rm -rf %s", DUMMY_SUBDIR);
   11749 			rc = system(command);
   11750 			if (rc == -1) {
   11751 				DMLOG_PRINT(DMLVL_DEBUG,
   11752 					    "Unable to clean up variation! (errno = %d)\n",
   11753 					    errno);
   11754 			}
   11755 			dm_handle_free(dhanp, dhlen);
   11756 		}
   11757 	}
   11758 
   11759 	/*
   11760 	 * TEST    : dm_get_dirattrs - DM_AT_STAT with one buffer (files
   11761 	 *              returned from jfs_readdir < files fit in buffer)
   11762 	 * EXPECTED: rc = 0
   11763 	 */
   11764 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 34)) {
   11765 		void *dhanp;
   11766 		size_t dhlen;
   11767 		dm_attrloc_t loc;
   11768 		char buf[ATTR_BIGLISTLEN];
   11769 		size_t rlen;
   11770 		dm_stat_t *entry;
   11771 		int varStatus;
   11772 		int i;
   11773 		char *filename;
   11774 		int num;
   11775 
   11776 		/* Variation set up */
   11777 		memset(buf, 0, sizeof(buf));
   11778 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   11779 			/* No clean up */
   11780 		} else
   11781 		    if ((rc =
   11782 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   11783 					   &dhlen)) == -1) {
   11784 			rmdir(DUMMY_SUBDIR);
   11785 		} else {
   11786 			for (i = 0; i < NUM_FILES && rc == 0; i++) {
   11787 				sprintf(command, "cp %s %s.%3.3d", DUMMY_TMP,
   11788 					DUMMY_SUBDIR_FILE, i);
   11789 				rc = system(command);
   11790 			}
   11791 			if ((rc == -1) ||
   11792 			    ((rc =
   11793 			      dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   11794 					      &loc)) == -1)) {
   11795 				sprintf(command, "rm -rf %s", DUMMY_SUBDIR);
   11796 				rc = system(command);
   11797 			}
   11798 		}
   11799 		if (rc == -1) {
   11800 			DMLOG_PRINT(DMLVL_DEBUG,
   11801 				    "Unable to set up variation! (errno = %d)\n",
   11802 				    errno);
   11803 			DMVAR_SKIP();
   11804 		} else {
   11805 			/* Variation */
   11806 			DMLOG_PRINT(DMLVL_DEBUG,
   11807 				    "%s(DM_AT_STAT with %d files)\n",
   11808 				    szFuncName, NUM_FILES + 2);
   11809 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   11810 					     DM_AT_STAT, &loc, sizeof(buf), buf,
   11811 					     &rlen);
   11812 			DMLOG_PRINT(DMLVL_DEBUG,
   11813 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   11814 				    rlen);
   11815 			varStatus = DMSTAT_PASS;
   11816 			if (rc == 0) {
   11817 				if (((num =
   11818 				      GetNumDirEntry(buf)) == NUM_FILES + 2)
   11819 				    && (rlen >=
   11820 					(NUM_FILES + 2) * MIN_ENTRYLEN)) {
   11821 					filename = strchr(command, '/') + 1;
   11822 					DMLOG_PRINT(DMLVL_DEBUG, "attrs:\n");
   11823 					LogDirAttrs(buf, DM_AT_STAT);
   11824 					if ((entry =
   11825 					     GetDirEntry(buf,
   11826 							 filename)) != NULL) {
   11827 						DMLOG_PRINT(DMLVL_DEBUG,
   11828 							    "%s returned expected rc = %d, expected number of entries in buffer %d, and entry %s in buffer\n",
   11829 							    szFuncName, rc, num,
   11830 							    filename);
   11831 					} else {
   11832 						DMLOG_PRINT(DMLVL_ERR,
   11833 							    "%s returned expected rc = %d but entry %s not in buffer\n",
   11834 							    szFuncName, rc,
   11835 							    filename);
   11836 						varStatus = DMSTAT_FAIL;
   11837 					}
   11838 				} else {
   11839 					DMLOG_PRINT(DMLVL_ERR,
   11840 						    "%s returned expected rc = %d but unexpected rlen = %d and/or number of entries in buffer %d\n",
   11841 						    szFuncName, rc, rlen, num);
   11842 					varStatus = DMSTAT_FAIL;
   11843 				}
   11844 			} else {
   11845 				DMLOG_PRINT(DMLVL_ERR,
   11846 					    "%s returned unexpected rc = %d\n",
   11847 					    szFuncName, rc);
   11848 				varStatus = DMSTAT_FAIL;
   11849 			}
   11850 			DMVAR_END(varStatus);
   11851 
   11852 			/* Variation clean up */
   11853 			sprintf(command, "rm -rf %s", DUMMY_SUBDIR);
   11854 			rc = system(command);
   11855 			if (rc == -1) {
   11856 				DMLOG_PRINT(DMLVL_DEBUG,
   11857 					    "Unable to clean up variation! (errno = %d)\n",
   11858 					    errno);
   11859 			}
   11860 			dm_handle_free(dhanp, dhlen);
   11861 		}
   11862 	}
   11863 
   11864 	/*
   11865 	 * TEST    : dm_get_dirattrs - DM_AT_HANDLE with link
   11866 	 * EXPECTED: rc = 0
   11867 	 */
   11868 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 35)) {
   11869 		void *dhanp, *fhanp1, *fhanp2;
   11870 		size_t dhlen, fhlen1, fhlen2;
   11871 		dm_attrloc_t loc;
   11872 		char buf[ATTR_LISTLEN];
   11873 		size_t rlen;
   11874 
   11875 		/* Variation set up */
   11876 		memset(buf, 0, ATTR_LISTLEN);
   11877 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   11878 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   11879 			/* No clean up */
   11880 		} else
   11881 		    if ((rc =
   11882 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   11883 					   &dhlen)) == -1) {
   11884 			rmdir(DUMMY_SUBDIR);
   11885 		} else if ((rc = system(command)) == -1) {
   11886 			dm_handle_free(dhanp, dhlen);
   11887 			rmdir(DUMMY_SUBDIR);
   11888 		} else
   11889 		    if ((rc =
   11890 			 dm_path_to_handle(DUMMY_SUBDIR_FILE, &fhanp1,
   11891 					   &fhlen1)) == -1) {
   11892 			remove(DUMMY_SUBDIR_FILE);
   11893 			dm_handle_free(dhanp, dhlen);
   11894 			rmdir(DUMMY_SUBDIR);
   11895 		} else if ((rc = link(DUMMY_SUBDIR_FILE, DUMMY_SUBDIR_LINK)) ==
   11896 			   -1) {
   11897 			dm_handle_free(fhanp1, fhlen1);
   11898 			remove(DUMMY_SUBDIR_FILE);
   11899 			dm_handle_free(dhanp, dhlen);
   11900 			rmdir(DUMMY_SUBDIR);
   11901 		} else
   11902 		    if ((rc =
   11903 			 dm_path_to_handle(DUMMY_SUBDIR_LINK, &fhanp2,
   11904 					   &fhlen2)) == -1) {
   11905 			unlink(DUMMY_SUBDIR_LINK);
   11906 			dm_handle_free(fhanp1, fhlen1);
   11907 			remove(DUMMY_SUBDIR_FILE);
   11908 			dm_handle_free(dhanp, dhlen);
   11909 			rmdir(DUMMY_SUBDIR);
   11910 		} else
   11911 		    if ((rc =
   11912 			 dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   11913 					 &loc)) == -1) {
   11914 			dm_handle_free(fhanp2, fhlen2);
   11915 			unlink(DUMMY_SUBDIR_LINK);
   11916 			dm_handle_free(fhanp1, fhlen1);
   11917 			remove(DUMMY_SUBDIR_FILE);
   11918 			dm_handle_free(dhanp, dhlen);
   11919 			rmdir(DUMMY_SUBDIR);
   11920 		}
   11921 		if (rc == -1) {
   11922 			DMLOG_PRINT(DMLVL_DEBUG,
   11923 				    "Unable to set up variation! (errno = %d)\n",
   11924 				    errno);
   11925 			DMVAR_SKIP();
   11926 		} else {
   11927 			/* Variation */
   11928 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_AT_HANDLE with link)\n",
   11929 				    szFuncName);
   11930 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   11931 					     DM_AT_HANDLE, &loc, sizeof(buf),
   11932 					     buf, &rlen);
   11933 			DMLOG_PRINT(DMLVL_DEBUG,
   11934 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   11935 				    rlen);
   11936 			if (rc == 0) {
   11937 				dm_stat_t *entry1 =
   11938 				    GetDirEntry(buf, DUMMY_FILE);
   11939 				dm_stat_t *entry2 =
   11940 				    GetDirEntry(buf, DUMMY_LINK);
   11941 				LogDirAttrs(buf, DM_AT_HANDLE);
   11942 				if (entry1 != NULL) {
   11943 					if (dm_handle_cmp
   11944 					    (fhanp1, fhlen1,
   11945 					     DM_GET_VALUE(entry1, dt_handle,
   11946 							  void *),
   11947 					     DM_GET_LEN(entry1,
   11948 							dt_handle)) == 0) {
   11949 						if (entry2 != NULL) {
   11950 							if (dm_handle_cmp
   11951 							    (fhanp2, fhlen2,
   11952 							     DM_GET_VALUE
   11953 							     (entry2, dt_handle,
   11954 							      void *),
   11955 							     DM_GET_LEN(entry2,
   11956 									dt_handle))
   11957 							    == 0) {
   11958 								DMLOG_PRINT
   11959 								    (DMLVL_DEBUG,
   11960 								     "%s passed with expected rc = %d\n",
   11961 								     szFuncName,
   11962 								     0);
   11963 								DMVAR_PASS();
   11964 							} else {
   11965 								DMLOG_PRINT
   11966 								    (DMLVL_ERR,
   11967 								     "%s failed with expected rc = %d but link handles NOT same\n",
   11968 								     szFuncName,
   11969 								     0);
   11970 								DMVAR_FAIL();
   11971 							}
   11972 						} else {
   11973 							DMLOG_PRINT(DMLVL_ERR,
   11974 								    "%s failed with expected rc = %d but unable to find entry %s",
   11975 								    szFuncName,
   11976 								    0,
   11977 								    DUMMY_LINK);
   11978 							DMVAR_FAIL();
   11979 						}
   11980 					} else {
   11981 						DMLOG_PRINT(DMLVL_ERR,
   11982 							    "%s failed with expected rc = %d but file handles NOT same\n",
   11983 							    szFuncName, 0);
   11984 						DMVAR_FAIL();
   11985 					}
   11986 				} else {
   11987 					DMLOG_PRINT(DMLVL_ERR,
   11988 						    "%s failed with expected rc = %d but unable to find entry %s",
   11989 						    szFuncName, 0, DUMMY_FILE);
   11990 					DMVAR_FAIL();
   11991 				}
   11992 			} else {
   11993 				DMLOG_PRINT(DMLVL_ERR,
   11994 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   11995 					    szFuncName, rc, errno);
   11996 				DMVAR_FAIL();
   11997 			}
   11998 
   11999 			/* Variation clean up */
   12000 			rc = remove(DUMMY_SUBDIR_FILE);
   12001 			rc |= remove(DUMMY_SUBDIR_LINK);
   12002 			rc |= rmdir(DUMMY_SUBDIR);
   12003 			if (rc == -1) {
   12004 				DMLOG_PRINT(DMLVL_DEBUG,
   12005 					    "Unable to clean up variation! (errno = %d)\n",
   12006 					    errno);
   12007 			}
   12008 			dm_handle_free(dhanp, dhlen);
   12009 			dm_handle_free(fhanp1, fhlen1);
   12010 			dm_handle_free(fhanp2, fhlen2);
   12011 		}
   12012 	}
   12013 
   12014 	/*
   12015 	 * TEST    : dm_get_dirattrs - DM_AT_EMASK (verify no handle)
   12016 	 * EXPECTED: rc = 0
   12017 	 *
   12018 	 * This variation uncovered XFS BUG #28 (handle returned when
   12019 	 * DM_AT_HANDLE not set in mask)
   12020 	 */
   12021 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 36)) {
   12022 		void *dhanp;
   12023 		size_t dhlen;
   12024 		dm_attrloc_t loc;
   12025 		char buf[ATTR_LISTLEN];
   12026 		size_t rlen;
   12027 
   12028 		/* Variation set up */
   12029 		memset(buf, 0, ATTR_LISTLEN);
   12030 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   12031 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   12032 			/* No clean up */
   12033 		} else
   12034 		    if ((rc =
   12035 			 dm_path_to_handle(DUMMY_SUBDIR, &dhanp,
   12036 					   &dhlen)) == -1) {
   12037 			rmdir(DUMMY_SUBDIR);
   12038 		} else if (((rc = system(command)) == -1) ||
   12039 			   ((rc =
   12040 			     dm_init_attrloc(sid, dhanp, dhlen, DM_NO_TOKEN,
   12041 					     &loc)) == -1)) {
   12042 			dm_handle_free(dhanp, dhlen);
   12043 			rmdir(DUMMY_SUBDIR);
   12044 		}
   12045 		if (rc == -1) {
   12046 			DMLOG_PRINT(DMLVL_DEBUG,
   12047 				    "Unable to set up variation! (errno = %d)\n",
   12048 				    errno);
   12049 			DMVAR_SKIP();
   12050 		} else {
   12051 			/* Variation */
   12052 			DMLOG_PRINT(DMLVL_DEBUG, "%s(~DM_AT_HANDLE)\n",
   12053 				    szFuncName);
   12054 			rc = dm_get_dirattrs(sid, dhanp, dhlen, DM_NO_TOKEN,
   12055 					     DM_AT_ALL_DIRATTRS &
   12056 					     (~DM_AT_HANDLE), &loc, sizeof(buf),
   12057 					     buf, &rlen);
   12058 			DMLOG_PRINT(DMLVL_DEBUG,
   12059 				    "call: rc %d, loc %lld, rlen %d\n", rc, loc,
   12060 				    rlen);
   12061 			if (rc == 0) {
   12062 				dm_stat_t *entry = GetDirEntry(buf, DUMMY_FILE);
   12063 				LogDirAttrs(buf, DM_AT_ALL_DIRATTRS);
   12064 				if (entry != NULL) {
   12065 					if ((entry->dt_handle.vd_offset == 0)
   12066 					    && (entry->dt_handle.vd_length ==
   12067 						0)) {
   12068 						DMLOG_PRINT(DMLVL_DEBUG,
   12069 							    "%s passed with expected rc = %d\n",
   12070 							    szFuncName, 0);
   12071 						DMVAR_PASS();
   12072 					} else {
   12073 						DMLOG_PRINT(DMLVL_ERR,
   12074 							    "%s failed with expected rc = %d but handle non-zero (offset %d, length %d)\n",
   12075 							    szFuncName, 0,
   12076 							    entry->dt_handle.
   12077 							    vd_offset,
   12078 							    entry->dt_handle.
   12079 							    vd_length);
   12080 						DMVAR_FAIL();
   12081 					}
   12082 				} else {
   12083 					DMLOG_PRINT(DMLVL_ERR,
   12084 						    "%s failed with expected rc = %d but unable to find entry %s",
   12085 						    szFuncName, 0, DUMMY_FILE);
   12086 					DMVAR_FAIL();
   12087 				}
   12088 			} else {
   12089 				DMLOG_PRINT(DMLVL_ERR,
   12090 					    "%s failed with unexpected rc = %d (errno = %d)\n",
   12091 					    szFuncName, rc, errno);
   12092 				DMVAR_FAIL();
   12093 			}
   12094 
   12095 			/* Variation clean up */
   12096 			rc = remove(DUMMY_SUBDIR_FILE);
   12097 			rc |= rmdir(DUMMY_SUBDIR);
   12098 			if (rc == -1) {
   12099 				DMLOG_PRINT(DMLVL_DEBUG,
   12100 					    "Unable to clean up variation! (errno = %d)\n",
   12101 					    errno);
   12102 			}
   12103 			dm_handle_free(dhanp, dhlen);
   12104 		}
   12105 	}
   12106 
   12107 	/*
   12108 	 * TEST    : dm_get_dirattrs - fs handle
   12109 	 * EXPECTED: rc = -1, errno = EINVAL
   12110 	 */
   12111 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 37)) {
   12112 		void *hanp;
   12113 		size_t hlen;
   12114 		dm_attrloc_t loc;
   12115 		char buf[ATTR_LISTLEN];
   12116 		size_t rlen;
   12117 
   12118 		/* Variation set up */
   12119 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   12120 		if ((rc = system(command)) == -1) {
   12121 			/* No clean up */
   12122 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   12123 			   == -1) {
   12124 			remove(DUMMY_FILE);
   12125 		}
   12126 		if (rc == -1) {
   12127 			DMLOG_PRINT(DMLVL_DEBUG,
   12128 				    "Unable to set up variation! (errno = %d)\n",
   12129 				    errno);
   12130 			DMVAR_SKIP();
   12131 		} else {
   12132 			/* Variation */
   12133 			DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName);
   12134 			rc = dm_get_dirattrs(sid, hanp, hlen, DM_NO_TOKEN,
   12135 					     DM_AT_EMASK, &loc, sizeof(buf),
   12136 					     buf, &rlen);
   12137 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   12138 
   12139 			/* Variation clean up */
   12140 			rc = remove(DUMMY_FILE);
   12141 			if (rc == -1) {
   12142 				DMLOG_PRINT(DMLVL_DEBUG,
   12143 					    "Unable to clean up variation! (errno = %d)\n",
   12144 					    errno);
   12145 			}
   12146 			dm_handle_free(hanp, hlen);
   12147 		}
   12148 	}
   12149 
   12150 	/*
   12151 	 * TEST    : dm_get_dirattrs - DM_NO_SESSION sid
   12152 	 * EXPECTED: rc = -1, errno = EINVAL
   12153 	 */
   12154 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 38)) {
   12155 		void *hanp;
   12156 		size_t hlen;
   12157 		dm_attrloc_t loc;
   12158 		char buf[ATTR_LISTLEN];
   12159 		size_t rlen;
   12160 
   12161 		/* Variation set up */
   12162 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_SUBDIR_FILE);
   12163 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   12164 			/* No clean up */
   12165 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   12166 			   == -1) {
   12167 			rmdir(DUMMY_SUBDIR);
   12168 		} else
   12169 		    if (((rc =
   12170 			  dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   12171 					  &loc)) == -1)
   12172 			|| ((rc = system(command)) == -1)) {
   12173 			dm_handle_free(hanp, hlen);
   12174 			rmdir(DUMMY_SUBDIR);
   12175 		}
   12176 		if (rc == -1) {
   12177 			DMLOG_PRINT(DMLVL_DEBUG,
   12178 				    "Unable to set up variation! (errno = %d)\n",
   12179 				    errno);
   12180 			DMVAR_SKIP();
   12181 		} else {
   12182 			/* Variation */
   12183 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
   12184 				    szFuncName);
   12185 			rc = dm_get_dirattrs(DM_NO_SESSION, hanp, hlen,
   12186 					     DM_NO_TOKEN, DM_AT_EMASK, &loc,
   12187 					     sizeof(buf), buf, &rlen);
   12188 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   12189 
   12190 			/* Variation clean up */
   12191 			rc = remove(DUMMY_SUBDIR_FILE);
   12192 			rc |= rmdir(DUMMY_SUBDIR);
   12193 			if (rc == -1) {
   12194 				DMLOG_PRINT(DMLVL_DEBUG,
   12195 					    "Unable to clean up variation! (errno = %d)\n",
   12196 					    errno);
   12197 			}
   12198 			dm_handle_free(hanp, hlen);
   12199 		}
   12200 	}
   12201 
   12202 	/*
   12203 	 * TEST    : dm_get_dirattrs - global handle
   12204 	 * EXPECTED: rc = -1, errno = EBADF
   12205 	 */
   12206 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 39)) {
   12207 		void *hanp;
   12208 		size_t hlen;
   12209 		dm_attrloc_t loc;
   12210 		char buf[ATTR_LISTLEN];
   12211 		size_t rlen;
   12212 
   12213 		/* Variation set up */
   12214 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   12215 			/* No clean up */
   12216 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   12217 			   == -1) {
   12218 			rmdir(DUMMY_SUBDIR);
   12219 		} else
   12220 		    if ((rc =
   12221 			 dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   12222 					 &loc)) == -1) {
   12223 			dm_handle_free(hanp, hlen);
   12224 			rmdir(DUMMY_SUBDIR);
   12225 		}
   12226 		if (rc == -1) {
   12227 			DMLOG_PRINT(DMLVL_DEBUG,
   12228 				    "Unable to set up variation! (errno = %d)\n",
   12229 				    errno);
   12230 			DMVAR_SKIP();
   12231 		} else {
   12232 			/* Variation */
   12233 			DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n",
   12234 				    szFuncName);
   12235 			rc = dm_get_dirattrs(sid, DM_GLOBAL_HANP,
   12236 					     DM_GLOBAL_HLEN, DM_NO_TOKEN,
   12237 					     DM_AT_EMASK, &loc, sizeof(buf),
   12238 					     buf, &rlen);
   12239 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   12240 
   12241 			/* Variation clean up */
   12242 			rc = rmdir(DUMMY_SUBDIR);
   12243 			if (rc == -1) {
   12244 				DMLOG_PRINT(DMLVL_DEBUG,
   12245 					    "Unable to clean up variation! (errno = %d)\n",
   12246 					    errno);
   12247 			}
   12248 			dm_handle_free(hanp, hlen);
   12249 		}
   12250 	}
   12251 
   12252 	/*
   12253 	 * TEST    : dm_get_dirattrs - invalidated hanp
   12254 	 * EXPECTED: rc = -1, errno = EBADF
   12255 	 */
   12256 	if (DMVAR_EXEC(GET_DIRATTRS_BASE + 40)) {
   12257 		void *hanp;
   12258 		size_t hlen;
   12259 		dm_attrloc_t loc;
   12260 		char buf[ATTR_LISTLEN];
   12261 		size_t rlen;
   12262 
   12263 		/* Variation set up */
   12264 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   12265 			/* No clean up */
   12266 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   12267 			   == -1) {
   12268 			rmdir(DUMMY_SUBDIR);
   12269 		} else
   12270 		    if ((rc =
   12271 			 dm_init_attrloc(sid, hanp, hlen, DM_NO_TOKEN,
   12272 					 &loc)) == -1) {
   12273 			dm_handle_free(hanp, hlen);
   12274 			rmdir(DUMMY_SUBDIR);
   12275 		} else if ((rc = rmdir(DUMMY_SUBDIR)) == -1) {
   12276 			dm_handle_free(hanp, hlen);
   12277 		}
   12278 		if (rc == -1) {
   12279 			DMLOG_PRINT(DMLVL_DEBUG,
   12280 				    "Unable to set up variation! (errno = %d)\n",
   12281 				    errno);
   12282 			DMVAR_SKIP();
   12283 		} else {
   12284 			/* Variation */
   12285 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated hanp)\n",
   12286 				    szFuncName);
   12287 			rc = dm_get_dirattrs(sid, hanp, hlen, DM_NO_TOKEN,
   12288 					     DM_AT_EMASK, &loc, sizeof(buf),
   12289 					     buf, &rlen);
   12290 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   12291 
   12292 			/* Variation clean up */
   12293 			dm_handle_free(hanp, hlen);
   12294 		}
   12295 	}
   12296 
   12297 	szFuncName = "dm_set_inherit";
   12298 
   12299 	/*
   12300 	 * TEST    : dm_set_inherit - invalid sid
   12301 	 * EXPECTED: rc = -1, errno = EINVAL
   12302 	 */
   12303 	if (DMVAR_EXEC(SET_INHERIT_BASE + 1)) {
   12304 		int fd;
   12305 		void *hanp;
   12306 		size_t hlen;
   12307 		dm_attrname_t attrname;
   12308 
   12309 		/* Variation set up */
   12310 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   12311 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   12312 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   12313 		if ((rc = system(command)) == -1) {
   12314 			/* No clean up */
   12315 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   12316 			remove(DUMMY_FILE);
   12317 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   12318 			   == -1) {
   12319 			close(fd);
   12320 			remove(DUMMY_FILE);
   12321 		}
   12322 		if (fd == -1 || rc == -1) {
   12323 			DMLOG_PRINT(DMLVL_DEBUG,
   12324 				    "Unable to set up variation! (errno = %d)\n",
   12325 				    errno);
   12326 			DMVAR_SKIP();
   12327 		} else {
   12328 			/* Variation */
   12329 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
   12330 				    szFuncName);
   12331 			rc = dm_set_inherit(INVALID_ADDR, hanp, hlen,
   12332 					    DM_NO_TOKEN, &attrname, 0);
   12333 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   12334 
   12335 			/* Variation clean up */
   12336 			rc = close(fd);
   12337 			rc |= remove(DUMMY_FILE);
   12338 			if (rc == -1) {
   12339 				DMLOG_PRINT(DMLVL_DEBUG,
   12340 					    "Unable to clean up variation! (errno = %d)\n",
   12341 					    errno);
   12342 			}
   12343 			dm_handle_free(hanp, hlen);
   12344 		}
   12345 	}
   12346 
   12347 	/*
   12348 	 * TEST    : dm_set_inherit - invalid hanp
   12349 	 * EXPECTED: rc = -1, errno = EFAULT
   12350 	 */
   12351 	if (DMVAR_EXEC(SET_INHERIT_BASE + 2)) {
   12352 		int fd;
   12353 		void *hanp;
   12354 		size_t hlen;
   12355 		dm_attrname_t attrname;
   12356 
   12357 		/* Variation set up */
   12358 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   12359 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   12360 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   12361 		if ((rc = system(command)) == -1) {
   12362 			/* No clean up */
   12363 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   12364 			remove(DUMMY_FILE);
   12365 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   12366 			   == -1) {
   12367 			close(fd);
   12368 			remove(DUMMY_FILE);
   12369 		}
   12370 		if (fd == -1 || rc == -1) {
   12371 			DMLOG_PRINT(DMLVL_DEBUG,
   12372 				    "Unable to set up variation! (errno = %d)\n",
   12373 				    errno);
   12374 			DMVAR_SKIP();
   12375 		} else {
   12376 			/* Variation */
   12377 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
   12378 				    szFuncName);
   12379 			rc = dm_set_inherit(sid, (void *)INVALID_ADDR, hlen,
   12380 					    DM_NO_TOKEN, &attrname, 0);
   12381 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   12382 
   12383 			/* Variation clean up */
   12384 			rc = close(fd);
   12385 			rc |= remove(DUMMY_FILE);
   12386 			if (rc == -1) {
   12387 				DMLOG_PRINT(DMLVL_DEBUG,
   12388 					    "Unable to clean up variation! (errno = %d)\n",
   12389 					    errno);
   12390 			}
   12391 			dm_handle_free(hanp, hlen);
   12392 		}
   12393 	}
   12394 
   12395 	/*
   12396 	 * TEST    : dm_set_inherit - invalid hlen
   12397 	 * EXPECTED: rc = -1, errno = EBADF
   12398 	 */
   12399 	if (DMVAR_EXEC(SET_INHERIT_BASE + 3)) {
   12400 		int fd;
   12401 		void *hanp;
   12402 		size_t hlen;
   12403 		dm_attrname_t attrname;
   12404 
   12405 		/* Variation set up */
   12406 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   12407 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   12408 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   12409 		if ((rc = system(command)) == -1) {
   12410 			/* No clean up */
   12411 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   12412 			remove(DUMMY_FILE);
   12413 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   12414 			   == -1) {
   12415 			close(fd);
   12416 			remove(DUMMY_FILE);
   12417 		}
   12418 		if (fd == -1 || rc == -1) {
   12419 			DMLOG_PRINT(DMLVL_DEBUG,
   12420 				    "Unable to set up variation! (errno = %d)\n",
   12421 				    errno);
   12422 			DMVAR_SKIP();
   12423 		} else {
   12424 			/* Variation */
   12425 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
   12426 				    szFuncName);
   12427 			rc = dm_set_inherit(sid, hanp, INVALID_ADDR,
   12428 					    DM_NO_TOKEN, &attrname, 0);
   12429 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   12430 
   12431 			/* Variation clean up */
   12432 			rc = close(fd);
   12433 			rc |= remove(DUMMY_FILE);
   12434 			if (rc == -1) {
   12435 				DMLOG_PRINT(DMLVL_DEBUG,
   12436 					    "Unable to clean up variation! (errno = %d)\n",
   12437 					    errno);
   12438 			}
   12439 			dm_handle_free(hanp, hlen);
   12440 		}
   12441 	}
   12442 
   12443 	/*
   12444 	 * TEST    : dm_set_inherit - invalid token
   12445 	 * EXPECTED: rc = -1, errno = EINVAL
   12446 	 */
   12447 	if (DMVAR_EXEC(SET_INHERIT_BASE + 4)) {
   12448 		int fd;
   12449 		void *hanp;
   12450 		size_t hlen;
   12451 		dm_attrname_t attrname;
   12452 
   12453 		/* Variation set up */
   12454 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   12455 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   12456 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   12457 		if ((rc = system(command)) == -1) {
   12458 			/* No clean up */
   12459 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   12460 			remove(DUMMY_FILE);
   12461 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   12462 			   == -1) {
   12463 			close(fd);
   12464 			remove(DUMMY_FILE);
   12465 		}
   12466 		if (fd == -1 || rc == -1) {
   12467 			DMLOG_PRINT(DMLVL_DEBUG,
   12468 				    "Unable to set up variation! (errno = %d)\n",
   12469 				    errno);
   12470 			DMVAR_SKIP();
   12471 		} else {
   12472 			/* Variation */
   12473 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
   12474 				    szFuncName);
   12475 			rc = dm_set_inherit(sid, hanp, hlen, INVALID_ADDR,
   12476 					    &attrname, 0);
   12477 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   12478 
   12479 			/* Variation clean up */
   12480 			rc = close(fd);
   12481 			rc |= remove(DUMMY_FILE);
   12482 			if (rc == -1) {
   12483 				DMLOG_PRINT(DMLVL_DEBUG,
   12484 					    "Unable to clean up variation! (errno = %d)\n",
   12485 					    errno);
   12486 			}
   12487 			dm_handle_free(hanp, hlen);
   12488 		}
   12489 	}
   12490 
   12491 	/*
   12492 	 * TEST    : dm_set_inherit - invalid attrnamep
   12493 	 * EXPECTED: rc = -1, errno = EFAULT
   12494 	 */
   12495 	if (DMVAR_EXEC(SET_INHERIT_BASE + 5)) {
   12496 		int fd;
   12497 		void *hanp;
   12498 		size_t hlen;
   12499 		dm_attrname_t attrname;
   12500 
   12501 		/* Variation set up */
   12502 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   12503 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   12504 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   12505 		if ((rc = system(command)) == -1) {
   12506 			/* No clean up */
   12507 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   12508 			remove(DUMMY_FILE);
   12509 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   12510 			   == -1) {
   12511 			close(fd);
   12512 			remove(DUMMY_FILE);
   12513 		}
   12514 		if (fd == -1 || rc == -1) {
   12515 			DMLOG_PRINT(DMLVL_DEBUG,
   12516 				    "Unable to set up variation! (errno = %d)\n",
   12517 				    errno);
   12518 			DMVAR_SKIP();
   12519 		} else {
   12520 			/* Variation */
   12521 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid attrnamep)\n",
   12522 				    szFuncName);
   12523 			rc = dm_set_inherit(sid, hanp, hlen, DM_NO_TOKEN,
   12524 					    (dm_attrname_t *) INVALID_ADDR, 0);
   12525 			DMVAR_ENDFAILEXP(szFuncName, -1, rc,
   12526 					 persInheritAttr ? EFAULT : ENOSYS);
   12527 
   12528 			/* Variation clean up */
   12529 			rc = close(fd);
   12530 			rc |= remove(DUMMY_FILE);
   12531 			if (rc == -1) {
   12532 				DMLOG_PRINT(DMLVL_DEBUG,
   12533 					    "Unable to clean up variation! (errno = %d)\n",
   12534 					    errno);
   12535 			}
   12536 			dm_handle_free(hanp, hlen);
   12537 		}
   12538 	}
   12539 
   12540 	/*
   12541 	 * TEST    : dm_set_inherit - DM_NO_SESSION sid
   12542 	 * EXPECTED: rc = -1, errno = EINVAL
   12543 	 */
   12544 	if (DMVAR_EXEC(SET_INHERIT_BASE + 6)) {
   12545 		int fd;
   12546 		void *hanp;
   12547 		size_t hlen;
   12548 		dm_attrname_t attrname;
   12549 
   12550 		/* Variation set up */
   12551 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   12552 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   12553 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   12554 		if ((rc = system(command)) == -1) {
   12555 			/* No clean up */
   12556 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   12557 			remove(DUMMY_FILE);
   12558 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   12559 			   == -1) {
   12560 			close(fd);
   12561 			remove(DUMMY_FILE);
   12562 		}
   12563 		if (fd == -1 || rc == -1) {
   12564 			DMLOG_PRINT(DMLVL_DEBUG,
   12565 				    "Unable to set up variation! (errno = %d)\n",
   12566 				    errno);
   12567 			DMVAR_SKIP();
   12568 		} else {
   12569 			/* Variation */
   12570 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
   12571 				    szFuncName);
   12572 			rc = dm_set_inherit(DM_NO_SESSION, hanp, hlen,
   12573 					    DM_NO_TOKEN, &attrname, 0);
   12574 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   12575 
   12576 			/* Variation clean up */
   12577 			rc = close(fd);
   12578 			rc |= remove(DUMMY_FILE);
   12579 			if (rc == -1) {
   12580 				DMLOG_PRINT(DMLVL_DEBUG,
   12581 					    "Unable to clean up variation! (errno = %d)\n",
   12582 					    errno);
   12583 			}
   12584 			dm_handle_free(hanp, hlen);
   12585 		}
   12586 	}
   12587 
   12588 	/*
   12589 	 * TEST    : dm_set_inherit - global handle
   12590 	 * EXPECTED: rc = -1, errno = EBADF
   12591 	 */
   12592 	if (DMVAR_EXEC(SET_INHERIT_BASE + 7)) {
   12593 		dm_attrname_t attrname;
   12594 
   12595 		/* Variation set up */
   12596 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   12597 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   12598 
   12599 		/* Variation */
   12600 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
   12601 		rc = dm_set_inherit(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN,
   12602 				    DM_NO_TOKEN, &attrname, 0);
   12603 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   12604 
   12605 		/* Variation clean up */
   12606 	}
   12607 
   12608 	/*
   12609 	 * TEST    : dm_set_inherit - file handle
   12610 	 * EXPECTED: rc = -1, errno = EINVAL
   12611 	 */
   12612 	if (DMVAR_EXEC(SET_INHERIT_BASE + 8)) {
   12613 		int fd;
   12614 		void *hanp;
   12615 		size_t hlen;
   12616 		dm_attrname_t attrname;
   12617 
   12618 		/* Variation set up */
   12619 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   12620 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   12621 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   12622 		if ((rc = system(command)) == -1) {
   12623 			/* No clean up */
   12624 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   12625 			remove(DUMMY_FILE);
   12626 		} else if ((rc = dm_path_to_handle(DUMMY_FILE, &hanp, &hlen)) ==
   12627 			   -1) {
   12628 			close(fd);
   12629 			remove(DUMMY_FILE);
   12630 		}
   12631 		if (fd == -1 || rc == -1) {
   12632 			DMLOG_PRINT(DMLVL_DEBUG,
   12633 				    "Unable to set up variation! (errno = %d)\n",
   12634 				    errno);
   12635 			DMVAR_SKIP();
   12636 		} else {
   12637 			/* Variation */
   12638 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file handle)\n",
   12639 				    szFuncName);
   12640 			rc = dm_set_inherit(sid, hanp, hlen, DM_NO_TOKEN,
   12641 					    &attrname, 0);
   12642 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   12643 
   12644 			/* Variation clean up */
   12645 			rc = close(fd);
   12646 			rc |= remove(DUMMY_FILE);
   12647 			if (rc == -1) {
   12648 				DMLOG_PRINT(DMLVL_DEBUG,
   12649 					    "Unable to clean up variation! (errno = %d)\n",
   12650 					    errno);
   12651 			}
   12652 			dm_handle_free(hanp, hlen);
   12653 		}
   12654 	}
   12655 
   12656 	/*
   12657 	 * TEST    : dm_set_inherit - directory handle
   12658 	 * EXPECTED: rc = -1, errno = EINVAL
   12659 	 */
   12660 	if (DMVAR_EXEC(SET_INHERIT_BASE + 9)) {
   12661 		void *hanp;
   12662 		size_t hlen;
   12663 		dm_attrname_t attrname;
   12664 
   12665 		/* Variation set up */
   12666 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   12667 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   12668 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   12669 			/* No clean up */
   12670 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   12671 			   == -1) {
   12672 			rmdir(DUMMY_SUBDIR);
   12673 		}
   12674 		if (rc == -1) {
   12675 			DMLOG_PRINT(DMLVL_DEBUG,
   12676 				    "Unable to set up variation! (errno = %d)\n",
   12677 				    errno);
   12678 			DMVAR_SKIP();
   12679 		} else {
   12680 			/* Variation */
   12681 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir handle)\n",
   12682 				    szFuncName);
   12683 			rc = dm_set_inherit(sid, hanp, hlen, DM_NO_TOKEN,
   12684 					    &attrname, 0);
   12685 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   12686 
   12687 			/* Variation clean up */
   12688 			rc = rmdir(DUMMY_SUBDIR);
   12689 			if (rc == -1) {
   12690 				DMLOG_PRINT(DMLVL_DEBUG,
   12691 					    "Unable to clean up variation! (errno = %d)\n",
   12692 					    errno);
   12693 			}
   12694 			dm_handle_free(hanp, hlen);
   12695 		}
   12696 	}
   12697 
   12698 	szFuncName = "dm_clear_inherit";
   12699 
   12700 	/*
   12701 	 * TEST    : dm_clear_inherit - invalid sid
   12702 	 * EXPECTED: rc = -1, errno = EINVAL
   12703 	 */
   12704 	if (DMVAR_EXEC(CLEAR_INHERIT_BASE + 1)) {
   12705 		int fd;
   12706 		void *hanp;
   12707 		size_t hlen;
   12708 		dm_attrname_t attrname;
   12709 
   12710 		/* Variation set up */
   12711 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   12712 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   12713 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   12714 		if ((rc = system(command)) == -1) {
   12715 			/* No clean up */
   12716 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   12717 			remove(DUMMY_FILE);
   12718 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   12719 			   == -1) {
   12720 			close(fd);
   12721 			remove(DUMMY_FILE);
   12722 		}
   12723 		if (fd == -1 || rc == -1) {
   12724 			DMLOG_PRINT(DMLVL_DEBUG,
   12725 				    "Unable to set up variation! (errno = %d)\n",
   12726 				    errno);
   12727 			DMVAR_SKIP();
   12728 		} else {
   12729 			/* Variation */
   12730 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
   12731 				    szFuncName);
   12732 			rc = dm_clear_inherit(INVALID_ADDR, hanp, hlen,
   12733 					      DM_NO_TOKEN, &attrname);
   12734 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   12735 
   12736 			/* Variation clean up */
   12737 			rc = close(fd);
   12738 			rc |= remove(DUMMY_FILE);
   12739 			if (rc == -1) {
   12740 				DMLOG_PRINT(DMLVL_DEBUG,
   12741 					    "Unable to clean up variation! (errno = %d)\n",
   12742 					    errno);
   12743 			}
   12744 			dm_handle_free(hanp, hlen);
   12745 		}
   12746 	}
   12747 
   12748 	/*
   12749 	 * TEST    : dm_clear_inherit - invalid hanp
   12750 	 * EXPECTED: rc = -1, errno = EFAULT
   12751 	 */
   12752 	if (DMVAR_EXEC(CLEAR_INHERIT_BASE + 2)) {
   12753 		int fd;
   12754 		void *hanp;
   12755 		size_t hlen;
   12756 		dm_attrname_t attrname;
   12757 
   12758 		/* Variation set up */
   12759 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   12760 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   12761 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   12762 		if ((rc = system(command)) == -1) {
   12763 			/* No clean up */
   12764 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   12765 			remove(DUMMY_FILE);
   12766 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   12767 			   == -1) {
   12768 			close(fd);
   12769 			remove(DUMMY_FILE);
   12770 		}
   12771 		if (fd == -1 || rc == -1) {
   12772 			DMLOG_PRINT(DMLVL_DEBUG,
   12773 				    "Unable to set up variation! (errno = %d)\n",
   12774 				    errno);
   12775 			DMVAR_SKIP();
   12776 		} else {
   12777 			/* Variation */
   12778 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
   12779 				    szFuncName);
   12780 			rc = dm_clear_inherit(sid, (void *)INVALID_ADDR, hlen,
   12781 					      DM_NO_TOKEN, &attrname);
   12782 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   12783 
   12784 			/* Variation clean up */
   12785 			rc = close(fd);
   12786 			rc |= remove(DUMMY_FILE);
   12787 			if (rc == -1) {
   12788 				DMLOG_PRINT(DMLVL_DEBUG,
   12789 					    "Unable to clean up variation! (errno = %d)\n",
   12790 					    errno);
   12791 			}
   12792 			dm_handle_free(hanp, hlen);
   12793 		}
   12794 	}
   12795 
   12796 	/*
   12797 	 * TEST    : dm_clear_inherit - invalid hlen
   12798 	 * EXPECTED: rc = -1, errno = EBADF
   12799 	 */
   12800 	if (DMVAR_EXEC(CLEAR_INHERIT_BASE + 3)) {
   12801 		int fd;
   12802 		void *hanp;
   12803 		size_t hlen;
   12804 		dm_attrname_t attrname;
   12805 
   12806 		/* Variation set up */
   12807 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   12808 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   12809 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   12810 		if ((rc = system(command)) == -1) {
   12811 			/* No clean up */
   12812 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   12813 			remove(DUMMY_FILE);
   12814 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   12815 			   == -1) {
   12816 			close(fd);
   12817 			remove(DUMMY_FILE);
   12818 		}
   12819 		if (fd == -1 || rc == -1) {
   12820 			DMLOG_PRINT(DMLVL_DEBUG,
   12821 				    "Unable to set up variation! (errno = %d)\n",
   12822 				    errno);
   12823 			DMVAR_SKIP();
   12824 		} else {
   12825 			/* Variation */
   12826 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
   12827 				    szFuncName);
   12828 			rc = dm_clear_inherit(sid, hanp, INVALID_ADDR,
   12829 					      DM_NO_TOKEN, &attrname);
   12830 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   12831 
   12832 			/* Variation clean up */
   12833 			rc = close(fd);
   12834 			rc |= remove(DUMMY_FILE);
   12835 			if (rc == -1) {
   12836 				DMLOG_PRINT(DMLVL_DEBUG,
   12837 					    "Unable to clean up variation! (errno = %d)\n",
   12838 					    errno);
   12839 			}
   12840 			dm_handle_free(hanp, hlen);
   12841 		}
   12842 	}
   12843 
   12844 	/*
   12845 	 * TEST    : dm_clear_inherit - invalid token
   12846 	 * EXPECTED: rc = -1, errno = EINVAL
   12847 	 */
   12848 	if (DMVAR_EXEC(CLEAR_INHERIT_BASE + 4)) {
   12849 		int fd;
   12850 		void *hanp;
   12851 		size_t hlen;
   12852 		dm_attrname_t attrname;
   12853 
   12854 		/* Variation set up */
   12855 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   12856 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   12857 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   12858 		if ((rc = system(command)) == -1) {
   12859 			/* No clean up */
   12860 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   12861 			remove(DUMMY_FILE);
   12862 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   12863 			   == -1) {
   12864 			close(fd);
   12865 			remove(DUMMY_FILE);
   12866 		}
   12867 		if (fd == -1 || rc == -1) {
   12868 			DMLOG_PRINT(DMLVL_DEBUG,
   12869 				    "Unable to set up variation! (errno = %d)\n",
   12870 				    errno);
   12871 			DMVAR_SKIP();
   12872 		} else {
   12873 			/* Variation */
   12874 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
   12875 				    szFuncName);
   12876 			rc = dm_clear_inherit(sid, hanp, hlen, INVALID_ADDR,
   12877 					      &attrname);
   12878 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   12879 
   12880 			/* Variation clean up */
   12881 			rc = close(fd);
   12882 			rc |= remove(DUMMY_FILE);
   12883 			if (rc == -1) {
   12884 				DMLOG_PRINT(DMLVL_DEBUG,
   12885 					    "Unable to clean up variation! (errno = %d)\n",
   12886 					    errno);
   12887 			}
   12888 			dm_handle_free(hanp, hlen);
   12889 		}
   12890 	}
   12891 
   12892 	/*
   12893 	 * TEST    : dm_clear_inherit - invalid attrnamep
   12894 	 * EXPECTED: rc = -1, errno = EFAULT
   12895 	 */
   12896 	if (DMVAR_EXEC(CLEAR_INHERIT_BASE + 5)) {
   12897 		int fd;
   12898 		void *hanp;
   12899 		size_t hlen;
   12900 		dm_attrname_t attrname;
   12901 
   12902 		/* Variation set up */
   12903 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   12904 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   12905 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   12906 		if ((rc = system(command)) == -1) {
   12907 			/* No clean up */
   12908 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   12909 			remove(DUMMY_FILE);
   12910 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   12911 			   == -1) {
   12912 			close(fd);
   12913 			remove(DUMMY_FILE);
   12914 		}
   12915 		if (fd == -1 || rc == -1) {
   12916 			DMLOG_PRINT(DMLVL_DEBUG,
   12917 				    "Unable to set up variation! (errno = %d)\n",
   12918 				    errno);
   12919 			DMVAR_SKIP();
   12920 		} else {
   12921 			/* Variation */
   12922 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid attrnamep)\n",
   12923 				    szFuncName);
   12924 			rc = dm_clear_inherit(sid, hanp, hlen, DM_NO_TOKEN,
   12925 					      (dm_attrname_t *) INVALID_ADDR);
   12926 			DMVAR_ENDFAILEXP(szFuncName, -1, rc,
   12927 					 persInheritAttr ? EFAULT : ENOSYS);
   12928 
   12929 			/* Variation clean up */
   12930 			rc = close(fd);
   12931 			rc |= remove(DUMMY_FILE);
   12932 			if (rc == -1) {
   12933 				DMLOG_PRINT(DMLVL_DEBUG,
   12934 					    "Unable to clean up variation! (errno = %d)\n",
   12935 					    errno);
   12936 			}
   12937 			dm_handle_free(hanp, hlen);
   12938 		}
   12939 	}
   12940 
   12941 	/*
   12942 	 * TEST    : dm_clear_inherit - DM_NO_SESSION sid
   12943 	 * EXPECTED: rc = -1, errno = EINVAL
   12944 	 */
   12945 	if (DMVAR_EXEC(CLEAR_INHERIT_BASE + 6)) {
   12946 		int fd;
   12947 		void *hanp;
   12948 		size_t hlen;
   12949 		dm_attrname_t attrname;
   12950 
   12951 		/* Variation set up */
   12952 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   12953 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   12954 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   12955 		if ((rc = system(command)) == -1) {
   12956 			/* No clean up */
   12957 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   12958 			remove(DUMMY_FILE);
   12959 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   12960 			   == -1) {
   12961 			close(fd);
   12962 			remove(DUMMY_FILE);
   12963 		}
   12964 		if (fd == -1 || rc == -1) {
   12965 			DMLOG_PRINT(DMLVL_DEBUG,
   12966 				    "Unable to set up variation! (errno = %d)\n",
   12967 				    errno);
   12968 			DMVAR_SKIP();
   12969 		} else {
   12970 			/* Variation */
   12971 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
   12972 				    szFuncName);
   12973 			rc = dm_clear_inherit(DM_NO_SESSION, hanp, hlen,
   12974 					      DM_NO_TOKEN, &attrname);
   12975 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   12976 
   12977 			/* Variation clean up */
   12978 			rc = close(fd);
   12979 			rc |= remove(DUMMY_FILE);
   12980 			if (rc == -1) {
   12981 				DMLOG_PRINT(DMLVL_DEBUG,
   12982 					    "Unable to clean up variation! (errno = %d)\n",
   12983 					    errno);
   12984 			}
   12985 			dm_handle_free(hanp, hlen);
   12986 		}
   12987 	}
   12988 
   12989 	/*
   12990 	 * TEST    : dm_clear_inherit - global handle
   12991 	 * EXPECTED: rc = -1, errno = EBADF
   12992 	 */
   12993 	if (DMVAR_EXEC(CLEAR_INHERIT_BASE + 7)) {
   12994 		dm_attrname_t attrname;
   12995 
   12996 		/* Variation set up */
   12997 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   12998 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   12999 
   13000 		/* Variation */
   13001 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
   13002 		rc = dm_clear_inherit(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN,
   13003 				      DM_NO_TOKEN, &attrname);
   13004 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   13005 
   13006 		/* Variation clean up */
   13007 	}
   13008 
   13009 	/*
   13010 	 * TEST    : dm_clear_inherit - file handle
   13011 	 * EXPECTED: rc = -1, errno = EINVAL
   13012 	 */
   13013 	if (DMVAR_EXEC(CLEAR_INHERIT_BASE + 8)) {
   13014 		int fd;
   13015 		void *hanp;
   13016 		size_t hlen;
   13017 		dm_attrname_t attrname;
   13018 
   13019 		/* Variation set up */
   13020 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   13021 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   13022 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   13023 		if ((rc = system(command)) == -1) {
   13024 			/* No clean up */
   13025 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   13026 			remove(DUMMY_FILE);
   13027 		} else if ((rc = dm_path_to_handle(DUMMY_FILE, &hanp, &hlen)) ==
   13028 			   -1) {
   13029 			close(fd);
   13030 			remove(DUMMY_FILE);
   13031 		}
   13032 		if (fd == -1 || rc == -1) {
   13033 			DMLOG_PRINT(DMLVL_DEBUG,
   13034 				    "Unable to set up variation! (errno = %d)\n",
   13035 				    errno);
   13036 			DMVAR_SKIP();
   13037 		} else {
   13038 			/* Variation */
   13039 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file handle)\n",
   13040 				    szFuncName);
   13041 			rc = dm_clear_inherit(sid, hanp, hlen, DM_NO_TOKEN,
   13042 					      &attrname);
   13043 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   13044 
   13045 			/* Variation clean up */
   13046 			rc = close(fd);
   13047 			rc |= remove(DUMMY_FILE);
   13048 			if (rc == -1) {
   13049 				DMLOG_PRINT(DMLVL_DEBUG,
   13050 					    "Unable to clean up variation! (errno = %d)\n",
   13051 					    errno);
   13052 			}
   13053 			dm_handle_free(hanp, hlen);
   13054 		}
   13055 	}
   13056 
   13057 	/*
   13058 	 * TEST    : dm_clear_inherit - directory handle
   13059 	 * EXPECTED: rc = -1, errno = EINVAL
   13060 	 */
   13061 	if (DMVAR_EXEC(CLEAR_INHERIT_BASE + 9)) {
   13062 		void *hanp;
   13063 		size_t hlen;
   13064 		dm_attrname_t attrname;
   13065 
   13066 		/* Variation set up */
   13067 		memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
   13068 		memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
   13069 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   13070 			/* No clean up */
   13071 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   13072 			   == -1) {
   13073 			rmdir(DUMMY_SUBDIR);
   13074 		}
   13075 		if (rc == -1) {
   13076 			DMLOG_PRINT(DMLVL_DEBUG,
   13077 				    "Unable to set up variation! (errno = %d)\n",
   13078 				    errno);
   13079 			DMVAR_SKIP();
   13080 		} else {
   13081 			/* Variation */
   13082 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir handle)\n",
   13083 				    szFuncName);
   13084 			rc = dm_clear_inherit(sid, hanp, hlen, DM_NO_TOKEN,
   13085 					      &attrname);
   13086 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   13087 
   13088 			/* Variation clean up */
   13089 			rc = rmdir(DUMMY_SUBDIR);
   13090 			if (rc == -1) {
   13091 				DMLOG_PRINT(DMLVL_DEBUG,
   13092 					    "Unable to clean up variation! (errno = %d)\n",
   13093 					    errno);
   13094 			}
   13095 			dm_handle_free(hanp, hlen);
   13096 		}
   13097 	}
   13098 
   13099 	szFuncName = "dm_getall_inherit";
   13100 
   13101 	/*
   13102 	 * TEST    : dm_getall_inherit - invalid sid
   13103 	 * EXPECTED: rc = -1, errno = EINVAL
   13104 	 */
   13105 	if (DMVAR_EXEC(GETALL_INHERIT_BASE + 1)) {
   13106 		int fd;
   13107 		void *hanp;
   13108 		size_t hlen;
   13109 		dm_inherit_t inheritbuf;
   13110 		u_int nelem;
   13111 
   13112 		/* Variation set up */
   13113 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   13114 		if ((rc = system(command)) == -1) {
   13115 			/* No clean up */
   13116 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   13117 			remove(DUMMY_FILE);
   13118 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   13119 			   == -1) {
   13120 			close(fd);
   13121 			remove(DUMMY_FILE);
   13122 		}
   13123 		if (fd == -1 || rc == -1) {
   13124 			DMLOG_PRINT(DMLVL_DEBUG,
   13125 				    "Unable to set up variation! (errno = %d)\n",
   13126 				    errno);
   13127 			DMVAR_SKIP();
   13128 		} else {
   13129 			/* Variation */
   13130 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
   13131 				    szFuncName);
   13132 			rc = dm_getall_inherit(INVALID_ADDR, hanp, hlen,
   13133 					       DM_NO_TOKEN, 1, &inheritbuf,
   13134 					       &nelem);
   13135 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   13136 
   13137 			/* Variation clean up */
   13138 			rc = close(fd);
   13139 			rc |= remove(DUMMY_FILE);
   13140 			if (rc == -1) {
   13141 				DMLOG_PRINT(DMLVL_DEBUG,
   13142 					    "Unable to clean up variation! (errno = %d)\n",
   13143 					    errno);
   13144 			}
   13145 			dm_handle_free(hanp, hlen);
   13146 		}
   13147 	}
   13148 
   13149 	/*
   13150 	 * TEST    : dm_getall_inherit - invalid hanp
   13151 	 * EXPECTED: rc = -1, errno = EFAULT
   13152 	 */
   13153 	if (DMVAR_EXEC(GETALL_INHERIT_BASE + 2)) {
   13154 		int fd;
   13155 		void *hanp;
   13156 		size_t hlen;
   13157 		dm_inherit_t inheritbuf;
   13158 		u_int nelem;
   13159 
   13160 		/* Variation set up */
   13161 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   13162 		if ((rc = system(command)) == -1) {
   13163 			/* No clean up */
   13164 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   13165 			remove(DUMMY_FILE);
   13166 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   13167 			   == -1) {
   13168 			close(fd);
   13169 			remove(DUMMY_FILE);
   13170 		}
   13171 		if (fd == -1 || rc == -1) {
   13172 			DMLOG_PRINT(DMLVL_DEBUG,
   13173 				    "Unable to set up variation! (errno = %d)\n",
   13174 				    errno);
   13175 			DMVAR_SKIP();
   13176 		} else {
   13177 			/* Variation */
   13178 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
   13179 				    szFuncName);
   13180 			rc = dm_getall_inherit(sid, (void *)INVALID_ADDR, hlen,
   13181 					       DM_NO_TOKEN, 1, &inheritbuf,
   13182 					       &nelem);
   13183 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
   13184 
   13185 			/* Variation clean up */
   13186 			rc = close(fd);
   13187 			rc |= remove(DUMMY_FILE);
   13188 			if (rc == -1) {
   13189 				DMLOG_PRINT(DMLVL_DEBUG,
   13190 					    "Unable to clean up variation! (errno = %d)\n",
   13191 					    errno);
   13192 			}
   13193 			dm_handle_free(hanp, hlen);
   13194 		}
   13195 	}
   13196 
   13197 	/*
   13198 	 * TEST    : dm_getall_inherit - invalid hlen
   13199 	 * EXPECTED: rc = -1, errno = EBADF
   13200 	 */
   13201 	if (DMVAR_EXEC(GETALL_INHERIT_BASE + 3)) {
   13202 		int fd;
   13203 		void *hanp;
   13204 		size_t hlen;
   13205 		dm_inherit_t inheritbuf;
   13206 		u_int nelem;
   13207 
   13208 		/* Variation set up */
   13209 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   13210 		if ((rc = system(command)) == -1) {
   13211 			/* No clean up */
   13212 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   13213 			remove(DUMMY_FILE);
   13214 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   13215 			   == -1) {
   13216 			close(fd);
   13217 			remove(DUMMY_FILE);
   13218 		}
   13219 		if (fd == -1 || rc == -1) {
   13220 			DMLOG_PRINT(DMLVL_DEBUG,
   13221 				    "Unable to set up variation! (errno = %d)\n",
   13222 				    errno);
   13223 			DMVAR_SKIP();
   13224 		} else {
   13225 			/* Variation */
   13226 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
   13227 				    szFuncName);
   13228 			rc = dm_getall_inherit(sid, hanp, INVALID_ADDR,
   13229 					       DM_NO_TOKEN, 1, &inheritbuf,
   13230 					       &nelem);
   13231 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   13232 
   13233 			/* Variation clean up */
   13234 			rc = close(fd);
   13235 			rc |= remove(DUMMY_FILE);
   13236 			if (rc == -1) {
   13237 				DMLOG_PRINT(DMLVL_DEBUG,
   13238 					    "Unable to clean up variation! (errno = %d)\n",
   13239 					    errno);
   13240 			}
   13241 			dm_handle_free(hanp, hlen);
   13242 		}
   13243 	}
   13244 
   13245 	/*
   13246 	 * TEST    : dm_getall_inherit - invalid token
   13247 	 * EXPECTED: rc = -1, errno = EINVAL
   13248 	 */
   13249 	if (DMVAR_EXEC(GETALL_INHERIT_BASE + 4)) {
   13250 		int fd;
   13251 		void *hanp;
   13252 		size_t hlen;
   13253 		dm_inherit_t inheritbuf;
   13254 		u_int nelem;
   13255 
   13256 		/* Variation set up */
   13257 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   13258 		if ((rc = system(command)) == -1) {
   13259 			/* No clean up */
   13260 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   13261 			remove(DUMMY_FILE);
   13262 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   13263 			   == -1) {
   13264 			close(fd);
   13265 			remove(DUMMY_FILE);
   13266 		}
   13267 		if (fd == -1 || rc == -1) {
   13268 			DMLOG_PRINT(DMLVL_DEBUG,
   13269 				    "Unable to set up variation! (errno = %d)\n",
   13270 				    errno);
   13271 			DMVAR_SKIP();
   13272 		} else {
   13273 			/* Variation */
   13274 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n",
   13275 				    szFuncName);
   13276 			rc = dm_getall_inherit(sid, hanp, hlen, INVALID_ADDR, 1,
   13277 					       &inheritbuf, &nelem);
   13278 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   13279 
   13280 			/* Variation clean up */
   13281 			rc = close(fd);
   13282 			rc |= remove(DUMMY_FILE);
   13283 			if (rc == -1) {
   13284 				DMLOG_PRINT(DMLVL_DEBUG,
   13285 					    "Unable to clean up variation! (errno = %d)\n",
   13286 					    errno);
   13287 			}
   13288 			dm_handle_free(hanp, hlen);
   13289 		}
   13290 	}
   13291 
   13292 	/*
   13293 	 * TEST    : dm_getall_inherit - invalid inheritbufp
   13294 	 * EXPECTED: rc = -1, errno = EFAULT
   13295 	 */
   13296 	if (DMVAR_EXEC(GETALL_INHERIT_BASE + 5)) {
   13297 		int fd;
   13298 		void *hanp;
   13299 		size_t hlen;
   13300 		u_int nelem;
   13301 
   13302 		/* Variation set up */
   13303 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   13304 		if ((rc = system(command)) == -1) {
   13305 			/* No clean up */
   13306 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   13307 			remove(DUMMY_FILE);
   13308 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   13309 			   == -1) {
   13310 			close(fd);
   13311 			remove(DUMMY_FILE);
   13312 		}
   13313 		if (fd == -1 || rc == -1) {
   13314 			DMLOG_PRINT(DMLVL_DEBUG,
   13315 				    "Unable to set up variation! (errno = %d)\n",
   13316 				    errno);
   13317 			DMVAR_SKIP();
   13318 		} else {
   13319 			/* Variation */
   13320 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid inheritbufp)\n",
   13321 				    szFuncName);
   13322 			rc = dm_getall_inherit(sid, hanp, hlen, DM_NO_TOKEN, 1,
   13323 					       (dm_inherit_t *) INVALID_ADDR,
   13324 					       &nelem);
   13325 			DMVAR_ENDFAILEXP(szFuncName, -1, rc,
   13326 					 persInheritAttr ? EFAULT : ENOSYS);
   13327 
   13328 			/* Variation clean up */
   13329 			rc = close(fd);
   13330 			rc |= remove(DUMMY_FILE);
   13331 			if (rc == -1) {
   13332 				DMLOG_PRINT(DMLVL_DEBUG,
   13333 					    "Unable to clean up variation! (errno = %d)\n",
   13334 					    errno);
   13335 			}
   13336 			dm_handle_free(hanp, hlen);
   13337 		}
   13338 	}
   13339 
   13340 	/*
   13341 	 * TEST    : dm_getall_inherit - DM_NO_SESSION sid
   13342 	 * EXPECTED: rc = -1, errno = EINVAL
   13343 	 */
   13344 	if (DMVAR_EXEC(GETALL_INHERIT_BASE + 6)) {
   13345 		int fd;
   13346 		void *hanp;
   13347 		size_t hlen;
   13348 		dm_inherit_t inheritbuf;
   13349 		u_int nelem;
   13350 
   13351 		/* Variation set up */
   13352 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   13353 		if ((rc = system(command)) == -1) {
   13354 			/* No clean up */
   13355 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   13356 			remove(DUMMY_FILE);
   13357 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
   13358 			   == -1) {
   13359 			close(fd);
   13360 			remove(DUMMY_FILE);
   13361 		}
   13362 		if (fd == -1 || rc == -1) {
   13363 			DMLOG_PRINT(DMLVL_DEBUG,
   13364 				    "Unable to set up variation! (errno = %d)\n",
   13365 				    errno);
   13366 			DMVAR_SKIP();
   13367 		} else {
   13368 			/* Variation */
   13369 			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n",
   13370 				    szFuncName);
   13371 			rc = dm_getall_inherit(DM_NO_SESSION, hanp, hlen,
   13372 					       DM_NO_TOKEN, 1, &inheritbuf,
   13373 					       &nelem);
   13374 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   13375 
   13376 			/* Variation clean up */
   13377 			rc = close(fd);
   13378 			rc |= remove(DUMMY_FILE);
   13379 			if (rc == -1) {
   13380 				DMLOG_PRINT(DMLVL_DEBUG,
   13381 					    "Unable to clean up variation! (errno = %d)\n",
   13382 					    errno);
   13383 			}
   13384 			dm_handle_free(hanp, hlen);
   13385 		}
   13386 	}
   13387 
   13388 	/*
   13389 	 * TEST    : dm_getall_inherit - global handle
   13390 	 * EXPECTED: rc = -1, errno = EBADF
   13391 	 */
   13392 	if (DMVAR_EXEC(GETALL_INHERIT_BASE + 7)) {
   13393 		dm_inherit_t inheritbuf;
   13394 		u_int nelem;
   13395 
   13396 		/* Variation set up */
   13397 
   13398 		/* Variation */
   13399 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
   13400 		rc = dm_getall_inherit(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN,
   13401 				       DM_NO_TOKEN, 1, &inheritbuf, &nelem);
   13402 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
   13403 
   13404 		/* Variation clean up */
   13405 	}
   13406 
   13407 	/*
   13408 	 * TEST    : dm_getall_inherit - file handle
   13409 	 * EXPECTED: rc = -1, errno = EINVAL
   13410 	 */
   13411 	if (DMVAR_EXEC(GETALL_INHERIT_BASE + 8)) {
   13412 		int fd;
   13413 		void *hanp;
   13414 		size_t hlen;
   13415 		dm_inherit_t inheritbuf;
   13416 		u_int nelem;
   13417 
   13418 		/* Variation set up */
   13419 		sprintf(command, "cp %s %s", DUMMY_TMP, DUMMY_FILE);
   13420 		if ((rc = system(command)) == -1) {
   13421 			/* No clean up */
   13422 		} else if ((fd = open(DUMMY_FILE, O_RDWR)) == -1) {
   13423 			remove(DUMMY_FILE);
   13424 		} else if ((rc = dm_path_to_handle(DUMMY_FILE, &hanp, &hlen)) ==
   13425 			   -1) {
   13426 			close(fd);
   13427 			remove(DUMMY_FILE);
   13428 		}
   13429 		if (fd == -1 || rc == -1) {
   13430 			DMLOG_PRINT(DMLVL_DEBUG,
   13431 				    "Unable to set up variation! (errno = %d)\n",
   13432 				    errno);
   13433 			DMVAR_SKIP();
   13434 		} else {
   13435 			/* Variation */
   13436 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file handle)\n",
   13437 				    szFuncName);
   13438 			rc = dm_getall_inherit(sid, hanp, hlen, DM_NO_TOKEN, 1,
   13439 					       &inheritbuf, &nelem);
   13440 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   13441 
   13442 			/* Variation clean up */
   13443 			rc = close(fd);
   13444 			rc |= remove(DUMMY_FILE);
   13445 			if (rc == -1) {
   13446 				DMLOG_PRINT(DMLVL_DEBUG,
   13447 					    "Unable to clean up variation! (errno = %d)\n",
   13448 					    errno);
   13449 			}
   13450 			dm_handle_free(hanp, hlen);
   13451 		}
   13452 	}
   13453 
   13454 	/*
   13455 	 * TEST    : dm_getall_inherit - directory handle
   13456 	 * EXPECTED: rc = -1, errno = EINVAL
   13457 	 */
   13458 	if (DMVAR_EXEC(GETALL_INHERIT_BASE + 9)) {
   13459 		void *hanp;
   13460 		size_t hlen;
   13461 		dm_inherit_t inheritbuf;
   13462 		u_int nelem;
   13463 
   13464 		/* Variation set up */
   13465 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
   13466 			/* No clean up */
   13467 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
   13468 			   == -1) {
   13469 			rmdir(DUMMY_SUBDIR);
   13470 		}
   13471 		if (rc == -1) {
   13472 			DMLOG_PRINT(DMLVL_DEBUG,
   13473 				    "Unable to set up variation! (errno = %d)\n",
   13474 				    errno);
   13475 			DMVAR_SKIP();
   13476 		} else {
   13477 			/* Variation */
   13478 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir handle)\n",
   13479 				    szFuncName);
   13480 			rc = dm_getall_inherit(sid, hanp, hlen, DM_NO_TOKEN, 1,
   13481 					       &inheritbuf, &nelem);
   13482 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
   13483 
   13484 			/* Variation clean up */
   13485 			rc = rmdir(DUMMY_SUBDIR);
   13486 			if (rc == -1) {
   13487 				DMLOG_PRINT(DMLVL_DEBUG,
   13488 					    "Unable to clean up variation! (errno = %d)\n",
   13489 					    errno);
   13490 			}
   13491 			dm_handle_free(hanp, hlen);
   13492 		}
   13493 	}
   13494 
   13495 	rc = dm_destroy_session(sid);
   13496 	if (rc == -1) {
   13497 		DMLOG_PRINT(DMLVL_ERR,
   13498 			    "dm_destroy_session failed! (rc = %d, errno = %d)\n",
   13499 			    rc, errno);
   13500 	}
   13501 
   13502 	remove(DUMMY_TMP);
   13503 
   13504 	DMLOG_STOP();
   13505 
   13506 	tst_exit();
   13507 }
   13508