int main( int argc, char **argv ) { extern char *optarg; int c; int ret; dm_sessid_t *sidbuf; u_int nelem = 100; u_int rnelem = 0; int i; char *versionstr; int anyway = 0; /* attempt to show this many elements anyway, * even if it looks like nothing was returned. */ while( (c = getopt(argc, argv, "hn:x:")) != -1 ) { switch(c){ case 'n': nelem = atoi( optarg ); break; case 'x': anyway = atoi( optarg ); break; case 'h': fprintf(stderr, "Usage: %s [-n nelem]\n", argv[0]); exit(2); } } if( (sidbuf = malloc( sizeof(*sidbuf) * nelem )) == NULL ){ fprintf(stderr, "%s: malloc failed\n", argv[0] ); exit(1); } memset( sidbuf, 0, sizeof(*sidbuf) * nelem ); if( dm_init_service( &versionstr ) < 0 ) exit(1); ret = dm_getall_sessions( nelem, sidbuf, &rnelem ); printf( "ret=%d\n", ret ); printf( "rnelem=%d\n", rnelem ); /* user wants us to try to show a specific number of elements */ if( anyway > 0 ) rnelem = anyway; printf("sids=\""); for( i = 0; i < rnelem; i++ ){ printf("%d ", sidbuf[i]); } printf("\"\n"); exit(0); }
int main(int argc, char **argv) { char *szSessionInfo = "dm_test session info"; char *szFuncName; char *varstr; int i; int rc; DMOPT_PARSE(argc, argv); DMLOG_START(); /* 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 { int nexist; rc = dm_getall_sessions(0, NULL, &nexist); if (rc == -1 && errno == E2BIG) { dm_sessid_t *psid; DMLOG_PRINT(DMLVL_DEBUG, "%d sessions already exist\n", nexist); if ((psid = malloc(nexist * sizeof(dm_sessid_t))) != NULL) { if ((rc = dm_getall_sessions(nexist, psid, &nexist)) == 0) { for (rc = 0, i = 0; i < nexist; i++) { DMLOG_PRINT(DMLVL_DEBUG, "destroying session %d\n", psid[i]); rc |= dm_destroy_session(psid[i]); } if (rc == -1) { DMLOG_PRINT(DMLVL_ERR, "dm_destroy_session failed, unable to destroy existing sessions\n"); DM_EXIT(); } } else { DMLOG_PRINT(DMLVL_ERR, "dm_getall_sessions failed, unable to destroy existing sessions\n"); DM_EXIT(); } free(psid); } else { DMLOG_PRINT(DMLVL_ERR, "malloc failed, unable to destroy existing sessions\n"); DM_EXIT(); } } } DMLOG_PRINT(DMLVL_DEBUG, "Starting DMAPI session tests\n") ; szFuncName = "dm_create_session"; /* * TEST : dm_create_session - invalid oldsid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(CREATE_SESSION_BASE + 1)) { dm_sessid_t newsid; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid oldsid)\n", szFuncName); rc = dm_create_session(INVALID_ADDR, szSessionInfo, &newsid); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ } /* * TEST : dm_create_session - NULL sessinfop * EXPECTED: rc = 0 */ if (DMVAR_EXEC(CREATE_SESSION_BASE + 2)) { dm_sessid_t newsid; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(NULL sessinfop)\n", szFuncName); rc = dm_create_session(DM_NO_SESSION, NULL, &newsid); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ } /* * TEST : dm_create_session - invalid sessinfop * EXPECTED: rc = -1, errno = EFAULT * * This variation uncovered XFS BUG #2 (0 return code from strnlen_user * ignored, which indicated fault) */ if (DMVAR_EXEC(CREATE_SESSION_BASE + 3)) { dm_sessid_t newsid; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sessinfop)\n", szFuncName); rc = dm_create_session(DM_NO_SESSION, (char *)INVALID_ADDR, &newsid); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ } /* * TEST : dm_create_session - NULL newsidp * EXPECTED: rc = -1, errno = EFAULT */ if (DMVAR_EXEC(CREATE_SESSION_BASE + 4)) { /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(NULL newsidp)\n", szFuncName); rc = dm_create_session(DM_NO_SESSION, szSessionInfo, NULL); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ } /* * TEST : dm_create_session - invalid newsidp * EXPECTED: rc = -1, errno = EFAULT */ if (DMVAR_EXEC(CREATE_SESSION_BASE + 5)) { /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid newsidp)\n", szFuncName); rc = dm_create_session(DM_NO_SESSION, szSessionInfo, (dm_sessid_t *)INVALID_ADDR); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ } /* * TEST : dm_create_session - DM_NO_SESSION oldsid * EXPECTED: rc = 0 */ if (DMVAR_EXEC(CREATE_SESSION_BASE + 6)) { dm_sessid_t newsid; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION oldsid)\n", szFuncName); rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); if (rc == 0) { DMLOG_PRINT(DMLVL_DEBUG, "newsid = %d\n", newsid); } DMVAR_ENDPASSEXP(szFuncName, 0, rc); /* Variation clean up */ rc = dm_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } /* * TEST : dm_create_session - valid oldsid * EXPECTED: rc = 0 */ if (DMVAR_EXEC(CREATE_SESSION_BASE + 7)) { dm_sessid_t newsid, oldsid; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { oldsid = newsid; /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(valid oldsid)\n", szFuncName); rc = dm_create_session(oldsid, szSessionInfo, &newsid); if (rc == 0) { DMLOG_PRINT(DMLVL_DEBUG, "newsid = %d\n", newsid); } DMVAR_ENDPASSEXP(szFuncName, 0, rc); /* Variation clean up */ rc = dm_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_create_session - invalidated oldsid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(CREATE_SESSION_BASE + 8)) { dm_sessid_t newsid, oldsid, delsid; /* Variation set up */ if ((rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid)) == -1) { /* No clean up */ } else if ((rc = dm_create_session(oldsid = newsid, szSessionInfo, &newsid)) == -1) { dm_destroy_session(oldsid); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); DMVAR_SKIP(); } else { delsid = newsid; /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated oldsid)\n", szFuncName); rc = dm_create_session(oldsid, szSessionInfo, &newsid); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ rc = dm_destroy_session(delsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_create_session - maximum sessinfo * EXPECTED: rc = 0 */ if (DMVAR_EXEC(CREATE_SESSION_BASE + 9)) { dm_sessid_t newsid; char *szBig = "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345"; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(max sessionfo)\n", szFuncName); rc = dm_create_session(DM_NO_SESSION, szBig, &newsid); if (rc == 0) { DMLOG_PRINT(DMLVL_DEBUG, "newsid = %d\n", newsid); } DMVAR_ENDPASSEXP(szFuncName, 0, rc); /* Variation clean up */ rc = dm_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } /* * TEST : dm_create_session - sessinfo too big * EXPECTED: rc = -1, errno = E2BIG * * This variation uncovered XFS BUG #1 (sessinfo simply truncated, API * passed) */ if (DMVAR_EXEC(CREATE_SESSION_BASE + 10)) { dm_sessid_t newsid; char *szTooBig = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456"; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(sessinfo too big)\n", szFuncName); rc = dm_create_session(DM_NO_SESSION, szTooBig, &newsid); DMVAR_ENDFAILEXP(szFuncName, -1, rc, E2BIG); /* Variation clean up */ } /* * TEST : dm_create_session - multiple sessions with same sessinfo * EXPECTED: rc = 0 */ if (DMVAR_EXEC(CREATE_SESSION_BASE + 11)) { dm_sessid_t newsid1, newsid2; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid1); 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(same sessinfo)\n", szFuncName); rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid2); if (rc == 0) { DMLOG_PRINT(DMLVL_DEBUG, "1st newsid = %d, 2nd newsid = %d\n", newsid1, newsid2); if (newsid1 != newsid2) { 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 session IDs same\n", szFuncName, 0); 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_destroy_session(newsid1); rc |= dm_destroy_session(newsid2); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } szFuncName = "dm_destroy_session"; /* * TEST : dm_destroy_session - DM_NO_SESSION sid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(DESTROY_SESSION_BASE + 1)) { /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n", szFuncName); rc = dm_destroy_session(DM_NO_SESSION); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ } /* * TEST : dm_destroy_session - invalid sid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(DESTROY_SESSION_BASE + 2)) { /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n", szFuncName); rc = dm_destroy_session(INVALID_ADDR); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ } /* * TEST : dm_destroy_session - invalidated sid * EXPECTED: rc = 0 */ if (DMVAR_EXEC(DESTROY_SESSION_BASE + 3)) { dm_sessid_t newsid; /* Variation set up */ if ((rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid)) != -1) { rc = dm_destroy_session(newsid); } 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(invalidated sid)\n", szFuncName); rc = dm_destroy_session(newsid); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ } } /* * TEST : dm_destroy_session - valid sid * EXPECTED: rc = 0 */ if (DMVAR_EXEC(DESTROY_SESSION_BASE + 4)) { dm_sessid_t newsid; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); 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(valid sid)\n", szFuncName); rc = dm_destroy_session(newsid); DMVAR_ENDPASSEXP(szFuncName, 0, rc); /* Variation clean up */ } } /* * TEST : dm_destroy_session - sid with oustanding events * EXPECTED: rc = -1, erno = EBUSY */ if (DMVAR_EXEC(DESTROY_SESSION_BASE + 5)) { dm_sessid_t newsid; char buf[MSG_DATALEN]; size_t rlen; /* Variation set up */ memcpy(buf, MSG_DATA, MSG_DATALEN); rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); rc |= dm_send_msg(newsid, DM_MSGTYPE_ASYNC, MSG_DATALEN, buf); 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(valid sid)\n", szFuncName); rc = dm_destroy_session(newsid); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBUSY); /* Variation clean up */ rc = dm_get_events(newsid, 1, 0, sizeof(dmMsgBuf), dmMsgBuf, &rlen); rc |= dm_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } szFuncName = "dm_getall_sessions"; /* * TEST : dm_getall_sessions - NULL sidbufp * EXPECTED: rc = -1, errno EFAULT */ if (DMVAR_EXEC(GETALL_SESSIONS_BASE + 1)) { dm_sessid_t newsid; int nelem; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); 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(NULL sidbufp)\n", szFuncName); rc = dm_getall_sessions(1, NULL, &nelem); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ rc = dm_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_getall_sessions - invalid sidbufp * EXPECTED: rc = -1, errno EFAULT */ if (DMVAR_EXEC(GETALL_SESSIONS_BASE + 2)) { dm_sessid_t newsid; int nelem; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); 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(invalid sidbufp)\n", szFuncName); rc = dm_getall_sessions(1, (dm_sessid_t *)INVALID_ADDR, &nelem); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ rc = dm_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_getall_sessions - NULL nelemp * EXPECTED: rc = -1, errno EFAULT */ if (DMVAR_EXEC(GETALL_SESSIONS_BASE + 3)) { dm_sessid_t newsid, sidArray[1]; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); 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(NULL nelemp)\n", szFuncName); rc = dm_getall_sessions(1, sidArray, NULL); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ rc = dm_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_getall_sessions - invalid nelemp * EXPECTED: rc = -1, errno EFAULT */ if (DMVAR_EXEC(GETALL_SESSIONS_BASE + 4)) { dm_sessid_t newsid, sidArray[1]; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); 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(invalid nelemp)\n", szFuncName); rc = dm_getall_sessions(1, sidArray, (u_int *)INVALID_ADDR); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ rc = dm_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_getall_sessions - zero nelem, zero sessions * EXPECTED: rc = 0 */ if (DMVAR_EXEC(GETALL_SESSIONS_BASE + 5)) { dm_sessid_t sidArray[1]; int nelem; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(zero nelem, zero sessions)\n", szFuncName); rc = dm_getall_sessions(0, sidArray, &nelem); if (rc == 0) { DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n", nelem); if (nelem == 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 nelem (%d vs %d)\n", szFuncName, 0, nelem, 0); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with unexpected rc = %d (errno = %d)\n", szFuncName, rc, errno); DMVAR_FAIL(); } /* Variation clean up */ } /* * TEST : dm_getall_sessions - zero nelem, one session * EXPECTED: rc = -1, errno = E2BIG */ if (DMVAR_EXEC(GETALL_SESSIONS_BASE + 6)) { dm_sessid_t newsid, sidArray[1]; int nelem; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); 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(zero nelem, one session)\n", szFuncName); rc = dm_getall_sessions(0, sidArray, &nelem); if (rc == -1) { if (errno == E2BIG) { DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n", nelem); if (nelem == 1) { 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 nelem (%d vs %d)\n", szFuncName, -1, E2BIG, nelem, 1); DMVAR_PASS(); } } 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 = dm_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_getall_sessions - one nelem, one session * EXPECTED: rc = 0 */ if (DMVAR_EXEC(GETALL_SESSIONS_BASE + 7)) { dm_sessid_t newsid, sidArray[1]; int nelem; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); 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(one nelem, one session)\n", szFuncName); rc = dm_getall_sessions(1, sidArray, &nelem); if (rc == 0) { DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n", nelem); if (nelem == 1) { LogSessions(sidArray, nelem); if (newsid == sidArray[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 and nelem = %d but unexpected session ID (%d vs %d)\n", szFuncName, 0, nelem, newsid, sidArray[0]); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with expected rc = %d but unexpected nelem (%d vs %d)\n", szFuncName, 0, nelem, 1); 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_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_getall_sessions - two nelem, one session * EXPECTED: rc = 0 */ if (DMVAR_EXEC(GETALL_SESSIONS_BASE + 8)) { dm_sessid_t newsid, sidArray[2]; int nelem; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); 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(two nelem, one session)\n", szFuncName); rc = dm_getall_sessions(2, sidArray, &nelem); if (rc == 0) { DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n", nelem); if (nelem == 1) { LogSessions(sidArray, nelem); if (newsid == sidArray[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 and nelem = %d but unexpected session ID (%d vs %d)\n", szFuncName, 0, nelem, newsid, sidArray[0]); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with expected rc = %d but unexpected nelem (%d vs %d)\n", szFuncName, 0, nelem, 1); 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_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_getall_sessions - ten nelem, eight sessions * EXPECTED: rc = 0 */ if (DMVAR_EXEC(GETALL_SESSIONS_BASE + 9)) { dm_sessid_t sidExpected[NUM_SESSIONS], sidArray[10]; int nelem; /* Variation set up */ for (i = 0, rc = 0; i < NUM_SESSIONS && rc == 0; i++) { rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &sidExpected[i]); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to set up variation! (errno = %d)\n", errno); for (i--; i >= 0; i--) { dm_destroy_session(sidExpected[i]); } DMVAR_SKIP(); } else { /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(%d nelem, %d sessions)\n", szFuncName, sizeof(sidArray)/sizeof(dm_sessid_t), NUM_SESSIONS); rc = dm_getall_sessions(sizeof(sidArray)/sizeof(dm_sessid_t), sidArray, &nelem); if (rc == 0) { DMLOG_PRINT(DMLVL_DEBUG, "nelem = %d\n", nelem); if (nelem == NUM_SESSIONS) { LogSessions(sidArray, nelem); if (memcmp(sidArray, sidExpected, NUM_SESSIONS * sizeof(dm_sessid_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 and nelem = %d but unexpected session ID(s)\n", szFuncName, 0, nelem); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with expected rc = %d but unexpected nelem (%d vs %d)\n", szFuncName, 0, nelem, NUM_SESSIONS); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with unexpected rc = %d (errno = %d)\n", szFuncName, rc, errno); DMVAR_FAIL(); } /* Variation clean up */ for (i = 0, rc = 0; i < NUM_SESSIONS; i++) { rc |= dm_destroy_session(sidExpected[i]); } if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } szFuncName = "dm_query_session"; /* * TEST : dm_query_session - DM_NO_SESSION sid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(QUERY_SESSION_BASE + 1)) { char buf[64]; size_t rlen; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(DM_NO_SESSION sid)\n", szFuncName); rc = dm_query_session(DM_NO_SESSION, sizeof(buf), buf, &rlen); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ } /* * TEST : dm_query_session - invalid sid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(QUERY_SESSION_BASE + 2)) { char buf[64]; size_t rlen; /* Variation set up */ /* Variation */ DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid sid)\n", szFuncName); rc = dm_query_session(INVALID_ADDR, sizeof(buf), buf, &rlen); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ } /* * TEST : dm_query_session - invalidated sid * EXPECTED: rc = -1, errno = EINVAL */ if (DMVAR_EXEC(QUERY_SESSION_BASE + 3)) { dm_sessid_t newsid; char buf[64]; size_t rlen; /* Variation set up */ if ((rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid)) != -1) { rc = dm_destroy_session(newsid); } 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(invalidated sid)\n", szFuncName); rc = dm_query_session(newsid, sizeof(buf), buf, &rlen); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL); /* Variation clean up */ } } /* * TEST : dm_query_session - NULL bufp * EXPECTED: rc = -1, errno EFAULT */ if (DMVAR_EXEC(QUERY_SESSION_BASE + 4)) { dm_sessid_t newsid; char buf[64]; size_t rlen; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); 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(NULL bufp)\n", szFuncName); rc = dm_query_session(newsid, sizeof(buf), NULL, &rlen); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ rc = dm_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_query_session - invalid bufp * EXPECTED: rc = -1, errno EFAULT */ if (DMVAR_EXEC(QUERY_SESSION_BASE + 5)) { dm_sessid_t newsid; char buf[64]; size_t rlen; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); 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(invalid bufp)\n", szFuncName); rc = dm_query_session(newsid, sizeof(buf), (void *)INVALID_ADDR, &rlen); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ rc = dm_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_query_session - NULL rlenp * EXPECTED: rc = -1, errno EFAULT */ if (DMVAR_EXEC(QUERY_SESSION_BASE + 6)) { dm_sessid_t newsid; char buf[64]; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); 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(NULL rlenp)\n", szFuncName); rc = dm_query_session(newsid, sizeof(buf), buf, NULL); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ rc = dm_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_query_session - invalid rlenp * EXPECTED: rc = -1, errno EFAULT */ if (DMVAR_EXEC(QUERY_SESSION_BASE + 7)) { dm_sessid_t newsid; char buf[64]; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); 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(invalid rlenp)\n", szFuncName); rc = dm_query_session(newsid, sizeof(buf), buf, (size_t *)INVALID_ADDR); DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT); /* Variation clean up */ rc = dm_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_query_session - zero buflen * EXPECTED: rc = -1, errno = E2BIG */ if (DMVAR_EXEC(QUERY_SESSION_BASE + 8)) { dm_sessid_t newsid; char buf[64]; size_t rlen; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); 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(buflen zero)\n", szFuncName); rc = dm_query_session(newsid, 0, buf, &rlen); if (rc == -1) { if (errno == E2BIG) { DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen); if (rlen == strlen(szSessionInfo)+1) { 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, strlen(szSessionInfo)+1); 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 = dm_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_query_session - valid * EXPECTED: rc = 0 */ if (DMVAR_EXEC(QUERY_SESSION_BASE + 9)) { dm_sessid_t newsid; char buf[64]; size_t rlen; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szSessionInfo, &newsid); 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(valid)\n", szFuncName, sizeof(buf)); rc = dm_query_session(newsid, sizeof(buf), buf, &rlen); if (rc == 0) { DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen); if (rlen == strlen(szSessionInfo)+1) { DMLOG_PRINT(DMLVL_DEBUG, "buf = \"%s\"\n", buf); if (strcmp(buf, szSessionInfo) == 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 and rlen = %d but unexpected session info (\"%s\" vs \"%s\")\n", szFuncName, 0, rlen, buf, szSessionInfo); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with expected rc = %d but unexpected rlen (%d vs %d)\n", szFuncName, 0, rlen, strlen(szSessionInfo)+1); 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_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } /* * TEST : dm_query_session - maximum sessionfo * sessioninfo * EXPECTED: rc = 0 */ if (DMVAR_EXEC(QUERY_SESSION_BASE + 10)) { dm_sessid_t newsid; char buf[512]; size_t rlen; char *szBig = "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345"; /* Variation set up */ rc = dm_create_session(DM_NO_SESSION, szBig, &newsid); 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(max sessinfo)\n", szFuncName, sizeof(buf)); rc = dm_query_session(newsid, sizeof(buf), buf, &rlen); if (rc == 0) { DMLOG_PRINT(DMLVL_DEBUG, "rlen = %d\n", rlen); if (rlen == DM_SESSION_INFO_LEN) { DMLOG_PRINT(DMLVL_DEBUG, "buf = \"%s\"\n", buf); if (strncmp(buf, szBig, DM_SESSION_INFO_LEN-1) == 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 and rlen = %d but unexpected session info (\"%s\" vs \"%s\")\n", szFuncName, 0, rlen, buf, szSessionInfo); DMVAR_FAIL(); } } else { DMLOG_PRINT(DMLVL_ERR, "%s failed with expected rc = %d but unexpected rlen (%d vs %d)\n", szFuncName, 0, rlen, DM_SESSION_INFO_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 = dm_destroy_session(newsid); if (rc == -1) { DMLOG_PRINT(DMLVL_DEBUG, "Unable to clean up variation! (errno = %d)\n", errno); } } } DMLOG_STOP(); return 0; }
extern void find_test_session( dm_sessid_t *session) { char buffer[DM_SESSION_INFO_LEN]; dm_sessid_t *sidbuf = NULL; dm_sessid_t new_session; u_int allocelem = 0; u_int nelem; size_t rlen; int error; u_int i; /* Retrieve the list of all active sessions on the host. */ nelem = 100; /* a reasonable first guess */ do { if (allocelem < nelem) { allocelem = nelem; sidbuf = realloc(sidbuf, nelem * sizeof(*sidbuf)); if (sidbuf == NULL) { fprintf(stderr, "realloc of %d bytes failed\n", nelem * sizeof(*sidbuf)); exit(1); } } error = dm_getall_sessions(allocelem, sidbuf, &nelem); } while (error < 0 && errno == E2BIG); /* If an error occurred, translate it into something meaningful. */ if (error < 0) { fprintf(stderr, "unexpected dm_getall_sessions failure, %s\n", strerror(errno)); free(sidbuf); exit(1); } /* We have the list of all active sessions. Scan the list looking for an existing "test" session that we can use. The list must first be sorted in case other processes happen to be creating test sessions at the same time; we need to make sure that we pick the one with the lowest session ID. */ qsort(sidbuf, nelem, sizeof(sidbuf[0]), session_compare); for (i = 0; i < nelem; i++) { error = dm_query_session(sidbuf[i], sizeof(buffer), buffer, &rlen); if (error < 0) { fprintf(stderr, "unexpected dm_query_session " "failure, %s\n", strerror(errno)); free(sidbuf); exit(1); } if (!strncmp(buffer, TEST_MSG, strlen(TEST_MSG))) break; } if (i < nelem) { *session = (dm_sessid_t)sidbuf[i]; free(sidbuf); return; } /* No test session exists, so we have to create one ourselves. */ if (dm_create_session(DM_NO_SESSION, TEST_MSG, &new_session) != 0) { fprintf(stderr, "dm_create_session failed, %s\n", strerror(errno)); free(sidbuf); exit(1); } /* Now re-retrieve the list of active sessions. */ do { if (allocelem < nelem) { allocelem = nelem; sidbuf = realloc(sidbuf, nelem * sizeof(*sidbuf)); if (sidbuf == NULL) { fprintf(stderr, "realloc of %d bytes failed\n", nelem * sizeof(*sidbuf)); exit(1); } } error = dm_getall_sessions(allocelem, sidbuf, &nelem); } while (error < 0 && errno == E2BIG); if (error < 0) { fprintf(stderr, "dm_getall_sessions failed, %s\n", strerror(errno)); free(sidbuf); exit(1); } /* Sort the session ID list into ascending ID order, then find the test session with the lowest session ID. We better find at least one since we created one! */ qsort(sidbuf, nelem, sizeof(sidbuf[0]), session_compare); for (i = 0; i < nelem; i++) { error = dm_query_session(sidbuf[i], sizeof(buffer), buffer, &rlen); if (error < 0) { fprintf(stderr, "dm_query_session failed, %s\n", strerror(errno)); free(sidbuf); exit(1); } if (!strncmp(buffer, TEST_MSG, strlen(TEST_MSG))) break; } if (i == nelem) { fprintf(stderr, "can't find the session we created\n"); free(sidbuf); exit(1); } *session = (dm_sessid_t)sidbuf[i]; free(sidbuf); /* If the session we are going to use is not the one we created, then we need to get rid of the created one. */ if (*session != new_session) { if ((new_session) != 0) { fprintf(stderr, "dm_destroy_session failed, %s\n", strerror(errno)); exit(1); } } }
/* Initialise DMAPI session. The session is persistant kernel state, so it might already exist, in which case we merely want to reconnect to it. This function should be called as root. */ static int dmapi_init_session(struct smbd_dmapi_context *ctx) { char buf[DM_SESSION_INFO_LEN]; size_t buflen; uint nsessions = 5; dm_sessid_t *sessions = NULL; char *version; char *session_name; TALLOC_CTX *tmp_ctx = talloc_new(NULL); int i, err; if (ctx->session_num == 0) { session_name = talloc_strdup(tmp_ctx, DMAPI_SESSION_NAME); } else { session_name = talloc_asprintf(tmp_ctx, "%s%u", DMAPI_SESSION_NAME, ctx->session_num); } if (session_name == NULL) { DEBUG(0,("Out of memory in dmapi_init_session\n")); talloc_free(tmp_ctx); return -1; } if (dm_init_service(&version) < 0) { DEBUG(0, ("dm_init_service failed - disabling DMAPI\n")); talloc_free(tmp_ctx); return -1; } ZERO_STRUCT(buf); /* Fetch kernel DMAPI sessions until we get any of them */ do { dm_sessid_t *new_sessions; nsessions *= 2; new_sessions = TALLOC_REALLOC_ARRAY(tmp_ctx, sessions, dm_sessid_t, nsessions); if (new_sessions == NULL) { talloc_free(tmp_ctx); return -1; } sessions = new_sessions; err = dm_getall_sessions(nsessions, sessions, &nsessions); } while (err == -1 && errno == E2BIG); if (err == -1) { DEBUGADD(DMAPI_TRACE, ("failed to retrieve DMAPI sessions: %s\n", strerror(errno))); talloc_free(tmp_ctx); return -1; } /* Look through existing kernel DMAPI sessions to find out ours */ for (i = 0; i < nsessions; ++i) { err = dm_query_session(sessions[i], sizeof(buf), buf, &buflen); buf[sizeof(buf) - 1] = '\0'; if (err == 0 && strcmp(session_name, buf) == 0) { ctx->session = sessions[i]; DEBUGADD(DMAPI_TRACE, ("attached to existing DMAPI session " "named '%s'\n", buf)); break; } } /* No session already defined. */ if (ctx->session == DM_NO_SESSION) { err = dm_create_session(DM_NO_SESSION, session_name, &ctx->session); if (err < 0) { DEBUGADD(DMAPI_TRACE, ("failed to create new DMAPI session: %s\n", strerror(errno))); ctx->session = DM_NO_SESSION; talloc_free(tmp_ctx); return -1; } DEBUG(0, ("created new DMAPI session named '%s' for %s\n", session_name, version)); } if (ctx->session != DM_NO_SESSION) { set_effective_capability(DMAPI_ACCESS_CAPABILITY); } /* Note that we never end the DMAPI session. It gets re-used if possiblie. DMAPI session is a kernel resource that is usually lives until server reboot and doesn't get destroed when an application finishes. However, we free list of references to DMAPI sessions we've got from the kernel as it is not needed anymore once we have found (or created) our session. */ talloc_free(tmp_ctx); 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; }
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); }
void migin_exit(int x) { dm_sessid_t *sidbuf, *sid; void *infobuf; char *cp; u_int nsessions, nret; int i, found, error; size_t buflen, retlen; sidbuf = NULL; infobuf = NULL; /* * We could try and kill off all our kids, but we're not * 'Mr. Mean', so we just wait for them to die. */ err_msg("%s: waiting for all children to die...", Progname); while (wait3((int *)0, WNOHANG, (struct rusage *)0) > 0) ; fprintf(stdout, "\n"); /* * Now search for our session and try and shut it down. We * could just as easily make the session ID a global, but * this demonstrates how sessions can be queried */ nsessions = 4; sidbuf = (dm_sessid_t *)malloc(nsessions * sizeof(dm_sessid_t)); if (sidbuf == NULL) { err_msg("Can't alloc mem to shut down session"); goto out; } error = dm_getall_sessions(nsessions, sidbuf, &nret); if (error == -1) { if (errno != E2BIG) { errno_msg("Can't get list of active sessions"); goto out; } free(sidbuf); nsessions = nret; sidbuf = (dm_sessid_t *)malloc(nsessions * sizeof(dm_sessid_t)); if (sidbuf == NULL) { err_msg("Can't alloc mem to shut down session"); goto out; } error = dm_getall_sessions(nsessions, sidbuf, &nret); if (error == -1) { errno_msg("Can't get list of active sessions"); goto out; } } /* * Now we have all the active sessions in our system. * Query each one until we find ourselves. */ sid = sidbuf; buflen = DM_SESSION_INFO_LEN; infobuf = malloc(buflen); if (infobuf == NULL) { err_msg("Can't alloc memory for session info buffer"); goto out; } /* * When we registered our session, we just hammered the last component * of the path name, so that's all we look for here. This prevents * mismatches when running at ./migin or some other such foo */ cp = strrchr(Progname, '/'); if (cp) cp++; else cp = Progname; found = 0; for (i=0; i<nret; i++) { error = dm_query_session(*sid, buflen, infobuf, &retlen); if (error == -1) continue; /* We just punt on errors */ if (strstr(infobuf, cp)) { found = 1; break; } sid++; } /* * XXXX FIXME XXX * * Should do a set_disp to 0 and then drain the session * queue as well. On the SGI, we'll need to make the * filesystem handle global so that we can get at it */ if (!found) { err_msg("Can't find session to shut down"); goto out; } error = dm_destroy_session(*sid); if (error == -1) { errno_msg("Can't shut down session"); } out: if (infobuf) free(infobuf); if (sidbuf) free(sidbuf); exit(0); }
// try to assume or create session void find_session() { char buffer[DM_SESSION_INFO_LEN]; dm_sessid_t *sidbuf; dm_sessid_t new_session; u_int allocelem; u_int nelem; size_t rlen; int error; u_int i; start_seek: sidbuf = NULL; allocelem = 0; // Retrieve the list of all active sessions nelem = 100; do { if (allocelem < nelem) { allocelem = nelem; sidbuf = realloc(sidbuf, nelem * sizeof(*sidbuf)); if (sidbuf == NULL) { fprintf(stderr, "realloc of %d bytes failed\n", (int)(nelem * sizeof(*sidbuf))); exit(1); } } error = dm_getall_sessions(allocelem, sidbuf, &nelem); } while (error < 0 && errno == E2BIG); if (error < 0) { fprintf(stderr, "unexpected dm_getall_sessions failure, %s\n", strerror(errno)); free(sidbuf); exit(1); } // check if yamss recall session exists, if yes try to assume it for (i = 0; i < nelem; i++) { error = dm_query_session(sidbuf[i], sizeof(buffer), buffer, &rlen); if (error < 0) { fprintf(stderr, "unexpected dm_query_session failure, %s\n", strerror(errno)); free(sidbuf); exit(1); } if (!strncmp(buffer, DMAPI_SESSION_NAME, strlen(DMAPI_SESSION_NAME))) break; } if (i < nelem) { // session exists if(Verbose) fprintf(stderr, "Session %s alredy existing, try to assume it\n",DMAPI_SESSION_NAME); sid = (dm_sessid_t)sidbuf[i]; if (dm_create_session(sid, DMAPI_SESSION_NAME, &new_session) != 0) { if(errno==EEXIST) { if(Verbose) fprintf(stderr, "Session %s cannot be assumed, sleep %d seconds and retry\n",DMAPI_SESSION_NAME,DMAPI_YAMSS_SLEEP_TIME); free(sidbuf); sleep(DMAPI_YAMSS_SLEEP_TIME); goto start_seek; } fprintf(stderr, "dm_create_session failed, %s\n", strerror(errno)); free(sidbuf); exit(1); } else { printf("Session %s assumed\n",DMAPI_SESSION_NAME); free(sidbuf); return; } } // the session did not exist, create it if (dm_create_session(DM_NO_SESSION, DMAPI_SESSION_NAME, &new_session) != 0) { fprintf(stderr, "dm_create_session failed, %s\n", strerror(errno)); free(sidbuf); exit(1); } printf("Session %s created\n",DMAPI_SESSION_NAME); // retrieve again the list of sessions to check if there are multiple ones // managing the case where two or more nodes by chance created a new // session at the same time do { if (allocelem < nelem) { allocelem = nelem; sidbuf = realloc(sidbuf, nelem * sizeof(*sidbuf)); if (sidbuf == NULL) { fprintf(stderr, "realloc of %d bytes failed\n", (int)(nelem * sizeof(*sidbuf))); exit(1); } } error = dm_getall_sessions(allocelem, sidbuf, &nelem); } while (error < 0 && errno == E2BIG); if (error < 0) { fprintf(stderr, "dm_getall_sessions failed, %s\n", strerror(errno)); free(sidbuf); exit(1); } // sort sessions looking for the lowest id qsort(sidbuf, nelem, sizeof(sidbuf[0]), session_compare); for (i = 0; i < nelem; i++) { error = dm_query_session(sidbuf[i], sizeof(buffer), buffer, &rlen); if (error < 0) { fprintf(stderr, "dm_query_session failed, %s\n", strerror(errno)); free(sidbuf); exit(1); } if (!strncmp(buffer, DMAPI_SESSION_NAME, strlen(DMAPI_SESSION_NAME))) break; } if (i == nelem) { fprintf(stderr, "can't find the session we created\n"); free(sidbuf); exit(1); } sid = (dm_sessid_t)sidbuf[i]; free(sidbuf); // if the session is not our one, destroy it if (sid != new_session) { printf("Duplicate %s session found, destroying our one, sleep %d seconds and retry\n",DMAPI_SESSION_NAME,DMAPI_YAMSS_SLEEP_TIME); if (dm_destroy_session(new_session)) { fprintf(stderr, "dm_destroy_session failed, %s\n", strerror(errno)); exit(1); } sleep(DMAPI_YAMSS_SLEEP_TIME); goto start_seek; } }
/* Initialise DMAPI session. The session is persistant kernel state, so it might already exist, in which case we merely want to reconnect to it. This function should be called as root. */ static int dmapi_init_session(void) { char buf[DM_SESSION_INFO_LEN]; size_t buflen; uint nsessions = 5; dm_sessid_t *sessions = NULL; int i, err; char *version; if (dm_init_service(&version) < 0) { DEBUG(0,("dm_init_service failed - disabling DMAPI\n")); return -1; } ZERO_STRUCT(buf); do { dm_sessid_t *new_sessions; nsessions *= 2; new_sessions = TALLOC_REALLOC_ARRAY(NULL, sessions, dm_sessid_t, nsessions); if (new_sessions == NULL) { talloc_free(sessions); return -1; } sessions = new_sessions; err = dm_getall_sessions(nsessions, sessions, &nsessions); } while (err == -1 && errno == E2BIG); if (err == -1) { DEBUGADD(DMAPI_TRACE, ("failed to retrieve DMAPI sessions: %s\n", strerror(errno))); talloc_free(sessions); return -1; } for (i = 0; i < nsessions; ++i) { err = dm_query_session(sessions[i], sizeof(buf), buf, &buflen); buf[sizeof(buf) - 1] = '\0'; if (err == 0 && strcmp(DMAPI_SESSION_NAME, buf) == 0) { samba_dmapi_session = sessions[i]; DEBUGADD(DMAPI_TRACE, ("attached to existing DMAPI session " "named '%s'\n", buf)); break; } } talloc_free(sessions); /* No session already defined. */ if (samba_dmapi_session == DM_NO_SESSION) { err = dm_create_session(DM_NO_SESSION, DMAPI_SESSION_NAME, &samba_dmapi_session); if (err < 0) { DEBUGADD(DMAPI_TRACE, ("failed to create new DMAPI session: %s\n", strerror(errno))); samba_dmapi_session = DM_NO_SESSION; return -1; } DEBUG(0,("created new DMAPI session named '%s' for %s\n", DMAPI_SESSION_NAME, version)); } if (samba_dmapi_session != DM_NO_SESSION) { set_effective_capability(DMAPI_ACCESS_CAPABILITY); } /* Note that we never end the DMAPI session. It gets re-used if possible */ return 0; }