const char * pam_getenv(pam_handle_t *pamh, const char *name) { char *str; int i; ENTERS(name); if (pamh == NULL) RETURNS(NULL); if (name == NULL || strchr(name, '=') != NULL) RETURNS(NULL); if ((i = openpam_findenv(pamh, name, strlen(name))) < 0) RETURNS(NULL); for (str = pamh->env[i]; *str != '\0'; ++str) { if (*str == '=') { ++str; break; } } RETURNS(str); }
const char * openpam_get_option(pam_handle_t *pamh, const char *option) { pam_chain_t *cur; size_t len; int i; ENTERS(option); if (pamh == NULL || pamh->current == NULL || option == NULL) RETURNS(NULL); cur = pamh->current; len = strlen(option); for (i = 0; i < cur->optc; ++i) { if (strncmp(cur->optv[i], option, len) == 0) { if (cur->optv[i][len] == '\0') RETURNS(&cur->optv[i][len]); else if (cur->optv[i][len] == '=') RETURNS(&cur->optv[i][len + 1]); } } RETURNS(NULL); }
TESTCASE() { MAX_WAIT_TIME(0); FUNCT(bounded_buf_get); FUNCT(bounded_buf_put); TVAR(P1); TVAR(C1); TVAR(C2); WAIT_FOR_THREAD(P1, ENTERS(bounded_buf_put), "Wait for a producer."); WAIT_FOR_DISTINCT_THREADS((C1, C2), ENTERS(bounded_buf_get), "Wait for 2 consumers."); RUN_THREAD_THROUGH(P1, RETURNS(bounded_buf_put), "Producer inserts an item."); RUN_THREAD_THROUGH(C1, HITS_MANUAL_PC(42), "First consumer runs first phase."); RUN_THREAD_THROUGH(C2, RETURNS(bounded_buf_get), "Second consumer removes the item."); // ERROR! RUN_THREAD_THROUGH(C1, ENDS(), "First consumer runs the second phase."); }