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; }
static int dmapi_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { sys_dmapi_args_t kargs; sys_dmapi_args_t *uap = &kargs; int error = 0; int rvp = -ENOSYS; int use_rvp = 0; if (!capable(CAP_MKNOD)) return(-EPERM); if( copy_from_user( &kargs, (sys_dmapi_args_t*)arg, sizeof(sys_dmapi_args_t) ) ) return -EFAULT; switch (cmd) { case DM_CLEAR_INHERIT: error = dm_clear_inherit( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (dm_attrname_t *) uap->arg5); /* attrnamep */ break; case DM_CREATE_BY_HANDLE: error = dm_create_by_handle( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* dirhanp */ (size_t) uap->arg3, /* dirhlen */ (dm_token_t) uap->arg4, /* token */ (void *) uap->arg5, /* hanp */ (size_t) uap->arg6, /* hlen */ (char *) uap->arg7); /* cname */ break; case DM_CREATE_SESSION: error = dm_create_session( (dm_sessid_t) uap->arg1, /* oldsid */ (char *) uap->arg2, /* sessinfop */ (dm_sessid_t *) uap->arg3); /* newsidp */ break; case DM_CREATE_USEREVENT: error = dm_create_userevent( (dm_sessid_t) uap->arg1, /* sid */ (size_t) uap->arg2, /* msglen */ (void *) uap->arg3, /* msgdatap */ (dm_token_t *) uap->arg4); /* tokenp */ break; case DM_DESTROY_SESSION: error = dm_destroy_session( (dm_sessid_t) uap->arg1); /* sid */ break; case DM_DOWNGRADE_RIGHT: error = dm_downgrade_right( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4); /* token */ break; case DM_FD_TO_HANDLE: error = dm_fd_to_hdl( (int) uap->arg1, /* fd */ (void *) uap->arg2, /* hanp */ (size_t *) uap->arg3); /* hlenp */ break; case DM_FIND_EVENTMSG: error = dm_find_eventmsg( (dm_sessid_t) uap->arg1, /* sid */ (dm_token_t) uap->arg2, /* token */ (size_t) uap->arg3, /* buflen */ (void *) uap->arg4, /* bufp */ (size_t *) uap->arg5); /* rlenp */ break; case DM_GET_ALLOCINFO: use_rvp = 1; error = dm_get_allocinfo_rvp( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (dm_off_t *) uap->arg5, /* offp */ (u_int) uap->arg6, /* nelem */ (dm_extent_t *) uap->arg7, /* extentp */ (u_int *) uap->arg8, /* nelemp */ &rvp); break; case DM_GET_BULKALL: use_rvp = 1; error = dm_get_bulkall_rvp( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (u_int) uap->arg5, /* mask */ (dm_attrname_t *) uap->arg6, /* attrnamep */ (dm_attrloc_t *) uap->arg7, /* locp */ (size_t) uap->arg8, /* buflen */ (void *) uap->arg9, /* bufp */ (size_t *) uap->arg10, /* rlenp */ &rvp); break; case DM_GET_BULKATTR: use_rvp = 1; error = dm_get_bulkattr_rvp( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (u_int) uap->arg5, /* mask */ (dm_attrloc_t *)uap->arg6, /* locp */ (size_t) uap->arg7, /* buflen */ (void *) uap->arg8, /* bufp */ (size_t *) uap->arg9, /* rlenp */ &rvp); break; case DM_GET_CONFIG: error = dm_get_config( (void *) uap->arg1, /* hanp */ (size_t) uap->arg2, /* hlen */ (dm_config_t) uap->arg3, /* flagname */ (dm_size_t *) uap->arg4); /* retvalp */ break; case DM_GET_CONFIG_EVENTS: error = dm_get_config_events( (void *) uap->arg1, /* hanp */ (size_t) uap->arg2, /* hlen */ (u_int) uap->arg3, /* nelem */ (dm_eventset_t *) uap->arg4, /* eventsetp */ (u_int *) uap->arg5); /* nelemp */ break; case DM_GET_DIOINFO: error = dm_get_dioinfo( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (dm_dioinfo_t *)uap->arg5); /* diop */ break; case DM_GET_DIRATTRS: use_rvp = 1; error = dm_get_dirattrs_rvp( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (u_int) uap->arg5, /* mask */ (dm_attrloc_t *)uap->arg6, /* locp */ (size_t) uap->arg7, /* buflen */ (void *) uap->arg8, /* bufp */ (size_t *) uap->arg9, /* rlenp */ &rvp); break; case DM_GET_DMATTR: error = dm_get_dmattr( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (dm_attrname_t *) uap->arg5, /* attrnamep */ (size_t) uap->arg6, /* buflen */ (void *) uap->arg7, /* bufp */ (size_t *) uap->arg8); /* rlenp */ break; case DM_GET_EVENTLIST: error = dm_get_eventlist( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (u_int) uap->arg5, /* nelem */ (dm_eventset_t *) uap->arg6, /* eventsetp */ (u_int *) uap->arg7); /* nelemp */ break; case DM_GET_EVENTS: error = dm_get_events( (dm_sessid_t) uap->arg1, /* sid */ (u_int) uap->arg2, /* maxmsgs */ (u_int) uap->arg3, /* flags */ (size_t) uap->arg4, /* buflen */ (void *) uap->arg5, /* bufp */ (size_t *) uap->arg6); /* rlenp */ break; case DM_GET_FILEATTR: error = dm_get_fileattr( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (u_int) uap->arg5, /* mask */ (dm_stat_t *) uap->arg6); /* statp */ break; case DM_GET_MOUNTINFO: error = dm_get_mountinfo( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (size_t) uap->arg5, /* buflen */ (void *) uap->arg6, /* bufp */ (size_t *) uap->arg7); /* rlenp */ break; case DM_GET_REGION: error = dm_get_region( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (u_int) uap->arg5, /* nelem */ (dm_region_t *) uap->arg6, /* regbufp */ (u_int *) uap->arg7); /* nelemp */ break; case DM_GETALL_DISP: error = dm_getall_disp( (dm_sessid_t) uap->arg1, /* sid */ (size_t) uap->arg2, /* buflen */ (void *) uap->arg3, /* bufp */ (size_t *) uap->arg4); /* rlenp */ break; case DM_GETALL_DMATTR: error = dm_getall_dmattr( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (size_t) uap->arg5, /* buflen */ (void *) uap->arg6, /* bufp */ (size_t *) uap->arg7); /* rlenp */ break; case DM_GETALL_INHERIT: error = dm_getall_inherit( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (u_int) uap->arg5, /* nelem */ (dm_inherit_t *)uap->arg6, /* inheritbufp*/ (u_int *) uap->arg7); /* nelemp */ break; case DM_GETALL_SESSIONS: error = dm_getall_sessions( (u_int) uap->arg1, /* nelem */ (dm_sessid_t *) uap->arg2, /* sidbufp */ (u_int *) uap->arg3); /* nelemp */ break; case DM_GETALL_TOKENS: error = dm_getall_tokens( (dm_sessid_t) uap->arg1, /* sid */ (u_int) uap->arg2, /* nelem */ (dm_token_t *) uap->arg3, /* tokenbufp */ (u_int *) uap->arg4); /* nelemp */ break; case DM_INIT_ATTRLOC: error = dm_init_attrloc( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (dm_attrloc_t *) uap->arg5); /* locp */ break; case DM_MKDIR_BY_HANDLE: error = dm_mkdir_by_handle( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* dirhanp */ (size_t) uap->arg3, /* dirhlen */ (dm_token_t) uap->arg4, /* token */ (void *) uap->arg5, /* hanp */ (size_t) uap->arg6, /* hlen */ (char *) uap->arg7); /* cname */ break; case DM_MOVE_EVENT: error = dm_move_event( (dm_sessid_t) uap->arg1, /* srcsid */ (dm_token_t) uap->arg2, /* token */ (dm_sessid_t) uap->arg3, /* targetsid */ (dm_token_t *) uap->arg4); /* rtokenp */ break; case DM_OBJ_REF_HOLD: error = dm_obj_ref_hold( (dm_sessid_t) uap->arg1, /* sid */ (dm_token_t) uap->arg2, /* token */ (void *) uap->arg3, /* hanp */ (size_t) uap->arg4); /* hlen */ break; case DM_OBJ_REF_QUERY: use_rvp = 1; error = dm_obj_ref_query_rvp( (dm_sessid_t) uap->arg1, /* sid */ (dm_token_t) uap->arg2, /* token */ (void *) uap->arg3, /* hanp */ (size_t) uap->arg4, /* hlen */ &rvp); break; case DM_OBJ_REF_RELE: error = dm_obj_ref_rele( (dm_sessid_t) uap->arg1, /* sid */ (dm_token_t) uap->arg2, /* token */ (void *) uap->arg3, /* hanp */ (size_t) uap->arg4); /* hlen */ break; case DM_PATH_TO_FSHANDLE: error = dm_path_to_fshdl( (char *) uap->arg1, /* path */ (void *) uap->arg2, /* hanp */ (size_t *) uap->arg3); /* hlenp */ break; case DM_PATH_TO_HANDLE: error = dm_path_to_hdl( (char *) uap->arg1, /* path */ (void *) uap->arg2, /* hanp */ (size_t *) uap->arg3); /* hlenp */ break; case DM_PENDING: error = dm_pending( (dm_sessid_t) uap->arg1, /* sid */ (dm_token_t) uap->arg2, /* token */ (dm_timestruct_t *) uap->arg3); /* delay */ break; case DM_PROBE_HOLE: error = dm_probe_hole( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (dm_off_t) uap->arg5, /* off */ (dm_size_t) uap->arg6, /* len */ (dm_off_t *) uap->arg7, /* roffp */ (dm_size_t *) uap->arg8); /* rlenp */ break; case DM_PUNCH_HOLE: error = dm_punch_hole( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (dm_off_t) uap->arg5, /* off */ (dm_size_t) uap->arg6); /* len */ break; case DM_QUERY_RIGHT: error = dm_query_right( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (dm_right_t *) uap->arg5); /* rightp */ break; case DM_QUERY_SESSION: error = dm_query_session( (dm_sessid_t) uap->arg1, /* sid */ (size_t) uap->arg2, /* buflen */ (void *) uap->arg3, /* bufp */ (size_t *) uap->arg4); /* rlenp */ break; case DM_READ_INVIS: use_rvp = 1; error = dm_read_invis_rvp( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (dm_off_t) uap->arg5, /* off */ (dm_size_t) uap->arg6, /* len */ (void *) uap->arg7, /* bufp */ &rvp); break; case DM_RELEASE_RIGHT: error = dm_release_right( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4); /* token */ break; case DM_REMOVE_DMATTR: error = dm_remove_dmattr( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (int) uap->arg5, /* setdtime */ (dm_attrname_t *) uap->arg6); /* attrnamep */ break; case DM_REQUEST_RIGHT: error = dm_request_right( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (u_int) uap->arg5, /* flags */ (dm_right_t) uap->arg6); /* right */ break; case DM_RESPOND_EVENT: error = dm_respond_event( (dm_sessid_t) uap->arg1, /* sid */ (dm_token_t) uap->arg2, /* token */ (dm_response_t) uap->arg3, /* response */ (int) uap->arg4, /* reterror */ (size_t) uap->arg5, /* buflen */ (void *) uap->arg6); /* respbufp */ break; case DM_SEND_MSG: error = dm_send_msg( (dm_sessid_t) uap->arg1, /* targetsid */ (dm_msgtype_t) uap->arg2, /* msgtype */ (size_t) uap->arg3, /* buflen */ (void *) uap->arg4); /* bufp */ break; case DM_SET_DISP: error = dm_set_disp( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (dm_eventset_t *) uap->arg5, /* eventsetp */ (u_int) uap->arg6); /* maxevent */ break; case DM_SET_DMATTR: error = dm_set_dmattr( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (dm_attrname_t *) uap->arg5, /* attrnamep */ (int) uap->arg6, /* setdtime */ (size_t) uap->arg7, /* buflen */ (void *) uap->arg8); /* bufp */ break; case DM_SET_EVENTLIST: error = dm_set_eventlist( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (dm_eventset_t *) uap->arg5, /* eventsetp */ (u_int) uap->arg6); /* maxevent */ break; case DM_SET_FILEATTR: error = dm_set_fileattr( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (u_int) uap->arg5, /* mask */ (dm_fileattr_t *)uap->arg6); /* attrp */ break; case DM_SET_INHERIT: error = dm_set_inherit( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (dm_attrname_t *)uap->arg5, /* attrnamep */ (mode_t) uap->arg6); /* mode */ break; case DM_SET_REGION: error = dm_set_region( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (u_int) uap->arg5, /* nelem */ (dm_region_t *) uap->arg6, /* regbufp */ (dm_boolean_t *) uap->arg7); /* exactflagp */ break; case DM_SET_RETURN_ON_DESTROY: error = dm_set_return_on_destroy( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (dm_attrname_t *) uap->arg5, /* attrnamep */ (dm_boolean_t) uap->arg6); /* enable */ break; case DM_SYMLINK_BY_HANDLE: error = dm_symlink_by_handle( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* dirhanp */ (size_t) uap->arg3, /* dirhlen */ (dm_token_t) uap->arg4, /* token */ (void *) uap->arg5, /* hanp */ (size_t) uap->arg6, /* hlen */ (char *) uap->arg7, /* cname */ (char *) uap->arg8); /* path */ break; case DM_SYNC_BY_HANDLE: error = dm_sync_by_handle( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4); /* token */ break; case DM_UPGRADE_RIGHT: error = dm_upgrade_right( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4); /* token */ break; case DM_WRITE_INVIS: use_rvp = 1; error = dm_write_invis_rvp( (dm_sessid_t) uap->arg1, /* sid */ (void *) uap->arg2, /* hanp */ (size_t) uap->arg3, /* hlen */ (dm_token_t) uap->arg4, /* token */ (int) uap->arg5, /* flags */ (dm_off_t) uap->arg6, /* off */ (dm_size_t) uap->arg7, /* len */ (void *) uap->arg8, /* bufp */ &rvp); break; default: error = ENOSYS; break; } /* If it was an *_rvp() function, then if error==0, return |rvp| */ if( use_rvp && (error == 0) ) return rvp; else return -error; }
void DoTest() { int rc; char *szFuncName; DMLOG_PRINT(DMLVL_DEBUG, "Starting DMAPI persistent managed regions test\n") ; szFuncName = "dm_get_region"; /* * TEST : dm_get_region - persistent, Part II * EXPECTED: rc = 0, nelem = 5 */ if (DMVAR_EXEC(GET_REGION_BASE + 1)) { int fd; void *hanp; size_t hlen; u_int nelem; dm_region_t regbuf[PMR_NUM_REGIONS]; int varStatus; int i; /* Variation set up */ if ((fd = open(DummyFile, O_RDWR)) == -1) { /* No clean up */ } else if ((rc = dm_fd_to_handle(fd, &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(persistent, Part II)\n", szFuncName); rc = dm_get_region(sid, hanp, hlen, DM_NO_TOKEN, sizeof(regbuf)/sizeof(dm_region_t), regbuf, &nelem); if (rc == 0) { DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n", nelem); } varStatus = DMSTAT_PASS; if (rc != 0) { DMLOG_PRINT(DMLVL_ERR, "%s returned unexpected rc = %d (errno = %d)\n", szFuncName, rc, errno); varStatus = DMSTAT_FAIL; } else if (nelem != PMR_NUM_REGIONS) { DMLOG_PRINT(DMLVL_ERR, "Number of regions NOT correct! (%d vs %d)\n", nelem, PMR_NUM_REGIONS); varStatus = DMSTAT_FAIL; } else { DMLOG_PRINT(DMLVL_DEBUG, "%s returned expected rc = %d\n", szFuncName, rc, errno); DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n", rc, errno); LogRegions(regbuf, nelem); for (i = 0; i < PMR_NUM_REGIONS; i++) { if (regbuf[i].rg_offset != dm_PMR_regbuf[i].rg_offset) { DMLOG_PRINT(DMLVL_ERR, "region %d offset NOT correct! (%lld vs %d)\n", i, regbuf[i].rg_offset, dm_PMR_regbuf[i].rg_offset); varStatus = DMSTAT_FAIL; } if (regbuf[i].rg_size != dm_PMR_regbuf[i].rg_size) { DMLOG_PRINT(DMLVL_ERR, "region %d size NOT correct! (%lld vs %d)\n", i, regbuf[i].rg_size, dm_PMR_regbuf[i].rg_size); varStatus = DMSTAT_FAIL; } if (regbuf[i].rg_flags != dm_PMR_regbuf[i].rg_flags) { DMLOG_PRINT(DMLVL_ERR, "region %d flags NOT correct! (%lld vs %d)\n", i, regbuf[i].rg_flags, dm_PMR_regbuf[i].rg_flags); 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); } dm_handle_free(hanp, hlen); } } /* * TEST : dm_get_region - invalid sid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(GET_REGION_BASE + 2)) { int fd; void *hanp; size_t hlen; u_int nelemin, nelemout; dm_region_t regbuf; dm_boolean_t exactflag; /* Variation set up */ nelemin = 1; memset(®buf, 0, sizeof(regbuf)); sprintf(command, "cp %s %s", DUMMY_FILE, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -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, nelemin, ®buf, &exactflag)) == -1) { close(fd); remove(DummyFile); dm_handle_free(hanp, hlen); } if (rc == -1 || fd == -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_region(INVALID_ADDR, hanp, hlen, DM_NO_TOKEN, nelemin, ®buf, &nelemout); 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_region - invalid hanp * EXPECTED: rc = -1, errno = EFAULT */ if (DMVAR_EXEC(GET_REGION_BASE + 3)) { int fd; void *hanp; size_t hlen; u_int nelemin, nelemout; dm_region_t regbuf; dm_boolean_t exactflag; /* Variation set up */ nelemin = 1; memset(®buf, 0, sizeof(regbuf)); sprintf(command, "cp %s %s", DUMMY_FILE, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -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, nelemin, ®buf, &exactflag)) == -1) { close(fd); remove(DummyFile); dm_handle_free(hanp, hlen); } if (rc == -1 || fd == -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_region(sid, (void *)INVALID_ADDR, hlen, DM_NO_TOKEN, nelemin, ®buf, &nelemout); 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_region - invalid hlen * EXPECTED: rc = -1, errno = EBADF */ if (DMVAR_EXEC(GET_REGION_BASE + 4)) { int fd; void *hanp; size_t hlen; u_int nelemin, nelemout; dm_region_t regbuf; dm_boolean_t exactflag; /* Variation set up */ nelemin = 1; memset(®buf, 0, sizeof(regbuf)); sprintf(command, "cp %s %s", DUMMY_FILE, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -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, nelemin, ®buf, &exactflag)) == -1) { close(fd); remove(DummyFile); dm_handle_free(hanp, hlen); } if (rc == -1 || fd == -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_region(sid, hanp, INVALID_ADDR, DM_NO_TOKEN, nelemin, ®buf, &nelemout); 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_region - invalid token * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(GET_REGION_BASE + 5)) { int fd; void *hanp; size_t hlen; u_int nelemin, nelemout; dm_region_t regbuf; dm_boolean_t exactflag; /* Variation set up */ nelemin = 1; memset(®buf, 0, sizeof(regbuf)); sprintf(command, "cp %s %s", DUMMY_FILE, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -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, nelemin, ®buf, &exactflag)) == -1) { close(fd); remove(DummyFile); dm_handle_free(hanp, hlen); } if (rc == -1 || fd == -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_region(sid, hanp, hlen, INVALID_ADDR, nelemin, ®buf, &nelemout); 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_region - invalid regbufp * EXPECTED: rc = -1, errno = EFAULT */ if (DMVAR_EXEC(GET_REGION_BASE + 6)) { int fd; void *hanp; size_t hlen; u_int nelemin, nelemout; dm_region_t regbuf; dm_boolean_t exactflag; /* Variation set up */ nelemin = 1; memset(®buf, 0, sizeof(regbuf)); sprintf(command, "cp %s %s", DUMMY_FILE, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -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, nelemin, ®buf, &exactflag)) == -1) { close(fd); remove(DummyFile); dm_handle_free(hanp, hlen); } if (rc == -1 || fd == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid regbufp)\n", szFuncName); rc = dm_get_region(sid, hanp, hlen, DM_NO_TOKEN, nelemin, (dm_region_t *)INVALID_ADDR, &nelemout); 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_region - invalid nelemp * EXPECTED: rc = -1, errno = EFAULT */ if (DMVAR_EXEC(GET_REGION_BASE + 7)) { int fd; void *hanp; size_t hlen; u_int nelemin; dm_region_t regbuf; dm_boolean_t exactflag; /* Variation set up */ nelemin = 1; memset(®buf, 0, sizeof(regbuf)); sprintf(command, "cp %s %s", DUMMY_FILE, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -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, nelemin, ®buf, &exactflag)) == -1) { close(fd); remove(DummyFile); dm_handle_free(hanp, hlen); } if (rc == -1 || fd == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid nelemp)\n", szFuncName); rc = dm_get_region(sid, hanp, hlen, DM_NO_TOKEN, nelemin, ®buf, (u_int *)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_region - DM_SO_SESSION sid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(GET_REGION_BASE + 8)) { int fd; void *hanp; size_t hlen; u_int nelemin, nelemout; dm_region_t regbuf; dm_boolean_t exactflag; /* Variation set up */ nelemin = 1; memset(®buf, 0, sizeof(regbuf)); sprintf(command, "cp %s %s", DUMMY_FILE, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -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, nelemin, ®buf, &exactflag)) == -1) { close(fd); remove(DummyFile); dm_handle_free(hanp, hlen); } if (rc == -1 || fd == -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_region(DM_NO_SESSION, hanp, hlen, DM_NO_TOKEN, nelemin, ®buf, &nelemout); 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_region - global handle * EXPECTED: rc = -1, errno = EBADF */ if (DMVAR_EXEC(GET_REGION_BASE + 9)) { int fd; void *hanp; size_t hlen; u_int nelemin, nelemout; dm_region_t regbuf; dm_boolean_t exactflag; /* Variation set up */ nelemin = 1; memset(®buf, 0, sizeof(regbuf)); sprintf(command, "cp %s %s", DUMMY_FILE, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -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, nelemin, ®buf, &exactflag)) == -1) { close(fd); remove(DummyFile); dm_handle_free(hanp, hlen); } if (rc == -1 || fd == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName); rc = dm_get_region(sid, DM_GLOBAL_HANP, DM_GLOBAL_HLEN, DM_NO_TOKEN, nelemin, ®buf, &nelemout); if (rc == -1 && errno == EBADF) { DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n", nelemout); } 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_region - directory handle * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(GET_REGION_BASE + 10)) { void *hanp; size_t hlen; u_int nelemin, nelemout; dm_region_t regbuf; /* Variation set up */ nelemin = 1; memset(®buf, 0, sizeof(regbuf)); 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 */ DMLOG_PRINT(DMLVL_DEBUG, "%s(dir handle)\n", szFuncName); rc = dm_get_region(sid, hanp, hlen, DM_NO_TOKEN, nelemin, ®buf, &nelemout); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ rc = rmdir(DummySubdir); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } dm_handle_free(hanp, hlen); } } /* * TEST : dm_get_region - fs handle * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(GET_REGION_BASE + 11)) { void *hanp; size_t hlen; u_int nelemin, nelemout; dm_region_t regbuf; /* Variation set up */ nelemin = 1; memset(®buf, 0, sizeof(regbuf)); if ((rc = mkdir(DummySubdir, DUMMY_DIR_RW_MODE)) == -1) { /* No clean up */ } else if ((rc = dm_path_to_fshandle(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(fs handle)\n", szFuncName); rc = dm_get_region(sid, hanp, hlen, DM_NO_TOKEN, nelemin, ®buf, &nelemout); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ rc = rmdir(DummySubdir); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } dm_handle_free(hanp, hlen); } } /* * TEST : dm_get_region - nelem 0 * EXPECTED: rc = 0 */ if (DMVAR_EXEC(GET_REGION_BASE + 11)) { int fd; void *hanp; size_t hlen; u_int nelemin, nelemout; dm_region_t regbuf; /* Variation set up */ nelemin = 0; sprintf(command, "cp %s %s", DUMMY_FILE, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -1) { remove(DummyFile); } else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) { close(fd); remove(DummyFile); } if (rc == -1 || fd == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(nelem 0)\n", szFuncName); rc = dm_get_region(sid, hanp, hlen, DM_NO_TOKEN, nelemin, ®buf, &nelemout); if (rc == 0) { DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n", nelemout); if (nelemin == nelemout) { 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 unexpected nelemp (%d vs %d)\n", szFuncName, 0, nelemin, nelemout); 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); } dm_handle_free(hanp, hlen); } } /* * TEST : dm_get_region - nelem 1 * EXPECTED: rc = 0 */ if (DMVAR_EXEC(GET_REGION_BASE + 12)) { int fd; void *hanp; size_t hlen; u_int nelemin, nelemout; dm_region_t regbufin, regbufout; dm_boolean_t exactflag; /* Variation set up */ nelemin = 1; memset(®bufin, 0, sizeof(regbufin)); sprintf(command, "cp %s %s", DUMMY_FILE, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -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, nelemin, ®bufin, &exactflag)) == -1) { close(fd); remove(DummyFile); dm_handle_free(hanp, hlen); } if (rc == -1 || fd == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(nelem 1)\n", szFuncName); rc = dm_get_region(sid, hanp, hlen, DM_NO_TOKEN, nelemin, ®bufout, &nelemout); if (rc == 0) { DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n", nelemout); if (nelemin == nelemout) { if (memcmp(®bufin, ®bufout, sizeof(dm_region_t)) == 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 unexpected regions\n", szFuncName, 0); DMLOG_PRINT(DMLVL_DEBUG, "Region in:\n"); LogRegions(®bufin, nelemin); DMLOG_PRINT(DMLVL_DEBUG, "Region out:\n"); LogRegions(®bufout, nelemout); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with expected rc = %d but unexpected nelemp (%d vs %d)\n", szFuncName, 0, nelemin, nelemout); 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); } dm_handle_free(hanp, hlen); } } /* * TEST : dm_get_region - nelem 2 * EXPECTED: rc = 0 */ if (DMVAR_EXEC(GET_REGION_BASE + 13)) { #ifdef MULTIPLE_REGIONS int fd; void *hanp; size_t hlen; u_int nelemin, nelemout; dm_region_t regbufin[2], regbufout[2]; dm_boolean_t exactflag; /* Variation set up */ nelemin = 2; regbufin[0].rg_offset = 0; regbufin[0].rg_size = 1000; regbufin[0].rg_flags = DM_REGION_READ; regbufin[1].rg_offset = 2000; regbufin[1].rg_size = 1000; regbufin[1].rg_flags = DM_REGION_WRITE; sprintf(command, "cp %s %s", DUMMY_FILE, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -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, nelemin, regbufin, &exactflag)) == -1) { close(fd); remove(DummyFile); dm_handle_free(hanp, hlen); } if (rc == -1 || fd == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(nelem 2)\n", szFuncName); rc = dm_get_region(sid, hanp, hlen, DM_NO_TOKEN, nelemin, regbufout, &nelemout); if (rc == 0) { DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n", nelemout); if (nelemin == nelemout) { if (memcmp(®bufin, ®bufout, sizeof(dm_region_t)) == 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 unexpected regions\n", szFuncName, 0); DMLOG_PRINT(DMLVL_DEBUG, "Region in:\n"); LogRegions(regbufin, nelemin); DMLOG_PRINT(DMLVL_DEBUG, "Region out:\n"); LogRegions(regbufout, nelemout); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with expected rc = %d but unexpected nelemp (%d vs %d)\n", szFuncName, 0, nelemin, nelemout); 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); } dm_handle_free(hanp, hlen); } #else DMLOG_PRINT(DMLVL_WARN, "Test case not built with MULTIPLE_REGIONS defined\n"); DMVAR_SKIP(); #endif } /* * TEST : dm_get_region - regbuf too small * EXPECTED: rc = -1, errno = E2BIG */ if (DMVAR_EXEC(GET_REGION_BASE + 14)) { int fd; void *hanp; size_t hlen; u_int nelemin, nelemout; dm_region_t regbufin[2], regbufout[1]; dm_boolean_t exactflag; /* Variation set up */ #ifdef MULTIPLE_REGIONS nelemin = 2; regbufin[0].rg_offset = 0; regbufin[0].rg_size = 1000; regbufin[0].rg_flags = DM_REGION_READ; regbufin[1].rg_offset = 2000; regbufin[1].rg_size = 1000; regbufin[1].rg_flags = DM_REGION_WRITE; #else nelemin = 1; regbufin[0].rg_offset = 0; regbufin[0].rg_size = 1000; regbufin[0].rg_flags = DM_REGION_READ; #endif sprintf(command, "cp %s %s", DUMMY_FILE, DummyFile); if ((rc = system(command)) == -1) { /* No clean up */ } else if ((fd = open(DummyFile, O_RDWR | O_CREAT, DUMMY_FILE_RW_MODE)) == -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, nelemin, regbufin, &exactflag)) == -1) { close(fd); remove(DummyFile); dm_handle_free(hanp, hlen); } if (rc == -1 || fd == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(regbuf too small)\n", szFuncName); rc = dm_get_region(sid, hanp, hlen, DM_NO_TOKEN, nelemin-1, regbufout, &nelemout); if (rc == -1) { if (errno == E2BIG) { DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n", nelemout); if (nelemout == nelemin) { DMLOG_PRINT(DMLVL_DEBUG, "%s passed with expected rc = %d and expected errno = %d\n", szFuncName, rc, errno); DMVAR_PASS(); } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with expected rc = %d and expected errno = %d but unexpected nelemp (%d vs %d)\n", szFuncName, rc, errno, nelemout, nelemin); 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 = 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); } } }
int main( int argc, char **argv) { dm_sessid_t sid, oldsid, targetsid, *newsidp, *sidbufp; dm_token_t token, *tokenp, *rtokenp, *tokenbufp; dm_attrname_t *attrnamep; dm_off_t off, *offp, *roffp; dm_extent_t *extentp; dm_inherit_t *inheritbufp; dm_stat_t *statp; dm_size_t len, *dmrlenp, *retvalp; dm_attrloc_t *locp; dm_eventset_t *eventsetp; dm_config_t flagname; dm_region_t *regbufp; dm_response_t response; dm_right_t right, *rightp; dm_igen_t igen, *igenp; dm_msgtype_t msgtype; dm_fileattr_t *attrp; dm_boolean_t enable, *exactflagp; dm_timestruct_t *delay; mode_t mode; size_t hlen, dirhlen, hlen1, hlen2, targhlen, *fshlenp, *hlenp; size_t msglen, buflen, *rlenp; u_int nelem, mask, maxmsgs, uflags, *nelemp, maxevent; void *hanp, *dirhanp, *hanp1, *hanp2, *targhanp; void *msgdatap, *bufp, **hanpp, *respbufp, **fshanpp; dm_fsid_t fsid, *fsidp; dm_ino_t ino, *inop; char *cname, *sessinfop, *path, *pathbufp, **versionstrpp; int flags, fd, setdtime, reterror; u_int urc; int rc; dm_ssize_t ssrc; /* Definitions per the prototypes in dmport.h, in the same order. */ rc = dm_clear_inherit(sid, hanp, hlen, token, attrnamep); rc = dm_create_by_handle(sid, dirhanp, dirhlen, token, hanp, hlen, cname); rc = dm_create_session(oldsid, sessinfop, newsidp); rc = dm_create_userevent(sid, msglen, msgdatap, tokenp); rc = dm_destroy_session(sid); rc = dm_downgrade_right(sid, hanp, hlen, token); rc = dm_fd_to_handle(fd, hanpp, hlenp); rc = dm_find_eventmsg(sid, token, buflen, bufp, rlenp); rc = dm_get_allocinfo(sid, hanp, hlen, token, offp, nelem, extentp, nelemp); rc = dm_get_bulkall(sid, hanp, hlen, token, mask, attrnamep, locp, buflen, bufp, rlenp); rc = dm_get_bulkattr(sid, hanp, hlen, token, mask, locp, buflen, bufp, rlenp); rc = dm_get_config(hanp, hlen, flagname, retvalp); rc = dm_get_config_events(hanp, hlen, nelem, eventsetp, nelemp); rc = dm_get_dirattrs(sid, hanp, hlen, token, mask, locp, buflen, bufp, rlenp); rc = dm_get_dmattr(sid, hanp, hlen, token, attrnamep, buflen, bufp, rlenp); rc = dm_get_eventlist(sid, hanp, hlen, token, nelem, eventsetp, nelemp); rc = dm_get_events(sid, maxmsgs, flags, buflen, bufp, rlenp); rc = dm_get_fileattr(sid, hanp, hlen, token, mask, statp); rc = dm_get_mountinfo(sid, hanp, hlen, token, buflen, bufp, rlenp); rc = dm_get_region(sid, hanp, hlen, token, nelem, regbufp, nelemp); rc = dm_getall_disp(sid, buflen, bufp, rlenp); rc = dm_getall_dmattr(sid, hanp, hlen, token, buflen, bufp, rlenp); rc = dm_getall_inherit(sid, hanp, hlen, token, nelem, inheritbufp, nelemp); rc = dm_getall_sessions(nelem, sidbufp, nelemp); rc = dm_getall_tokens(sid, nelem, tokenbufp, nelemp); rc = dm_handle_cmp(hanp1, hlen1, hanp2, hlen2); dm_handle_free(hanp, hlen); urc = dm_handle_hash(hanp, hlen); rc = dm_handle_is_valid(hanp, hlen); rc = dm_handle_to_fshandle(hanp, hlen, fshanpp, fshlenp); rc = dm_handle_to_fsid(hanp, hlen, fsidp); rc = dm_handle_to_igen(hanp, hlen, igenp); rc = dm_handle_to_ino(hanp, hlen, inop); rc = dm_handle_to_path(dirhanp, dirhlen, targhanp, targhlen, buflen, pathbufp, rlenp); rc = dm_init_attrloc(sid, hanp, hlen, token, locp); rc = dm_init_service(versionstrpp); rc = dm_make_handle(&fsid, &ino, &igen, hanpp, hlenp); rc = dm_make_fshandle(&fsid, hanpp, hlenp); rc = dm_mkdir_by_handle(sid, dirhanp, dirhlen, token, hanp, hlen, cname); rc = dm_move_event(sid, token, targetsid, rtokenp); rc = dm_obj_ref_hold(sid, token, hanp, hlen); rc = dm_obj_ref_query(sid, token, hanp, hlen); rc = dm_obj_ref_rele(sid, token, hanp, hlen); rc = dm_path_to_fshandle(path, hanpp, hlenp); rc = dm_path_to_handle(path, hanpp, hlenp); rc = dm_pending(sid, token, delay); rc = dm_probe_hole(sid, hanp, hlen, token, off, len, roffp, dmrlenp); rc = dm_punch_hole(sid, hanp, hlen, token, off, len); rc = dm_query_right(sid, hanp, hlen, token, rightp); rc = dm_query_session(sid, buflen, bufp, rlenp); ssrc = dm_read_invis(sid, hanp, hlen, token, off, len, bufp); rc = dm_release_right(sid, hanp, hlen, token); rc = dm_remove_dmattr(sid, hanp, hlen, token, setdtime, attrnamep); rc = dm_request_right(sid, hanp, hlen, token, uflags, right); rc = dm_respond_event(sid, token, response, reterror, buflen, respbufp); rc = dm_send_msg(sid, msgtype, buflen, bufp); rc = dm_set_disp(sid, hanp, hlen, token, eventsetp, maxevent); rc = dm_set_dmattr(sid, hanp, hlen, token, attrnamep, setdtime, buflen, bufp); rc = dm_set_eventlist(sid, hanp, hlen, token, eventsetp, maxevent); rc = dm_set_fileattr(sid, hanp, hlen, token, mask, attrp); rc = dm_set_inherit(sid, hanp, hlen, token, attrnamep, mode); rc = dm_set_region(sid, hanp, hlen, token, nelem, regbufp, exactflagp); rc = dm_set_return_on_destroy(sid, hanp, hlen, token, attrnamep, enable); rc = dm_symlink_by_handle(sid, dirhanp, dirhlen, token, hanp, hlen, cname, path); rc = dm_sync_by_handle(sid, hanp, hlen, token); rc = dm_upgrade_right(sid, hanp, hlen, token); ssrc = dm_write_invis(sid, hanp, hlen, flags, token, off, len, bufp); exit(0); }
int main( int argc, char **argv) { dm_region_t region = { 0, 0, 0 }; dm_region_t checkregion = { 0, 0, 0 }; dm_sessid_t sid = DM_NO_SESSION; char *dir_name = NULL; char *ls_path = NULL; char object[128]; char command[128]; u_int exactflag; u_int nelem_read = 0; void *hanp; size_t hlen; char *name; int opt; int i; int Vflag = 0; dm_token_t test_token = DM_NO_TOKEN; if (Progname = strrchr(argv[0], '/')) { Progname++; } else { Progname = argv[0]; } /* Crack and validate the command line options. */ while ((opt = getopt(argc, argv, "vo:l:s:")) != EOF) { switch (opt) { case 'v': Vflag++; break; case 'o': region.rg_offset = atol(optarg); break; case 'l': region.rg_size = atol(optarg); break; case 's': sid = atol(optarg); break; case '?': usage(); } } if (optind + 2 > argc) usage(); ls_path = argv[optind]; dir_name = 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); /***********************************************\ |* Beginning the testing of set/get_region... *| \***********************************************/ printf("Region test beginning...\n"); sprintf(object, "%s/VeryLongUnlikelyFilename.REGIONTEST", dir_name); sprintf(command, "cp %s %s \n", ls_path, object); system(command); /* Get the test file's handle. */ if (dm_path_to_handle(object, &hanp, &hlen)) { fprintf(stderr, "can't get handle for file %s\n", object); exit(1); } /* Loop over all possible region flag combinations, * setting and getting. See what works! */ for (i = 0; i < 8; i++) { region.rg_flags = reg_flags[i]; if (dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, NELEM, ®ion, &exactflag)) { fprintf(stderr, "dm_set_region failed, %s\n", ERR_NAME); continue; } if (exactflag != DM_TRUE){ fprintf(stdout, "oops...exactflag was false!\n"); } if (dm_get_region(sid, hanp, hlen, DM_NO_TOKEN, NELEM, &checkregion, &nelem_read)) { fprintf(stderr, "dm_get_region failed, %s\n", ERR_NAME); continue; } if (region.rg_flags != checkregion.rg_flags) { fprintf(stdout, "set region flags %d, but found %d\n", region.rg_flags, checkregion.rg_flags); } else if (Vflag) { fprintf(stdout, "Test #%d okay\n", i); } } /*************************************\ |* Correct-input testing complete. *| |* Beginning improper-input testing. *| \*************************************/ printf("\t(errno subtests beginning...)\n"); region.rg_flags = 7; /**** SET tests ****/ /*---------------------------------------------------------*/ ERRTEST(E2BIG, "set", dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, 2, ®ion, &exactflag)) ERRTEST(E2BIG, "set", dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, -1, ®ion, &exactflag)) /*---------------------------------------------------------*/ EXCLTEST("set", hanp, hlen, test_token, dm_set_region(sid, hanp, hlen, test_token, NELEM, ®ion, &exactflag)) /*---------------------------------------------------------*/ ERRTEST(EFAULT, "set", dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, NELEM, (dm_region_t*)(-1000), &exactflag)) ERRTEST(EFAULT, "set", dm_set_region(sid, hanp, hlen, DM_NO_TOKEN, NELEM, ®ion, (dm_boolean_t*)(-1000))) /*---------------------------------------------------------*/ ERRTEST(EINVAL, "set (bad session id)", dm_set_region(-100, hanp, hlen, DM_NO_TOKEN, NELEM, ®ion, &exactflag)) /*---------------------------------------------------------*/ /**** GET tests ****/ /*---------------------------------------------------------*/ ERRTEST (E2BIG, "get", dm_get_region(sid, hanp, hlen, DM_NO_TOKEN, 0, &checkregion, &nelem_read)) /*---------------------------------------------------------*/ ERRTEST(EFAULT, "get (bad handle)", dm_get_region(sid, NULL, hlen, DM_NO_TOKEN, NELEM, &checkregion, &nelem_read)) /*---------------------------------------------------------*/ ERRTEST(EFAULT, "get (bad regbufp)", dm_get_region(sid, hanp, hlen, DM_NO_TOKEN, NELEM, (dm_region_t *)(-1000), &nelem_read)) /*---------------------------------------------------------*/ ERRTEST(EFAULT, "get (bad nelemp)", dm_get_region(sid, hanp, hlen, DM_NO_TOKEN, NELEM, &checkregion, (u_int *)(-1000))) /*---------------------------------------------------------*/ SHAREDTEST("get", hanp, hlen, test_token, dm_get_region(sid, hanp, hlen, test_token, NELEM, &checkregion, &nelem_read)) /*---------------------------------------------------------*/ ERRTEST(EINVAL, "get", dm_get_region(-100, hanp, hlen, DM_NO_TOKEN, NELEM, &checkregion, &nelem_read)) /*---------------------------------------------------------*/ printf("\t(errno subtests complete)\n"); /**********************************\ |* End of improper-input testing. *| \**********************************/ sprintf(command, "rm %s \n", object); system(command); printf("Region test complete.\n"); /***********************************\ |* End of set/get_region testing. *| \***********************************/ dm_handle_free(hanp, hlen); exit(0); }
/* migrate one file */ static int hsm_migrate(const char *path) { int ret; void *hanp = NULL; size_t hlen = 0; dm_attrname_t attrname; uint8_t buf[0x1000]; size_t rlen; struct stat st; struct hsm_attr h; dm_region_t region; dm_boolean_t exactFlag; off_t ofs; int retval = 1; struct hsm_store_handle *handle; dmapi.token = DM_NO_TOKEN; ret = dm_path_to_handle(discard_const(path), &hanp, &hlen); if (ret != 0) { printf("dm_path_to_handle failed for %s - %s\n", path, strerror(errno)); exit(1); } /* we create a user event which we use to gain exclusive rights on the file */ ret = dm_create_userevent(dmapi.sid, 0, NULL, &dmapi.token); if (ret != 0) { printf("dm_create_userevent failed for %s - %s\n", path, strerror(errno)); exit(1); } /* getting an exclusive right first guarantees that two migrate commands don't happen at the same time on the same file, and also guarantees that a recall isn't happening at the same time. We then downgrade to a shared right immediately, which still gives the same guarantee, but means that any reads on the file can proceeed while we are saving away the data during the migrate */ ret = dm_request_right(dmapi.sid, hanp, hlen, dmapi.token, DM_RR_WAIT, DM_RIGHT_EXCL); if (ret != 0) { printf("dm_request_right failed for %s - %s\n", path, strerror(errno)); goto respond; } /* now downgrade the right - reads on the file can then proceed during the expensive migration step */ ret = dm_downgrade_right(dmapi.sid, hanp, hlen, dmapi.token); if (ret != 0) { printf("dm_downgrade_right failed for %s - %s\n", path, strerror(errno)); goto respond; } memset(attrname.an_chars, 0, DM_ATTR_NAME_SIZE); strncpy((char*)attrname.an_chars, HSM_ATTRNAME, DM_ATTR_NAME_SIZE); /* get any existing attribute on the file */ ret = dm_get_dmattr(dmapi.sid, hanp, hlen, dmapi.token, &attrname, sizeof(h), &h, &rlen); if (ret != 0 && errno != ENOENT) { printf("dm_get_dmattr failed for %s - %s\n", path, strerror(errno)); goto respond; } /* check it is valid */ if (ret == 0) { if (strncmp(h.magic, HSM_MAGIC, sizeof(h.magic)) != 0) { printf("Bad magic '%*.*s'\n", (int)sizeof(h.magic), (int)sizeof(h.magic), h.magic); exit(1); } if (h.state == HSM_STATE_START) { /* a migration has died on this file */ printf("Continuing migration of partly migrated file\n"); hsm_store_remove(store_ctx, h.device, h.inode); } else { /* it is either fully migrated, or waiting recall */ printf("Not migrating already migrated file %s\n", path); goto respond; } } if (lstat(path, &st) != 0) { printf("failed to stat %s - %s\n", path, strerror(errno)); goto respond; } if (!S_ISREG(st.st_mode)) { printf("Not migrating non-regular file %s\n", path); goto respond; } if (st.st_size == 0) { printf("Not migrating file '%s' of size 0\n", path); goto respond; } /* open up the store file */ handle = hsm_store_open(store_ctx, st.st_dev, st.st_ino, false); if (handle == NULL) { printf("Failed to open store file for %s - %s\n", path, strerror(errno)); goto respond; } /* read the file data and store it away */ ofs = 0; while ((ret = dm_read_invis(dmapi.sid, hanp, hlen, dmapi.token, ofs, sizeof(buf), buf)) > 0) { if (hsm_store_write(handle, buf, ret) != 0) { printf("Failed to write to store for %s - %s\n", path, strerror(errno)); hsm_store_close(handle); hsm_store_remove(store_ctx, st.st_dev, st.st_ino); goto respond; } ofs += ret; } if (ret == -1) { printf("failed dm_read_invis on %s - %s\n", path, strerror(errno)); hsm_store_close(handle); hsm_store_remove(store_ctx, st.st_dev, st.st_ino); goto respond; } hsm_store_close(handle); /* now upgrade to a exclusive right on the file before we change the dmattr and punch holes in the file. */ ret = dm_upgrade_right(dmapi.sid, hanp, hlen, dmapi.token); if (ret != 0) { printf("dm_upgrade_right failed for %s - %s\n", path, strerror(errno)); goto respond; } strncpy(h.magic, HSM_MAGIC, sizeof(h.magic)); h.size = st.st_size; h.migrate_time = time(NULL); h.device = st.st_dev; h.inode = st.st_ino; h.state = HSM_STATE_START; /* mark the file as starting to migrate */ ret = dm_set_dmattr(dmapi.sid, hanp, hlen, dmapi.token, &attrname, 0, sizeof(h), (void*)&h); if (ret == -1) { printf("failed dm_set_dmattr on %s - %s\n", path, strerror(errno)); hsm_store_remove(store_ctx, st.st_dev, st.st_ino); goto respond; } /* mark the whole file as offline, including parts beyond EOF */ region.rg_offset = 0; region.rg_size = 0; /* zero means the whole file */ region.rg_flags = DM_REGION_WRITE | DM_REGION_READ; ret = dm_set_region(dmapi.sid, hanp, hlen, dmapi.token, 1, ®ion, &exactFlag); if (ret == -1) { printf("failed dm_set_region on %s - %s\n", path, strerror(errno)); hsm_store_remove(store_ctx, st.st_dev, st.st_ino); goto respond; } /* this dm_get_dmattr() is not strictly necessary - it is just paranoia */ ret = dm_get_dmattr(dmapi.sid, hanp, hlen, dmapi.token, &attrname, sizeof(h), &h, &rlen); if (ret != 0) { printf("ERROR: Abandoning partial migrate - attribute gone!?\n"); goto respond; } if (h.state != HSM_STATE_START) { printf("ERROR: Abandoning partial migrate - state=%d\n", h.state); goto respond; } ret = dm_punch_hole(dmapi.sid, hanp, hlen, dmapi.token, 0, st.st_size); if (ret == -1) { printf("failed dm_punch_hole on %s - %s\n", path, strerror(errno)); hsm_store_remove(store_ctx, st.st_dev, st.st_ino); goto respond; } h.state = HSM_STATE_MIGRATED; /* mark the file as fully migrated */ ret = dm_set_dmattr(dmapi.sid, hanp, hlen, dmapi.token, &attrname, 0, sizeof(h), (void*)&h); if (ret == -1) { printf("failed dm_set_dmattr on %s - %s\n", path, strerror(errno)); hsm_store_remove(store_ctx, st.st_dev, st.st_ino); goto respond; } printf("Migrated file '%s' of size %d\n", path, (int)st.st_size); retval = 0; respond: /* destroy our userevent */ ret = dm_respond_event(dmapi.sid, dmapi.token, DM_RESP_CONTINUE, 0, 0, NULL); if (ret == -1) { printf("failed dm_respond_event on %s - %s\n", path, strerror(errno)); exit(1); } dmapi.token = DM_NO_TOKEN; dm_handle_free(hanp, hlen); return retval; }