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