1d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/*
2d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *   Copyright (c) International Business Machines  Corp., 2004
3d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *
4d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *   This program is free software;  you can redistribute it and/or modify
5d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *   it under the terms of the GNU General Public License as published by
6d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *   the Free Software Foundation; either version 2 of the License, or
7d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *   (at your option) any later version.
8d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *
9d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *   This program is distributed in the hope that it will be useful,
10d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
11d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
12d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *   the GNU General Public License for more details.
13d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *
14d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *   You should have received a copy of the GNU General Public License
15d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *   along with this program;  if not, write to the Free Software
164548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */
18d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
19d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/*
20d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * TEST CASE	: token.c
21d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *
22d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * VARIATIONS	: 9
23d13d74bbf207c2d01598c6fef092a75b93b07c71vapier *
24d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * API'S TESTED	: dm_getall_tokens
25d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */
26d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <string.h>
27d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <stdio.h>
28d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <stdlib.h>
29d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <errno.h>
30d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <pthread.h>
31d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <unistd.h>
32d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <sys/stat.h>
33d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <sys/mount.h>
34d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <fcntl.h>
35d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include "dm_test.h"
36d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
37d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#define TOKBUF_NUM 10
38d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#define TOKBUF_LEN (TOKBUF_NUM * sizeof(dm_token_t))
39d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
40d13d74bbf207c2d01598c6fef092a75b93b07c71vapierpthread_t tid;
41d13d74bbf207c2d01598c6fef092a75b93b07c71vapierdm_sessid_t sid;
42d13d74bbf207c2d01598c6fef092a75b93b07c71vapierchar dmMsgBuf[4096];
43d13d74bbf207c2d01598c6fef092a75b93b07c71vapierchar *mountPt;
44d13d74bbf207c2d01598c6fef092a75b93b07c71vapierchar *deviceNm;
45d13d74bbf207c2d01598c6fef092a75b93b07c71vapierchar DummySubdir[FILENAME_MAX];
46d13d74bbf207c2d01598c6fef092a75b93b07c71vapierdm_token_t createToken;
47d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
48d13d74bbf207c2d01598c6fef092a75b93b07c71vapiervoid *Thread(void *);
49d13d74bbf207c2d01598c6fef092a75b93b07c71vapiervoid *TokenThread(void *);
50d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
51d13d74bbf207c2d01598c6fef092a75b93b07c71vapierint main(int argc, char **argv)
52d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{
53d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
54d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	char *szFuncName;
55d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	char *varstr;
56354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int rc;
57d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	char *szSessionInfo = "dm_test session info";
58d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	dm_eventset_t events;
59d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
60d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	DMOPT_PARSE(argc, argv);
61d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	DMLOG_START();
62d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
63d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	DMEV_ZERO(events);
64d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	DMEV_SET(DM_EVENT_MOUNT, events);
65bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
66d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/* CANNOT DO ANYTHING WITHOUT SUCCESSFUL INITIALIZATION!!! */
67d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	if ((rc = dm_init_service(&varstr)) != 0) {
68354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		DMLOG_PRINT(DMLVL_ERR,
69354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    "dm_init_service failed! (rc = %d, errno = %d)\n",
70354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    rc, errno);
71d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		DM_EXIT();
72354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	} else if ((rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &sid))
73354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		   == -1) {
74354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		DMLOG_PRINT(DMLVL_ERR,
75354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    "dm_create_session failed! (rc = %d, errno = %d)\n",
76354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    rc, errno);
77d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		DM_EXIT();
78354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	} else
79354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	    if ((rc =
80354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		 dm_set_disp(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN, DM_NO_TOKEN,
81354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			     &events, DM_EVENT_MAX)) == -1) {
82354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		DMLOG_PRINT(DMLVL_ERR,
83354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    "dm_set_disp failed! (rc = %d, errno = %d)\n", rc,
84354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    errno);
85d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_destroy_session(sid);
86d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		DM_EXIT();
87d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	} else if ((rc = pthread_create(&tid, NULL, Thread, NULL)) != 0) {
88354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		DMLOG_PRINT(DMLVL_ERR,
89354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    "pthread_create failed! (rc = %d, errno = %d)\n",
90354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    rc, errno);
91d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_destroy_session(sid);
92d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		DM_EXIT();
93d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	} else if ((rc = dmimpl_mount(&mountPt, &deviceNm)) == -1) {
94354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		DMLOG_PRINT(DMLVL_ERR,
95354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    "dmimpl_mount failed! (rc = %d, errno = %d)\n", rc,
96354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    errno);
97d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_destroy_session(sid);
98d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		DM_EXIT();
99d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	} else {
100d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		sprintf(DummySubdir, "%s/%s", mountPt, DUMMY_SUBDIR);
101d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
102d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		rmdir(DummySubdir);
103d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	}
104d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
105354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	DMLOG_PRINT(DMLVL_DEBUG, "Starting DMAPI tokens tests\n");
106bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
107d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	szFuncName = "dm_getall_tokens";
108bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
109d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/*
110d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * TEST    : dm_getall_tokens - invalid sid
111d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * EXPECTED: rc = -1, errno = EINVAL
112d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 */
113d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	if (DMVAR_EXEC(GETALL_TOKENS_BASE + 1)) {
114d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_token_t buf[TOKBUF_NUM];
115d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		u_int nelem;
116d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		char msgbuf[MSG_DATALEN];
117d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_token_t token;
118d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
119d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		/* Variation set up */
120d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		memcpy(msgbuf, MSG_DATA, MSG_DATALEN);
121d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		rc = dm_create_userevent(sid, MSG_DATALEN, msgbuf, &token);
122d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		if (rc == -1) {
123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG,
124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    "Unable to set up variation! (errno = %d)\n",
125354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    errno);
126d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMVAR_SKIP();
127d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		} else {
128d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation */
129354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n",
130354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    szFuncName);
131354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_getall_tokens(INVALID_ADDR, TOKBUF_NUM, buf,
132354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      &nelem);
1334bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
134d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
135d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation clean up */
136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
137354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      0, NULL);
138d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == -1) {
139354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_DEBUG,
140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "Unable to clean up variation! (errno = %d)\n",
141354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    errno);
142d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
143d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
144d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	}
145bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
146d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/*
147d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * TEST    : dm_getall_tokens - invalid nelem
148d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * EXPECTED: rc = -1, errno = E2BIG
149d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 */
150d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	if (DMVAR_EXEC(GETALL_TOKENS_BASE + 2)) {
151d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_token_t buf[TOKBUF_NUM];
152d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		u_int nelem;
153d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		char msgbuf[MSG_DATALEN];
154d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_token_t token;
155d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
156d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		/* Variation set up */
157d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		memcpy(msgbuf, MSG_DATA, MSG_DATALEN);
158d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		rc = dm_create_userevent(sid, MSG_DATALEN, msgbuf, &token);
159d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		if (rc == -1) {
160354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG,
161354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    "Unable to set up variation! (errno = %d)\n",
162354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    errno);
163d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMVAR_SKIP();
164d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		} else {
165d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation */
166354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid nelem)\n",
167354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    szFuncName);
168d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			rc = dm_getall_tokens(sid, 0, buf, &nelem);
169d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == -1) {
170d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				if (errno == E2BIG) {
171354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n",
172354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    nelem);
173d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					if (nelem == 1) {
174354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						DMLOG_PRINT(DMLVL_DEBUG,
175354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    "%s passed with expected rc = %d and expected errno = %d\n",
176354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    szFuncName, -1,
177354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    E2BIG);
178d13d74bbf207c2d01598c6fef092a75b93b07c71vapier						DMVAR_PASS();
179d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					} else {
180354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						DMLOG_PRINT(DMLVL_ERR,
181354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    "%s failed with expected rc = %d and expected errno = %d but unexpected nelem (%d vs %d)\n",
182354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    szFuncName, -1,
183354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    E2BIG, nelem, 1);
184d13d74bbf207c2d01598c6fef092a75b93b07c71vapier						DMVAR_FAIL();
185d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					}
186d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				} else {
187354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_ERR,
188354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "%s failed with expected rc = %d but unexpected errno = %d\n",
189354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    szFuncName, -1, errno);
190d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					DMVAR_FAIL();
191d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				}
192d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			} else {
193354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_ERR,
194354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "%s failed with unexpected rc = %d\n",
195354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    szFuncName, rc);
196d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				DMVAR_FAIL();
197d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
198d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
199d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation clean up */
200354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
201354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      0, NULL);
202d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == -1) {
203354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_DEBUG,
204354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "Unable to clean up variation! (errno = %d)\n",
205354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    errno);
206d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
207d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
208d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	}
209bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
210d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/*
211d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * TEST    : dm_getall_tokens - invalid tokenbufp
212d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * EXPECTED: rc = -1, errno = EFAULT
213d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 */
214d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	if (DMVAR_EXEC(GETALL_TOKENS_BASE + 3)) {
215d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		u_int nelem;
216d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		char msgbuf[MSG_DATALEN];
217d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_token_t token;
218d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
219d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		/* Variation set up */
220d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		memcpy(msgbuf, MSG_DATA, MSG_DATALEN);
221d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		rc = dm_create_userevent(sid, MSG_DATALEN, msgbuf, &token);
222d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		if (rc == -1) {
223354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG,
224354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    "Unable to set up variation! (errno = %d)\n",
225354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    errno);
226d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMVAR_SKIP();
227d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		} else {
228d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation */
229354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid tokenbufp)\n",
230354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    szFuncName);
231354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_getall_tokens(sid, TOKBUF_NUM,
232354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      (dm_token_t *) INVALID_ADDR,
233354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      &nelem);
2344bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
235bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
236d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation clean up */
237354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
238354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      0, NULL);
239d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == -1) {
240354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_DEBUG,
241354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "Unable to clean up variation! (errno = %d)\n",
242354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    errno);
243d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
244d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
245d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	}
246bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
247d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/*
248d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * TEST    : dm_getall_tokens - invalid nelemp
249d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * EXPECTED: rc = -1, errno = EFAULT
250d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 */
251d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	if (DMVAR_EXEC(GETALL_TOKENS_BASE + 4)) {
252d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_token_t buf[TOKBUF_NUM];
253d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		char msgbuf[MSG_DATALEN];
254d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_token_t token;
255d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
256d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		/* Variation set up */
257d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		memcpy(msgbuf, MSG_DATA, MSG_DATALEN);
258d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		rc = dm_create_userevent(sid, MSG_DATALEN, msgbuf, &token);
259d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		if (rc == -1) {
260354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG,
261354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    "Unable to set up variation! (errno = %d)\n",
262354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    errno);
263d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMVAR_SKIP();
264d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		} else {
265d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation */
266354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid nelemp)\n",
267354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    szFuncName);
268354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_getall_tokens(sid, TOKBUF_NUM, buf,
269354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      (u_int *) INVALID_ADDR);
2704bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
271d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
272d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation clean up */
273354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
274354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      0, NULL);
275d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == -1) {
276354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_DEBUG,
277354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "Unable to clean up variation! (errno = %d)\n",
278354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    errno);
279d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
280d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
281d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	}
282bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
283d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/*
284d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * TEST    : dm_getall_tokens - one userevent token
285d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * EXPECTED: rc = 0
286d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 */
287d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	if (DMVAR_EXEC(GETALL_TOKENS_BASE + 5)) {
288d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_token_t buf[TOKBUF_NUM];
289d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		u_int nelem;
290d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		char msgbuf[MSG_DATALEN];
291d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_token_t token;
292d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
293d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		/* Variation set up */
294d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		memcpy(msgbuf, MSG_DATA, MSG_DATALEN);
295d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		rc = dm_create_userevent(sid, MSG_DATALEN, msgbuf, &token);
296d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		if (rc == -1) {
297354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG,
298354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    "Unable to set up variation! (errno = %d)\n",
299354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    errno);
300d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMVAR_SKIP();
301d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		} else {
302d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation */
303354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG, "%s(one userevent token)\n",
304354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    szFuncName);
305d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			rc = dm_getall_tokens(sid, TOKBUF_NUM, buf, &nelem);
306d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == 0) {
307d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n", nelem);
308d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				if (nelem == 1) {
309354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_DEBUG,
310354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "token 0: %d\n", buf[0]);
311d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					if (token == buf[0]) {
312354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						DMLOG_PRINT(DMLVL_DEBUG,
313354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    "%s passed with expected rc = %d\n",
314354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    szFuncName, 0);
315d13d74bbf207c2d01598c6fef092a75b93b07c71vapier						DMVAR_PASS();
316d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					} else {
317354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						DMLOG_PRINT(DMLVL_ERR,
318354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    "%s failed with expected rc = %d but unexpected token (%d vs %d)\n",
319354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    szFuncName, 0,
320354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    token, buf[0]);
321d13d74bbf207c2d01598c6fef092a75b93b07c71vapier						DMVAR_FAIL();
322d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					}
323d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				} else {
324354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_ERR,
325354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "%s failed with expected rc = %d but unexpected nelem (%d vs %d)\n",
326354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    szFuncName, 0, nelem, 1);
327d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					DMVAR_FAIL();
328d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				}
329d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			} else {
330354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_ERR,
331354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "%s failed with unexpected rc = %d (errno = %d)\n",
332354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    szFuncName, rc, errno);
333d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				DMVAR_FAIL();
334d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
335d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
336d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation clean up */
337354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
338354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      0, NULL);
339d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == -1) {
340354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_DEBUG,
341354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "Unable to clean up variation! (errno = %d)\n",
342354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    errno);
343d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
344d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
345d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	}
346bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
347d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/*
348d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * TEST    : dm_getall_tokens - two userevent tokens
349d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * EXPECTED: rc = 0
350d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 */
351d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	if (DMVAR_EXEC(GETALL_TOKENS_BASE + 6)) {
352d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_token_t buf[TOKBUF_NUM];
353d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		u_int nelem;
354d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		char msgbuf[MSG_DATALEN];
355d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_token_t token1, token2;
356d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
357d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		/* Variation set up */
358d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		memcpy(msgbuf, MSG_DATA, MSG_DATALEN);
359354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if ((rc =
360354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		     dm_create_userevent(sid, MSG_DATALEN, msgbuf,
361354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 &token1)) == -1) {
362d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* No clean up */
363354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else
364354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    if ((rc =
365354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 dm_create_userevent(sid, MSG_DATALEN, msgbuf,
366354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					     &token2)) == -1) {
367354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			dm_respond_event(sid, token1, DM_RESP_CONTINUE, 0, 0,
368354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 NULL);
369d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
370d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		if (rc == -1) {
371354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG,
372354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    "Unable to set up variation! (errno = %d)\n",
373354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    errno);
374d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMVAR_SKIP();
375d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		} else {
376d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation */
377354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG, "%s(two userevent tokens)\n",
378354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    szFuncName);
379d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			rc = dm_getall_tokens(sid, TOKBUF_NUM, buf, &nelem);
380d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == 0) {
381d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n", nelem);
382d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				if (nelem == 2) {
383354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_DEBUG,
384354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "token 0: %d\n", buf[0]);
385354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_DEBUG,
386354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "token 1: %d\n", buf[1]);
387354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					if (token1 == buf[0]
388354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    || token1 == buf[1]) {
389354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						if (token2 == buf[0]
390354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    || token2 == buf[1]) {
391354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							DMLOG_PRINT(DMLVL_DEBUG,
392354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								    "%s passed with expected rc = %d\n",
393354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								    szFuncName,
394354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								    0);
395d13d74bbf207c2d01598c6fef092a75b93b07c71vapier							DMVAR_PASS();
396d13d74bbf207c2d01598c6fef092a75b93b07c71vapier						} else {
397354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							DMLOG_PRINT(DMLVL_ERR,
398354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								    "%s failed with expected rc = %d but token = %d not in buf\n",
399354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								    szFuncName,
400354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								    0, token2);
401d13d74bbf207c2d01598c6fef092a75b93b07c71vapier							DMVAR_FAIL();
402d13d74bbf207c2d01598c6fef092a75b93b07c71vapier						}
403d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					} else {
404354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						DMLOG_PRINT(DMLVL_ERR,
405354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    "%s failed with expected rc = %d but token = %d not in buf\n",
406354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    szFuncName, 0,
407354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    token1);
408d13d74bbf207c2d01598c6fef092a75b93b07c71vapier						DMVAR_FAIL();
409d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					}
410d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				} else {
411354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_ERR,
412354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "%s failed with expected rc = %d but unexpected nelem (%d vs %d)\n",
413354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    szFuncName, 0, nelem, 1);
414d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					DMVAR_FAIL();
415d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				}
416d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			} else {
417354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_ERR,
418354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "%s failed with unexpected rc = %d (errno = %d)\n",
419354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    szFuncName, rc, errno);
420d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				DMVAR_FAIL();
421d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
422d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
423d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation clean up */
424354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_respond_event(sid, token2, DM_RESP_CONTINUE, 0,
425354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      0, NULL);
426354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc |=
427354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    dm_respond_event(sid, token1, DM_RESP_CONTINUE, 0,
428354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					     0, NULL);
429d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == -1) {
430354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_DEBUG,
431354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "Unable to clean up variation! (errno = %d)\n",
432354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    errno);
433d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
434d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
435d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	}
436bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
437d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/*
438d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * TEST    : dm_getall_tokens - one event token
439d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * EXPECTED: rc = 0
440d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 */
441d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	if (DMVAR_EXEC(GETALL_TOKENS_BASE + 7)) {
442d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_token_t buf[TOKBUF_NUM];
443d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		u_int nelem;
444d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		pthread_t tidToken;
445d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
446d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		/* Variation set up */
447d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		createToken = 0;
448d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		rc = pthread_create(&tidToken, NULL, TokenThread, NULL);
449d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		if (rc == -1) {
450354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG,
451354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    "Unable to set up variation! (errno = %d)\n",
452354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    errno);
453d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMVAR_SKIP();
454d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		} else {
455d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation */
456d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Wait for DM_EVENT_CREATE event to set token */
457d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			while (createToken == 0) {
458d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				EVENT_DELIVERY_DELAY;
459d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
460354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG, "%s(one event token)\n",
461354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    szFuncName);
462d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			rc = dm_getall_tokens(sid, TOKBUF_NUM, buf, &nelem);
463d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == 0) {
464d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n", nelem);
465d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				if (nelem == 1) {
466354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_DEBUG,
467354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "token 0: %d\n", buf[0]);
468d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					if (buf[0] == createToken) {
469354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						DMLOG_PRINT(DMLVL_DEBUG,
470354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    "%s passed with expected rc = %d\n",
471354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    szFuncName, 0);
472d13d74bbf207c2d01598c6fef092a75b93b07c71vapier						DMVAR_PASS();
473d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					} else {
474354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						DMLOG_PRINT(DMLVL_ERR,
475354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    "%s failed with expected rc = %d but unexpected token (%d vs %d)\n",
476354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    szFuncName, 0,
477354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    buf[0],
478354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    createToken);
479d13d74bbf207c2d01598c6fef092a75b93b07c71vapier						DMVAR_FAIL();
480d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					}
481d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				} else {
482354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_ERR,
483354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "%s failed with expected rc = %d but unexpected nelem (%d vs %d)\n",
484354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    szFuncName, 0, nelem, 1);
485d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					DMVAR_FAIL();
486d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				}
487d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			} else {
488354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_ERR,
489354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "%s failed with unexpected rc = %d (errno = %d)\n",
490354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    szFuncName, rc, errno);
491d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				DMVAR_FAIL();
492d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
493d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
494d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation clean up */
495d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			pthread_join(tidToken, NULL);
496d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
497d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	}
498bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
499d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/*
500d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * TEST    : dm_getall_tokens - one event token, one userevent token
501d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * EXPECTED: rc = 0
502d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 */
503d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	if (DMVAR_EXEC(GETALL_TOKENS_BASE + 8)) {
504d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_token_t buf[TOKBUF_NUM];
505d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		u_int nelem;
506d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		char msgbuf[MSG_DATALEN];
507d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_token_t token;
508d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		pthread_t tidToken;
509d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
510d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		/* Variation set up */
511d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		memcpy(msgbuf, MSG_DATA, MSG_DATALEN);
512d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		createToken = 0;
513354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if ((rc =
514354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		     dm_create_userevent(sid, MSG_DATALEN, msgbuf,
515354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 &token)) == -1) {
516d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* No clean up */
517354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else
518354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    if ((rc =
519354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			 pthread_create(&tidToken, NULL, TokenThread,
520354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					NULL)) == -1) {
521354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			dm_respond_event(sid, token, DM_RESP_CONTINUE, 0, 0,
522354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 NULL);
523d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
524d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		if (rc == -1) {
525354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG,
526354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    "Unable to clean up variation! (errno = %d)\n",
527354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    errno);
528d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMVAR_SKIP();
529d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		} else {
530d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation */
531d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Wait for DM_EVENT_CREATE event to set token */
532d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			while (createToken == 0) {
533d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				EVENT_DELIVERY_DELAY;
534d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
535354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG,
536354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    "%s(one event token, one userevent token)\n",
537354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    szFuncName);
538d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			rc = dm_getall_tokens(sid, TOKBUF_NUM, buf, &nelem);
539d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == 0) {
540d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n", nelem);
541d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				if (nelem == 2) {
542354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_DEBUG,
543354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "token 0: %d\n", buf[0]);
544354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_DEBUG,
545354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "token 1: %d\n", buf[1]);
546d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					if (token == buf[0] || token == buf[1]) {
547354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						if (createToken == buf[0]
548354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    || createToken == buf[1]) {
549354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							DMLOG_PRINT(DMLVL_DEBUG,
550354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								    "%s passed with expected rc = %d\n",
551354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								    szFuncName,
552354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								    0);
553d13d74bbf207c2d01598c6fef092a75b93b07c71vapier							DMVAR_PASS();
554d13d74bbf207c2d01598c6fef092a75b93b07c71vapier						} else {
555354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							DMLOG_PRINT(DMLVL_ERR,
556354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								    "%s failed with expected rc = %d but token = %d not in buf\n",
557354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								    szFuncName,
558354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								    0,
559354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								    createToken);
560d13d74bbf207c2d01598c6fef092a75b93b07c71vapier							DMVAR_FAIL();
561d13d74bbf207c2d01598c6fef092a75b93b07c71vapier						}
562d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					} else {
563354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						DMLOG_PRINT(DMLVL_ERR,
564354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    "%s failed with expected rc = %d but token = %d not in buf\n",
565354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    szFuncName, 0,
566354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    token);
567d13d74bbf207c2d01598c6fef092a75b93b07c71vapier						DMVAR_FAIL();
568d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					}
569d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				} else {
570354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_ERR,
571354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "%s failed with expected rc = %d but unexpected nelem (%d vs %d)\n",
572354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    szFuncName, 0, nelem, 1);
573d13d74bbf207c2d01598c6fef092a75b93b07c71vapier					DMVAR_FAIL();
574d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				}
575d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			} else {
576354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_ERR,
577354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "%s failed with unexpected rc = %d (errno = %d)\n",
578354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    szFuncName, rc, errno);
579d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				DMVAR_FAIL();
580d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
581d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
582d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation clean up */
583354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
584354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      0, NULL);
585d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == -1) {
586354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_DEBUG,
587354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "Unable to clean up variation! (errno = %d)\n",
588354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    errno);
589d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
590d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			pthread_join(tidToken, NULL);
591d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
592d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	}
593bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
594d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	/*
595d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * TEST    : dm_getall_tokens - DM_NO_SESSION sid
596d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 * EXPECTED: rc = -1, errno = EINVAL
597d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	 */
598d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	if (DMVAR_EXEC(GETALL_TOKENS_BASE + 9)) {
599d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_token_t buf[TOKBUF_NUM];
600d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		u_int nelem;
601d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		char msgbuf[MSG_DATALEN];
602d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		dm_token_t token;
603d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
604d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		/* Variation set up */
605d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		memcpy(msgbuf, MSG_DATA, MSG_DATALEN);
606d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		rc = dm_create_userevent(sid, MSG_DATALEN, msgbuf, &token);
607d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		if (rc == -1) {
608354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG,
609354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    "Unable to clean up variation! (errno = %d)\n",
610354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    errno);
611d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMVAR_SKIP();
612d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		} else {
613d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation */
614354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION, sid)\n",
615354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    szFuncName);
616354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_getall_tokens(DM_NO_SESSION, TOKBUF_NUM, buf,
617354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      &nelem);
6184bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
619d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
620d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* Variation clean up */
621354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0,
622354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      0, NULL);
623d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == -1) {
624354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_DEBUG,
625354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "Unable to clean up variation! (errno = %d)\n",
626354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    errno);
627d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
628d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
629d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	}
630bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak
631d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	rc = umount(mountPt);
632d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	if (rc == -1) {
633354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		DMLOG_PRINT(DMLVL_ERR, "umount failed! (rc = %d, errno = %d)\n",
634354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    rc, errno);
635d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	}
636d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
637d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	pthread_join(tid, NULL);
638d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
639d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	rc = dm_destroy_session(sid);
640d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	if (rc == -1) {
641354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		DMLOG_PRINT(DMLVL_ERR,
642354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    "dm_destroy_session failed! (rc = %d, errno = %d)\n",
643354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    rc, errno);
644d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	}
645d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
646d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	DMLOG_STOP();
6472c28215423293e443469a07ae7011135d058b671Garrett Cooper
6482c28215423293e443469a07ae7011135d058b671Garrett Cooper	tst_exit();
649d13d74bbf207c2d01598c6fef092a75b93b07c71vapier}
650d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
651d13d74bbf207c2d01598c6fef092a75b93b07c71vapiervoid *Thread(void *parm)
652d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{
653d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	int rc;
654d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	size_t dmMsgBufLen;
655d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	dm_eventmsg_t *dmMsg;
656d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	int bMounted = DM_FALSE;
657d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	dm_eventtype_t type;
658d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	dm_token_t token;
659d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	dm_eventset_t events;
660d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	dm_response_t response;
661d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
662d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	do {
663d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		/* Loop until message received (wait could be interrupted) */
664d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		do {
665d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMLOG_PRINT(DMLVL_DEBUG, "Waiting for event...\n");
666d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			dmMsgBufLen = 0;
667d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
668354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_get_events(sid, 1, DM_EV_WAIT, sizeof(dmMsgBuf),
669354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					   dmMsgBuf, &dmMsgBufLen);
670354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG,
671354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    "... dm_get_events returned %d (errno %d)\n",
672354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    rc, errno);
673d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		} while ((rc == -1) && (errno == EINTR) && (dmMsgBufLen == 0));
674d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
675d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		if (rc) {
676354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_ERR,
677354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    "dm_get_events failed with rc = %d, errno = %d\n",
678354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    rc, errno);
679d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			dm_destroy_session(sid);
680d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DM_EXIT();
681d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		} else {
682354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			dmMsg = (dm_eventmsg_t *) dmMsgBuf;
683d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			token = dmMsg->ev_token;
684d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			type = dmMsg->ev_type;
685d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
686d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMLOG_PRINT(DMLVL_DEBUG, "Received message %d\n", type);
687d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
688d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
689d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		if (type == DM_EVENT_MOUNT) {
690d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			/* SPECIAL CASE: need to set disposition, events and response */
691354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			dm_mount_event_t *me =
692354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    DM_GET_VALUE(dmMsg, ev_data, dm_mount_event_t *);
693d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			void *hanp = DM_GET_VALUE(me, me_handle1, void *);
694d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			size_t hlen = DM_GET_LEN(me, me_handle1);
695d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
696d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMLOG_PRINT(DMLVL_DEBUG, "Message is DM_EVENT_MOUNT\n");
697d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMLOG_PRINT(DMLVL_DEBUG, "  Mode: %x\n", me->me_mode);
698354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG, "  File system handle: %p\n",
699354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    hanp);
700354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG,
701354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    "  File system handle length: %d\n", hlen);
702354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG, "  Mountpoint handle: %p\n",
703354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    DM_GET_VALUE(me, me_handle2, void *));
704354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG,
705354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    "  Mountpoint handle length: %d\n",
706354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    DM_GET_LEN(me, me_handle2));
707354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG, "  Mountpoint path: %s\n",
708354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    DM_GET_VALUE(me, me_name1, char *));
709354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG, "  Media designator: %s\n",
710354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    DM_GET_VALUE(me, me_name2, char *));
711354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG, "  Root handle: %p\n",
712354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    DM_GET_VALUE(me, me_roothandle, void *));
713354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG, "  Root handle length: %d\n",
714354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    DM_GET_LEN(me, me_roothandle));
715354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
716354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			bMounted = dm_handle_is_valid(hanp, hlen);
717354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
718354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_request_right(sid, hanp, hlen, token,
719354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      DM_RR_WAIT, DM_RIGHT_EXCL);
720d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == -1) {
721354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_ERR,
722354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "dm_request_right failed! (rc = %d, errno = %d)\n",
723354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    rc, errno);
724d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				dm_destroy_session(sid);
725d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				DM_EXIT();
726d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
727d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
728d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMEV_ZERO(events);
729d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMEV_SET(DM_EVENT_PREUNMOUNT, events);
730d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMEV_SET(DM_EVENT_UNMOUNT, events);
731d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			DMEV_SET(DM_EVENT_CREATE, events);
732354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_set_disp(sid, hanp, hlen, token, &events,
733354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					 DM_EVENT_MAX);
734d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == -1) {
735354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_ERR,
736354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "dm_set_disp failed! (rc = %d, errno = %d)\n",
737354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    rc, errno);
738d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				dm_destroy_session(sid);
739d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				DM_EXIT();
740d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
741d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
742354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_set_eventlist(sid, hanp, hlen, token, &events,
743354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      DM_EVENT_MAX);
744d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == -1) {
745354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_ERR,
746354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "dm_set_eventlist failed! (rc = %d, errno = %d)\n",
747354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    rc, errno);
748d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				dm_destroy_session(sid);
749d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				DM_EXIT();
750d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
751d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
752354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_release_right(sid, hanp, hlen, token);
753d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (rc == -1) {
754354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				DMLOG_PRINT(DMLVL_ERR,
755354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    "dm_request_right failed! (rc = %d, errno = %d)\n",
756354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    rc, errno);
757d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				dm_destroy_session(sid);
758d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				DM_EXIT();
759d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
760d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
761d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			response = DM_RESP_CONTINUE;
762d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		} else if (type == DM_EVENT_UNMOUNT) {
763354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			dm_namesp_event_t *nse =
764354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    DM_GET_VALUE(dmMsg, ev_data, dm_namesp_event_t *);
765d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			if (nse->ne_retcode == 0) {
766d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				bMounted = DM_FALSE;
767d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
768d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
769d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			response = DM_RESP_CONTINUE;
770d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		} else {
771d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			switch (type) {
772d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			case DM_EVENT_PREUNMOUNT:
773d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				response = DM_RESP_CONTINUE;
774d13d74bbf207c2d01598c6fef092a75b93b07c71vapier				break;
7752c28215423293e443469a07ae7011135d058b671Garrett Cooper
776d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			case DM_EVENT_CREATE:
777354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				{
778354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					dm_namesp_event_t *nse =
779354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					    DM_GET_VALUE(dmMsg, ev_data,
780354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							 dm_namesp_event_t *);
781354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
782354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_DEBUG,
783354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "Message is DM_EVENT_CREATE\n");
784354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_DEBUG, "  Mode: %x\n",
785354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    nse->ne_mode);
786354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_DEBUG,
787354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "  Parent handle: %p\n",
788354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    DM_GET_VALUE(nse,
789354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								 ne_handle1,
790354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								 void *));
791354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_DEBUG,
792354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "  Parent handle length: %d\n",
793354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    DM_GET_LEN(nse,
794354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							       ne_handle1));
795354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_DEBUG,
796354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "  Entry name: %s\n",
797354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    DM_GET_VALUE(nse, ne_name1,
798354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								 char *));
799354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
800354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					createToken = token;
801354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_DEBUG,
802354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "  Token: %d\n",
803354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    createToken);
804354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
805354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					/* Wait for main thread to call dm_getall_tokens */
806354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					sleep(3);
807354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
808354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					response = DM_RESP_CONTINUE;
809354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					break;
810354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				}
811d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
812d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			default:
813354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				{
814354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					DMLOG_PRINT(DMLVL_ERR,
815354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						    "Message is unexpected!\n");
816354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					response = DM_RESP_ABORT;
817354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					break;
818354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				}
819d13d74bbf207c2d01598c6fef092a75b93b07c71vapier			}
820d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
821d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
822d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		if (response != DM_RESP_INVALID) {
823354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			DMLOG_PRINT(DMLVL_DEBUG,
824354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    "Responding to message %d with %d\n", type,
825354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    response);
826354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			rc = dm_respond_event(sid, token, response,
827354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      response ==
828354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      DM_RESP_ABORT ? ABORT_ERRNO : 0,
829354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					      0, NULL);
830d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		}
831d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	} while (bMounted);
832d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
833d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	pthread_exit(0);
834bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak}
835d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
836d13d74bbf207c2d01598c6fef092a75b93b07c71vapiervoid *TokenThread(void *parm)
837d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{
838e753fd7967c95651b952dd6fe67d2cb56478056esubrata_modak	int rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE);
839d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
840d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	if (rc != -1) {
841d13d74bbf207c2d01598c6fef092a75b93b07c71vapier		rmdir(DummySubdir);
842d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	}
843d13d74bbf207c2d01598c6fef092a75b93b07c71vapier
844d13d74bbf207c2d01598c6fef092a75b93b07c71vapier	pthread_exit(0);
845ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
846