Example #1
0
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.");

	}