blob: a04869027fb522179d750201f4809d8741f30950 [file] [log] [blame]
/*
* Copyright (c) International Business Machines Corp., 2004
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
* the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* TEST CASE : event_am.c
*
* VARIATIONS : 31
*
* EVENTS TESTED: DM_EVENT_ATTRIBUTE
* DM_EVENT_CLOSE
* DM_EVENT_DESTROY
*
* API'S TESTED : dm_set_return_on_destroy
*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/mount.h>
#include <fcntl.h>
#include "dm_test.h"
pthread_t tid;
dm_sessid_t sid;
char dmMsgBuf[4096];
char *mountPt;
char *deviceNm;
char DummyFile[FILENAME_MAX];
char DummySubdir[FILENAME_MAX];
/* Variables for thread communications */
dm_eventtype_t eventExpected;
dm_eventtype_t eventReceived;
dm_response_t eventResponse;
void *hanp1, *hanp2, *ahanp1;
size_t hlen1, hlen2, ahlen1;
char name1[FILENAME_MAX];
void *Thread(void *);
int main(int argc, char **argv)
{
char *varstr;
int rc;
int varStatus;
char *szSessionInfo = "dm_test session info";
char *szFuncName;
dm_eventset_t events;
dm_size_t maxAttrSize;
void *fshanp;
size_t fshlen;
dm_eventset_t AMevents;
DMOPT_PARSE(argc, argv);
DMLOG_START();
DMEV_ZERO(events);
DMEV_SET(DM_EVENT_MOUNT, events);
/* CANNOT DO ANYTHING WITHOUT SUCCESSFUL INITIALIZATION!!! */
if ((rc = dm_init_service(&varstr)) != 0) {
DMLOG_PRINT(DMLVL_ERR, "dm_init_service failed! (rc = %d, errno = %d)\n", rc, errno);
DM_EXIT();
} else if ((rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &sid)) == -1) {
DMLOG_PRINT(DMLVL_ERR, "dm_create_session failed! (rc = %d, errno = %d)\n", rc, errno);
DM_EXIT();
} else if ((rc = dm_set_disp(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN, DM_NO_TOKEN, &events, DM_EVENT_MAX)) == -1) {
DMLOG_PRINT(DMLVL_ERR, "dm_set_disp failed! (rc = %d, errno = %d)\n", rc, errno);
dm_destroy_session(sid);
DM_EXIT();
} else if ((rc = pthread_create(&tid, NULL, Thread, NULL)) != 0) {
DMLOG_PRINT(DMLVL_ERR, "pthread_create failed! (rc = %d, errno = %d)\n", rc, errno);
dm_destroy_session(sid);
DM_EXIT();
} else if ((rc = dmimpl_mount(&mountPt, &deviceNm)) == -1) {
DMLOG_PRINT(DMLVL_ERR, "dmimpl_mount failed! (rc = %d, errno = %d)\n", rc, errno);
dm_destroy_session(sid);
DM_EXIT();
} else {
sprintf(DummyFile, "%s/%s", mountPt, DUMMY_FILE);
sprintf(DummySubdir, "%s/%s", mountPt, DUMMY_SUBDIR);
remove(DummyFile);
rmdir(DummySubdir);
}
DMLOG_PRINT(DMLVL_DEBUG, "Starting DMAPI asynchronous metadata event tests\n") ;
/*
* First batch of tests will be with events enabled on file system,
* so set up events on fs accordingly
*/
rc = dm_path_to_fshandle(mountPt, &fshanp, &fshlen);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "dm_path_to_handle(fs) failed! (rc = %d, errno = %d)\n", rc, errno);
dm_destroy_session(sid);
DM_EXIT();
}
DMEV_ZERO(events);
DMEV_SET(DM_EVENT_PREUNMOUNT, events);
DMEV_SET(DM_EVENT_UNMOUNT, events);
DMEV_SET(DM_EVENT_POSTCREATE, events);
DMEV_SET(DM_EVENT_ATTRIBUTE, events);
DMEV_SET(DM_EVENT_CLOSE, events);
rc = dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN, &events, DM_EVENT_MAX);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "dm_set_eventlist(fs) failed! (rc = %d, errno = %d)\n", rc, errno);
dm_destroy_session(sid);
DM_EXIT();
}
/*
* TEST : chmod - enabled on fs
* EXPECTED: DM_EVENT_ATTRIBUTE
*/
if (DMVAR_EXEC(DIR_ASYNC_META_EVENT_BASE + 1)) {
dm_ino_t ino;
/* Variation set up */
eventExpected = DM_EVENT_ATTRIBUTE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
rc = mkdir(DummySubdir, DUMMY_DIR_RO_MODE);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "chmod(%s)\n", DummySubdir);
rc = chmod(DummySubdir, O_RDWR);
DMLOG_PRINT(DMLVL_DEBUG, "chmod(%s) returned %d\n", DummySubdir, rc);
EVENT_DELIVERY_DELAY;
if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) {
struct stat statfs;
rc = dm_handle_to_ino(ahanp1, ahlen1, &ino);
rc |= stat(DummySubdir, &statfs);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n");
varStatus = DMSTAT_FAIL;
} else if (dm_handle_cmp(hanp2, hlen2, ahanp1, ahlen1) != 0) {
DMLOG_PRINT(DMLVL_ERR, "Object/entry handles NOT same!\n");
varStatus = DMSTAT_FAIL;
} else if (ino != statfs.st_ino) {
DMLOG_PRINT(DMLVL_ERR, "Object handle NOT correct! (%lld vs %d)\n", ino, statfs.st_ino);
varStatus = DMSTAT_FAIL;
} else if (!(statfs.st_mode & O_RDWR)) {
DMLOG_PRINT(DMLVL_ERR, "Object mode NOT correct! (%x vs %x)\n", O_RDWR, statfs.st_mode);
varStatus = DMSTAT_FAIL;
} else if (strcmp(name1, DUMMY_SUBDIR) != 0) {
DMLOG_PRINT(DMLVL_ERR, "Entry name NOT correct! (%s vs %s)\n", name1, DUMMY_SUBDIR);
varStatus = DMSTAT_FAIL;
}
}
DMVAR_END(varStatus);
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = rmdir(DummySubdir);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
}
}
/*
* TEST : chown - enabled on fs
* EXPECTED: DM_EVENT_ATTRIBUTE
*/
if (DMVAR_EXEC(DIR_ASYNC_META_EVENT_BASE + 2)) {
dm_ino_t ino;
/* Variation set up */
eventExpected = DM_EVENT_ATTRIBUTE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
rc = mkdir(DummySubdir, DUMMY_DIR_RO_MODE);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "chown(%s)\n", DummySubdir);
rc = chown(DummySubdir, DUMMY_UID, DUMMY_GID);
DMLOG_PRINT(DMLVL_DEBUG, "chown(%s) returned %d\n", DummySubdir, rc);
EVENT_DELIVERY_DELAY;
if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) {
struct stat statfs;
rc = dm_handle_to_ino(ahanp1, ahlen1, &ino);
rc |= stat(DummySubdir, &statfs);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n");
varStatus = DMSTAT_FAIL;
} else if (dm_handle_cmp(hanp2, hlen2, ahanp1, ahlen1) != 0) {
DMLOG_PRINT(DMLVL_ERR, "Object/entry handles NOT same!\n");
varStatus = DMSTAT_FAIL;
} else if (ino != statfs.st_ino) {
DMLOG_PRINT(DMLVL_ERR, "Object handle NOT correct! (%lld vs %d)\n", ino, statfs.st_ino);
varStatus = DMSTAT_FAIL;
} else if (statfs.st_uid != DUMMY_UID) {
DMLOG_PRINT(DMLVL_ERR, "Object uid NOT correct! (%x vs %x)\n", DUMMY_UID, statfs.st_uid);
varStatus = DMSTAT_FAIL;
} else if (statfs.st_gid != DUMMY_GID) {
DMLOG_PRINT(DMLVL_ERR, "Object gid NOT correct! (%x vs %x)\n", DUMMY_GID, statfs.st_gid);
varStatus = DMSTAT_FAIL;
} else if (strcmp(name1, DUMMY_SUBDIR) != 0) {
DMLOG_PRINT(DMLVL_ERR, "Entry name NOT correct! (%s vs %s)\n", name1, DUMMY_SUBDIR);
varStatus = DMSTAT_FAIL;
}
}
DMVAR_END(varStatus);
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = rmdir(DummySubdir);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
}
}
/*
* TEST : close - enabled on fs
* EXPECTED: DM_EVENT_CLOSE
*/
if (DMVAR_EXEC(DIR_ASYNC_META_EVENT_BASE + 3)) {
int fd1, fd2;
/* Variation set up */
eventExpected = DM_EVENT_CLOSE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
if ((rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE)) == -1) {
/* No clean up */
} else if ((fd1 = open(DummySubdir, O_DIRECTORY)) == -1) {
rmdir(DummySubdir);
} else if ((fd2 = open(DummySubdir, O_DIRECTORY)) == -1) {
close(fd1);
rmdir(DummySubdir);
}
if (fd1 == -1 || fd2 == -1 || fd1 == fd2) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
eventExpected = DM_EVENT_INVALID;
eventReceived = DM_EVENT_INVALID;
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #1\n", fd1);
rc = close(fd1);
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #1 returned %d\n", fd1, rc);
EVENT_DELIVERY_DELAY;
if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) {
eventExpected = DM_EVENT_CLOSE;
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #2\n", fd2);
rc = close(fd2);
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #2 returned %d\n", fd2, rc);
EVENT_DELIVERY_DELAY;
varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived);
}
DMVAR_END(varStatus);
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = rmdir(DummySubdir);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
}
}
/*
* TEST : chmod - enabled on fs
* EXPECTED: DM_EVENT_ATTRIBUTE
*/
if (DMVAR_EXEC(FILE_ASYNC_META_EVENT_BASE + 1)) {
int fd;
dm_ino_t ino;
/* Variation set up */
eventExpected = DM_EVENT_ATTRIBUTE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
if ((fd = open(DummyFile, O_RDONLY | O_CREAT, DUMMY_FILE_RO_MODE)) == -1) {
/* No clean up */
} else if ((rc = close(fd)) == -1) {
remove(DummyFile);
}
if (fd == -1 || rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "chmod(%s)\n", DummyFile);
rc = chmod(DummyFile, O_RDWR);
DMLOG_PRINT(DMLVL_DEBUG, "chmod(%s) returned %d\n", DummyFile, rc);
EVENT_DELIVERY_DELAY;
if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) {
struct stat statfs;
rc = dm_handle_to_ino(ahanp1, ahlen1, &ino);
rc |= stat(DummyFile, &statfs);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n");
varStatus = DMSTAT_FAIL;
} else if (dm_handle_cmp(hanp2, hlen2, ahanp1, ahlen1) != 0) {
DMLOG_PRINT(DMLVL_ERR, "Object/entry handles NOT same!\n");
varStatus = DMSTAT_FAIL;
} else if (ino != statfs.st_ino) {
DMLOG_PRINT(DMLVL_ERR, "Object handle NOT correct! (%lld vs %d)\n", ino, statfs.st_ino);
varStatus = DMSTAT_FAIL;
} else if (!(statfs.st_mode & O_RDWR)) {
DMLOG_PRINT(DMLVL_ERR, "Object mode NOT correct! (%x vs %x)\n", O_RDWR, statfs.st_mode);
varStatus = DMSTAT_FAIL;
} else if (strcmp(name1, DUMMY_FILE) != 0) {
DMLOG_PRINT(DMLVL_ERR, "Entry name NOT correct! (%s vs %s)\n", name1, DUMMY_FILE);
varStatus = DMSTAT_FAIL;
}
}
DMVAR_END(varStatus);
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
}
}
/*
* TEST : chown - enabled on fs
* EXPECTED: DM_EVENT_ATTRIBUTE
*/
if (DMVAR_EXEC(FILE_ASYNC_META_EVENT_BASE + 2)) {
int fd;
dm_ino_t ino;
/* Variation set up */
eventExpected = DM_EVENT_ATTRIBUTE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
if ((fd = open(DummyFile, O_RDONLY | O_CREAT, DUMMY_FILE_RO_MODE)) == -1) {
/* No clean up */
} else if ((rc = close(fd)) == -1) {
remove(DummyFile);
}
if (fd == -1 || rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "chown(%s)\n", DummyFile);
rc = chown(DummyFile, DUMMY_UID, DUMMY_GID);
DMLOG_PRINT(DMLVL_DEBUG, "chown(%s) returned %d\n", DummyFile, rc);
EVENT_DELIVERY_DELAY;
if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) {
struct stat statfs;
rc = dm_handle_to_ino(ahanp1, ahlen1, &ino);
rc |= stat(DummyFile, &statfs);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n");
varStatus = DMSTAT_FAIL;
} else if (dm_handle_cmp(hanp2, hlen2, ahanp1, ahlen1) != 0) {
DMLOG_PRINT(DMLVL_ERR, "Object/entry handles NOT same!\n");
varStatus = DMSTAT_FAIL;
} else if (ino != statfs.st_ino) {
DMLOG_PRINT(DMLVL_ERR, "Object handle NOT correct! (%lld vs %d)\n", ino, statfs.st_ino);
varStatus = DMSTAT_FAIL;
} else if (statfs.st_uid != DUMMY_UID) {
DMLOG_PRINT(DMLVL_ERR, "Object uid NOT correct! (%x vs %x)\n", DUMMY_UID, statfs.st_uid);
varStatus = DMSTAT_FAIL;
} else if (statfs.st_gid != DUMMY_GID) {
DMLOG_PRINT(DMLVL_ERR, "Object gid NOT correct! (%x vs %x)\n", DUMMY_GID, statfs.st_gid);
varStatus = DMSTAT_FAIL;
} else if (strcmp(name1, DUMMY_FILE) != 0) {
DMLOG_PRINT(DMLVL_ERR, "Entry name NOT correct! (%s vs %s)\n", name1, DUMMY_FILE);
varStatus = DMSTAT_FAIL;
}
}
DMVAR_END(varStatus);
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
}
}
/*
* TEST : close - enabled on fs
* EXPECTED: DM_EVENT_CLOSE
*/
if (DMVAR_EXEC(FILE_ASYNC_META_EVENT_BASE + 3)) {
int fd1, fd2;
/* Variation set up */
eventExpected = DM_EVENT_CLOSE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
if ((fd1 = open(DummyFile, O_RDONLY | O_CREAT, DUMMY_FILE_RO_MODE)) == -1) {
/* No clean up */
} else if ((fd2 = open(DummyFile, O_RDONLY)) == -1) {
close(fd1);
remove(DummyFile);
}
if (fd1 == -1 || fd2 == -1 || fd1 == fd2) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
eventExpected = DM_EVENT_INVALID;
eventReceived = DM_EVENT_INVALID;
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #1\n", fd1);
rc = close(fd1);
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #1 returned %d\n", fd1, rc);
EVENT_DELIVERY_DELAY;
if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) {
eventExpected = DM_EVENT_CLOSE;
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #2\n", fd2);
rc = close(fd2);
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #2 returned %d\n", fd2, rc);
EVENT_DELIVERY_DELAY;
varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived);
}
DMVAR_END(varStatus);
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
}
}
/* Wait for all pending messages to be handled */
EVENT_DELIVERY_DELAY_LOOP;
/*
* Next batch of tests will be with events enabled on object, so
* clear events on fs
*/
rc = dm_path_to_fshandle(mountPt, &fshanp, &fshlen);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "dm_path_to_handle failed! (rc = %d, errno = %d)\n", rc, errno);
dm_destroy_session(sid);
DM_EXIT();
}
DMEV_ZERO(events);
DMEV_SET(DM_EVENT_PREUNMOUNT, events);
DMEV_SET(DM_EVENT_UNMOUNT, events);
DMEV_SET(DM_EVENT_POSTCREATE, events);
rc = dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN, &events, DM_EVENT_MAX);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "dm_set_eventlist(fs) failed! (rc = %d, errno = %d)\n", rc, errno);
dm_destroy_session(sid);
DM_EXIT();
}
DMEV_ZERO(AMevents);
DMEV_SET(DM_EVENT_ATTRIBUTE, AMevents);
DMEV_SET(DM_EVENT_CLOSE, AMevents);
/*
* TEST : chmod - enabled on directory
* EXPECTED: DM_EVENT_ATTRIBUTE
*/
if (DMVAR_EXEC(DIR_ASYNC_META_EVENT_BASE + 4)) {
void *hanp;
size_t hlen;
dm_ino_t ino;
/* Variation set up */
eventExpected = DM_EVENT_ATTRIBUTE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
if ((rc = mkdir(DummySubdir, DUMMY_DIR_RO_MODE)) == -1) {
/* No clean up */
} else if ((rc = dm_path_to_handle(DummySubdir, &hanp, &hlen)) == -1) {
rmdir(DummySubdir);
} else if ((rc = dm_set_eventlist(sid, hanp, hlen, DM_NO_TOKEN, &AMevents, DM_EVENT_MAX)) == -1) {
dm_handle_free(hanp, hlen);
rmdir(DummySubdir);
}
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "chmod(%s)\n", DummySubdir);
rc = chmod(DummySubdir, O_RDWR);
DMLOG_PRINT(DMLVL_DEBUG, "chmod(%s) returned %d\n", DummySubdir, rc);
EVENT_DELIVERY_DELAY;
if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) {
struct stat statfs;
rc = dm_handle_to_ino(ahanp1, ahlen1, &ino);
rc |= stat(DummySubdir, &statfs);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n");
varStatus = DMSTAT_FAIL;
} else if (dm_handle_cmp(hanp2, hlen2, ahanp1, ahlen1) != 0) {
DMLOG_PRINT(DMLVL_ERR, "Object/entry handles NOT same!\n");
varStatus = DMSTAT_FAIL;
} else if (ino != statfs.st_ino) {
DMLOG_PRINT(DMLVL_ERR, "Object handle NOT correct! (%lld vs %d)\n", ino, statfs.st_ino);
varStatus = DMSTAT_FAIL;
} else if (!(statfs.st_mode & O_RDWR)) {
DMLOG_PRINT(DMLVL_ERR, "Object mode NOT correct! (%x vs %x)\n", O_RDWR, statfs.st_mode);
varStatus = DMSTAT_FAIL;
} else if (strcmp(name1, DUMMY_SUBDIR) != 0) {
DMLOG_PRINT(DMLVL_ERR, "Entry name NOT correct! (%s vs %s)\n", name1, DUMMY_SUBDIR);
varStatus = DMSTAT_FAIL;
}
}
DMVAR_END(varStatus);
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = rmdir(DummySubdir);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
dm_handle_free(hanp, hlen);
}
}
/*
* TEST : chown - enabled on directory
* EXPECTED: DM_EVENT_ATTRIBUTE
*/
if (DMVAR_EXEC(DIR_ASYNC_META_EVENT_BASE + 5)) {
void *hanp;
size_t hlen;
dm_ino_t ino;
/* Variation set up */
eventExpected = DM_EVENT_ATTRIBUTE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
if ((rc = mkdir(DummySubdir, DUMMY_DIR_RO_MODE)) == -1) {
/* No clean up */
} else if ((rc = dm_path_to_handle(DummySubdir, &hanp, &hlen)) == -1) {
rmdir(DummySubdir);
} else if ((rc = dm_set_eventlist(sid, hanp, hlen, DM_NO_TOKEN, &AMevents, DM_EVENT_MAX)) == -1) {
dm_handle_free(hanp, hlen);
rmdir(DummySubdir);
}
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "chown(%s)\n", DummySubdir);
rc = chown(DummySubdir, DUMMY_UID, DUMMY_GID);
DMLOG_PRINT(DMLVL_DEBUG, "chown(%s) returned %d\n", DummySubdir, rc);
EVENT_DELIVERY_DELAY;
if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) {
struct stat statfs;
rc = dm_handle_to_ino(ahanp1, ahlen1, &ino);
rc |= stat(DummySubdir, &statfs);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n");
varStatus = DMSTAT_FAIL;
} else if (dm_handle_cmp(hanp2, hlen2, ahanp1, ahlen1) != 0) {
DMLOG_PRINT(DMLVL_ERR, "Object/entry handles NOT same!\n");
varStatus = DMSTAT_FAIL;
} else if (ino != statfs.st_ino) {
DMLOG_PRINT(DMLVL_ERR, "Object handle NOT correct! (%lld vs %d)\n", ino, statfs.st_ino);
varStatus = DMSTAT_FAIL;
} else if (statfs.st_uid != DUMMY_UID) {
DMLOG_PRINT(DMLVL_ERR, "Object uid NOT correct! (%x vs %x)\n", DUMMY_UID, statfs.st_uid);
varStatus = DMSTAT_FAIL;
} else if (statfs.st_gid != DUMMY_GID) {
DMLOG_PRINT(DMLVL_ERR, "Object gid NOT correct! (%x vs %x)\n", DUMMY_GID, statfs.st_gid);
varStatus = DMSTAT_FAIL;
} else if (strcmp(name1, DUMMY_SUBDIR) != 0) {
DMLOG_PRINT(DMLVL_ERR, "Entry name NOT correct! (%s vs %s)\n", name1, DUMMY_SUBDIR);
varStatus = DMSTAT_FAIL;
}
}
DMVAR_END(varStatus);
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = rmdir(DummySubdir);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
dm_handle_free(hanp, hlen);
}
}
/*
* TEST : close - enabled on directory
* EXPECTED: DM_EVENT_CLOSE
*/
if (DMVAR_EXEC(DIR_ASYNC_META_EVENT_BASE + 6)) {
int fd1, fd2;
void *hanp;
size_t hlen;
/* Variation set up */
eventExpected = DM_EVENT_CLOSE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
if ((rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE)) == -1) {
/* No clean up */
} else if ((fd1 = open(DummySubdir, O_DIRECTORY)) == -1) {
rmdir(DummySubdir);
} else if ((fd2 = open(DummySubdir, O_DIRECTORY)) == -1) {
close(fd1);
rmdir(DummySubdir);
} else if ((rc = dm_fd_to_handle(fd2, &hanp, &hlen)) == -1) {
close(fd2);
close(fd1);
rmdir(DummySubdir);
} else if ((rc = dm_set_eventlist(sid, hanp, hlen, DM_NO_TOKEN, &AMevents, DM_EVENT_MAX)) == -1) {
dm_handle_free(hanp, hlen);
close(fd2);
close(fd1);
rmdir(DummySubdir);
}
if (fd1 == -1 || fd2 == -1 || fd1 == fd2) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
eventExpected = DM_EVENT_INVALID;
eventReceived = DM_EVENT_INVALID;
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #1\n", fd1);
rc = close(fd1);
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #1 returned %d\n", fd1, rc);
EVENT_DELIVERY_DELAY;
if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) {
eventExpected = DM_EVENT_CLOSE;
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #2\n", fd2);
rc = close(fd2);
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #2 returned %d\n", fd2, rc);
EVENT_DELIVERY_DELAY;
varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived);
}
DMVAR_END(varStatus);
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = rmdir(DummySubdir);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
dm_handle_free(hanp, hlen);
}
}
/*
* TEST : chmod - enabled on file
* EXPECTED: DM_EVENT_ATTRIBUTE
*/
if (DMVAR_EXEC(FILE_ASYNC_META_EVENT_BASE + 4)) {
int fd;
void *hanp;
size_t hlen;
dm_ino_t ino;
/* Variation set up */
eventExpected = DM_EVENT_ATTRIBUTE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
if ((fd = open(DummyFile, O_RDONLY | O_CREAT, DUMMY_FILE_RO_MODE)) == -1) {
/* No clean up */
} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
close(fd);
remove(DummyFile);
} else if (((rc = close(fd)) == -1) ||
((rc = dm_set_eventlist(sid, hanp, hlen, DM_NO_TOKEN, &AMevents, DM_EVENT_MAX)) == -1)) {
dm_handle_free(hanp, hlen);
remove(DummyFile);
}
if (fd == -1 || rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "chmod(%s)\n", DummyFile);
rc = chmod(DummyFile, O_RDWR);
DMLOG_PRINT(DMLVL_DEBUG, "chmod(%s) returned %d\n", DummyFile, rc);
EVENT_DELIVERY_DELAY;
if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) {
struct stat statfs;
rc = dm_handle_to_ino(ahanp1, ahlen1, &ino);
rc |= stat(DummyFile, &statfs);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n");
varStatus = DMSTAT_FAIL;
} else if (dm_handle_cmp(hanp2, hlen2, ahanp1, ahlen1) != 0) {
DMLOG_PRINT(DMLVL_ERR, "Object/entry handles NOT same!\n");
varStatus = DMSTAT_FAIL;
} else if (ino != statfs.st_ino) {
DMLOG_PRINT(DMLVL_ERR, "Object handle NOT correct! (%lld vs %d)\n", ino, statfs.st_ino);
varStatus = DMSTAT_FAIL;
} else if (!(statfs.st_mode & O_RDWR)) {
DMLOG_PRINT(DMLVL_ERR, "Object mode NOT correct! (%x vs %x)\n", O_RDWR, statfs.st_mode);
varStatus = DMSTAT_FAIL;
} else if (strcmp(name1, DUMMY_FILE) != 0) {
DMLOG_PRINT(DMLVL_ERR, "Entry name NOT correct! (%s vs %s)\n", name1, DUMMY_FILE);
varStatus = DMSTAT_FAIL;
}
}
DMVAR_END(varStatus);
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
}
}
/*
* TEST : chown - enabled on file
* EXPECTED: DM_EVENT_ATTRIBUTE
*/
if (DMVAR_EXEC(FILE_ASYNC_META_EVENT_BASE + 5)) {
int fd;
void *hanp;
size_t hlen;
dm_ino_t ino;
/* Variation set up */
eventExpected = DM_EVENT_ATTRIBUTE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
if ((fd = open(DummyFile, O_RDONLY | O_CREAT, DUMMY_FILE_RO_MODE)) == -1) {
/* No clean up */
} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
close(fd);
remove(DummyFile);
} else if (((rc = close(fd)) == -1) ||
((rc = dm_set_eventlist(sid, hanp, hlen, DM_NO_TOKEN, &AMevents, DM_EVENT_MAX)) == -1)) {
dm_handle_free(hanp, hlen);
remove(DummyFile);
}
if (fd == -1 || rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "chown(%s)\n", DummyFile);
rc = chown(DummyFile, DUMMY_UID, DUMMY_GID);
DMLOG_PRINT(DMLVL_DEBUG, "chown(%s) returned %d\n", DummyFile, rc);
EVENT_DELIVERY_DELAY;
if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) {
struct stat statfs;
rc = dm_handle_to_ino(ahanp1, ahlen1, &ino);
rc |= stat(DummyFile, &statfs);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n");
varStatus = DMSTAT_FAIL;
} else if (dm_handle_cmp(hanp2, hlen2, ahanp1, ahlen1) != 0) {
DMLOG_PRINT(DMLVL_ERR, "Object/entry handles NOT same!\n");
varStatus = DMSTAT_FAIL;
} else if (ino != statfs.st_ino) {
DMLOG_PRINT(DMLVL_ERR, "Object handle NOT correct! (%lld vs %d)\n", ino, statfs.st_ino);
varStatus = DMSTAT_FAIL;
} else if (statfs.st_uid != DUMMY_UID) {
DMLOG_PRINT(DMLVL_ERR, "Object uid NOT correct! (%x vs %x)\n", DUMMY_UID, statfs.st_uid);
varStatus = DMSTAT_FAIL;
} else if (statfs.st_gid != DUMMY_GID) {
DMLOG_PRINT(DMLVL_ERR, "Object gid NOT correct! (%x vs %x)\n", DUMMY_GID, statfs.st_gid);
varStatus = DMSTAT_FAIL;
} else if (strcmp(name1, DUMMY_FILE) != 0) {
DMLOG_PRINT(DMLVL_ERR, "Entry name NOT correct! (%s vs %s)\n", name1, DUMMY_FILE);
varStatus = DMSTAT_FAIL;
}
}
DMVAR_END(varStatus);
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
}
}
/*
* TEST : close - enabled on file
* EXPECTED: DM_EVENT_CLOSE
*/
if (DMVAR_EXEC(FILE_ASYNC_META_EVENT_BASE + 6)) {
int fd1, fd2;
void *hanp;
size_t hlen;
/* Variation set up */
eventExpected = DM_EVENT_CLOSE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
if ((fd1 = open(DummyFile, O_RDONLY | O_CREAT, DUMMY_FILE_RO_MODE)) == -1) {
/* No clean up */
} else if ((fd2 = open(DummyFile, O_RDONLY)) == -1) {
close(fd1);
remove(DummyFile);
} else if ((rc = dm_fd_to_handle(fd2, &hanp, &hlen)) == -1) {
close(fd2);
close(fd1);
remove(DummyFile);
} else if ((rc = dm_set_eventlist(sid, hanp, hlen, DM_NO_TOKEN, &AMevents, DM_EVENT_MAX)) == -1) {
dm_handle_free(hanp, hlen);
close(fd2);
close(fd1);
remove(DummyFile);
}
if (fd1 == -1 || fd2 == -1 || fd1 == fd2) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
eventExpected = DM_EVENT_INVALID;
eventReceived = DM_EVENT_INVALID;
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #1\n", fd1);
rc = close(fd1);
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #1 returned %d\n", fd1, rc);
EVENT_DELIVERY_DELAY;
if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) {
eventExpected = DM_EVENT_CLOSE;
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #2\n", fd2);
rc = close(fd2);
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #2 returned %d\n", fd2, rc);
EVENT_DELIVERY_DELAY;
varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived);
}
DMVAR_END(varStatus);
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
dm_handle_free(hanp, hlen);
}
}
/* Wait for all pending messages to be handled */
EVENT_DELIVERY_DELAY_LOOP;
/*
* Last batch of tests will be with events disabled
*/
/*
* TEST : chmod - disabled
* EXPECTED: DM_EVENT_ATTRIBUTE
*/
if (DMVAR_EXEC(DIR_ASYNC_META_EVENT_BASE + 7)) {
/* Variation set up */
eventExpected = DM_EVENT_ATTRIBUTE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
rc = mkdir(DummySubdir, DUMMY_DIR_RO_MODE);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
eventExpected = DM_EVENT_INVALID;
eventReceived = DM_EVENT_INVALID;
DMLOG_PRINT(DMLVL_DEBUG, "chmod(%s)\n", DummySubdir);
rc = chmod(DummySubdir, O_RDWR);
DMLOG_PRINT(DMLVL_DEBUG, "chmod(%s) returned %d\n", DummySubdir, rc);
EVENT_DELIVERY_DELAY;
DMVAR_END(DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived));
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = rmdir(DummySubdir);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
}
}
/*
* TEST : chown - disabled
* EXPECTED: DM_EVENT_ATTRIBUTE
*/
if (DMVAR_EXEC(DIR_ASYNC_META_EVENT_BASE + 8)) {
/* Variation set up */
eventExpected = DM_EVENT_ATTRIBUTE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
rc = mkdir(DummySubdir, DUMMY_DIR_RO_MODE);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
eventExpected = DM_EVENT_INVALID;
eventReceived = DM_EVENT_INVALID;
DMLOG_PRINT(DMLVL_DEBUG, "chown(%s)\n", DummySubdir);
rc = chown(DummySubdir, DUMMY_UID, DUMMY_GID);
DMLOG_PRINT(DMLVL_DEBUG, "chown(%s) returned %d\n", DummySubdir, rc);
EVENT_DELIVERY_DELAY;
DMVAR_END(DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived));
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = rmdir(DummySubdir);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
}
}
/*
* TEST : close - disabled
* EXPECTED: DM_EVENT_CLOSE
*/
if (DMVAR_EXEC(DIR_ASYNC_META_EVENT_BASE + 9)) {
int fd1, fd2;
/* Variation set up */
eventExpected = DM_EVENT_CLOSE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
if ((rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE)) == -1) {
/* No clean up */
} else if ((fd1 = open(DummySubdir, O_DIRECTORY)) == -1) {
rmdir(DummySubdir);
} else if ((fd2 = open(DummySubdir, O_DIRECTORY)) == -1) {
close(fd1);
rmdir(DummySubdir);
}
if (fd1 == -1 || fd2 == -1 || fd1 == fd2) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
eventExpected = DM_EVENT_INVALID;
eventReceived = DM_EVENT_INVALID;
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #1\n", fd1);
rc = close(fd1);
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #1 returned %d\n", fd1, rc);
EVENT_DELIVERY_DELAY;
if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) {
eventExpected = DM_EVENT_INVALID;
eventReceived = DM_EVENT_INVALID;
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #2\n", fd2);
rc = close(fd2);
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #2 returned %d\n", fd2, rc);
EVENT_DELIVERY_DELAY;
varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived);
}
DMVAR_END(varStatus);
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = rmdir(DummySubdir);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
}
}
/*
* TEST : chmod - disabled
* EXPECTED: DM_EVENT_ATTRIBUTE
*/
if (DMVAR_EXEC(FILE_ASYNC_META_EVENT_BASE + 7)) {
int fd;
/* Variation set up */
eventExpected = DM_EVENT_ATTRIBUTE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
if ((fd = open(DummyFile, O_RDONLY | O_CREAT, DUMMY_FILE_RO_MODE)) == -1) {
/* No clean up */
} else if ((rc = close(fd)) == -1) {
remove(DummyFile);
}
if (fd == -1 || rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
eventExpected = DM_EVENT_INVALID;
eventReceived = DM_EVENT_INVALID;
DMLOG_PRINT(DMLVL_DEBUG, "chmod(%s)\n", DummyFile);
rc = chmod(DummyFile, O_RDWR);
DMLOG_PRINT(DMLVL_DEBUG, "chmod(%s) returned %d\n", DummyFile, rc);
EVENT_DELIVERY_DELAY;
DMVAR_END(DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived));
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
}
}
/*
* TEST : chown - disabled
* EXPECTED: DM_EVENT_ATTRIBUTE
*/
if (DMVAR_EXEC(FILE_ASYNC_META_EVENT_BASE + 8)) {
int fd;
/* Variation set up */
eventExpected = DM_EVENT_ATTRIBUTE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
if ((fd = open(DummyFile, O_RDONLY | O_CREAT, DUMMY_FILE_RO_MODE)) == -1) {
/* No clean up */
} else if ((rc = close(fd)) == -1) {
remove(DummyFile);
}
if (fd == -1 || rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
eventExpected = DM_EVENT_INVALID;
eventReceived = DM_EVENT_INVALID;
DMLOG_PRINT(DMLVL_DEBUG, "chown(%s)\n", DummyFile);
rc = chown(DummyFile, DUMMY_UID, DUMMY_GID);
DMLOG_PRINT(DMLVL_DEBUG, "chown(%s) returned %d\n", DummyFile, rc);
EVENT_DELIVERY_DELAY;
DMVAR_END(DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived));
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
}
}
/*
* TEST : close - disabled
* EXPECTED: DM_EVENT_CLOSE
*/
if (DMVAR_EXEC(FILE_ASYNC_META_EVENT_BASE + 9)) {
int fd1, fd2;
/* Variation set up */
eventExpected = DM_EVENT_CLOSE;
eventReceived = DM_EVENT_INVALID;
eventResponse = DM_RESP_CONTINUE;
if ((fd1 = open(DummyFile, O_RDONLY | O_CREAT, DUMMY_FILE_RO_MODE)) == -1) {
/* No clean up */
} else if ((fd2 = open(DummyFile, O_RDONLY)) == -1) {
close(fd1);
remove(DummyFile);
}
if (fd1 == -1 || fd2 == -1 || fd1 == fd2) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
eventExpected = DM_EVENT_INVALID;
eventReceived = DM_EVENT_INVALID;
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #1\n", fd1);
rc = close(fd1);
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #1 returned %d\n", fd1, rc);
EVENT_DELIVERY_DELAY;
if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) {
eventExpected = DM_EVENT_INVALID;
eventReceived = DM_EVENT_INVALID;
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #2\n", fd2);
rc = close(fd2);
DMLOG_PRINT(DMLVL_DEBUG, "close(%d) #2 returned %d\n", fd2, rc);
EVENT_DELIVERY_DELAY;
varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived);
}
DMVAR_END(varStatus);
/* Variation clean up */
EVENT_DELIVERY_DELAY;
rc = remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
}
}
/* From here on out we're only interested in the destroy event */
DMEV_ZERO(events);
DMEV_SET(DM_EVENT_PREUNMOUNT, events);
DMEV_SET(DM_EVENT_UNMOUNT, events);
DMEV_SET(DM_EVENT_DESTROY, events);
rc = dm_set_eventlist(sid, fshanp, fshlen, DM_NO_TOKEN, &events, DM_EVENT_MAX);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "dm_set_eventlist failed! (rc = %d, errno = %d)\n", rc, errno);
dm_destroy_session(sid);
DM_EXIT();
}
rc = dm_get_config(fshanp, fshlen, DM_CONFIG_MAX_ATTR_ON_DESTROY, &maxAttrSize);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "dm_get_config failed! (rc = %d, errno = %d)\n", rc, errno);
dm_destroy_session(sid);
DM_EXIT();
} else {
DMLOG_PRINT(DMLVL_DEBUG, "DM_CONFIG_MAX_ATTR_ON_DESTROY %d\n", maxAttrSize);
}
szFuncName = "dm_set_return_on_destroy";
/*
* TEST : dm_set_return_on_destroy - invalid sid
* EXPECTED: rc = -1, errno = EINVAL
*/
if (DMVAR_EXEC(SET_RETURN_ON_DESTROY_BASE + 1)) {
int fd;
void *hanp, *fshanp;
size_t hlen, fshlen;
dm_attrname_t attrname;
char buf[ATTR_VALUELEN];
/* Variation set up */
memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -1) {
/* No clean up */
} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
close(fd);
remove(DummyFile);
} else if (((rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname, 0, sizeof(buf), buf)) == -1) ||
((rc = dm_path_to_fshandle(DummyFile, &fshanp, &fshlen)) == -1)) {
close(fd);
remove(DummyFile);
dm_handle_free(hanp, hlen);
}
if (fd == -1 || rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n", szFuncName);
rc = dm_set_return_on_destroy(INVALID_ADDR, fshanp, fshlen, DM_NO_TOKEN, &attrname, DM_TRUE);
DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
/* Variation clean up */
rc = close(fd);
rc |= remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
dm_handle_free(hanp, hlen);
dm_handle_free(fshanp, fshlen);
}
}
/*
* TEST : dm_set_return_on_destroy - invalid hanp
* EXPECTED: rc = -1, errno = EFAULT
*/
if (DMVAR_EXEC(SET_RETURN_ON_DESTROY_BASE + 2)) {
int fd;
void *hanp, *fshanp;
size_t hlen, fshlen;
dm_attrname_t attrname;
char buf[ATTR_VALUELEN];
/* Variation set up */
memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -1) {
/* No clean up */
} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
close(fd);
remove(DummyFile);
} else if (((rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname, 0, sizeof(buf), buf)) == -1) ||
((rc = dm_path_to_fshandle(DummyFile, &fshanp, &fshlen)) == -1)) {
close(fd);
remove(DummyFile);
dm_handle_free(hanp, hlen);
}
if (fd == -1 || rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n", szFuncName);
rc = dm_set_return_on_destroy(sid, (void *)INVALID_ADDR, fshlen, DM_NO_TOKEN, &attrname, DM_TRUE);
DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
/* Variation clean up */
rc = close(fd);
rc |= remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
dm_handle_free(hanp, hlen);
dm_handle_free(fshanp, fshlen);
}
}
/*
* TEST : dm_set_return_on_destroy - invalid hlen
* EXPECTED: rc = -1, errno = EBADF
*/
if (DMVAR_EXEC(SET_RETURN_ON_DESTROY_BASE + 3)) {
int fd;
void *hanp, *fshanp;
size_t hlen, fshlen;
dm_attrname_t attrname;
char buf[ATTR_VALUELEN];
/* Variation set up */
memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -1) {
/* No clean up */
} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
close(fd);
remove(DummyFile);
} else if (((rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname, 0, sizeof(buf), buf)) == -1) ||
((rc = dm_path_to_fshandle(DummyFile, &fshanp, &fshlen)) == -1)) {
close(fd);
remove(DummyFile);
dm_handle_free(hanp, hlen);
}
if (fd == -1 || rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n", szFuncName);
rc = dm_set_return_on_destroy(sid, fshanp, INVALID_ADDR, DM_NO_TOKEN, &attrname, DM_TRUE);
DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
/* Variation clean up */
rc = close(fd);
rc |= remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
dm_handle_free(hanp, hlen);
dm_handle_free(fshanp, fshlen);
}
}
/*
* TEST : dm_set_return_on_destroy - invalid token
* EXPECTED: rc = -1, errno = EINVAL
*/
if (DMVAR_EXEC(SET_RETURN_ON_DESTROY_BASE + 4)) {
int fd;
void *hanp, *fshanp;
size_t hlen, fshlen;
dm_attrname_t attrname;
char buf[ATTR_VALUELEN];
/* Variation set up */
memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -1) {
/* No clean up */
} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
close(fd);
remove(DummyFile);
} else if (((rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname, 0, sizeof(buf), buf)) == -1) ||
((rc = dm_path_to_fshandle(DummyFile, &fshanp, &fshlen)) == -1)) {
close(fd);
remove(DummyFile);
dm_handle_free(hanp, hlen);
}
if (fd == -1 || rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n", szFuncName);
rc = dm_set_return_on_destroy(sid, fshanp, fshlen, INVALID_ADDR, &attrname, DM_TRUE);
DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
/* Variation clean up */
rc = close(fd);
rc |= remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
dm_handle_free(hanp, hlen);
dm_handle_free(fshanp, fshlen);
}
}
/*
* TEST : dm_set_return_on_destroy - invalid attrnamep
* EXPECTED: rc = -1, errno = EFAULT
*
* This variation uncovered XFS BUG #14 (non-0 return code from
* copy_from_user returned)
*/
if (DMVAR_EXEC(SET_RETURN_ON_DESTROY_BASE + 5)) {
int fd;
void *hanp, *fshanp;
size_t hlen, fshlen;
dm_attrname_t attrname;
char buf[ATTR_VALUELEN];
/* Variation set up */
memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -1) {
/* No clean up */
} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
close(fd);
remove(DummyFile);
} else if (((rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname, 0, sizeof(buf), buf)) == -1) ||
((rc = dm_path_to_fshandle(DummyFile, &fshanp, &fshlen)) == -1)) {
close(fd);
remove(DummyFile);
dm_handle_free(hanp, hlen);
}
if (fd == -1 || rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid attrnamep)\n", szFuncName);
rc = dm_set_return_on_destroy(sid, fshanp, fshlen, DM_NO_TOKEN, (dm_attrname_t *)INVALID_ADDR, DM_TRUE);
DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
/* Variation clean up */
rc = close(fd);
rc |= remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
dm_handle_free(hanp, hlen);
dm_handle_free(fshanp, fshlen);
}
}
/*
* TEST : dm_set_return_on_destroy - DM_NO_SESSION sid
* EXPECTED: rc = -1, errno = EINVAL
*/
if (DMVAR_EXEC(SET_RETURN_ON_DESTROY_BASE + 6)) {
int fd;
void *hanp, *fshanp;
size_t hlen, fshlen;
dm_attrname_t attrname;
char buf[ATTR_VALUELEN];
/* Variation set up */
memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -1) {
/* No clean up */
} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
close(fd);
remove(DummyFile);
} else if (((rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname, 0, sizeof(buf), buf)) == -1) ||
((rc = dm_path_to_fshandle(DummyFile, &fshanp, &fshlen)) == -1)) {
close(fd);
remove(DummyFile);
dm_handle_free(hanp, hlen);
}
if (fd == -1 || rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n", szFuncName);
rc = dm_set_return_on_destroy(DM_NO_SESSION, fshanp, fshlen, DM_NO_TOKEN, &attrname, DM_TRUE);
DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
/* Variation clean up */
rc = close(fd);
rc |= remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
dm_handle_free(hanp, hlen);
dm_handle_free(fshanp, fshlen);
}
}
/*
* TEST : dm_set_return_on_destroy - different sid
* EXPECTED: rc = -1, errno = EINVAL
*/
if (DMVAR_EXEC(SET_RETURN_ON_DESTROY_BASE + 7)) {
int fd;
void *hanp, *fshanp;
size_t hlen, fshlen;
dm_attrname_t attrname;
char buf[ATTR_VALUELEN];
dm_sessid_t newsid;
/* Variation set up */
memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -1) {
/* No clean up */
} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
close(fd);
remove(DummyFile);
} else if (((rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname, 0, sizeof(buf), buf)) == -1) ||
((rc = dm_path_to_fshandle(DummyFile, &fshanp, &fshlen)) == -1)) {
close(fd);
remove(DummyFile);
dm_handle_free(hanp, hlen);
} else if ((rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid)) == -1) {
close(fd);
remove(DummyFile);
dm_handle_free(hanp, hlen);
dm_handle_free(fshanp, fshlen);
}
if (fd == -1 || rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "%s(different sid)\n", szFuncName);
rc = dm_set_return_on_destroy(newsid, fshanp, fshlen, DM_NO_TOKEN, &attrname, DM_FALSE);
DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
/* Variation clean up */
rc = close(fd);
rc |= remove(DummyFile);
rc |= dm_destroy_session(newsid);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
dm_handle_free(hanp, hlen);
dm_handle_free(fshanp, fshlen);
}
}
/*
* TEST : dm_set_return_on_destroy - file handle
* EXPECTED: rc = -1, errno = EINVAL
*/
if (DMVAR_EXEC(SET_RETURN_ON_DESTROY_BASE + 8)) {
int fd;
void *hanp;
size_t hlen;
dm_attrname_t attrname;
char buf[ATTR_VALUELEN];
/* Variation set up */
memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -1) {
/* No clean up */
} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
close(fd);
remove(DummyFile);
} else if ((rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname, 0, sizeof(buf), buf)) == -1) {
close(fd);
remove(DummyFile);
dm_handle_free(hanp, hlen);
}
if (fd == -1 || rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "%s(file handle)\n", szFuncName);
rc = dm_set_return_on_destroy(sid, hanp, hlen, DM_NO_TOKEN, &attrname, DM_TRUE);
DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
/* Variation clean up */
rc = close(fd);
rc |= remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
dm_handle_free(hanp, hlen);
}
}
/*
* TEST : dm_set_return_on_destroy - directory handle
* EXPECTED: rc = -1, errno = EINVAL
*/
if (DMVAR_EXEC(SET_RETURN_ON_DESTROY_BASE + 9)) {
void *hanp;
size_t hlen;
dm_attrname_t attrname;
char buf[ATTR_VALUELEN];
/* Variation set up */
memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
if ((rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE)) == -1) {
/* No clean up */
} else if ((rc = dm_path_to_handle(DummySubdir, &hanp, &hlen)) == -1) {
rmdir(DummySubdir);
} else if ((rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname, 0, sizeof(buf), buf)) == -1) {
rmdir(DummySubdir);
dm_handle_free(hanp, hlen);
}
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "%s(dir handle)\n", szFuncName);
rc = dm_set_return_on_destroy(sid, hanp, hlen, DM_NO_TOKEN, &attrname, DM_TRUE);
DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
/* Variation clean up */
rc = rmdir(DummySubdir);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
dm_handle_free(hanp, hlen);
}
}
/*
* TEST : dm_set_return_on_destroy - global handle
* EXPECTED: rc = -1, errno = EBADF
*/
if (DMVAR_EXEC(SET_RETURN_ON_DESTROY_BASE + 10)) {
dm_attrname_t attrname;
/* Variation set up */
memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
rc = dm_set_return_on_destroy(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN, DM_NO_TOKEN, &attrname, DM_TRUE);
DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
/* Variation clean up */
}
/*
* TEST : dm_set_return_on_destroy - valid
* EXPECTED: rc = -1, errno = EINVAL
*/
if (DMVAR_EXEC(SET_RETURN_ON_DESTROY_BASE + 11)) {
int fd;
void *hanp, *fshanp;
size_t hlen, fshlen;
dm_attrname_t attrname;
char buf[ATTR_VALUELEN];
/* Variation set up */
memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
memcpy(buf, ATTR_VALUE, ATTR_VALUELEN);
if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -1) {
/* No clean up */
} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
close(fd);
remove(DummyFile);
} else if (((rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname, 0, sizeof(buf), buf)) == -1) ||
((rc = dm_path_to_fshandle(DummyFile, &fshanp, &fshlen)) == -1)) {
close(fd);
remove(DummyFile);
dm_handle_free(hanp, hlen);
}
if (fd == -1 || rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "%s(valid)\n", szFuncName);
rc = dm_set_return_on_destroy(sid, fshanp, fshlen, DM_NO_TOKEN, &attrname, DM_TRUE);
DMVAR_ENDPASSEXP(szFuncName, 0, rc);
/* Variation clean up */
rc = close(fd);
rc |= remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
dm_handle_free(hanp, hlen);
dm_handle_free(fshanp, fshlen);
}
}
/*
* TEST : dm_set_return_on_destroy - zero length attribute
* EXPECTED: rc = -1, errno = EINVAL
*/
if (DMVAR_EXEC(SET_RETURN_ON_DESTROY_BASE + 12)) {
int fd;
void *hanp, *fshanp;
size_t hlen, fshlen;
dm_attrname_t attrname;
/* Variation set up */
memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -1) {
/* No clean up */
} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
close(fd);
remove(DummyFile);
} else if (((rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname, 0, 0, NULL)) == -1) ||
((rc = dm_path_to_fshandle(DummyFile, &fshanp, &fshlen)) == -1)) {
close(fd);
remove(DummyFile);
dm_handle_free(hanp, hlen);
}
if (fd == -1 || rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "%s(zero len attr)\n", szFuncName);
rc = dm_set_return_on_destroy(sid, fshanp, fshlen, DM_NO_TOKEN, &attrname, DM_TRUE);
DMVAR_ENDPASSEXP(szFuncName, 0, rc);
/* Variation clean up */
rc = close(fd);
rc |= remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
dm_handle_free(hanp, hlen);
dm_handle_free(fshanp, fshlen);
}
}
/*
* TEST : dm_set_return_on_destroy - attribute too big
* EXPECTED: rc = 0
*/
if (DMVAR_EXEC(SET_RETURN_ON_DESTROY_BASE + 13)) {
int fd;
void *hanp, *fshanp;
size_t hlen, fshlen;
dm_attrname_t attrname;
char *buf;
/* Variation set up */
memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE);
memcpy(attrname.an_chars, ATTR_NAME, DM_ATTR_NAME_SIZE);
if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -1) {
/* No clean up */
} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
close(fd);
remove(DummyFile);
} else if ((buf = malloc(maxAttrSize+1)) == NULL) {
dm_handle_free(hanp, hlen);
close(fd);
remove(DummyFile);
} else if ((memset(buf, '4', maxAttrSize+1) == NULL) ||
((rc = dm_set_dmattr(sid, hanp, hlen, DM_NO_TOKEN, &attrname, 0, maxAttrSize+1, buf)) == -1) ||
((rc = dm_path_to_fshandle(DummyFile, &fshanp, &fshlen)) == -1 )) {
free(buf);
dm_handle_free(hanp, hlen);
close(fd);
remove(DummyFile);
}
if (fd == -1 || rc == -1 || buf == NULL) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno);
DMVAR_SKIP();
} else {
/* Variation */
EVENT_DELIVERY_DELAY;
DMLOG_PRINT(DMLVL_DEBUG, "%s(attr too big)\n", szFuncName);
rc = dm_set_return_on_destroy(sid, fshanp, fshlen, DM_NO_TOKEN, &attrname, DM_TRUE);
DMVAR_ENDPASSEXP(szFuncName, 0, rc);
/* Variation clean up */
rc = close(fd);
rc |= remove(DummyFile);
if (rc == -1) {
DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno);
}
free(buf);
dm_handle_free(hanp, hlen);
dm_handle_free(fshanp, fshlen);
}
}
dm_handle_free(fshanp, fshlen);
/* Wait for all pending messages to be handled */
EVENT_DELIVERY_DELAY_LOOP;
rc = umount(mountPt);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "umount failed! (rc = %d, errno = %d)\n", rc, errno);
}
pthread_join(tid, NULL);
rc = dm_destroy_session(sid);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "dm_destroy_session failed! (rc = %d, errno = %d)\n", rc, errno);
}
DMLOG_STOP();
tst_exit();
}
void *Thread(void *parm)
{
int rc;
size_t dmMsgBufLen;
dm_eventmsg_t *dmMsg;
int bMounted = DM_FALSE;
int type;
dm_token_t token;
dm_eventset_t events;
dm_response_t response;
do {
/* Loop until message received (wait could be interrupted) */
do {
DMLOG_PRINT(DMLVL_DEBUG, "Waiting for event...\n");
dmMsgBufLen = 0;
rc = dm_get_events(sid, 1, DM_EV_WAIT, sizeof(dmMsgBuf), dmMsgBuf, &dmMsgBufLen);
DMLOG_PRINT(DMLVL_DEBUG, "... dm_get_events returned %d (errno %d)\n", rc, errno);
} while ((rc == -1) && (errno == EINTR) && (dmMsgBufLen == 0));
if (rc) {
DMLOG_PRINT(DMLVL_ERR, "dm_get_events failed with rc = %d, errno = %d\n", rc, errno);
dm_destroy_session(sid);
DM_EXIT();
} else {
dmMsg = (dm_eventmsg_t *)dmMsgBuf;
token = dmMsg->ev_token;
type = dmMsg->ev_type;
DMLOG_PRINT(DMLVL_DEBUG, "Received message %d\n", type);
}
if (type == DM_EVENT_MOUNT) {
/* SPECIAL CASE: need to set disposition, events and response */
dm_mount_event_t *me = DM_GET_VALUE(dmMsg, ev_data, dm_mount_event_t *);
void *lhanp = DM_GET_VALUE(me, me_handle1, void *);
size_t lhlen = DM_GET_LEN(me, me_handle1);
DMLOG_PRINT(DMLVL_DEBUG, "Message is DM_EVENT_MOUNT\n");
DMLOG_PRINT(DMLVL_DEBUG, " Mode: %x\n", me->me_mode);
DMLOG_PRINT(DMLVL_DEBUG, " File system handle: %p\n", lhanp);
DMLOG_PRINT(DMLVL_DEBUG, " File system handle length: %d\n", lhlen);
DMLOG_PRINT(DMLVL_DEBUG, " Mountpoint handle: %p\n", DM_GET_VALUE(me, me_handle2, void *));
DMLOG_PRINT(DMLVL_DEBUG, " Mountpoint handle length: %d\n", DM_GET_LEN(me, me_handle2));
DMLOG_PRINT(DMLVL_DEBUG, " Mountpoint path: %s\n", DM_GET_VALUE(me, me_name1, char *));
DMLOG_PRINT(DMLVL_DEBUG, " Media designator: %s\n", DM_GET_VALUE(me, me_name2, char *));
DMLOG_PRINT(DMLVL_DEBUG, " Root handle: %p\n", DM_GET_VALUE(me, me_roothandle, void *));
DMLOG_PRINT(DMLVL_DEBUG, " Root handle length: %d\n", DM_GET_LEN(me, me_roothandle));
bMounted = dm_handle_is_valid(lhanp, lhlen);
/*rc = dm_request_right(sid, lhanp, lhlen, token, DM_RR_WAIT, DM_RIGHT_EXCL);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "dm_request_right failed! (rc = %d, errno = %d)\n", rc, errno);
dm_destroy_session(sid);
DM_EXIT();
}*/
DMEV_ZERO(events);
DMEV_SET(DM_EVENT_PREUNMOUNT, events);
DMEV_SET(DM_EVENT_UNMOUNT, events);
DMEV_SET(DM_EVENT_POSTCREATE, events);
DMEV_SET(DM_EVENT_ATTRIBUTE, events);
DMEV_SET(DM_EVENT_CLOSE, events);
DMEV_SET(DM_EVENT_DESTROY, events);
rc = dm_set_disp(sid, lhanp, lhlen, DM_NO_TOKEN, &events, DM_EVENT_MAX);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "dm_set_disp failed! (rc = %d, errno = %d)\n", rc, errno);
dm_destroy_session(sid);
DM_EXIT();
}
/*rc = dm_release_right(sid, lhanp, lhlen, token);
if (rc == -1) {
DMLOG_PRINT(DMLVL_ERR, "dm_request_right failed! (rc = %d, errno = %d)\n", rc, errno);
dm_destroy_session(sid);
DM_EXIT();
}*/
response = DM_RESP_CONTINUE;
} else if (type == DM_EVENT_PREUNMOUNT) {
/* SPECIAL CASE: need to set response */
dm_namesp_event_t *nse = DM_GET_VALUE(dmMsg, ev_data, dm_namesp_event_t *);
DMLOG_PRINT(DMLVL_DEBUG, "Message is DM_EVENT_PREUNMOUNT\n");
DMLOG_PRINT(DMLVL_DEBUG, " Unmount mode: %x\n", nse->ne_mode);
DMLOG_PRINT(DMLVL_DEBUG, " File system handle: %p\n", DM_GET_VALUE(nse, ne_handle1, void *));
DMLOG_PRINT(DMLVL_DEBUG, " File system handle length: %d\n", DM_GET_LEN(nse, ne_handle1));
DMLOG_PRINT(DMLVL_DEBUG, " Root directory handle: %p\n", DM_GET_VALUE(nse, ne_handle2, void *));
DMLOG_PRINT(DMLVL_DEBUG, " Root directory handle length: %d\n", DM_GET_LEN(nse, ne_handle2));
response = DM_RESP_CONTINUE;
} else if (type == DM_EVENT_UNMOUNT) {
/* SPECIAL CASE: need to set response and bMounted */
dm_namesp_event_t *nse = DM_GET_VALUE(dmMsg, ev_data, dm_namesp_event_t *);
DMLOG_PRINT(DMLVL_DEBUG, "Message is DM_EVENT_UNMOUNT\n");
DMLOG_PRINT(DMLVL_DEBUG, " Unmount mode: %x\n", nse->ne_mode);
DMLOG_PRINT(DMLVL_DEBUG, " File system handle: %p\n", DM_GET_VALUE(nse, ne_handle1, void *));
DMLOG_PRINT(DMLVL_DEBUG, " File system handle length: %d\n", DM_GET_LEN(nse, ne_handle1));
DMLOG_PRINT(DMLVL_DEBUG, " Return code: %x\n", nse->ne_retcode);
if (nse->ne_retcode == 0) {
bMounted = DM_FALSE;
}
response = DM_RESP_CONTINUE;
} else if (type == DM_EVENT_POSTCREATE) {
/* SPECIAL CASE: need to save entry info */
dm_namesp_event_t *nse = DM_GET_VALUE(dmMsg, ev_data, dm_namesp_event_t *);
hanp2 = DM_GET_VALUE(nse, ne_handle2, void *);
hlen2 = DM_GET_LEN(nse, ne_handle2);
strcpy(name1, DM_GET_VALUE(nse, ne_name1, char *));
DMLOG_PRINT(DMLVL_DEBUG, "Message is DM_EVENT_POSTCREATE\n");
DMLOG_PRINT(DMLVL_DEBUG, " Mode: %x\n", nse->ne_mode);
DMLOG_PRINT(DMLVL_DEBUG, " Parent handle: %p\n", DM_GET_VALUE(nse, ne_handle1, void *));
DMLOG_PRINT(DMLVL_DEBUG, " Parent handle length: %d\n", DM_GET_LEN(nse, ne_handle1));
DMLOG_PRINT(DMLVL_DEBUG, " Entry handle: %p\n", hanp2);
DMLOG_PRINT(DMLVL_DEBUG, " Entry handle length: %d\n", hlen2);
DMLOG_PRINT(DMLVL_DEBUG, " Entry name: %s\n", name1);
DMLOG_PRINT(DMLVL_DEBUG, " Return code: %x\n", nse->ne_retcode);
/* No response needed */
response = DM_RESP_INVALID;
} else {
eventReceived = type;
response = eventResponse;
switch (type)
{
case DM_EVENT_ATTRIBUTE:
{
dm_namesp_event_t *nse = DM_GET_VALUE(dmMsg, ev_data, dm_namesp_event_t *);
ahanp1 = DM_GET_VALUE(nse, ne_handle1, void *);
ahlen1 = DM_GET_LEN(nse, ne_handle1);
DMLOG_PRINT(DMLVL_DEBUG, "Message is DM_EVENT_ATTRIBUTE\n");
DMLOG_PRINT(DMLVL_DEBUG, " Object handle: %p\n", ahanp1);
DMLOG_PRINT(DMLVL_DEBUG, " Object handle length: %d\n", ahlen1);
response = DM_RESP_INVALID;
break;
}
case DM_EVENT_CLOSE:
{
dm_namesp_event_t *nse = DM_GET_VALUE(dmMsg, ev_data, dm_namesp_event_t *);
ahanp1 = DM_GET_VALUE(nse, ne_handle1, void *);
ahlen1 = DM_GET_LEN(nse, ne_handle1);
DMLOG_PRINT(DMLVL_DEBUG, "Message is DM_EVENT_CLOSE\n");
DMLOG_PRINT(DMLVL_DEBUG, " Object handle: %p\n", ahanp1);
DMLOG_PRINT(DMLVL_DEBUG, " Object handle length: %d\n", ahlen1);
response = DM_RESP_INVALID;
break;
}
case DM_EVENT_DESTROY:
{
dm_destroy_event_t *de = DM_GET_VALUE(dmMsg, ev_data, dm_destroy_event_t *);
ahanp1 = DM_GET_VALUE(de, ds_handle, void *);
ahlen1 = DM_GET_LEN(de, ds_handle);
DMLOG_PRINT(DMLVL_DEBUG, "Message is DM_EVENT_DESTROY\n");
DMLOG_PRINT(DMLVL_DEBUG, " Object handle: %p\n", ahanp1);
DMLOG_PRINT(DMLVL_DEBUG, " Object handle length: %d\n", ahlen1);
if (de->ds_attrname.an_chars[0]) {
int attrlen = DM_GET_LEN(de, ds_attrcopy);
DMLOG_PRINT(DMLVL_DEBUG, " Attribute name: %.*s\n", 8, de->ds_attrname.an_chars);
DMLOG_PRINT(DMLVL_DEBUG, " Attribute value length: %d\n", attrlen);
if (attrlen) {
DMLOG_PRINT(DMLVL_DEBUG, " Attribute value: %s\n", DM_GET_VALUE(de, ds_attrcopy, char *));
}
}
response = DM_RESP_INVALID;
break;
}
default:
{
DMLOG_PRINT(DMLVL_ERR, "Message is unexpected!\n");
response = DM_RESP_ABORT;
break;
}
}
}
if (response != DM_RESP_INVALID) {
DMLOG_PRINT(DMLVL_DEBUG, "Responding to message %d with %d\n", type, response);
rc = dm_respond_event(sid, token, response, response == DM_RESP_ABORT ? ABORT_ERRNO : 0, 0, NULL);
}
} while (bMounted);
pthread_exit(0);
}