示例#1
0
static void *
get_oodfunc(void)
{
    char *lib;

    lib = getenv("MAKEOODLIB");

    if (lib && *lib) {
	int (*oodptr) (const char *);

#ifdef	_WIN32
	HINSTANCE hinstLib = LoadLibrary(lib);
	if (!hinstLib)
	    dlfailure();

	*(void **)(&oodptr) = GetProcAddress(hinstLib, "oodfunc");
	if (!oodptr)
	    dlfailure();
#else	/*_WIN32*/
	// RTLD_LOCAL doesn't work on OSX 10.3 but GLOBAL is fine ...
	void *dlhandle = dlopen(lib, RTLD_GLOBAL | RTLD_LAZY);
	if (!dlhandle)
	    dlfailure();

	*(void **)(&oodptr) = dlsym(dlhandle, "oodfunc");
	if (!oodptr)
	    dlfailure();
#endif	/*_WIN32*/

	return oodptr;
    } else {
	return &oodfunc_date;
    }
}
int
pam_prompt(pam_handle_t *pamh, int style, const char *prompt, char **user_msg)
{
	void *openpam = dlopen(libopenpam, RTLD_LOCAL | RTLD_LAZY | RTLD_FIRST);
	if (NULL == openpam) dlfailure("pam_prompt");
	pam_prompt_func func = dlsym(openpam, "pam_prompt");
	if (NULL == func) dlfailure("pam_prompt");
	return xlate_pam_shim_retval(func(pamh, style, user_msg, "%s", prompt));
}
int
pam_get_pass(pam_handle_t *pamh, const char **passp, const char *prompt, __unused int options)
{
	void *openpam = dlopen(libopenpam, RTLD_LOCAL | RTLD_LAZY | RTLD_FIRST);
	if (NULL == openpam) dlfailure("pam_get_pass");
	pam_get_pass_func func = dlsym(openpam, "pam_get_authtok");
	if (NULL == func) dlfailure("pam_get_authtok");
	return xlate_pam_shim_retval(func(pamh, PAM_AUTHTOK, passp, prompt));
}
int
aliased_pam_set_data(pam_handle_t *pamh, const char *modue_data_name, void *data, pam_set_data_cleanup_func cleanup)
{
	void *openpam = dlopen(libopenpam, RTLD_LOCAL | RTLD_LAZY | RTLD_FIRST);
	if (NULL == openpam) dlfailure("pam_set_data");
	pam_set_data_func func = dlsym(openpam, "pam_set_data");
	if (NULL == func) dlfailure("pam_set_data");
	return xlate_pam_shim_retval(func(pamh, modue_data_name, data, cleanup));
}
int
aliased_pam_get_user(pam_handle_t *pamh, char **user, const char *prompt)
{
	void *openpam = dlopen(libopenpam, RTLD_LOCAL | RTLD_LAZY | RTLD_FIRST);
	if (NULL == openpam) dlfailure("pam_get_user");
	pam_get_user_func func = dlsym(openpam, "pam_get_user");
	if (NULL == func) dlfailure("pam_get_user");
	return xlate_pam_shim_retval(func(pamh, user, prompt));
}
int
pam_putenv(pam_handle_t *pamh, const char *name_value)
{
	void *openpam = dlopen(libopenpam, RTLD_LOCAL | RTLD_LAZY | RTLD_FIRST);
	if (NULL == openpam) dlfailure("pam_putenv");
	pam_putenv_func func = dlsym(openpam, "pam_putenv");
	if (NULL == func) dlfailure("pam_putenv");
	return xlate_pam_shim_retval(func(pamh, name_value));
}
const char *
pam_getenv(pam_handle_t *pamh, const char *name)
{
	void *openpam = dlopen(libopenpam, RTLD_LOCAL | RTLD_LAZY | RTLD_FIRST);
	if (NULL == openpam) dlfailure("pam_getenv");
	pam_getenv_func func = dlsym(openpam, "pam_getenv");
	if (NULL == func) dlfailure("pam_getenv");
	return func(pamh, name);
}
int
misc_conv(int num_msg, const struct pam_message **msgm, struct pam_response **response, void *appdata_ptr)
{
	void *openpam = dlopen(libopenpam, RTLD_LOCAL | RTLD_LAZY | RTLD_FIRST);
	if (NULL == openpam) dlfailure("misc_conv");
	misc_conv_func func = dlsym(openpam, "openpam_ttyconv");
	if (NULL == func) dlfailure("misc_conv");
	return xlate_pam_shim_retval(func(num_msg, msgm, response, appdata_ptr));
}
const char *
pam_strerror(const pam_handle_t *pamh, int pam_error)
{
	void *openpam = dlopen(libopenpam, RTLD_LOCAL | RTLD_LAZY | RTLD_FIRST);
	if (NULL == openpam) dlfailure("pam_strerror");
	pam_strerr_func func = dlsym(openpam, "pam_strerror");
	if (NULL == func) dlfailure("pam_strerror");
	return func(pamh, pam_error);
}
int
pam_end(pam_handle_t *pamh, int pam_status)
{
	void *openpam = dlopen(libopenpam, RTLD_LOCAL | RTLD_LAZY | RTLD_FIRST);
	if (NULL == openpam) dlfailure("pam_end");
	pam_end_func func = dlsym(openpam, "pam_end");
	if (NULL == func) dlfailure("pam_end");
	return xlate_pam_shim_retval(func(pamh, pam_status));
}
int
pam_start(const char *service_name, const char *user, const struct pam_conv *pam_conversation, pam_handle_t **pamh)
{
	void *openpam = dlopen(libopenpam, RTLD_LOCAL | RTLD_LAZY | RTLD_FIRST);
	if (NULL == openpam) dlfailure("pam_start");
	pam_start_func func = dlsym(openpam, "pam_start");
	if (NULL == func) dlfailure("pam_start");
	return xlate_pam_shim_retval(func(service_name, user, pam_conversation, pamh));
}
int
pam_get_item(const pam_handle_t *pamh, int item_type, const void **item)
{
	int newitemtype = xlate_pam_shim_item_type(item_type);
	void *openpam = dlopen(libopenpam, RTLD_LOCAL | RTLD_LAZY | RTLD_FIRST);
	if (NULL == openpam) dlfailure("pam_get_item");
	pam_get_item_func func = dlsym(openpam, "pam_get_item");
	if (NULL == func) dlfailure("pam_get_item");
	return xlate_pam_shim_retval(func(pamh, newitemtype, item));
}
int
pam_close_session(pam_handle_t *pamh, int flags)
{
	int newflags = xlate_pam_shim_session_flags(flags);
	void *openpam = dlopen(libopenpam, RTLD_LOCAL | RTLD_LAZY | RTLD_FIRST);
	if (NULL == openpam) dlfailure("pam_close_session");
	pam_close_session_func func = dlsym(openpam, "pam_close_session");
	if (NULL == func) dlfailure("pam_close_session");
	return xlate_pam_shim_retval(func(pamh, newflags));
}
int
pam_acct_mgmt(pam_handle_t *pamh, int flags)
{
	int newflags = xlate_pam_shim_authenticate_flags(flags);
	void *openpam = dlopen(libopenpam, RTLD_LOCAL | RTLD_LAZY | RTLD_FIRST);
	if (NULL == openpam) dlfailure("pam_acct_mgmt");
	pam_acct_mgmt_func func = dlsym(openpam, "pam_acct_mgmt");
	if (NULL == func) dlfailure("pam_acct_mgmt");
	return xlate_pam_shim_retval(func(pamh, newflags));
}