示例#1
0
static void
pkcs11_daemon_cleanup (gpointer unused)
{
	CK_RV rv;

	g_assert (pkcs11_roof);

	gkd_ssh_agent_uninitialize ();
	gkm_rpc_layer_uninitialize ();
	gkd_gpg_agent_uninitialize ();
	rv = (pkcs11_roof->C_Finalize) (NULL);

	if (rv != CKR_OK)
		g_warning ("couldn't finalize internal PKCS#11 stack (code: %d)", (gint)rv);

	pkcs11_roof = NULL;
}
int
main (int argc, char *argv[])
{
	CK_C_GetFunctionList func_get_list;
	CK_FUNCTION_LIST_PTR funcs;
	void *module;
	fd_set read_fds;
	int sock, ret;
	CK_RV rv;

	/* The module to load is the argument */
	if (argc != 2)
		usage();

	/* Load the library */
	module = dlopen(argv[1], RTLD_NOW);
	if(!module) {
		fprintf (stderr, "couldn't open library: %s: %s\n", argv[1], dlerror());
		exit (1);
	}

	/* Lookup the appropriate function in library */
	func_get_list = (CK_C_GetFunctionList)dlsym (module, "C_GetFunctionList");
	if (!func_get_list) {
		fprintf (stderr, "couldn't find C_GetFunctionList in library: %s: %s\n", argv[1], dlerror());
		exit (1);
	}

	/* Get the function list */
	rv = (func_get_list) (&funcs);
	if (rv != CKR_OK || !funcs) {
		fprintf (stderr, "couldn't get function list from C_GetFunctionList in libary: %s: 0x%08x\n",
		         argv[1], (int)rv);
		exit (1);
	}

	/* RPC layer expects initialized module */
	rv = (funcs->C_Initialize) (&p11_init_args);
	if (rv != CKR_OK) {
		fprintf (stderr, "couldn't initialize module: %s: 0x%08x\n", argv[1], (int)rv);
		exit (1);
	}

	gkm_rpc_layer_initialize (funcs);
	sock = gkm_rpc_layer_startup (SOCKET_PATH);
	if (sock == -1)
		exit (1);

	is_running = 1;
	while (is_running) {
		FD_ZERO (&read_fds);
		FD_SET (sock, &read_fds);
		ret = select (sock + 1, &read_fds, NULL, NULL, NULL);
		if (ret < 0) {
			if (errno == EINTR)
				continue;
			fprintf (stderr, "error watching socket: %s\n", strerror (errno));
			exit (1);
		}

		if (FD_ISSET (sock, &read_fds))
			gkm_rpc_layer_accept ();
	}

	gkm_rpc_layer_shutdown ();
	gkm_rpc_layer_uninitialize ();

	rv = (funcs->C_Finalize) (NULL);
	if (rv != CKR_OK)
		fprintf (stderr, "couldn't finalize module: %s: 0x%08x\n", argv[1], (int)rv);

	dlclose(module);

	return 0;
}