]> granicus.if.org Git - p11-kit/commitdiff
remote: Add API to serve a token
authorDaiki Ueno <dueno@redhat.com>
Sun, 25 Dec 2016 02:03:47 +0000 (11:03 +0900)
committerDaiki Ueno <ueno@gnu.org>
Fri, 17 Feb 2017 09:25:55 +0000 (10:25 +0100)
doc/manual/p11-kit-sections.txt
p11-kit/remote.h
p11-kit/rpc-server.c

index 386b97e4ef22e6d11167649c6654820985e17da6..a1fdeb5e1396a08438461eabaff53d3ba643974b 100644 (file)
@@ -138,6 +138,7 @@ p11_kit_iter_free
 P11KitIterKind
 P11KitIterBehavior
 p11_kit_remote_serve_module
+p11_kit_remote_serve_token
 </SECTION>
 
 <SECTION>
index 12cbe6d452257c67d9b5185d4afcc9f9d7466e24..899f0706d4a1173da8bca3923b5672fac38f7e19 100644 (file)
@@ -47,6 +47,11 @@ int                    p11_kit_remote_serve_module          (CK_FUNCTION_LIST *m
                                                             int in_fd,
                                                             int out_fd);
 
+int                   p11_kit_remote_serve_token           (CK_FUNCTION_LIST *module,
+                                                            CK_TOKEN_INFO *token,
+                                                            int in_fd,
+                                                            int out_fd);
+
 #endif
 
 #ifdef __cplusplus
index 5da53bf636d2574a9c6b29c0134aca623bc1ab7e..58241571a2829366cd91b055b06f2ccec932bff5 100644 (file)
@@ -37,6 +37,7 @@
 
 #define P11_DEBUG_FLAG P11_DEBUG_RPC
 #include "debug.h"
+#include "filter.h"
 #include "pkcs11.h"
 #include "library.h"
 #include "private.h"
@@ -2015,3 +2016,39 @@ out:
 
        return ret;
 }
+
+int
+p11_kit_remote_serve_token (CK_FUNCTION_LIST *module,
+                           CK_TOKEN_INFO *token,
+                           int in_fd,
+                           int out_fd)
+{
+       p11_virtual virt;
+       p11_virtual *filter = NULL;
+       CK_FUNCTION_LIST *filtered = NULL;
+       int ret = 1;
+
+       return_val_if_fail (module != NULL, 1);
+       return_val_if_fail (token != NULL, 1);
+
+       p11_virtual_init (&virt, &p11_virtual_base, module, NULL);
+       filter = p11_filter_subclass (&virt, NULL);
+       if (filter == NULL)
+               goto out;
+
+       filtered = p11_virtual_wrap (filter, (p11_destroyer)p11_virtual_uninit);
+       if (filtered == NULL)
+               goto out;
+
+       p11_filter_allow_token (filter, token);
+
+       ret = p11_kit_remote_serve_module (filtered, in_fd, out_fd);
+
+ out:
+       if (filtered != NULL)
+               p11_virtual_unwrap (filtered);
+       if (filter != NULL)
+               p11_filter_release (filter);
+
+       return ret;
+}