// Register for mount event void register_mount() { dm_eventset_t eventlist; DMEV_ZERO(eventlist); DMEV_SET(DM_EVENT_MOUNT, eventlist); if (dm_set_disp(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN, DM_NO_TOKEN, &eventlist, DM_EVENT_MAX) == -1) { fprintf(stderr, "dm_set_disp, %d/%s\n", errno, strerror(errno)); exit(1); } printf("Registered for MOUNT\n"); }
// Set the event disposition void set_events() { dm_eventset_t eventlist; DMEV_ZERO(eventlist); DMEV_SET(DM_EVENT_READ, eventlist); DMEV_SET(DM_EVENT_WRITE, eventlist); DMEV_SET(DM_EVENT_TRUNCATE, eventlist); if (dm_set_disp(sid, fs_hanp, fs_hlen, DM_NO_TOKEN, &eventlist, DM_EVENT_MAX) == -1) { fprintf(stderr, "dm_set_disp, %d/%s\n", errno, strerror(errno)); exit(1); } printf("Registered for READ, WRITE and TRUNCATE\n"); }
/* * Set the event disposition of the managed region events */ int set_events( dm_sessid_t sid, void *fs_hanp, size_t fs_hlen) { dm_eventset_t eventlist; DMEV_ZERO(eventlist); DMEV_SET(DM_EVENT_READ, eventlist); DMEV_SET(DM_EVENT_WRITE, eventlist); DMEV_SET(DM_EVENT_TRUNCATE, eventlist); if (dm_set_disp(sid, fs_hanp, fs_hlen, DM_NO_TOKEN, &eventlist, DM_EVENT_MAX) == -1) { errno_msg("Can't set event disposition"); return(1); } return(0); }
int main(int argc, char **argv) { char *varstr; int rc; int i; char *szSessionInfo = "dm_test session info"; dm_eventset_t events; 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 { int fd; sprintf(DummyFile, "%s/%s", mountPt, DUMMY_FILE); sprintf(DummyTmp, "%s/%s", mountPt, DUMMY_TMP); remove(DummyFile); EVENT_DELIVERY_DELAY; fd = open(DummyTmp, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE); if (fd != -1) { for (i = 0; i < TMP_FILELEN/DUMMY_STRLEN; i++) { if (write(fd, DUMMY_STRING, DUMMY_STRLEN) != DUMMY_STRLEN) { rc = -1; break; } } } else { rc = -1; } if (rc != -1) { rc = fsync(fd); } if (rc != -1) { rc = close(fd); } if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "creating dummy file failed! (rc = %d, errno = %d)\n", rc, errno); dm_destroy_session(sid); DM_EXIT(); } } DMLOG_PRINT(DMLVL_DEBUG, "Starting DMAPI memory mapped file synchronous event data tests\n") ; /* * TEST : mmap - no regions * EXPECTED: no event */ if (DMVAR_EXEC(MMAP_READ_BASE + 1)) { int fd; void *hanp; size_t hlen; off_t inoff = 0; size_t inlen = DUMMY_STRLEN; /* Variation set up */ eventExpected = DM_EVENT_INVALID; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_INVALID; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if ((rc = close(fd)) == -1) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDONLY, inoff, (long)inlen, 1); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; DMVAR_END(DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)); /* Variation clean up */ 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 : mmap - one region, DM_REGION_WRITE * EXPECTED: no event */ if (DMVAR_EXEC(MMAP_READ_BASE + 2)) { int fd; void *hanp; size_t hlen; off_t inoff = 0; size_t inlen = DUMMY_STRLEN; dm_boolean_t exactflag; int numRegions; dm_region_t Regions[1]; /* Variation set up */ eventExpected = DM_EVENT_INVALID; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_INVALID; numRegions = 1; Regions[0].rg_offset = 0; Regions[0].rg_size = 0; Regions[0].rg_flags = DM_REGION_WRITE; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if (((rc = dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions, Regions, &exactflag)) == -1) || ((rc = close(fd)) == -1)) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDONLY, inoff, (long)inlen, 1); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; DMVAR_END(DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)); /* Variation clean up */ 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 : mmap - one region, DM_REGION_TRUNCATE * EXPECTED: no event */ if (DMVAR_EXEC(MMAP_READ_BASE + 3)) { int fd; void *hanp; size_t hlen; off_t inoff = 0; size_t inlen = DUMMY_STRLEN; dm_boolean_t exactflag; int numRegions; dm_region_t Regions[1]; /* Variation set up */ eventExpected = DM_EVENT_INVALID; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_INVALID; numRegions = 1; Regions[0].rg_offset = 0; Regions[0].rg_size = 0; Regions[0].rg_flags = DM_REGION_TRUNCATE; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if (((rc = dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions, Regions, &exactflag)) == -1) || ((rc = close(fd)) == -1)) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDONLY, inoff, (long)inlen, 1); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; DMVAR_END(DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)); /* Variation clean up */ 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 : mmap - one region, DM_EVENT_READ, DM_RESP_CONTINUE * EXPECTED: DM_EVENT_READ * * This variation uncovered XFS BUG #33 (entire file returned instead * of mapped region only) */ if (DMVAR_EXEC(MMAP_READ_BASE + 4)) { int fd; void *hanp; size_t hlen; off_t inoff = PAGEALIGN(0); size_t inlen = PAGEALIGN(DUMMY_STRLEN); dm_boolean_t exactflag; int varStatus; int numRegions; dm_region_t Regions[1]; /* Variation set up */ eventExpected = DM_EVENT_READ; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; numRegions = 1; Regions[0].rg_offset = 0; Regions[0].rg_size = 0; Regions[0].rg_flags = DM_REGION_READ; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if (((rc = dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions, Regions, &exactflag)) == -1) || ((rc = close(fd)) == -1)) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDONLY, inoff, (long)inlen, 1); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { if (inoff != offset) { DMLOG_PRINT(DMLVL_ERR, "Offset NOT correct! (%d vs %d)\n", inoff, offset); varStatus = DMSTAT_FAIL; } else if (inlen != length) { DMLOG_PRINT(DMLVL_ERR, "Length NOT correct! (%d vs %d)\n", inlen, length); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ 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 : mmap - one region, DM_EVENT_READ, DM_RESP_ABORT * EXPECTED: DM_EVENT_READ */ if (DMVAR_EXEC(MMAP_READ_BASE + 5)) { int fd; void *hanp; size_t hlen; off_t inoff = PAGEALIGN(0); size_t inlen = PAGEALIGN(DUMMY_STRLEN); dm_boolean_t exactflag; int varStatus; int numRegions; dm_region_t Regions[1]; /* Variation set up */ eventExpected = DM_EVENT_READ; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_ABORT; numRegions = 1; Regions[0].rg_offset = 0; Regions[0].rg_size = 0; Regions[0].rg_flags = DM_REGION_READ; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if (((rc = dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions, Regions, &exactflag)) == -1) || ((rc = close(fd)) == -1)) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDONLY, inoff, (long)inlen, 0); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { if (inoff != offset) { DMLOG_PRINT(DMLVL_ERR, "Offset NOT correct! (%d vs %d)\n", inoff, offset); varStatus = DMSTAT_FAIL; } else if (inlen != length) { DMLOG_PRINT(DMLVL_ERR, "Length NOT correct! (%d vs %d)\n", inlen, length); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ 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 : mmap - one region, DM_EVENT_READ * EXPECTED: no event */ if (DMVAR_EXEC(MMAP_READ_BASE + 6)) { int fd; void *hanp; size_t hlen; off_t inoff = PAGEALIGN(0); size_t inlen = PAGEALIGN(DUMMY_STRLEN); dm_boolean_t exactflag; int numRegions; dm_region_t Regions[1]; /* Variation set up */ eventExpected = DM_EVENT_INVALID; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; numRegions = 1; Regions[0].rg_offset = TMP_FILELEN/2; Regions[0].rg_size = 0; Regions[0].rg_flags = DM_REGION_READ; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if (((rc = dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions, Regions, &exactflag)) == -1) || ((rc = close(fd)) == -1)) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDONLY, inoff, (long)inlen, 1); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; DMVAR_END(DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)); /* Variation clean up */ 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 : mmap - one region, DM_EVENT_READ * EXPECTED: no event */ if (DMVAR_EXEC(MMAP_READ_BASE + 7)) { int fd; void *hanp; size_t hlen; off_t inoff = PAGEALIGN(TMP_FILELEN/4); size_t inlen = PAGEALIGN(DUMMY_STRLEN); dm_boolean_t exactflag; int numRegions; dm_region_t Regions[1]; /* Variation set up */ eventExpected = DM_EVENT_INVALID; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; numRegions = 1; Regions[0].rg_offset = TMP_FILELEN/2; Regions[0].rg_size = 0; Regions[0].rg_flags = DM_REGION_READ; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if (((rc = dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions, Regions, &exactflag)) == -1) || ((rc = close(fd)) == -1)) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDONLY, inoff, (long)inlen, 1); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; DMVAR_END(DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)); /* Variation clean up */ 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 : mmap - one region, DM_EVENT_READ * EXPECTED: DM_EVENT_READ */ if (DMVAR_EXEC(MMAP_READ_BASE + 8)) { int fd; void *hanp; size_t hlen; off_t inoff = PAGEALIGN(TMP_FILELEN/4); size_t inlen = PAGEALIGN(DUMMY_STRLEN); dm_boolean_t exactflag; int varStatus; int numRegions; dm_region_t Regions[1]; /* Variation set up */ eventExpected = DM_EVENT_READ; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; numRegions = 1; Regions[0].rg_offset = TMP_FILELEN/4; Regions[0].rg_size = 0; Regions[0].rg_flags = DM_REGION_READ; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if (((rc = dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions, Regions, &exactflag)) == -1) || ((rc = close(fd)) == -1)) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDONLY, inoff, (long)inlen, 1); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { if (inoff != offset) { DMLOG_PRINT(DMLVL_ERR, "Offset NOT correct! (%d vs %d)\n", inoff, offset); varStatus = DMSTAT_FAIL; } else if (inlen != length) { DMLOG_PRINT(DMLVL_ERR, "Length NOT correct! (%d vs %d)\n", inlen, length); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ 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 : mmap - one region, DM_EVENT_READ * EXPECTED: no event */ if (DMVAR_EXEC(MMAP_READ_BASE + 9)) { int fd; void *hanp; size_t hlen; off_t inoff = PAGEALIGN(TMP_FILELEN/4); size_t inlen = PAGEALIGN(DUMMY_STRLEN); dm_boolean_t exactflag; int numRegions; dm_region_t Regions[1]; /* Variation set up */ eventExpected = DM_EVENT_INVALID; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; numRegions = 1; Regions[0].rg_offset = 0; Regions[0].rg_size = DUMMY_STRLEN; Regions[0].rg_flags = DM_REGION_READ; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if (((rc = dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions, Regions, &exactflag)) == -1) || ((rc = close(fd)) == -1)) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDONLY, inoff, (long)inlen, 1); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; DMVAR_END(DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)); /* Variation clean up */ 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 : mmap - no regions * EXPECTED: no event */ if (DMVAR_EXEC(MMAP_WRITE_BASE + 1)) { int fd; void *hanp; size_t hlen; off_t inoff = 0; size_t inlen = DUMMY_STRLEN; /* Variation set up */ eventExpected = DM_EVENT_INVALID; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_INVALID; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if ((rc = close(fd)) == -1) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDWR, inoff, (long)inlen, 1); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; DMVAR_END(DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)); /* Variation clean up */ 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 : mmap - one region, DM_REGION_READ * EXPECTED: no event */ if (DMVAR_EXEC(MMAP_WRITE_BASE + 2)) { int fd; void *hanp; size_t hlen; off_t inoff = 0; size_t inlen = DUMMY_STRLEN; dm_boolean_t exactflag; int numRegions; dm_region_t Regions[1]; /* Variation set up */ eventExpected = DM_EVENT_INVALID; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_INVALID; numRegions = 1; Regions[0].rg_offset = 0; Regions[0].rg_size = 0; Regions[0].rg_flags = DM_REGION_READ; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if (((rc = dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions, Regions, &exactflag)) == -1) || ((rc = close(fd)) == -1)) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDWR, inoff, (long)inlen, 1); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; DMVAR_END(DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)); /* Variation clean up */ 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 : mmap - one region, DM_REGION_TRUNCATE * EXPECTED: no event */ if (DMVAR_EXEC(MMAP_WRITE_BASE + 3)) { int fd; void *hanp; size_t hlen; off_t inoff = 0; size_t inlen = DUMMY_STRLEN; dm_boolean_t exactflag; int numRegions; dm_region_t Regions[1]; /* Variation set up */ eventExpected = DM_EVENT_INVALID; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_INVALID; numRegions = 1; Regions[0].rg_offset = 0; Regions[0].rg_size = 0; Regions[0].rg_flags = DM_REGION_TRUNCATE; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if (((rc = dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions, Regions, &exactflag)) == -1) || ((rc = close(fd)) == -1)) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDWR, inoff, (long)inlen, 1); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; DMVAR_END(DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)); /* Variation clean up */ 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 : mmap - one region, DM_EVENT_WRITE, DM_RESP_CONTINUE * EXPECTED: DM_EVENT_WRITE */ if (DMVAR_EXEC(MMAP_WRITE_BASE + 4)) { int fd; void *hanp; size_t hlen; off_t inoff = PAGEALIGN(0); size_t inlen = PAGEALIGN(DUMMY_STRLEN); dm_boolean_t exactflag; int varStatus; int numRegions; dm_region_t Regions[1]; /* Variation set up */ eventExpected = DM_EVENT_WRITE; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; numRegions = 1; Regions[0].rg_offset = 0; Regions[0].rg_size = 0; Regions[0].rg_flags = DM_REGION_WRITE; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if (((rc = dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions, Regions, &exactflag)) == -1) || ((rc = close(fd)) == -1)) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDWR, inoff, (long)inlen, 1); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { if (inoff != offset) { DMLOG_PRINT(DMLVL_ERR, "Offset NOT correct! (%d vs %d)\n", inoff, offset); varStatus = DMSTAT_FAIL; } else if (inlen != length) { DMLOG_PRINT(DMLVL_ERR, "Length NOT correct! (%d vs %d)\n", inlen, length); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ 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 : mmap - one region, DM_EVENT_WRITE, DM_RESP_ABORT * EXPECTED: DM_EVENT_WRITE */ if (DMVAR_EXEC(MMAP_WRITE_BASE + 5)) { int fd; void *hanp; size_t hlen; off_t inoff = PAGEALIGN(0); size_t inlen = PAGEALIGN(DUMMY_STRLEN); dm_boolean_t exactflag; int varStatus; int numRegions; dm_region_t Regions[1]; /* Variation set up */ eventExpected = DM_EVENT_WRITE; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_ABORT; numRegions = 1; Regions[0].rg_offset = 0; Regions[0].rg_size = 0; Regions[0].rg_flags = DM_REGION_WRITE; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if (((rc = dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions, Regions, &exactflag)) == -1) || ((rc = close(fd)) == -1)) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDWR, inoff, (long)inlen, 0); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { if (inoff != offset) { DMLOG_PRINT(DMLVL_ERR, "Offset NOT correct! (%d vs %d)\n", inoff, offset); varStatus = DMSTAT_FAIL; } else if (inlen != length) { DMLOG_PRINT(DMLVL_ERR, "Length NOT correct! (%d vs %d)\n", inlen, length); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ 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 : mmap - one region, DM_EVENT_WRITE * EXPECTED: no event */ if (DMVAR_EXEC(MMAP_WRITE_BASE + 6)) { int fd; void *hanp; size_t hlen; off_t inoff = PAGEALIGN(0); size_t inlen = PAGEALIGN(DUMMY_STRLEN); dm_boolean_t exactflag; int numRegions; dm_region_t Regions[1]; /* Variation set up */ eventExpected = DM_EVENT_INVALID; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; numRegions = 1; Regions[0].rg_offset = TMP_FILELEN/2; Regions[0].rg_size = 0; Regions[0].rg_flags = DM_REGION_WRITE; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if (((rc = dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions, Regions, &exactflag)) == -1) || ((rc = close(fd)) == -1)) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDWR, inoff, (long)inlen, 1); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; DMVAR_END(DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)); /* Variation clean up */ 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 : mmap - one region, DM_EVENT_WRITE * EXPECTED: no event */ if (DMVAR_EXEC(MMAP_WRITE_BASE + 7)) { int fd; void *hanp; size_t hlen; off_t inoff = PAGEALIGN(TMP_FILELEN/4); size_t inlen = PAGEALIGN(DUMMY_STRLEN); dm_boolean_t exactflag; int numRegions; dm_region_t Regions[1]; /* Variation set up */ eventExpected = DM_EVENT_INVALID; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; numRegions = 1; Regions[0].rg_offset = TMP_FILELEN/2; Regions[0].rg_size = 0; Regions[0].rg_flags = DM_REGION_WRITE; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if (((rc = dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions, Regions, &exactflag)) == -1) || ((rc = close(fd)) == -1)) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDWR, inoff, (long)inlen, 1); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; DMVAR_END(DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)); /* Variation clean up */ 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 : mmap - one region, DM_EVENT_WRITE * EXPECTED: DM_EVENT_WRITE */ if (DMVAR_EXEC(MMAP_WRITE_BASE + 8)) { int fd; void *hanp; size_t hlen; off_t inoff = PAGEALIGN(TMP_FILELEN/4); size_t inlen = PAGEALIGN(DUMMY_STRLEN); dm_boolean_t exactflag; int varStatus; int numRegions; dm_region_t Regions[1]; /* Variation set up */ eventExpected = DM_EVENT_WRITE; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; numRegions = 1; Regions[0].rg_offset = TMP_FILELEN/4; Regions[0].rg_size = 0; Regions[0].rg_flags = DM_REGION_WRITE; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if (((rc = dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions, Regions, &exactflag)) == -1) || ((rc = close(fd)) == -1)) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDWR, inoff, (long)inlen, 1); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { if (inoff != offset) { DMLOG_PRINT(DMLVL_ERR, "Offset NOT correct! (%d vs %d)\n", inoff, offset); varStatus = DMSTAT_FAIL; } else if (inlen != length) { DMLOG_PRINT(DMLVL_ERR, "Length NOT correct! (%d vs %d)\n", inlen, length); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ 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 : mmap - one region, DM_EVENT_WRITE * EXPECTED: no event */ if (DMVAR_EXEC(MMAP_WRITE_BASE + 9)) { int fd; void *hanp; size_t hlen; off_t inoff = PAGEALIGN(TMP_FILELEN/4); size_t inlen = PAGEALIGN(DUMMY_STRLEN); dm_boolean_t exactflag; int numRegions; dm_region_t Regions[1]; /* Variation set up */ eventExpected = DM_EVENT_INVALID; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; numRegions = 1; Regions[0].rg_offset = 0; Regions[0].rg_size = DUMMY_STRLEN; Regions[0].rg_flags = DM_REGION_WRITE; sprintf(command, "cp %s %s", DummyTmp, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDONLY)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } else if (((rc = dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, numRegions, Regions, &exactflag)) == -1) || ((rc = close(fd)) == -1)) { dm_handle_free(hanp, hlen); remove(DummyFile); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ sprintf(command, "./%s %s %d %ld %ld %d", MMAPFILE_EXE, DummyFile, O_RDWR, inoff, (long)inlen, 1); DMLOG_PRINT(DMLVL_DEBUG, "invoking %s\n", command); rc = system(command); EVENT_DELIVERY_DELAY; DMVAR_END(DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)); /* Variation clean up */ rc = remove(DummyFile); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } dm_handle_free(hanp, hlen); } } remove(DummyFile); remove(DummyTmp); 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(); return 0; }
void *Thread(void *parm) { int rc; size_t dmMsgBufLen; dm_eventmsg_t *dmMsg; int bMounted = DM_FALSE; dm_eventtype_t 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_READ, events); DMEV_SET(DM_EVENT_WRITE, events); rc = dm_set_disp(sid, lhanp, lhlen, 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(); } DMEV_ZERO(events); DMEV_SET(DM_EVENT_PREUNMOUNT, events); DMEV_SET(DM_EVENT_UNMOUNT, events); rc = dm_set_eventlist(sid, lhanp, lhlen, 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_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_UNMOUNT) { dm_namesp_event_t *nse = DM_GET_VALUE(dmMsg, ev_data, dm_namesp_event_t *); if (nse->ne_retcode == 0) { bMounted = DM_FALSE; } response = DM_RESP_CONTINUE; } else {
int main(int argc, char **argv) { char *szFuncName; char *varstr; int rc; int varStatus; char *szSessionInfo = "dm_test session info"; dm_eventset_t events; 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 { rc = dm_get_config(fshanp, fshlen, DM_CONFIG_MAX_MESSAGE_DATA, &maxMsgDat); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "dm_get_config failed! (rc = %d, errno = %d)\n", rc, errno); umount(mountPt); dm_destroy_session(sid); DM_EXIT(); } } DMLOG_PRINT(DMLVL_DEBUG, "Starting DMAPI user event tests\n") ; szFuncName = "dm_create_userevent"; /* * TEST : dm_create_uservent - invalid sid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(CREATE_USEREVENT_BASE + 1)) { char buf[MSG_DATALEN]; dm_token_t token; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n", szFuncName); rc = dm_create_userevent(INVALID_ADDR, MSG_DATALEN, buf, &token); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ } /* * TEST : dm_create_uservent - invalid msglen * EXPECTED: rc = -1, errno = E2BIG */ if (DMVAR_EXEC(CREATE_USEREVENT_BASE + 2)) { char buf[MSG_DATALEN]; dm_token_t token; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid msglen)\n", szFuncName); rc = dm_create_userevent(sid, maxMsgDat+1, buf, &token); DMVAR_ENDFAILEXP(szFuncName, -1, rc, E2BIG); /* Variation clean up */ } /* * TEST : dm_create_uservent - invalid msgdatap * EXPECTED: rc = -1, errno = EFAULT */ if (DMVAR_EXEC(CREATE_USEREVENT_BASE + 3)) { dm_token_t token; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid msgdatap)\n", szFuncName); rc = dm_create_userevent(sid, MSG_DATALEN, (void *)INVALID_ADDR, &token); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ } /* * TEST : dm_create_uservent - invalid tokenp * EXPECTED: rc = -1, errno = EFAULT * * This variation uncovered XFS BUG #11 (unused tevp left on queue) */ if (DMVAR_EXEC(CREATE_USEREVENT_BASE + 4)) { char buf[MSG_DATALEN]; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid tokenp)\n", szFuncName); rc = dm_create_userevent(sid, MSG_DATALEN, buf, (dm_token_t *)INVALID_ADDR); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ } /* * TEST : dm_create_uservent - valid * EXPECTED: rc = 0 */ if (DMVAR_EXEC(CREATE_USEREVENT_BASE + 5)) { char buf[MSG_DATALEN]; dm_token_t token; /* Variation set up */ memcpy(buf, MSG_DATA, MSG_DATALEN); /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(valid)\n", szFuncName); rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token); DMVAR_ENDPASSEXP(szFuncName, 0, rc); /* Variation clean up */ rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0, 0, NULL); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } /* * TEST : dm_create_uservent - DM_NO_SESSION sid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(CREATE_USEREVENT_BASE + 6)) { char buf[MSG_DATALEN]; dm_token_t token; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n", szFuncName); rc = dm_create_userevent(DM_NO_SESSION, MSG_DATALEN, buf, &token); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ } szFuncName = "dm_send_msg"; /* * TEST : dm_send_msg - invalid targetsid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(SEND_MSG_BASE + 1)) { char buf[MSG_DATALEN]; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid targetsid)\n", szFuncName); rc = dm_send_msg(INVALID_ADDR, DM_MSGTYPE_SYNC, MSG_DATALEN, buf); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ } /* * TEST : dm_send_msg - invalid msgtype * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(SEND_MSG_BASE + 2)) { char buf[MSG_DATALEN]; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid msgtype)\n", szFuncName); rc = dm_send_msg(sid, INVALID_ADDR, MSG_DATALEN, buf); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ } /* * TEST : dm_send_msg - invalid buflen * EXPECTED: rc = -1, errno = E2BIG */ if (DMVAR_EXEC(SEND_MSG_BASE + 3)) { char buf[MSG_DATALEN]; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid buflen)\n", szFuncName); rc = dm_send_msg(sid, DM_MSGTYPE_SYNC, maxMsgDat+1, buf); DMVAR_ENDFAILEXP(szFuncName, -1, rc, E2BIG); /* Variation clean up */ } /* * TEST : dm_send_msg - invalid bufp * EXPECTED: rc = -1, errno = EFAULT */ if (DMVAR_EXEC(SEND_MSG_BASE + 4)) { /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid bufp)\n", szFuncName); rc = dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN, (void *)INVALID_ADDR); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ } /* * TEST : dm_send_msg - DM_RESP_CONTINUE * EXPECTED: rc = 0 */ if (DMVAR_EXEC(SEND_MSG_BASE + 5)) { char buf[MSG_DATALEN]; /* Variation set up */ eventExpected = DM_EVENT_USER; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; memcpy(buf, MSG_DATA, MSG_DATALEN); /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(continue response)\n", szFuncName); rc = dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN, buf); if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { if (tokenReceived == 0) { DMLOG_PRINT(DMLVL_ERR, "Token NOT correct! (%d vs non-zero)\n", tokenReceived); varStatus = DMSTAT_FAIL; } if (msgDataLenReceived != MSG_DATALEN) { DMLOG_PRINT(DMLVL_ERR, "Message lengths NOT same! (%d vs %d)\n", msgDataLenReceived, MSG_DATALEN); varStatus = DMSTAT_FAIL; } else if (memcmp(msgDataReceived, buf, MSG_DATALEN) != 0) { DMLOG_PRINT(DMLVL_ERR, "Message data NOT same! (%s vs %s)\n", msgDataReceived, buf); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ } /* * TEST : dm_send_msg - DM_RESP_ABORT * EXPECTED: rc = -1, errno = ABORT_ERRNO * * This variation uncovered XFS BUG #39 (response reterror returned * instead of -1 and errno set to reterror) */ if (DMVAR_EXEC(SEND_MSG_BASE + 6)) { char buf[MSG_DATALEN]; /* Variation set up */ eventExpected = DM_EVENT_USER; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_ABORT; memcpy(buf, MSG_DATA, MSG_DATALEN); /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(abort response)\n", szFuncName); rc = dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN, buf); if ((varStatus = DMVAR_CHKFAILEXP(-1, rc, ABORT_ERRNO, eventExpected, eventReceived)) == DMSTAT_PASS) { if (tokenReceived == 0) { DMLOG_PRINT(DMLVL_ERR, "Token NOT correct! (%d vs non-zero)\n", tokenReceived); varStatus = DMSTAT_FAIL; } if (msgDataLenReceived != MSG_DATALEN) { DMLOG_PRINT(DMLVL_ERR, "Message lengths NOT same! (%d vs %d)\n", msgDataLenReceived, MSG_DATALEN); varStatus = DMSTAT_FAIL; } else if (memcmp(msgDataReceived, buf, MSG_DATALEN) != 0) { DMLOG_PRINT(DMLVL_ERR, "Message data NOT same! (%s vs %s)\n", msgDataReceived, buf); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ } /* * TEST : dm_send_msg - DM_MSGTYPE_ASYNC * EXPECTED: rc = 0 */ if (DMVAR_EXEC(SEND_MSG_BASE + 7)) { char buf[MSG_DATALEN]; /* Variation set up */ eventExpected = DM_EVENT_USER; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; memcpy(buf, MSG_DATA, MSG_DATALEN); /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_MSGTYPE_ASYNC)\n", szFuncName); rc = dm_send_msg(sid, DM_MSGTYPE_ASYNC, MSG_DATALEN, buf); EVENT_DELIVERY_DELAY; if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { if (tokenReceived != 0) { DMLOG_PRINT(DMLVL_ERR, "Token NOT correct! (%d vs %d)\n", tokenReceived, 0); varStatus = DMSTAT_FAIL; } if (msgDataLenReceived != MSG_DATALEN) { DMLOG_PRINT(DMLVL_ERR, "Message lengths NOT same! (%d vs %d)\n", msgDataLenReceived, MSG_DATALEN); varStatus = DMSTAT_FAIL; } else if (memcmp(msgDataReceived, buf, MSG_DATALEN) != 0) { DMLOG_PRINT(DMLVL_ERR, "Message data NOT same! (%s vs %s)\n", msgDataReceived, buf); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ } /* * TEST : dm_send_msg - DM_NO_SESSION targetsid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(SEND_MSG_BASE + 8)) { char buf[MSG_DATALEN]; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION targetsid)\n", szFuncName); rc = dm_send_msg(DM_NO_SESSION, DM_MSGTYPE_SYNC, MSG_DATALEN, buf); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ } szFuncName = "dm_find_eventmsg"; /* * TEST : dm_find_eventmsg - invalid sid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(FIND_EVENTMSG_BASE + 1)) { dm_token_t token; char buf[MSG_DATALEN]; size_t rlen; /* Variation set up */ memcpy(buf, MSG_DATA, MSG_DATALEN); rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to initialize variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n", szFuncName); rc = dm_find_eventmsg(INVALID_ADDR, token, MSG_DATALEN, buf, &rlen); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0, 0, NULL); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_find_eventmsg - invalid token * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(FIND_EVENTMSG_BASE + 2)) { dm_token_t token; char buf[MSG_DATALEN]; size_t rlen; /* Variation set up */ memcpy(buf, MSG_DATA, MSG_DATALEN); rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to initialize variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n", szFuncName); rc = dm_find_eventmsg(sid, INVALID_ADDR, MSG_DATALEN, buf, &rlen); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0, 0, NULL); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_find_eventmsg - invalid buflen * EXPECTED: rc = -1, errno = E2BIG */ if (DMVAR_EXEC(FIND_EVENTMSG_BASE + 3)) { dm_token_t token; char buf[MSG_DATALEN]; size_t rlen; /* Variation set up */ memcpy(buf, MSG_DATA, MSG_DATALEN); rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to initialize variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid buflen)\n", szFuncName); rc = dm_find_eventmsg(sid, token, MSG_DATALEN-1, buf, &rlen); if (rc == -1) { if (errno == E2BIG) { DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen); if (rlen == MSG_DATALEN+sizeof(dm_eventmsg_t)) { DMLOG_PRINT(DMLVL_DEBUG, "%s passed with expected rc = %d, expected errno = %d, and expected rlen = %d\n", szFuncName, rc, errno, rlen); DMVAR_PASS(); } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with expected rc = %d and expected errno = %d but unexpected rlen (%d vs %d)\n", szFuncName, rc, errno, rlen, MSG_DATALEN); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with expected rc = %d but unexpected errno = %d\n", szFuncName, rc, errno); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with unexpected rc = %d\n", szFuncName, rc); DMVAR_FAIL(); } /* Variation clean up */ rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0, 0, NULL); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_find_eventmsg - invalid bufp * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(FIND_EVENTMSG_BASE + 4)) { dm_token_t token; char buf[MSG_DATALEN]; size_t rlen; /* Variation set up */ memcpy(buf, MSG_DATA, MSG_DATALEN); rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to initialize variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid bufp)\n", szFuncName); rc = dm_find_eventmsg(sid, token, MSG_DATALEN, (void *)INVALID_ADDR, &rlen); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0, 0, NULL); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_find_eventmsg - invalid rlenp * EXPECTED: rc = -1, errno = EFAULT */ if (DMVAR_EXEC(FIND_EVENTMSG_BASE + 5)) { dm_token_t token; char buf[MSG_DATALEN]; /* Variation set up */ memcpy(buf, MSG_DATA, MSG_DATALEN); rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to initialize variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid rlenp)\n", szFuncName); rc = dm_find_eventmsg(sid, token, MSG_DATALEN, buf, (size_t *)INVALID_ADDR); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0, 0, NULL); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_find_eventmsg - valid * EXPECTED: rc = 0 */ if (DMVAR_EXEC(FIND_EVENTMSG_BASE + 6)) { dm_token_t token; char bufin[MSG_DATALEN], bufout[MSG_DATALEN+sizeof(dm_eventmsg_t)]; size_t rlen; /* Variation set up */ memcpy(bufin, MSG_DATA, MSG_DATALEN); rc = dm_create_userevent(sid, MSG_DATALEN, bufin, &token); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to initialize variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(valid)\n", szFuncName); rc = dm_find_eventmsg(sid, token, sizeof(bufout), bufout, &rlen); if (rc == 0) { DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen); if (rlen == MSG_DATALEN+sizeof(dm_eventmsg_t)) { if (memcmp(bufin, bufout+sizeof(dm_eventmsg_t), MSG_DATALEN) == 0) { DMLOG_PRINT(DMLVL_DEBUG, "%s passed with expected rc = %d, expected rlen %d, and expected buffer %s\n", szFuncName, rc, rlen, bufout+sizeof(dm_eventmsg_t)); DMVAR_PASS(); } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with expected rc = %d and expected rlen %d but expected buffer %s\n", szFuncName, rc, rlen, bufout); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s passed with expected rc = %d but unexpected rlen %d\n", szFuncName, rc, rlen); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with unexpected rc = %d (errno = %d)\n", szFuncName, rc, errno); DMVAR_FAIL(); } /* Variation clean up */ rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0, 0, NULL); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_find_eventmsg - DM_NO_SESSION sid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(FIND_EVENTMSG_BASE + 7)) { dm_token_t token; char buf[MSG_DATALEN]; size_t rlen; /* Variation set up */ memcpy(buf, MSG_DATA, MSG_DATALEN); rc = dm_create_userevent(sid, MSG_DATALEN, buf, &token); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to initialize variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n", szFuncName); rc = dm_find_eventmsg(DM_NO_SESSION, token, MSG_DATALEN, buf, &rlen); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ rc = dm_respond_event(sid, token, DM_RESP_CONTINUE, 0, 0, NULL); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } rc = umount(mountPt); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "umount failed! (rc = %d, errno = %d)\n", rc, errno); } EVENT_DELIVERY_DELAY; 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(); }
int dm_getall_disp( dm_sessid_t sid, size_t buflen, void *bufp, size_t *rlenp) { dm_session_t *s; /* pointer to session given by sid */ int lc1; /* first lock cookie */ int lc2; /* second lock cookie */ int totalsize; int msgsize; int fsyscnt; dm_dispinfo_t *prevmsg; dm_fsreg_t *fsrp; int error; char *kbuf; int tmp3; int tmp4; /* Because the dm_getall_disp structure contains a __u64 field, make sure that the buffer provided by the caller is aligned so that he can read such fields successfully. */ if (((__psint_t)bufp & (sizeof(__u64) - 1)) != 0) return(EFAULT); /* Compute the size of a dm_dispinfo structure, rounding up to an 8-byte boundary so that any subsequent structures will also be aligned. */ #if 0 /* XXX ug, what is going on here? */ msgsize = (sizeof(dm_dispinfo_t) + FSHSIZE + sizeof(uint64_t) - 1) & ~(sizeof(uint64_t) - 1); #else tmp3 = sizeof(dm_dispinfo_t) + FSHSIZE; tmp3 += sizeof(__u64); tmp3 -= 1; tmp4 = ~(sizeof(__u64) - 1); msgsize = tmp3 & tmp4; #endif /* Loop until we can get the right amount of temp space, being careful not to hold a mutex during the allocation. Usually only one trip. */ for (;;) { if ((fsyscnt = dm_fsys_cnt) == 0) { /*if (dm_cpoutsizet(rlenp, 0))*/ if (put_user(0,rlenp)) return(EFAULT); return(0); } kbuf = kmem_alloc(fsyscnt * msgsize, KM_SLEEP); lc1 = mutex_spinlock(&dm_reg_lock); if (fsyscnt == dm_fsys_cnt) break; mutex_spinunlock(&dm_reg_lock, lc1); kmem_free(kbuf, fsyscnt * msgsize); } /* Find the indicated session and lock it. */ if ((error = dm_find_session_and_lock(sid, &s, &lc2)) != 0) { mutex_spinunlock(&dm_reg_lock, lc1); kmem_free(kbuf, fsyscnt * msgsize); return(error); } /* Create a dm_dispinfo structure for each filesystem in which this session has at least one event selected for disposition. */ totalsize = 0; /* total bytes to transfer to the user */ prevmsg = NULL; for (fsrp = dm_registers; fsrp; fsrp = fsrp->fr_next) { dm_dispinfo_t *disp; int event; int found; disp = (dm_dispinfo_t *)(kbuf + totalsize); DMEV_ZERO(disp->di_eventset); for (event = 0, found = 0; event < DM_EVENT_MAX; event++) { if (fsrp->fr_sessp[event] != s) continue; DMEV_SET(event, disp->di_eventset); found++; } if (!found) continue; disp->_link = 0; disp->di_fshandle.vd_offset = sizeof(dm_dispinfo_t); disp->di_fshandle.vd_length = FSHSIZE; bcopy(&fsrp->fr_fsid, (char *)disp + disp->di_fshandle.vd_offset, disp->di_fshandle.vd_length); if (prevmsg) prevmsg->_link = msgsize; prevmsg = disp; totalsize += msgsize; } mutex_spinunlock(&s->sn_qlock, lc2); /* reverse cookie order */ mutex_spinunlock(&dm_reg_lock, lc1); if (put_user(totalsize, rlenp)) { error = EFAULT; } else if (totalsize > buflen) { /* no more room */ error = E2BIG; } else if (totalsize && copy_to_user(bufp, kbuf, totalsize)) { error = EFAULT; } else { error = 0; } kmem_free(kbuf, fsyscnt * msgsize); return(error); }
int main( int argc, char **argv) { dm_sessid_t sid = DM_NO_SESSION; dm_token_t token = DM_NO_TOKEN; u_int nelem = DM_EVENT_MAX; char *object; dm_eventset_t eventset; void *hanp; size_t hlen; u_int nelemp; char *name; int Fflag = 0; int error; int opt; int i; if (Progname = strrchr(argv[0], '/')) { Progname++; } else { Progname = argv[0]; } /* Crack and validate the command line options. */ while ((opt = getopt(argc, argv, "Fn:s:t:")) != EOF) { switch (opt) { case 'F': Fflag++; break; case 'n': nelem = atol(optarg); break; case 's': sid = atol(optarg); break; case 't': token = atol(optarg); break; case '?': usage(); } } if (optind + 1 != argc) usage(); object = argv[optind]; if (dm_init_service(&name) == -1) { fprintf(stderr, "Can't initialize the DMAPI\n"); exit(1); } if ((error = opaque_to_handle(object, &hanp, &hlen)) != 0) { fprintf(stderr, "can't get a handle from %s, %s\n", object, strerror(error)); return(1); } if (Fflag) { void *fshanp; size_t fshlen; if (dm_handle_to_fshandle(hanp, hlen, &fshanp, &fshlen)) { fprintf(stderr, "can't get filesystem handle from %s\n", object); exit(1); } dm_handle_free(hanp, hlen); hanp = fshanp; hlen = fshlen; } if (sid == DM_NO_SESSION) find_test_session(&sid); DMEV_ZERO(eventset); if (dm_get_eventlist(sid, hanp, hlen, token, nelem, &eventset, &nelemp)) { fprintf(stderr, "dm_get_eventlist failed, %s\n", strerror(errno)); return(1); } #ifdef VERITAS_21 fprintf(stdout, "Events on object %s (0x%x), nelemp %d:\n", #else fprintf(stdout, "Events on object %s (0x%llx), nelemp %d:\n", #endif object, eventset, nelemp); for (i = 0; i < nelemp; i++) { if (!DMEV_ISSET(i, eventset)) continue; switch (i) { case DM_EVENT_CANCEL: fprintf(stdout, "DM_EVENT_CANCEL"); break; case DM_EVENT_MOUNT: fprintf(stdout, "DM_EVENT_MOUNT"); break; case DM_EVENT_PREUNMOUNT: fprintf(stdout, "DM_EVENT_PREUNMOUNT"); break; case DM_EVENT_UNMOUNT: fprintf(stdout, "DM_EVENT_UNMOUNT"); break; case DM_EVENT_DEBUT: fprintf(stdout, "DM_EVENT_DEBUT"); break; case DM_EVENT_CREATE: fprintf(stdout, "DM_EVENT_CREATE"); break; case DM_EVENT_CLOSE: fprintf(stdout, "DM_EVENT_CLOSE"); break; case DM_EVENT_POSTCREATE: fprintf(stdout, "DM_EVENT_POSTCREATE"); break; case DM_EVENT_REMOVE: fprintf(stdout, "DM_EVENT_REMOVE"); break; case DM_EVENT_POSTREMOVE: fprintf(stdout, "DM_EVENT_POSTREMOVE"); break; case DM_EVENT_RENAME: fprintf(stdout, "DM_EVENT_RENAME"); break; case DM_EVENT_POSTRENAME: fprintf(stdout, "DM_EVENT_POSTRENAME"); break; case DM_EVENT_LINK: fprintf(stdout, "DM_EVENT_LINK"); break; case DM_EVENT_POSTLINK: fprintf(stdout, "DM_EVENT_POSTLINK"); break; case DM_EVENT_SYMLINK: fprintf(stdout, "DM_EVENT_SYMLINK"); break; case DM_EVENT_POSTSYMLINK: fprintf(stdout, "DM_EVENT_POSTSYMLINK"); break; case DM_EVENT_READ: fprintf(stdout, "DM_EVENT_READ"); break; case DM_EVENT_WRITE: fprintf(stdout, "DM_EVENT_WRITE"); break; case DM_EVENT_TRUNCATE: fprintf(stdout, "DM_EVENT_TRUNCATE"); break; case DM_EVENT_ATTRIBUTE: fprintf(stdout, "DM_EVENT_ATTRIBUTE"); break; case DM_EVENT_DESTROY: fprintf(stdout, "DM_EVENT_DESTROY"); break; case DM_EVENT_NOSPACE: fprintf(stdout, "DM_EVENT_NOSPACE"); break; case DM_EVENT_USER: fprintf(stdout, "DM_EVENT_USER"); break; case DM_EVENT_MAX: fprintf(stdout, "DM_EVENT_23"); break; } fprintf(stdout, " (%d)\n", i); } dm_handle_free(hanp, hlen); return(0); }
int main(int argc, char **argv) { char *varstr; int rc; int varStatus; char *szSessionInfo = "dm_test session info"; dm_eventset_t events; 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(DummyFile2, "%s/%s", mountPt, DUMMY_FILE2); sprintf(DummySubdir, "%s/%s", mountPt, DUMMY_SUBDIR); sprintf(DummySubdir2, "%s/%s", mountPt, DUMMY_SUBDIR2); sprintf(DummyLink, "%s/%s", mountPt, DUMMY_LINK); remove(DummyFile); remove(DummyFile2); unlink(DummyLink); rmdir(DummySubdir); rmdir(DummySubdir2); } DMLOG_PRINT(DMLVL_DEBUG, "Starting DMAPI synchronous namespace event tests\n") ; /* * TEST : mkdir - DM_RESP_CONTINUE * EXPECTED: DM_EVENT_CREATE */ if (DMVAR_EXEC(DIR_SYNC_NAMESP_EVENT_BASE + 1)) { dm_ino_t ino; /* Variation set up */ eventExpected = DM_EVENT_CREATE; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; /* Variation */ EVENT_DELIVERY_DELAY; DMLOG_PRINT(DMLVL_DEBUG, "mkdir(%s)\n", DummySubdir); rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE); DMLOG_PRINT(DMLVL_DEBUG, "mkdir(%s) returned %d\n", DummySubdir, rc); if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Parent handle NOT root! (%lld vs %d)\n", ino, ROOT_INODE); 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 : mkdir - DM_RESP_ABORT * EXPECTED: DM_EVENT_CREATE */ if (DMVAR_EXEC(DIR_SYNC_NAMESP_EVENT_BASE + 2)) { dm_ino_t ino; /* Variation set up */ eventExpected = DM_EVENT_CREATE; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_ABORT; /* Variation */ EVENT_DELIVERY_DELAY; DMLOG_PRINT(DMLVL_DEBUG, "mkdir(%s)\n", DummySubdir); rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE); DMLOG_PRINT(DMLVL_DEBUG, "mkdir(%s) returned %d\n", DummySubdir, rc); if ((varStatus = DMVAR_CHKFAILEXP(-1, rc, ABORT_ERRNO, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Parent handle NOT root! (%lld vs %d)\n", ino, ROOT_INODE); 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 */ } /* * TEST : rmdir - DM_RESP_CONTINUE * EXPECTED: DM_EVENT_REMOVE */ if (DMVAR_EXEC(DIR_SYNC_NAMESP_EVENT_BASE + 3)) { dm_ino_t ino; /* Variation set up */ eventExpected = DM_EVENT_REMOVE; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; rc = mkdir(DummySubdir, DUMMY_DIR_RW_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, "rmdir(%s)\n", DummySubdir); rc = rmdir(DummySubdir); DMLOG_PRINT(DMLVL_DEBUG, "rmdir(%s) returned %d\n", DummySubdir, rc); if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Parent handle NOT root! (%lld vs %d)\n", ino, ROOT_INODE); 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 */ } } /* * TEST : rmdir - DM_RESP_ABORT * EXPECTED: DM_EVENT_REMOVE */ if (DMVAR_EXEC(DIR_SYNC_NAMESP_EVENT_BASE + 4)) { dm_ino_t ino; /* Variation set up */ eventExpected = DM_EVENT_REMOVE; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ eventResponse = DM_RESP_ABORT; EVENT_DELIVERY_DELAY; DMLOG_PRINT(DMLVL_DEBUG, "rmdir(%s)\n", DummySubdir); rc = rmdir(DummySubdir); DMLOG_PRINT(DMLVL_DEBUG, "rmdir(%s) returned %d\n", DummySubdir, rc); if ((varStatus = DMVAR_CHKFAILEXP(-1, rc, ABORT_ERRNO, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Parent handle NOT root! (%lld vs %d)\n", ino, ROOT_INODE); 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 */ eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; rc = rmdir(DummySubdir); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : mv - DM_RESP_CONTINUE * EXPECTED: DM_EVENT_RENAME */ if (DMVAR_EXEC(DIR_SYNC_NAMESP_EVENT_BASE + 5)) { dm_ino_t ino1, ino2; /* Variation set up */ eventExpected = DM_EVENT_RENAME; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; sprintf(command, "mv %s %s", DummySubdir, DummySubdir2); EVENT_DELIVERY_DELAY; rc = mkdir(DummySubdir, DUMMY_DIR_RW_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, "system(mv %s %s)\n", DummySubdir, DummySubdir2); rc = system(command); DMLOG_PRINT(DMLVL_DEBUG, "system(mv %s %s) returned %d\n", DummySubdir, DummySubdir2, rc); if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino1); rc |= dm_handle_to_ino(hanp2, hlen2, &ino2); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino1 != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Old parent handle NOT root! (%lld vs %d)\n", ino1, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (ino2 != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "New parent handle NOT root! (%lld vs %d)\n", ino2, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (dm_handle_cmp(hanp1, hlen1, hanp2, hlen2) != 0) { DMLOG_PRINT(DMLVL_ERR, "Old parent handle NOT equal to new parent handle!\n"); varStatus = DMSTAT_FAIL; } else if (strcmp(name1, DUMMY_SUBDIR) != 0) { DMLOG_PRINT(DMLVL_ERR, "Old entry name NOT correct! (%s vs %s)\n", name1, DUMMY_SUBDIR); varStatus = DMSTAT_FAIL; } else if (strcmp(name2, DUMMY_SUBDIR2) != 0) { DMLOG_PRINT(DMLVL_ERR, "New entry name NOT correct! (%s vs %s)\n", name2, DUMMY_SUBDIR2); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ EVENT_DELIVERY_DELAY; rc = rmdir(DummySubdir2); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : mv - DM_RESP_ABORT * EXPECTED: DM_EVENT_RENAME */ if (DMVAR_EXEC(DIR_SYNC_NAMESP_EVENT_BASE + 6)) { dm_ino_t ino1, ino2; /* Variation set up */ eventExpected = DM_EVENT_RENAME; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; sprintf(command, "mv %s %s", DummySubdir, DummySubdir2); EVENT_DELIVERY_DELAY; rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ eventResponse = DM_RESP_ABORT; EVENT_DELIVERY_DELAY; DMLOG_PRINT(DMLVL_DEBUG, "system(mv %s %s)\n", DummySubdir, DummySubdir2); rc = system(command); DMLOG_PRINT(DMLVL_DEBUG, "system(mv %s %s) returned %d\n", DummySubdir, DummySubdir2, rc); if ((varStatus = (rc == 0 ? DMSTAT_FAIL : DMSTAT_PASS)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino1); rc |= dm_handle_to_ino(hanp2, hlen2, &ino2); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino1 != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Old parent handle NOT root! (%lld vs %d)\n", ino1, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (ino2 != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "New parent handle NOT root! (%lld vs %d)\n", ino2, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (dm_handle_cmp(hanp1, hlen1, hanp2, hlen2) != 0) { DMLOG_PRINT(DMLVL_ERR, "Old parent handle NOT equal to new parent handle!\n"); varStatus = DMSTAT_FAIL; } else if (strcmp(name1, DUMMY_SUBDIR) != 0) { DMLOG_PRINT(DMLVL_ERR, "Old entry name NOT correct! (%s vs %s)\n", name1, DUMMY_SUBDIR); varStatus = DMSTAT_FAIL; } else if (strcmp(name2, DUMMY_SUBDIR2) != 0) { DMLOG_PRINT(DMLVL_ERR, "New entry name NOT correct! (%s vs %s)\n", name2, DUMMY_SUBDIR2); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; rc = rmdir(DummySubdir); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : symlink - DM_RESP_CONTINUE * EXPECTED: DM_EVENT_SYMLINK */ if (DMVAR_EXEC(DIR_SYNC_NAMESP_EVENT_BASE + 7)) { dm_ino_t ino; /* Variation set up */ eventExpected = DM_EVENT_SYMLINK; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; rc = mkdir(DummySubdir, DUMMY_DIR_RW_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, "symlink(%s, %s)\n", DummySubdir, DummySubdir2); rc = symlink(DummySubdir, DummySubdir2); DMLOG_PRINT(DMLVL_DEBUG, "symlink(%s, %s) returned %d\n", DummySubdir, DummySubdir2, rc); if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Parent handle NOT root! (%lld vs %d)\n", ino, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (strcmp(name1, DUMMY_SUBDIR2) != 0) { DMLOG_PRINT(DMLVL_ERR, "Symlink entry name NOT correct! (%s vs %s)\n", name1, DUMMY_SUBDIR2); varStatus = DMSTAT_FAIL; } else if (strcmp(name2, DummySubdir) != 0) { DMLOG_PRINT(DMLVL_ERR, "Symlink contents NOT correct! (%s vs %s)\n", name2, DummySubdir); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ EVENT_DELIVERY_DELAY; rc = unlink(DummySubdir2); rc |= rmdir(DummySubdir); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : symlink - DM_RESP_ABORT * EXPECTED: DM_EVENT_SYMLINK */ if (DMVAR_EXEC(DIR_SYNC_NAMESP_EVENT_BASE + 8)) { dm_ino_t ino; /* Variation set up */ eventExpected = DM_EVENT_SYMLINK; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ eventResponse = DM_RESP_ABORT; EVENT_DELIVERY_DELAY; DMLOG_PRINT(DMLVL_DEBUG, "symlink(%s, %s)\n", DummySubdir, DummySubdir2); rc = symlink(DummySubdir, DummySubdir2); DMLOG_PRINT(DMLVL_DEBUG, "symlink(%s, %s) returned %d\n", DummySubdir, DummySubdir2, rc); EVENT_DELIVERY_DELAY; if ((varStatus = DMVAR_CHKFAILEXP(-1, rc, ABORT_ERRNO, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Parent handle NOT root! (%lld vs %d)\n", ino, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (strcmp(name1, DUMMY_SUBDIR2) != 0) { DMLOG_PRINT(DMLVL_ERR, "Symlink entry name NOT correct! (%s vs %s)\n", name1, DUMMY_SUBDIR2); varStatus = DMSTAT_FAIL; } else if (strcmp(name2, DummySubdir) != 0) { DMLOG_PRINT(DMLVL_ERR, "Symlink contents NOT correct! (%s vs %s)\n", name2, DummySubdir); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; rc = rmdir(DummySubdir); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : link - DM_RESP_CONTINUE * EXPECTED: DM_EVENT_LINK */ if (DMVAR_EXEC(DIR_SYNC_NAMESP_EVENT_BASE + 9)) { #ifdef DIRECTORY_LINKS dm_ino_t ino1, ino2, ino3; void *hanp; size_t hlen; /* Variation set up */ eventExpected = DM_EVENT_LINK; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; 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); } 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, "link(%s, %s)\n", DummySubdir, DummyLink); rc = link(DummySubdir, DummyLink); DMLOG_PRINT(DMLVL_DEBUG, "link(%s, %s) returned %d\n", DummySubdir, DummyLink, rc); if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino1); rc |= dm_handle_to_ino(hanp2, hlen2, &ino2); rc |= dm_handle_to_ino(hanp, hlen, &ino3); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino1 != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Parent handle NOT root! (%lld vs %d)\n", ino1, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (ino2 != ino3) { DMLOG_PRINT(DMLVL_ERR, "Source link handle NOT correct! (%lld vs %lld)\n", ino2, ino3); varStatus = DMSTAT_FAIL; } else if (strcmp(name1, DUMMY_LINK) != 0) { DMLOG_PRINT(DMLVL_ERR, "Target entry name NOT correct! (%s vs %s)\n", name1, DUMMY_LINK); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ EVENT_DELIVERY_DELAY; rc = rmdir(DummySubdir); rc |= unlink(DummyLink); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } dm_handle_free(hanp, hlen); } #else DMLOG_PRINT(DMLVL_WARN, "Test case not built with DIRECTORY_LINKS defined\n"); DMVAR_SKIP(); #endif } /* * TEST : link - DM_RESP_ABORT * EXPECTED: DM_EVENT_LINK */ if (DMVAR_EXEC(DIR_SYNC_NAMESP_EVENT_BASE + 10)) { #ifdef DIRECTORY_LINKS dm_ino_t ino1, ino2, ino3; void *hanp; size_t hlen; /* Variation set up */ eventExpected = DM_EVENT_LINK; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; 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); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ eventResponse = DM_RESP_ABORT; EVENT_DELIVERY_DELAY; DMLOG_PRINT(DMLVL_DEBUG, "link(%s, %s)\n", DummySubdir, DummyLink); rc = link(DummySubdir, DummyLink); DMLOG_PRINT(DMLVL_DEBUG, "link(%s, %s) returned %d\n", DummySubdir, DummyLink, rc); if ((varStatus = DMVAR_CHKFAILEXP(-1, rc, ABORT_ERRNO, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino1); rc |= dm_handle_to_ino(hanp2, hlen2, &ino2); rc |= dm_handle_to_ino(hanp, hlen, &ino3); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino1 != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Parent handle NOT root! (%lld vs %d)\n", ino1, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (ino2 != ino3) { DMLOG_PRINT(DMLVL_ERR, "Source link handle NOT correct! (%lld vs %lld)\n", ino2, ino3); varStatus = DMSTAT_FAIL; } else if (strcmp(name1, DUMMY_LINK) != 0) { DMLOG_PRINT(DMLVL_ERR, "Target entry name NOT correct! (%s vs %s)\n", name1, DUMMY_LINK); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ eventResponse = DM_RESP_CONTINUE; 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); } #else DMLOG_PRINT(DMLVL_WARN, "Test case not built with DIRECTORY_LINKS defined\n"); DMVAR_SKIP(); #endif } /* * TEST : open * EXPECTED: DM_EVENT_CREATE, DM_RESP_CONTINUE */ if (DMVAR_EXEC(FILE_SYNC_NAMESP_EVENT_BASE + 1)) { int fd; dm_ino_t ino; /* Variation set up */ eventExpected = DM_EVENT_CREATE; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; /* Variation */ EVENT_DELIVERY_DELAY; DMLOG_PRINT(DMLVL_DEBUG, "open(%s)\n", DummyFile); fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE); DMLOG_PRINT(DMLVL_DEBUG, "open(%s) returned %d\n", DummyFile, fd); rc = (fd == -1) ? -1 : 0; if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Parent handle NOT root! (%lld vs %d)\n", ino, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (strcmp(name1, DUMMY_FILE) != 0) { DMLOG_PRINT(DMLVL_ERR, "Entry name NOT correct! (%s %s)\n", name1, DUMMY_SUBDIR); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ EVENT_DELIVERY_DELAY; rc = close(fd); rc |= remove(DummyFile); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } /* * TEST : open * EXPECTED: DM_EVENT_CREATE, DM_RESP_ABORT */ if (DMVAR_EXEC(FILE_SYNC_NAMESP_EVENT_BASE + 2)) { dm_ino_t ino; int fd; /* Variation set up */ eventExpected = DM_EVENT_CREATE; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_ABORT; /* Variation */ EVENT_DELIVERY_DELAY; DMLOG_PRINT(DMLVL_DEBUG, "open(%s)\n", DummyFile); fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE); DMLOG_PRINT(DMLVL_DEBUG, "open(%s) returned %d\n", DummyFile, fd); if ((varStatus = DMVAR_CHKFAILEXP(-1, fd, ABORT_ERRNO, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Parent handle NOT root! (%lld vs %d)\n", ino, ROOT_INODE); 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 */ } /* * TEST : remove * EXPECTED: DM_EVENT_REMOVE, DM_RESP_CONTINUE */ if (DMVAR_EXEC(FILE_SYNC_NAMESP_EVENT_BASE + 3)) { dm_ino_t ino; int fd; /* Variation set up */ eventExpected = DM_EVENT_REMOVE; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) != -1) { rc = close(fd); } 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, "remove(%s)\n", DummyFile); rc = remove(DummyFile); DMLOG_PRINT(DMLVL_DEBUG, "remove(%s) returned %d\n", DummyFile, rc); if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Parent handle NOT root! (%lld vs %d)\n", ino, ROOT_INODE); 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 */ } } /* * TEST : remove * EXPECTED: DM_EVENT_REMOVE, DM_RESP_ABORT */ if (DMVAR_EXEC(FILE_SYNC_NAMESP_EVENT_BASE + 4)) { dm_ino_t ino; int fd; /* Variation set up */ eventExpected = DM_EVENT_REMOVE; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) != -1) { rc = close(fd); } if (fd == -1 || rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ eventResponse = DM_RESP_ABORT; EVENT_DELIVERY_DELAY; DMLOG_PRINT(DMLVL_DEBUG, "remove(%s)\n", DummyFile); rc = remove(DummyFile); DMLOG_PRINT(DMLVL_DEBUG, "remove(%s) returned %d\n", DummyFile, rc); if ((varStatus = DMVAR_CHKFAILEXP(-1, rc, ABORT_ERRNO, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Parent handle NOT root! (%lld vs %d)\n", ino, ROOT_INODE); 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 */ eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; rc = remove(DummyFile); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : mv * EXPECTED: DM_EVENT_RENAME, DM_RESP_CONTINUE */ if (DMVAR_EXEC(FILE_SYNC_NAMESP_EVENT_BASE + 5)) { dm_ino_t ino1, ino2; int fd; /* Variation set up */ eventExpected = DM_EVENT_RENAME; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; sprintf(command, "mv %s %s", DummyFile, DummyFile2); EVENT_DELIVERY_DELAY; if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) != -1) { rc = close(fd); } 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, "system(mv %s %s)\n", DummyFile, DummyFile2); rc = system(command); DMLOG_PRINT(DMLVL_DEBUG, "system(mv %s %s) returned %d\n", DummyFile, DummyFile2, rc); if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino1); rc |= dm_handle_to_ino(hanp2, hlen2, &ino2); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino1 != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Old parent handle NOT root! (%lld vs %d)\n", ino1, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (ino2 != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "New parent handle NOT root! (%lld vs %d)\n", ino2, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (dm_handle_cmp(hanp1, hlen1, hanp2, hlen2) != 0) { DMLOG_PRINT(DMLVL_ERR, "Old parent handle NOT equal to new parent handle!\n"); varStatus = DMSTAT_FAIL; } else if (strcmp(name1, DUMMY_FILE) != 0) { DMLOG_PRINT(DMLVL_ERR, "Old entry name NOT correct! (%s vs %s)\n", name1, DUMMY_FILE); varStatus = DMSTAT_FAIL; } else if (strcmp(name2, DUMMY_FILE2) != 0) { DMLOG_PRINT(DMLVL_ERR, "New entry name NOT correct! (%s vs %s)\n", name2, DUMMY_FILE2); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ EVENT_DELIVERY_DELAY; rc = remove(DummyFile2); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); } } } /* * TEST : mv * EXPECTED: DM_EVENT_RENAME, DM_RESP_ABORT */ if (DMVAR_EXEC(FILE_SYNC_NAMESP_EVENT_BASE + 6)) { dm_ino_t ino1, ino2; int fd; /* Variation set up */ eventExpected = DM_EVENT_RENAME; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; sprintf(command, "mv %s %s", DummyFile, DummyFile2); EVENT_DELIVERY_DELAY; if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) != -1) { rc = close(fd); } if (fd == -1 || rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ eventResponse = DM_RESP_ABORT; EVENT_DELIVERY_DELAY; DMLOG_PRINT(DMLVL_DEBUG, "system(mv %s %s)\n", DummyFile, DummyFile2); rc = system(command); DMLOG_PRINT(DMLVL_DEBUG, "system(mv %s %s) returned %d\n", DummyFile, DummyFile2, rc); if ((varStatus = (rc == 0 ? DMSTAT_FAIL : DMSTAT_PASS)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino1); rc |= dm_handle_to_ino(hanp2, hlen2, &ino2); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino1 != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Old parent handle NOT root! (%lld vs %d)\n", ino1, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (ino2 != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "New parent handle NOT root! (%lld vs %d)\n", ino2, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (dm_handle_cmp(hanp1, hlen1, hanp2, hlen2) != 0) { DMLOG_PRINT(DMLVL_ERR, "Old parent handle NOT equal to new parent handle!\n"); varStatus = DMSTAT_FAIL; } else if (strcmp(name1, DUMMY_FILE) != 0) { DMLOG_PRINT(DMLVL_ERR, "Old entry name NOT correct! (%s vs %s)\n", name1, DUMMY_FILE); varStatus = DMSTAT_FAIL; } else if (strcmp(name2, DUMMY_FILE2) != 0) { DMLOG_PRINT(DMLVL_ERR, "New entry name NOT correct! (%s vs %s)\n", name2, DUMMY_FILE2); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; rc = remove(DummyFile); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : symlink * EXPECTED: DM_EVENT_SYMLINK, DM_RESP_CONTINUE */ if (DMVAR_EXEC(FILE_SYNC_NAMESP_EVENT_BASE + 7)) { dm_ino_t ino; int fd; /* Variation set up */ eventExpected = DM_EVENT_SYMLINK; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) != -1) { rc = close(fd); } 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, "symlink(%s, %s)\n", DummyFile, DummyLink); rc = symlink(DummyFile, DummyLink); DMLOG_PRINT(DMLVL_DEBUG, "symlink(%s, %s) returned %d\n", DummyFile, DummyLink, rc); if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Parent handle NOT root! (%lld vs %d)\n", ino, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (strcmp(name1, DUMMY_LINK) != 0) { DMLOG_PRINT(DMLVL_ERR, "Symlink entry name NOT correct! (%s vs %s)\n", name1, DUMMY_LINK); varStatus = DMSTAT_FAIL; } else if (strcmp(name2, DummyFile) != 0) { DMLOG_PRINT(DMLVL_ERR, "Symlink contents NOT correct! (%s vs %s)\n", name2, DummyFile); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ EVENT_DELIVERY_DELAY; rc = unlink(DummyLink); rc |= remove(DummyFile); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : symlink * EXPECTED: DM_EVENT_SYMLINK, DM_RESP_ABORT */ if (DMVAR_EXEC(FILE_SYNC_NAMESP_EVENT_BASE + 8)) { dm_ino_t ino; int fd; /* Variation set up */ eventExpected = DM_EVENT_SYMLINK; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) != -1) { rc = close(fd); } if (fd == -1 || rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ eventResponse = DM_RESP_ABORT; EVENT_DELIVERY_DELAY; DMLOG_PRINT(DMLVL_DEBUG, "symlink(%s, %s)\n", DummyFile, DummyLink); rc = symlink(DummyFile, DummyLink); DMLOG_PRINT(DMLVL_DEBUG, "symlink(%s, %s) returned %d\n", DummyFile, DummyLink, rc); if ((varStatus = DMVAR_CHKFAILEXP(-1, rc, ABORT_ERRNO, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Parent handle NOT root! (%lld vs %d)\n", ino, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (strcmp(name1, DUMMY_LINK) != 0) { DMLOG_PRINT(DMLVL_ERR, "Symlink entry name NOT correct! (%s vs %s)\n", name1, DUMMY_LINK); varStatus = DMSTAT_FAIL; } else if (strcmp(name2, DummyFile) != 0) { DMLOG_PRINT(DMLVL_ERR, "Symlink contents NOT correct! (%s vs %s)\n", name2, DummyFile); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; rc = remove(DummyFile); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : link * EXPECTED: DM_EVENT_LINK, DM_RESP_CONTINUE */ if (DMVAR_EXEC(FILE_SYNC_NAMESP_EVENT_BASE + 9)) { dm_ino_t ino1, ino2, ino3; void *hanp; size_t hlen; int fd; /* Variation set up */ eventExpected = DM_EVENT_LINK; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; 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); } 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, "link(%s, %s)\n", DummyFile, DummyLink); rc = link(DummyFile, DummyLink); DMLOG_PRINT(DMLVL_DEBUG, "link(%s, %s) returned %d\n", DummyFile, DummyLink, rc); if ((varStatus = DMVAR_CHKPASSEXP(0, rc, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino1); rc |= dm_handle_to_ino(hanp2, hlen2, &ino2); rc |= dm_handle_to_ino(hanp, hlen, &ino3); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino1 != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Parent handle NOT root! (%lld vs %d)\n", ino1, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (ino2 != ino3) { DMLOG_PRINT(DMLVL_ERR, "Source link handle NOT correct! (%lld vs %lld)\n", ino2, ino3); varStatus = DMSTAT_FAIL; } else if (strcmp(name1, DUMMY_LINK) != 0) { DMLOG_PRINT(DMLVL_ERR, "Target entry name NOT correct! (%s vs %s)\n", name1, DUMMY_LINK); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ EVENT_DELIVERY_DELAY; rc = close(fd); rc |= remove(DummyFile); rc |= remove(DummyLink); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } dm_handle_free(hanp, hlen); } } /* * TEST : link * EXPECTED: DM_EVENT_LINK, DM_RESP_ABORT */ if (DMVAR_EXEC(FILE_SYNC_NAMESP_EVENT_BASE + 10)) { dm_ino_t ino1, ino2, ino3; void *hanp; size_t hlen; int fd; /* Variation set up */ eventExpected = DM_EVENT_LINK; eventReceived = DM_EVENT_INVALID; eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; 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); } if (fd == -1 || rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ eventResponse = DM_RESP_ABORT; EVENT_DELIVERY_DELAY; DMLOG_PRINT(DMLVL_DEBUG, "link(%s, %s)\n", DummyFile, DummyLink); rc = link(DummyFile, DummyLink); DMLOG_PRINT(DMLVL_DEBUG, "link(%s, %s) returned %d\n", DummyFile, DummyLink, rc); if ((varStatus = DMVAR_CHKFAILEXP(-1, rc, ABORT_ERRNO, eventExpected, eventReceived)) == DMSTAT_PASS) { rc = dm_handle_to_ino(hanp1, hlen1, &ino1); rc |= dm_handle_to_ino(hanp2, hlen2, &ino2); rc |= dm_handle_to_ino(hanp, hlen, &ino3); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "Unable to obtain inode!\n"); varStatus = DMSTAT_FAIL; } else if (ino1 != ROOT_INODE) { DMLOG_PRINT(DMLVL_ERR, "Parent handle NOT root! (%lld vs %d)\n", ino1, ROOT_INODE); varStatus = DMSTAT_FAIL; } else if (ino2 != ino3) { DMLOG_PRINT(DMLVL_ERR, "Source link handle NOT correct! (%lld vs %lld)\n", ino2, ino3); varStatus = DMSTAT_FAIL; } else if (strcmp(name1, DUMMY_LINK) != 0) { DMLOG_PRINT(DMLVL_ERR, "Target entry name NOT correct! (%s vs %s)\n", name1, DUMMY_LINK); varStatus = DMSTAT_FAIL; } } DMVAR_END(varStatus); /* Variation clean up */ eventResponse = DM_RESP_CONTINUE; EVENT_DELIVERY_DELAY; 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); } } 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(); }
int main(int argc, char **argv) { char *varstr; int rc; char *szSessionInfo = "dm_test session info"; dm_eventset_t events; 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(DummySubdir, "%s/%s", mountPt, DUMMY_SUBDIR); rmdir(DummySubdir); } /* This is what kicks off the test case, variations done in thread */ runTestOnCreate = 1; rc = mkdir(DummySubdir, O_RDWR | O_CREAT); runTestOnCreate = 0; if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "mkdir failed! (rc = %d, errno = %d)\n", rc, errno); } rc = rmdir(DummySubdir); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "rmdir failed! (rc = %d, errno = %d)\n", rc, errno); } 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(); return 0; }
/* * Get the complete list of events for a file. */ int event_info( dm_sessid_t sid, void *hanp, size_t hlen) { u_int ret; dm_eventset_t eventlist; DMEV_ZERO(eventlist); if (dm_get_eventlist(sid, hanp, hlen, DM_NO_TOKEN, DM_EVENT_MAX, &eventlist, &ret)) { errno_msg("Can't get list of events"); return(1); } printf("\n\tEvent list: \n\t\t"); if (DMEV_ISSET(DM_EVENT_MOUNT, eventlist)) printf("mount "); if (DMEV_ISSET(DM_EVENT_PREUNMOUNT, eventlist)) printf("preunmount "); if (DMEV_ISSET(DM_EVENT_UNMOUNT, eventlist)) printf("unmount "); if (DMEV_ISSET(DM_EVENT_DEBUT, eventlist)) printf("debut "); if (DMEV_ISSET(DM_EVENT_CREATE, eventlist)) printf("create "); if (DMEV_ISSET(DM_EVENT_POSTCREATE, eventlist)) printf("postcreate "); if (DMEV_ISSET(DM_EVENT_REMOVE, eventlist)) printf("remove "); if (DMEV_ISSET(DM_EVENT_POSTREMOVE, eventlist)) printf("postmount "); if (DMEV_ISSET(DM_EVENT_RENAME, eventlist)) printf("rename "); if (DMEV_ISSET(DM_EVENT_POSTRENAME, eventlist)) printf("postrename "); if (DMEV_ISSET(DM_EVENT_LINK, eventlist)) printf("link "); if (DMEV_ISSET(DM_EVENT_POSTLINK, eventlist)) printf("postlink "); if (DMEV_ISSET(DM_EVENT_SYMLINK, eventlist)) printf("symlink "); if (DMEV_ISSET(DM_EVENT_POSTSYMLINK, eventlist)) printf("postsymlink "); if (DMEV_ISSET(DM_EVENT_READ, eventlist)) printf("read "); if (DMEV_ISSET(DM_EVENT_WRITE, eventlist)) printf("write "); if (DMEV_ISSET(DM_EVENT_TRUNCATE, eventlist)) printf("truncate "); if (DMEV_ISSET(DM_EVENT_ATTRIBUTE, eventlist)) printf("attribute "); if (DMEV_ISSET(DM_EVENT_DESTROY, eventlist)) printf("destroy "); if (DMEV_ISSET(DM_EVENT_NOSPACE, eventlist)) printf("nospace "); if (DMEV_ISSET(DM_EVENT_USER, eventlist)) printf("user "); printf("\n"); return(0); }
int main(int argc, char **argv) { char *varstr; int i; int rc; char *szSessionInfo = "dm_test session info"; dm_eventset_t events; char buf[MSG_DATALEN]; 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 { int fd; sprintf(DummyFile, "%s/%s", mountPt, DUMMY_FILE); sprintf(DummySubdir, "%s/%s", mountPt, DUMMY_SUBDIR); /* DO NOT REMOVE DummyFile, IT HAS THE REGIONS FOR FIRST VAR */ remove(DummySubdir); fd = open(DUMMY_FILE, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE); if (fd != -1) { for (i = 0; i < (TMP_FILELEN/DUMMY_STRLEN); i++) { if (write(fd, DUMMY_STRING, DUMMY_STRLEN) != DUMMY_STRLEN) { rc = -1; break; } } } else { rc = -1; } if (rc == 0) { rc = close(fd); } if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "creating dummy file failed! (rc = %d, errno = %d)\n", rc, errno); dm_destroy_session(sid); DM_EXIT(); } } /* This is what kicks off the test case, variations done in thread */ memcpy(buf, MSG_DATA, MSG_DATALEN); rc = dm_send_msg(sid, DM_MSGTYPE_SYNC, MSG_DATALEN, buf); if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "dm_send_msg failed! (rc = %d, errno = %d)\n", rc, errno); } 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); } remove(DUMMY_FILE); DMLOG_STOP(); tst_exit(); }
int main( int argc, char **argv) { dm_sessid_t sid = DM_NO_SESSION; dm_token_t token = DM_NO_TOKEN; char *object; dm_eventset_t eventset; void *hanp; size_t hlen; int Fflag = 0; u_int maxevent = DM_EVENT_MAX; char *name; int opt; Progname = strrchr(argv[0], '/'); if (Progname) { Progname++; } else { Progname = argv[0]; } /* Crack and validate the command line options. */ while ((opt = getopt(argc, argv, "Fm:s:t:")) != EOF) { switch (opt) { case 'F': Fflag++; break; case 'm': maxevent = atol(optarg); break; case 's': sid = atol(optarg); break; case 't': token = atol(optarg); break; case '?': usage(); } } if (optind + 1 > argc) usage(); object = argv[optind++]; if (dm_init_service(&name) == -1) { fprintf(stderr, "Can't initialize the DMAPI\n"); exit(1); } if (sid == DM_NO_SESSION) find_test_session(&sid); DMEV_ZERO(eventset); /* Get the file's handle or convert the external handle. */ if (opaque_to_handle(object, &hanp, &hlen)) { fprintf(stderr, "can't get handle for %s\n", object); exit(1); } if (Fflag) { void *fshanp; size_t fshlen; if (dm_handle_to_fshandle(hanp, hlen, &fshanp, &fshlen)) { fprintf(stderr, "can't get filesystem handle from %s\n", object); exit(1); } dm_handle_free(hanp, hlen); hanp = fshanp; hlen = fshlen; } for (; optind < argc; optind++) { dm_eventtype_t event; event = ev_name_to_value(argv[optind]); if (event == DM_EVENT_INVALID) { fprintf(stderr, "invalid event %s\n", argv[optind]); usage(); } if ((event == DM_EVENT_READ) || (event == DM_EVENT_WRITE) || (event == DM_EVENT_TRUNCATE)) { fprintf(stderr, "Use set_region to twiddle read/write/trunc events\n"); exit(1); } DMEV_SET(event, eventset); } if (dm_set_eventlist(sid, hanp, hlen, token, &eventset, maxevent)) { fprintf(stderr, "dm_set_eventlist failed, %s\n", strerror(errno)); exit(1); } dm_handle_free(hanp, hlen); exit(0); }
int main( int argc, char **argv) { u_int nelem = DM_EVENT_MAX; char *han_str; dm_eventset_t eventset; void *hanp; size_t hlen; u_int nelemp; char *name; int error; int opt; int i; Progname = strrchr(argv[0], '/'); if (Progname) { Progname++; } else { Progname = argv[0]; } /* Crack and validate the command line options. */ while ((opt = getopt(argc, argv, "n:")) != EOF) { switch (opt) { case 'n': nelem = atol(optarg); break; case '?': usage(); } } if (optind + 1 != argc) usage(); han_str = argv[optind]; if ((error = atohan(han_str, &hanp, &hlen)) != 0) { fprintf(stderr, "atohan() failed, %s\n", strerror(error)); return(1); } if (dm_init_service(&name)) { fprintf(stderr, "Can't initialize the DMAPI\n"); return(1); } DMEV_ZERO(eventset); if (dm_get_config_events(hanp, hlen, nelem, &eventset, &nelemp)) { fprintf(stderr, "dm_get_config_events failed, %s\n", strerror(errno)); return(1); } fprintf(stdout, "Events supported (0x%llx), nelemp %d:\n", (unsigned long long) eventset, nelemp); for (i = 0; i < nelemp; i++) { if (!DMEV_ISSET(i, eventset)) continue; switch (i) { case DM_EVENT_CANCEL: fprintf(stdout, "DM_EVENT_CANCEL"); break; case DM_EVENT_MOUNT: fprintf(stdout, "DM_EVENT_MOUNT"); break; case DM_EVENT_PREUNMOUNT: fprintf(stdout, "DM_EVENT_PREUNMOUNT"); break; case DM_EVENT_UNMOUNT: fprintf(stdout, "DM_EVENT_UNMOUNT"); break; case DM_EVENT_DEBUT: fprintf(stdout, "DM_EVENT_DEBUT"); break; case DM_EVENT_CREATE: fprintf(stdout, "DM_EVENT_CREATE"); break; case DM_EVENT_CLOSE: fprintf(stdout, "DM_EVENT_CLOSE"); break; case DM_EVENT_POSTCREATE: fprintf(stdout, "DM_EVENT_POSTCREATE"); break; case DM_EVENT_REMOVE: fprintf(stdout, "DM_EVENT_REMOVE"); break; case DM_EVENT_POSTREMOVE: fprintf(stdout, "DM_EVENT_POSTREMOVE"); break; case DM_EVENT_RENAME: fprintf(stdout, "DM_EVENT_RENAME"); break; case DM_EVENT_POSTRENAME: fprintf(stdout, "DM_EVENT_POSTRENAME"); break; case DM_EVENT_LINK: fprintf(stdout, "DM_EVENT_LINK"); break; case DM_EVENT_POSTLINK: fprintf(stdout, "DM_EVENT_POSTLINK"); break; case DM_EVENT_SYMLINK: fprintf(stdout, "DM_EVENT_SYMLINK"); break; case DM_EVENT_POSTSYMLINK: fprintf(stdout, "DM_EVENT_POSTSYMLINK"); break; case DM_EVENT_READ: fprintf(stdout, "DM_EVENT_READ"); break; case DM_EVENT_WRITE: fprintf(stdout, "DM_EVENT_WRITE"); break; case DM_EVENT_TRUNCATE: fprintf(stdout, "DM_EVENT_TRUNCATE"); break; case DM_EVENT_ATTRIBUTE: fprintf(stdout, "DM_EVENT_ATTRIBUTE"); break; case DM_EVENT_DESTROY: fprintf(stdout, "DM_EVENT_DESTROY"); break; case DM_EVENT_NOSPACE: fprintf(stdout, "DM_EVENT_NOSPACE"); break; case DM_EVENT_USER: fprintf(stdout, "DM_EVENT_USER"); break; case DM_EVENT_MAX: fprintf(stdout, "DM_EVENT_23"); break; } fprintf(stdout, " (%d)\n", i); } dm_handle_free(hanp, hlen); return(0); }
int main(int argc, char **argv) { char *szFuncName; char *varstr; int rc; char *szSessionInfo = "dm_test session info"; dm_eventset_t events; 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 mount tests\n") ; szFuncName = "dm_set_dmattr"; /* * TEST : dm_get_mountinfo - invalid sid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(GET_MOUNTINFO_BASE + 1)) { int fd; void *hanp; size_t hlen; char buf[MOUNTEVENT_LEN]; size_t rlen; /* Variation set up */ if ((fd = open(DummyFile, O_RDWR | O_CREAT)) == -1) { /* No clean up */ } else if ((rc = dm_path_to_fshandle(DummyFile, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } if (fd == -1 || rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n", szFuncName); rc = dm_get_mountinfo(INVALID_ADDR, hanp, hlen, DM_NO_TOKEN, sizeof(buf), buf, &rlen); 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_get_mountinfo - invalid hanp * EXPECTED: rc = -1, errno = EFAULT */ if (DMVAR_EXEC(GET_MOUNTINFO_BASE + 2)) { int fd; void *hanp; size_t hlen; char buf[MOUNTEVENT_LEN]; size_t rlen; /* Variation set up */ if ((fd = open(DummyFile, O_RDWR | O_CREAT)) == -1) { /* No clean up */ } else if ((rc = dm_path_to_fshandle(DummyFile, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } if (fd == -1 || rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n", szFuncName); rc = dm_get_mountinfo(sid, (void *)INVALID_ADDR, hlen, DM_NO_TOKEN, sizeof(buf), buf, &rlen); 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); } } /* * TEST : dm_get_mountinfo - invalid hlen * EXPECTED: rc = -1, errno = EBADF */ if (DMVAR_EXEC(GET_MOUNTINFO_BASE + 3)) { int fd; void *hanp; size_t hlen; char buf[MOUNTEVENT_LEN]; size_t rlen; /* Variation set up */ if ((fd = open(DummyFile, O_RDWR | O_CREAT)) == -1) { /* No clean up */ } else if ((rc = dm_path_to_fshandle(DummyFile, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } if (fd == -1 || rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n", szFuncName); rc = dm_get_mountinfo(sid, hanp, INVALID_ADDR, DM_NO_TOKEN, sizeof(buf), buf, &rlen); 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); } } /* * TEST : dm_get_mountinfo - invalid token * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(GET_MOUNTINFO_BASE + 4)) { int fd; void *hanp; size_t hlen; char buf[MOUNTEVENT_LEN]; size_t rlen; /* Variation set up */ if ((fd = open(DummyFile, O_RDWR | O_CREAT)) == -1) { /* No clean up */ } else if ((rc = dm_path_to_fshandle(DummyFile, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } if (fd == -1 || rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid token)\n", szFuncName); rc = dm_get_mountinfo(sid, hanp, hlen, INVALID_ADDR, sizeof(buf), buf, &rlen); 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_get_mountinfo - invalid buflen * EXPECTED: rc = -1, errno = E2BIG */ if (DMVAR_EXEC(GET_MOUNTINFO_BASE + 5)) { int fd; void *hanp; size_t hlen; char buf[MOUNTEVENT_LEN]; size_t rlen; /* Variation set up */ if ((fd = open(DummyFile, O_RDWR | O_CREAT)) == -1) { /* No clean up */ } else if ((rc = dm_path_to_fshandle(DummyFile, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } if (fd == -1 || rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid buflen)\n", szFuncName); rc = dm_get_mountinfo(sid, hanp, hlen, DM_NO_TOKEN, 0, buf, &rlen); if (rc == -1) { if (errno == E2BIG) { DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen); if (rlen == me_len) { DMLOG_PRINT(DMLVL_DEBUG, "%s passed with expected rc = %d and expected errno = %d\n", szFuncName, -1, E2BIG); DMVAR_PASS(); } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with expected rc = %d and expected errno = %d but unexpected rlen (%d vs %d)\n", szFuncName, -1, E2BIG, rlen, me_len); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with expected rc = %d but unexpected errno = %d\n", szFuncName, -1, errno); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with unexpected rc = %d\n", szFuncName, rc); DMVAR_FAIL(); } /* 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_get_mountinfo - invalid bufp * EXPECTED: rc = -1, errno = EFAULT */ if (DMVAR_EXEC(GET_MOUNTINFO_BASE + 6)) { int fd; void *hanp; size_t hlen; char buf[MOUNTEVENT_LEN]; size_t rlen; /* Variation set up */ if ((fd = open(DummyFile, O_RDWR | O_CREAT)) == -1) { /* No clean up */ } else if ((rc = dm_path_to_fshandle(DummyFile, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } if (fd == -1 || rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid bufp)\n", szFuncName); rc = dm_get_mountinfo(sid, hanp, hlen, DM_NO_TOKEN, sizeof(buf), (void *)INVALID_ADDR, &rlen); 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); } } /* * TEST : dm_get_mountinfo - invalid rlenp * EXPECTED: rc = -1, errno = EFAULT */ if (DMVAR_EXEC(GET_MOUNTINFO_BASE + 7)) { int fd; void *hanp; size_t hlen; char buf[MOUNTEVENT_LEN]; /* Variation set up */ if ((fd = open(DummyFile, O_RDWR | O_CREAT)) == -1) { /* No clean up */ } else if ((rc = dm_path_to_fshandle(DummyFile, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } if (fd == -1 || rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid rlenp)\n", szFuncName); rc = dm_get_mountinfo(sid, hanp, hlen, DM_NO_TOKEN, sizeof(buf), buf, (size_t *)INVALID_ADDR); 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); } } /* * TEST : dm_get_mountinfo - valid * EXPECTED: rc = 0 */ if (DMVAR_EXEC(GET_MOUNTINFO_BASE + 8)) { int fd; void *hanp; size_t hlen; char buf[MOUNTEVENT_LEN]; size_t rlen; /* Variation set up */ if ((fd = open(DummyFile, O_RDWR | O_CREAT)) == -1) { /* No clean up */ } else if ((rc = dm_path_to_fshandle(DummyFile, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } if (fd == -1 || rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(valid)\n", szFuncName); rc = dm_get_mountinfo(sid, hanp, hlen, DM_NO_TOKEN, sizeof(buf), buf, &rlen); if (rc == 0) { DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen); if (rlen == me_len) { if (memcmp(buf, me_ptr, rlen) == 0) { DMLOG_PRINT(DMLVL_DEBUG, "%s passed with expected rc = %d\n", szFuncName, 0); DMVAR_PASS(); } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with expected rc = %d but mount info not same\n", szFuncName, 0); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with expected rc = %d but mount info len not same (%d vs %d)\n", szFuncName, 0, rlen, me_len); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with unexpected rc = %d (errno = %d)\n", szFuncName, rc, errno); DMVAR_FAIL(); } /* 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); } } } /* * TEST : dm_get_mountinfo - DM_NO_SESSION sid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(GET_MOUNTINFO_BASE + 9)) { int fd; void *hanp; size_t hlen; char buf[MOUNTEVENT_LEN]; size_t rlen; /* Variation set up */ if ((fd = open(DummyFile, O_RDWR | O_CREAT)) == -1) { /* No clean up */ } else if ((rc = dm_path_to_fshandle(DummyFile, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } if (fd == -1 || rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n", szFuncName); rc = dm_get_mountinfo(DM_NO_SESSION, hanp, hlen, DM_NO_TOKEN, sizeof(buf), buf, &rlen); 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_get_mountinfo - global handle * EXPECTED: rc = -1, errno = EBADF */ if (DMVAR_EXEC(GET_MOUNTINFO_BASE + 10)) { char buf[MOUNTEVENT_LEN]; size_t rlen; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName); rc = dm_get_mountinfo(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN, DM_NO_TOKEN, sizeof(buf), buf, &rlen); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF); /* Variation clean up */ } /* * TEST : dm_get_mountinfo - file handle * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(GET_MOUNTINFO_BASE + 11)) { int fd; void *hanp; size_t hlen; char buf[MOUNTEVENT_LEN]; size_t rlen; /* Variation set up */ if ((fd = open(DummyFile, O_RDWR | O_CREAT)) == -1) { /* No clean up */ } else if ((rc = dm_path_to_handle(DummyFile, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } if (fd == -1 || rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(file handle)\n", szFuncName); rc = dm_get_mountinfo(sid, hanp, hlen, DM_NO_TOKEN, sizeof(buf), buf, &rlen); 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_get_mountinfo - dir handle * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(GET_MOUNTINFO_BASE + 12)) { void *hanp; size_t hlen; char buf[MOUNTEVENT_LEN]; size_t rlen; /* Variation set up */ if ((rc = mkdir(DummySubdir, O_RDWR | O_CREAT)) == -1) { /* No clean up */ } else if ((rc = dm_path_to_handle(DummySubdir, &hanp, &hlen)) == -1) { rmdir(DummySubdir); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(dir handle)\n", szFuncName); rc = dm_get_mountinfo(sid, hanp, hlen, DM_NO_TOKEN, sizeof(buf), buf, &rlen); 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); } } if (me_ptr != NULL) { free(me_ptr); } 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(); return 0; }
int main(int argc, char **argv) { dm_sessid_t sid = DM_NO_SESSION; dm_token_t token[NUM_TOKENS]; dm_token_t test_token; void *fs_hanp; size_t fs_hlen; void *dir_hanp; size_t dir_hlen; void *ap; size_t alen; void *bp; size_t blen; void *cp; size_t clen; char *name; char *ls_path; char *pathname; char fname_a[100]; char fname_b[100]; char fname_c[100]; char command[150]; int opt; int i=0; if (Progname = strrchr(argv[0], '/')) { Progname++; } else { Progname = argv[0]; } opterr = 0; while ((opt = getopt(argc, argv, "vn:s:")) != EOF) { switch (opt) { case 'v': Vflag++; break; case 's': sid = atol(optarg); break; case '?': usage(); } } if (optind + 2 != argc) { usage(); } ls_path = argv[optind]; pathname = argv[optind+1]; if (dm_init_service(&name) == -1) { fprintf(stderr, "Can't inititalize the DMAPI\n"); exit(1); } if (sid == DM_NO_SESSION) find_test_session(&sid); printf("Beginning access rights testing...\n"); sprintf(fname_a, "%s/DMAPI_rights_test_file_a", pathname); sprintf(command, "cp %s %s\n", ls_path, fname_a); system(command); if (dm_path_to_handle(fname_a, &ap, &alen)) { fprintf(stderr, "ERROR: can't get handle for %s; %s\n", fname_a, ERR_NAME); goto abort_test; } sprintf(fname_b, "%s/DMAPI_rights_test_file_b", pathname); sprintf(command, "cp %s %s\n", ls_path, fname_b); system(command); if (dm_path_to_handle(fname_b, &bp, &blen)) { fprintf(stderr, "ERROR: can't get handle for %s; %s\n", fname_b, ERR_NAME); goto abort_test; } sprintf(fname_c, "%s/DMAPI_rights_test_file_c", pathname); sprintf(command, "cp %s %s\n", ls_path, fname_c); system(command); if (dm_path_to_handle(fname_c, &cp, &clen)) { fprintf(stderr, "ERROR: can't get handle for %s; %s\n", fname_c, ERR_NAME); goto abort_test; } if (dm_path_to_fshandle(pathname, &fs_hanp, &fs_hlen)) { fprintf(stderr, "ERROR: can't get handle for %s; %s\n", pathname, ERR_NAME); goto abort_test; } sprintf(pathname, "%s/DMAPI_rights_test_dir", pathname); sprintf(command, "mkdir %s\n", pathname); system(command); if (dm_path_to_handle(pathname, &dir_hanp, &dir_hlen)) { fprintf(stderr, "ERROR: can't get handle for %s; %s\n", pathname, ERR_NAME); goto abort_test; } /* Test remaining functions for appropriate * right requirements... *------------------------------------------------------------*/ { dm_off_t off = (dm_off_t)0; dm_extent_t extent; u_int nelem_ret; SHAREDTEST("get_allocinfo", ap, alen, test_token, dm_get_allocinfo(sid, ap, alen, test_token, &off, 1, &extent, &nelem_ret)) } /*------------------------------------------------------------*/ { void *bufp=(void*)malloc(5*sizeof(dm_attrlist_t)); size_t rlen; SHAREDTEST("getall_dmattr", ap, alen, test_token, dm_getall_dmattr(sid, ap, alen, test_token, 5, bufp, &rlen)) } /*------------------------------------------------------------*/ { dm_attrloc_t loc; SHAREDTEST("init_attrloc", dir_hanp, dir_hlen, test_token, dm_init_attrloc(sid, dir_hanp, dir_hlen, test_token, &loc)) } /*------------------------------------------------------------*/ #if 0 mkdir_by_handle is NOT SUPPORTED in current SGI DMAPI { SHAREDTEST("mkdir_by_handle", fs_hanp, fs_hlen, test_token, dm_mkdir_by_handle(sid, fs_hanp, fs_hlen, test_token, dir_hanp, dir_hlen, "FUBAR_DIR")) } #endif /*------------------------------------------------------------*/ { dm_eventset_t eventset; DMEV_ZERO(eventset); EXCLTEST("set_disp", fs_hanp, fs_hlen, test_token, dm_set_disp(sid, fs_hanp, fs_hlen, test_token, &eventset, DM_EVENT_MAX)) }