• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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	: objref.c
21  *
22  * VARIATIONS	: 24
23  *
24  * API'S TESTED	: dm_obj_ref_hold
25  * 		  dm_obj_ref_rele
26  * 		  dm_obj_ref_query
27  */
28 #include <string.h>
29 #include <stdio.h>
30 #include <errno.h>
31 #include <pthread.h>
32 #include <unistd.h>
33 #include <sys/stat.h>
34 #include <sys/mount.h>
35 #include <fcntl.h>
36 #include "dm_test.h"
37 
38 pthread_t tid;
39 dm_sessid_t sid;
40 char dmMsgBuf[4096];
41 char command[4096];
42 char *mountPt;
43 char *deviceNm;
44 char DummySubdir[FILENAME_MAX];
45 int runTestOnCreate;
46 
47 void *Thread(void *);
48 
main(int argc,char ** argv)49 int main(int argc, char **argv)
50 {
51 
52 	char *varstr;
53 	int rc;
54 	char *szSessionInfo = "dm_test session info";
55 	dm_eventset_t events;
56 
57 	DMOPT_PARSE(argc, argv);
58 	DMLOG_START();
59 
60 	DMEV_ZERO(events);
61 	DMEV_SET(DM_EVENT_MOUNT, events);
62 
63 	/* CANNOT DO ANYTHING WITHOUT SUCCESSFUL INITIALIZATION!!! */
64 	if ((rc = dm_init_service(&varstr)) != 0) {
65 		DMLOG_PRINT(DMLVL_ERR,
66 			    "dm_init_service failed! (rc = %d, errno = %d)\n",
67 			    rc, errno);
68 		DM_EXIT();
69 	} else if ((rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &sid))
70 		   == -1) {
71 		DMLOG_PRINT(DMLVL_ERR,
72 			    "dm_create_session failed! (rc = %d, errno = %d)\n",
73 			    rc, errno);
74 		DM_EXIT();
75 	} else
76 	    if ((rc =
77 		 dm_set_disp(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN, DM_NO_TOKEN,
78 			     &events, DM_EVENT_MAX)) == -1) {
79 		DMLOG_PRINT(DMLVL_ERR,
80 			    "dm_set_disp failed! (rc = %d, errno = %d)\n", rc,
81 			    errno);
82 		dm_destroy_session(sid);
83 		DM_EXIT();
84 	} else if ((rc = pthread_create(&tid, NULL, Thread, NULL)) != 0) {
85 		DMLOG_PRINT(DMLVL_ERR,
86 			    "pthread_create failed! (rc = %d, errno = %d)\n",
87 			    rc, errno);
88 		dm_destroy_session(sid);
89 		DM_EXIT();
90 	} else if ((rc = dmimpl_mount(&mountPt, &deviceNm)) == -1) {
91 		DMLOG_PRINT(DMLVL_ERR,
92 			    "dmimpl_mount failed! (rc = %d, errno = %d)\n", rc,
93 			    errno);
94 		dm_destroy_session(sid);
95 		DM_EXIT();
96 	} else {
97 		sprintf(DummySubdir, "%s/%s", mountPt, DUMMY_SUBDIR);
98 
99 		rmdir(DummySubdir);
100 	}
101 
102 	/* This is what kicks off the test case, variations done in thread */
103 	runTestOnCreate = 1;
104 	rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE);
105 	runTestOnCreate = 0;
106 	if (rc == -1) {
107 		DMLOG_PRINT(DMLVL_ERR, "mkdir failed! (rc = %d, errno = %d)\n",
108 			    rc, errno);
109 	}
110 
111 	rc = rmdir(DummySubdir);
112 	if (rc == -1) {
113 		DMLOG_PRINT(DMLVL_ERR, "rmdir failed! (rc = %d, errno = %d)\n",
114 			    rc, errno);
115 	}
116 
117 	rc = umount(mountPt);
118 	if (rc == -1) {
119 		DMLOG_PRINT(DMLVL_ERR, "umount failed! (rc = %d, errno = %d)\n",
120 			    rc, errno);
121 	}
122 
123 	pthread_join(tid, NULL);
124 
125 	rc = dm_destroy_session(sid);
126 	if (rc == -1) {
127 		DMLOG_PRINT(DMLVL_ERR,
128 			    "dm_destroy_session failed! (rc = %d, errno = %d)\n",
129 			    rc, errno);
130 	}
131 
132 	DMLOG_STOP();
133 
134 	tst_exit();
135 }
136 
DoTest(dm_token_t token,void * hanp,size_t hlen)137 void DoTest(dm_token_t token, void *hanp, size_t hlen)
138 {
139 
140 	char *szFuncName;
141 	int rc;
142 
143 	DMLOG_PRINT(DMLVL_DEBUG, "Starting DMAPI object reference tests\n");
144 
145 	szFuncName = "dm_obj_ref_hold";
146 
147 	/*
148 	 * TEST    : dm_obj_ref_hold - invalid sid
149 	 * EXPECTED: rc = -1, errno = EINVAL
150 	 */
151 	if (DMVAR_EXEC(OBJ_REF_HOLD_BASE + 1)) {
152 
153 		/* Variation set up */
154 
155 		/* Variation */
156 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n", szFuncName);
157 		rc = dm_obj_ref_hold(INVALID_ADDR, token, hanp, hlen);
158 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
159 
160 		/* Variation clean up */
161 	}
162 
163 	/*
164 	 * TEST    : dm_obj_ref_hold - invalid token
165 	 * EXPECTED: rc = -1, errno = EINVAL
166 	 */
167 	if (DMVAR_EXEC(OBJ_REF_HOLD_BASE + 2)) {
168 
169 		/* Variation set up */
170 
171 		/* Variation */
172 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n", szFuncName);
173 		rc = dm_obj_ref_hold(sid, INVALID_ADDR, hanp, hlen);
174 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
175 
176 		/* Variation clean up */
177 	}
178 
179 	/*
180 	 * TEST    : dm_obj_ref_hold - invalid hanp
181 	 * EXPECTED: rc = -1, errno = EFAULT
182 	 */
183 	if (DMVAR_EXEC(OBJ_REF_HOLD_BASE + 3)) {
184 
185 		/* Variation set up */
186 
187 		/* Variation */
188 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n", szFuncName);
189 		rc = dm_obj_ref_hold(sid, token, (void *)INVALID_ADDR, hlen);
190 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
191 
192 		/* Variation clean up */
193 	}
194 
195 	/*
196 	 * TEST    : dm_obj_ref_hold - invalid hlen
197 	 * EXPECTED: rc = -1, errno = EBADF
198 	 */
199 	if (DMVAR_EXEC(OBJ_REF_HOLD_BASE + 4)) {
200 
201 		/* Variation set up */
202 
203 		/* Variation */
204 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n", szFuncName);
205 		rc = dm_obj_ref_hold(sid, token, hanp, INVALID_ADDR);
206 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
207 
208 		/* Variation clean up */
209 	}
210 
211 	/*
212 	 * TEST    : dm_obj_ref_hold - multiple holds
213 	 * EXPECTED: rc = -1, errno = EBUSY
214 	 */
215 	if (DMVAR_EXEC(OBJ_REF_HOLD_BASE + 5)) {
216 
217 		/* Variation set up */
218 		rc = dm_obj_ref_hold(sid, token, hanp, hlen);
219 		if (rc == -1) {
220 			DMLOG_PRINT(DMLVL_DEBUG,
221 				    "Unable to set up variation! (errno = %d)\n",
222 				    errno);
223 			DMVAR_SKIP();
224 		} else {
225 			/* Variation */
226 			DMLOG_PRINT(DMLVL_DEBUG, "%s(multiple holds)\n",
227 				    szFuncName);
228 			rc = dm_obj_ref_hold(sid, token, hanp, hlen);
229 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBUSY);
230 
231 			/* Variation clean up */
232 			rc = dm_obj_ref_rele(sid, token, hanp, hlen);
233 			if (rc == -1) {
234 				DMLOG_PRINT(DMLVL_DEBUG,
235 					    "Unable to clean up variation! (errno = %d)\n",
236 					    errno);
237 			}
238 		}
239 	}
240 
241 	/*
242 	 * TEST    : dm_obj_ref_hold - valid
243 	 * EXPECTED: rc = 0
244 	 */
245 	if (DMVAR_EXEC(OBJ_REF_HOLD_BASE + 6)) {
246 		int rc2;
247 
248 		/* Variation set up */
249 
250 		/* Variation */
251 		DMLOG_PRINT(DMLVL_DEBUG, "%s(valid)\n", szFuncName);
252 		rc = dm_obj_ref_hold(sid, token, hanp, hlen);
253 		if (rc == 0) {
254 			if ((rc2 =
255 			     dm_obj_ref_query(sid, token, hanp, hlen)) == 1) {
256 				DMLOG_PRINT(DMLVL_DEBUG,
257 					    "%s passed with expected rc = %d\n",
258 					    szFuncName, 0);
259 				DMVAR_PASS();
260 			} else {
261 				DMLOG_PRINT(DMLVL_ERR,
262 					    "%s failed with expected rc = %d but unexpected dm_obj_ref_query rc = %d\n",
263 					    szFuncName, 0, rc2);
264 				DMVAR_FAIL();
265 			}
266 		} else {
267 			DMLOG_PRINT(DMLVL_ERR,
268 				    "%s failed with unexpected rc = %d (errno = %d)\n",
269 				    szFuncName, rc, errno);
270 			DMVAR_FAIL();
271 		}
272 
273 		/* Variation clean up */
274 		rc = dm_obj_ref_rele(sid, token, hanp, hlen);
275 	}
276 
277 	/*
278 	 * TEST    : dm_obj_ref_hold - DM_NO_SESSION sid
279 	 * EXPECTED: rc = -1, errno = EINVAL
280 	 */
281 	if (DMVAR_EXEC(OBJ_REF_HOLD_BASE + 7)) {
282 
283 		/* Variation set up */
284 
285 		/* Variation */
286 		DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n", szFuncName);
287 		rc = dm_obj_ref_hold(DM_NO_SESSION, token, hanp, hlen);
288 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
289 
290 		/* Variation clean up */
291 	}
292 
293 	/*
294 	 * TEST    : dm_obj_ref_hold - global handle
295 	 * EXPECTED: rc = -1, errno = EBADF
296 	 */
297 	if (DMVAR_EXEC(OBJ_REF_HOLD_BASE + 8)) {
298 
299 		/* Variation set up */
300 
301 		/* Variation */
302 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
303 		rc = dm_obj_ref_hold(sid, token, DM_GLOBAL_HANP,
304 				     DM_GLOBAL_HLEN);
305 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
306 
307 		/* Variation clean up */
308 	}
309 
310 	szFuncName = "dm_obj_ref_rele";
311 
312 	/*
313 	 * TEST    : dm_obj_ref_rele - invalid sid
314 	 * EXPECTED: rc = -1, errno = EINVAL
315 	 */
316 	if (DMVAR_EXEC(OBJ_REF_RELE_BASE + 1)) {
317 
318 		/* Variation set up */
319 
320 		/* Variation */
321 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n", szFuncName);
322 		rc = dm_obj_ref_rele(INVALID_ADDR, token, hanp, hlen);
323 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
324 
325 		/* Variation clean up */
326 	}
327 
328 	/*
329 	 * TEST    : dm_obj_ref_rele - invalid token
330 	 * EXPECTED: rc = -1, errno = EINVAL
331 	 */
332 	if (DMVAR_EXEC(OBJ_REF_RELE_BASE + 2)) {
333 
334 		/* Variation set up */
335 
336 		/* Variation */
337 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n", szFuncName);
338 		rc = dm_obj_ref_rele(sid, INVALID_ADDR, hanp, hlen);
339 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
340 
341 		/* Variation clean up */
342 	}
343 
344 	/*
345 	 * TEST    : dm_obj_ref_rele - invalid hanp
346 	 * EXPECTED: rc = -1, errno = EFAULT
347 	 */
348 	if (DMVAR_EXEC(OBJ_REF_RELE_BASE + 3)) {
349 
350 		/* Variation set up */
351 
352 		/* Variation */
353 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n", szFuncName);
354 		rc = dm_obj_ref_rele(sid, token, (void *)INVALID_ADDR, hlen);
355 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
356 
357 		/* Variation clean up */
358 	}
359 
360 	/*
361 	 * TEST    : dm_obj_ref_rele - invalid hlen
362 	 * EXPECTED: rc = -1, errno = EBADF
363 	 */
364 	if (DMVAR_EXEC(OBJ_REF_RELE_BASE + 4)) {
365 
366 		/* Variation set up */
367 
368 		/* Variation */
369 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n", szFuncName);
370 		rc = dm_obj_ref_rele(sid, token, hanp, INVALID_ADDR);
371 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
372 
373 		/* Variation clean up */
374 	}
375 
376 	/*
377 	 * TEST    : dm_obj_ref_rele - no hold
378 	 * EXPECTED: rc = -1, errno = EACCES
379 	 */
380 	if (DMVAR_EXEC(OBJ_REF_RELE_BASE + 5)) {
381 
382 		/* Variation set up */
383 
384 		/* Variation */
385 		DMLOG_PRINT(DMLVL_DEBUG, "%s(no hold)\n", szFuncName);
386 		rc = dm_obj_ref_rele(sid, token, hanp, hlen);
387 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EACCES);
388 
389 		/* Variation clean up */
390 	}
391 
392 	/*
393 	 * TEST    : dm_obj_ref_rele - valid
394 	 * EXPECTED: rc = 0
395 	 */
396 	if (DMVAR_EXEC(OBJ_REF_RELE_BASE + 6)) {
397 		int rc2;
398 
399 		/* Variation set up */
400 		rc = dm_obj_ref_hold(sid, token, hanp, hlen);
401 		if (rc == -1) {
402 			DMLOG_PRINT(DMLVL_DEBUG,
403 				    "Unable to set up variation! (errno = %d)\n",
404 				    errno);
405 			DMVAR_SKIP();
406 		} else {
407 			/* Variation */
408 			DMLOG_PRINT(DMLVL_DEBUG, "%s(valid)\n", szFuncName);
409 			rc = dm_obj_ref_rele(sid, token, hanp, hlen);
410 			if (rc == 0) {
411 				if ((rc2 =
412 				     dm_obj_ref_query(sid, token, hanp,
413 						      hlen)) == 0) {
414 					DMLOG_PRINT(DMLVL_DEBUG,
415 						    "%s passed with expected rc = %d\n",
416 						    szFuncName, 0);
417 					DMVAR_PASS();
418 				} else {
419 					DMLOG_PRINT(DMLVL_ERR,
420 						    "%s failed with expected rc = %d but unexpected dm_obj_ref_query rc = %d\n",
421 						    szFuncName, 0, rc2);
422 					DMVAR_FAIL();
423 				}
424 			} else {
425 				DMLOG_PRINT(DMLVL_ERR,
426 					    "%s failed with unexpected rc = %d (errno = %d)\n",
427 					    szFuncName, rc, errno);
428 				DMVAR_FAIL();
429 			}
430 		}
431 	}
432 
433 	/*
434 	 * TEST    : dm_obj_ref_rele - DM_NO_SESSION sid
435 	 * EXPECTED: rc = -1, errno = EINVAL
436 	 */
437 	if (DMVAR_EXEC(OBJ_REF_RELE_BASE + 7)) {
438 
439 		/* Variation set up */
440 
441 		/* Variation */
442 		DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n", szFuncName);
443 		rc = dm_obj_ref_rele(DM_NO_SESSION, token, hanp, hlen);
444 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
445 
446 		/* Variation clean up */
447 	}
448 
449 	/*
450 	 * TEST    : dm_obj_ref_rele - global handle
451 	 * EXPECTED: rc = -1, errno = EBADF
452 	 */
453 	if (DMVAR_EXEC(OBJ_REF_RELE_BASE + 8)) {
454 
455 		/* Variation set up */
456 
457 		/* Variation */
458 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
459 		rc = dm_obj_ref_rele(sid, token, DM_GLOBAL_HANP,
460 				     DM_GLOBAL_HLEN);
461 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
462 
463 		/* Variation clean up */
464 	}
465 
466 	szFuncName = "dm_obj_ref_query";
467 
468 	/*
469 	 * TEST    : dm_obj_ref_query - invalid sid
470 	 * EXPECTED: rc = -1, errno = EINVAL
471 	 */
472 	if (DMVAR_EXEC(OBJ_REF_QUERY_BASE + 1)) {
473 
474 		/* Variation set up */
475 
476 		/* Variation */
477 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n", szFuncName);
478 		rc = dm_obj_ref_query(INVALID_ADDR, token, hanp, hlen);
479 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
480 
481 		/* Variation clean up */
482 	}
483 
484 	/*
485 	 * TEST    : dm_obj_ref_query - invalid token
486 	 * EXPECTED: rc = -1, errno = EINVAL
487 	 */
488 	if (DMVAR_EXEC(OBJ_REF_QUERY_BASE + 2)) {
489 
490 		/* Variation set up */
491 
492 		/* Variation */
493 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n", szFuncName);
494 		rc = dm_obj_ref_query(sid, INVALID_ADDR, hanp, hlen);
495 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
496 
497 		/* Variation clean up */
498 	}
499 
500 	/*
501 	 * TEST    : dm_obj_ref_query - invalid hanp
502 	 * EXPECTED: rc = -1, errno = EFAULT
503 	 */
504 	if (DMVAR_EXEC(OBJ_REF_QUERY_BASE + 3)) {
505 
506 		/* Variation set up */
507 
508 		/* Variation */
509 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n", szFuncName);
510 		rc = dm_obj_ref_query(sid, token, (void *)INVALID_ADDR, hlen);
511 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
512 
513 		/* Variation clean up */
514 	}
515 
516 	/*
517 	 * TEST    : dm_obj_ref_query - invalid hlen
518 	 * EXPECTED: rc = -1, errno = EBADF
519 	 */
520 	if (DMVAR_EXEC(OBJ_REF_QUERY_BASE + 4)) {
521 
522 		/* Variation set up */
523 
524 		/* Variation */
525 		DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n", szFuncName);
526 		rc = dm_obj_ref_query(sid, token, hanp, INVALID_ADDR);
527 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
528 
529 		/* Variation clean up */
530 	}
531 
532 	/*
533 	 * TEST    : dm_obj_ref_query - not held
534 	 * EXPECTED: rc = 0
535 	 */
536 	if (DMVAR_EXEC(OBJ_REF_QUERY_BASE + 5)) {
537 
538 		/* Variation set up */
539 
540 		/* Variation */
541 		DMLOG_PRINT(DMLVL_DEBUG, "%s(not held)\n", szFuncName);
542 		rc = dm_obj_ref_query(sid, token, hanp, hlen);
543 		DMVAR_ENDPASSEXP(szFuncName, 0, rc);
544 
545 		/* Variation clean up */
546 	}
547 
548 	/*
549 	 * TEST    : dm_obj_ref_query - held
550 	 * EXPECTED: rc = 1
551 	 */
552 	if (DMVAR_EXEC(OBJ_REF_QUERY_BASE + 6)) {
553 
554 		/* Variation set up */
555 		rc = dm_obj_ref_hold(sid, token, hanp, hlen);
556 		if (rc == -1) {
557 			DMLOG_PRINT(DMLVL_DEBUG,
558 				    "Unable to set up variation! (errno = %d)\n",
559 				    errno);
560 			DMVAR_SKIP();
561 		} else {
562 			/* Variation */
563 			DMLOG_PRINT(DMLVL_DEBUG, "%s(held)\n", szFuncName);
564 			rc = dm_obj_ref_query(sid, token, hanp, hlen);
565 			DMVAR_ENDPASSEXP(szFuncName, 1, rc);
566 
567 			/* Variation clean up */
568 		}
569 	}
570 
571 	/*
572 	 * TEST    : dm_obj_ref_query - DM_NO_SESSION sid
573 	 * EXPECTED: rc = -1, errno = EINVAL
574 	 */
575 	if (DMVAR_EXEC(OBJ_REF_QUERY_BASE + 7)) {
576 
577 		/* Variation set up */
578 
579 		/* Variation */
580 		DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n", szFuncName);
581 		rc = dm_obj_ref_query(DM_NO_SESSION, token, hanp, hlen);
582 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
583 
584 		/* Variation clean up */
585 	}
586 
587 	/*
588 	 * TEST    : dm_obj_ref_query - global handle
589 	 * EXPECTED: rc = -1, errno = EBADF
590 	 */
591 	if (DMVAR_EXEC(OBJ_REF_QUERY_BASE + 8)) {
592 
593 		/* Variation set up */
594 
595 		/* Variation */
596 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
597 		rc = dm_obj_ref_query(sid, token, DM_GLOBAL_HANP,
598 				      DM_GLOBAL_HLEN);
599 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
600 
601 		/* Variation clean up */
602 	}
603 
604 }
605 
Thread(void * parm)606 void *Thread(void *parm)
607 {
608 	int rc;
609 	size_t dmMsgBufLen;
610 	dm_eventmsg_t *dmMsg;
611 	int bMounted = DM_FALSE;
612 	dm_eventtype_t type;
613 	dm_token_t token;
614 	dm_eventset_t events;
615 	dm_response_t response;
616 
617 	do {
618 		/* Loop until message received (wait could be interrupted) */
619 		do {
620 			DMLOG_PRINT(DMLVL_DEBUG, "Waiting for event...\n");
621 			dmMsgBufLen = 0;
622 
623 			rc = dm_get_events(sid, 1, DM_EV_WAIT, sizeof(dmMsgBuf),
624 					   dmMsgBuf, &dmMsgBufLen);
625 			DMLOG_PRINT(DMLVL_DEBUG,
626 				    "... dm_get_events returned %d (errno %d)\n",
627 				    rc, errno);
628 		} while ((rc == -1) && (errno == EINTR) && (dmMsgBufLen == 0));
629 
630 		if (rc) {
631 			DMLOG_PRINT(DMLVL_ERR,
632 				    "dm_get_events failed with rc = %d, errno = %d\n",
633 				    rc, errno);
634 			dm_destroy_session(sid);
635 			DM_EXIT();
636 		} else {
637 			dmMsg = (dm_eventmsg_t *) dmMsgBuf;
638 			token = dmMsg->ev_token;
639 			type = dmMsg->ev_type;
640 
641 			DMLOG_PRINT(DMLVL_DEBUG, "Received message %d\n", type);
642 		}
643 
644 		if (type == DM_EVENT_MOUNT) {
645 			/* SPECIAL CASE: need to set disposition, events and response */
646 			dm_mount_event_t *me =
647 			    DM_GET_VALUE(dmMsg, ev_data, dm_mount_event_t *);
648 			void *lhanp = DM_GET_VALUE(me, me_handle1, void *);
649 			size_t lhlen = DM_GET_LEN(me, me_handle1);
650 
651 			DMLOG_PRINT(DMLVL_DEBUG, "Message is DM_EVENT_MOUNT\n");
652 			DMLOG_PRINT(DMLVL_DEBUG, "  Mode: %x\n", me->me_mode);
653 			DMLOG_PRINT(DMLVL_DEBUG, "  File system handle: %p\n",
654 				    lhanp);
655 			DMLOG_PRINT(DMLVL_DEBUG,
656 				    "  File system handle length: %d\n", lhlen);
657 			DMLOG_PRINT(DMLVL_DEBUG, "  Mountpoint handle: %p\n",
658 				    DM_GET_VALUE(me, me_handle2, void *));
659 			DMLOG_PRINT(DMLVL_DEBUG,
660 				    "  Mountpoint handle length: %d\n",
661 				    DM_GET_LEN(me, me_handle2));
662 			DMLOG_PRINT(DMLVL_DEBUG, "  Mountpoint path: %s\n",
663 				    DM_GET_VALUE(me, me_name1, char *));
664 			DMLOG_PRINT(DMLVL_DEBUG, "  Media designator: %s\n",
665 				    DM_GET_VALUE(me, me_name2, char *));
666 			DMLOG_PRINT(DMLVL_DEBUG, "  Root handle: %p\n",
667 				    DM_GET_VALUE(me, me_roothandle, void *));
668 			DMLOG_PRINT(DMLVL_DEBUG, "  Root handle length: %d\n",
669 				    DM_GET_LEN(me, me_roothandle));
670 
671 			bMounted = dm_handle_is_valid(lhanp, lhlen);
672 
673 			rc = dm_request_right(sid, lhanp, lhlen, token,
674 					      DM_RR_WAIT, DM_RIGHT_EXCL);
675 			if (rc == -1) {
676 				DMLOG_PRINT(DMLVL_ERR,
677 					    "dm_request_right failed! (rc = %d, errno = %d)\n",
678 					    rc, errno);
679 				dm_destroy_session(sid);
680 				DM_EXIT();
681 			}
682 
683 			DMEV_ZERO(events);
684 			DMEV_SET(DM_EVENT_PREUNMOUNT, events);
685 			DMEV_SET(DM_EVENT_UNMOUNT, events);
686 			DMEV_SET(DM_EVENT_CREATE, events);
687 			rc = dm_set_disp(sid, lhanp, lhlen, token, &events,
688 					 DM_EVENT_MAX);
689 			if (rc == -1) {
690 				DMLOG_PRINT(DMLVL_ERR,
691 					    "dm_set_disp failed! (rc = %d, errno = %d)\n",
692 					    rc, errno);
693 				dm_destroy_session(sid);
694 				DM_EXIT();
695 			}
696 
697 			rc = dm_set_eventlist(sid, lhanp, lhlen, token, &events,
698 					      DM_EVENT_MAX);
699 			if (rc == -1) {
700 				DMLOG_PRINT(DMLVL_ERR,
701 					    "dm_set_eventlist failed! (rc = %d, errno = %d)\n",
702 					    rc, errno);
703 				dm_destroy_session(sid);
704 				DM_EXIT();
705 			}
706 
707 			rc = dm_release_right(sid, lhanp, lhlen, token);
708 			if (rc == -1) {
709 				DMLOG_PRINT(DMLVL_ERR,
710 					    "dm_request_right failed! (rc = %d, errno = %d)\n",
711 					    rc, errno);
712 				dm_destroy_session(sid);
713 				DM_EXIT();
714 			}
715 
716 			response = DM_RESP_CONTINUE;
717 		} else if (type == DM_EVENT_UNMOUNT) {
718 			dm_namesp_event_t *nse =
719 			    DM_GET_VALUE(dmMsg, ev_data, dm_namesp_event_t *);
720 			if (nse->ne_retcode == 0) {
721 				bMounted = DM_FALSE;
722 			}
723 
724 			response = DM_RESP_CONTINUE;
725 		} else if (type == DM_EVENT_CREATE) {
726 			dm_namesp_event_t *nse =
727 			    DM_GET_VALUE(dmMsg, ev_data, dm_namesp_event_t *);
728 			void *hanp = DM_GET_VALUE(nse, ne_handle1, void *);
729 			size_t hlen = DM_GET_LEN(nse, ne_handle1);
730 
731 			if (runTestOnCreate) {
732 				DoTest(token, hanp, hlen);
733 			}
734 
735 			response = DM_RESP_CONTINUE;
736 		} else {
737 			switch (type) {
738 			case DM_EVENT_PREUNMOUNT:
739 				response = DM_RESP_CONTINUE;
740 				break;
741 
742 			default:
743 				{
744 					DMLOG_PRINT(DMLVL_ERR,
745 						    "Message is unexpected!\n");
746 					response = DM_RESP_ABORT;
747 					break;
748 				}
749 			}
750 		}
751 
752 		if (response != DM_RESP_INVALID) {
753 			DMLOG_PRINT(DMLVL_DEBUG,
754 				    "Responding to message %d with %d\n", type,
755 				    response);
756 			rc = dm_respond_event(sid, token, response,
757 					      response ==
758 					      DM_RESP_ABORT ? ABORT_ERRNO : 0,
759 					      0, NULL);
760 		}
761 	} while (bMounted);
762 
763 	pthread_exit(0);
764 }
765