/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* gkm-rpc-daemon-standalone.c - A sample daemon.
Copyright (C) 2008, Stef Walter
The Gnome Keyring Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The Gnome Keyring Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the Gnome Library; see the file COPYING.LIB. If not,
.
Author: Stef Walter
*/
#include "config.h"
#include "pkcs11/pkcs11.h"
#include "gkm-rpc-layer.h"
#include
#include
#include
#include
#include
#include
#include
#define SOCKET_PATH "/tmp/gkm-rpc-daemon.sock"
/* Sample configuration for loading NSS remotely */
static CK_C_INITIALIZE_ARGS p11_init_args = {
NULL,
NULL,
NULL,
NULL,
CKF_OS_LOCKING_OK,
"init-string = configdir='/tmp' certPrefix='' keyPrefix='' secmod='/tmp/secmod.db' flags="
};
static int is_running = 1;
static int
usage (void)
{
fprintf (stderr, "usage: gkm-rpc-daemon pkcs11-module\n");
exit (2);
}
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;
}