[Pvfs2-cvs] commit by nlmills in pvfs2/src/client/sysint: sys-getcred.sm

CVS commit program cvs at parl.clemson.edu
Thu Dec 4 10:18:22 EST 2008


Update of /anoncvs/pvfs2/src/client/sysint
In directory parlweb1:/tmp/cvs-serv3690/src/client/sysint

Modified Files:
      Tag: cu-security-branch
	sys-getcred.sm 
Log Message:
completed getcred client state machine


Index: sys-getcred.sm
===================================================================
RCS file: /anoncvs/pvfs2/src/client/sysint/Attic/sys-getcred.sm,v
diff -p -u -r1.1.2.1 -r1.1.2.2
--- sys-getcred.sm	4 Dec 2008 04:40:43 -0000	1.1.2.1
+++ sys-getcred.sm	4 Dec 2008 15:18:22 -0000	1.1.2.2
@@ -16,25 +16,44 @@
 #include "gossip.h"
 #include "pint-util.h"
 #include "pvfs2-internal.h"
-/* TODO: include security stuff */
+#include "security-util.h"
 
 extern job_context_id pint_client_sm_context;
 
+static int getcred_comp_fn(void *v_p, struct PVFS_server_resp *resp_p, 
+                           int index);
+
 %%
 
 machine pvfs2_client_getcred_sm
 {
-    /* TODO: replace with real states */
-    state entry
+    state setup_msgpair
+    {
+        run getcred_setup_msgpair;
+        success => xfer_msgpair;
+        default => cleanup;
+    }
+
+    state xfer_msgpair
+    {
+        jump pvfs2_msgpairarray_sm;
+        success => cleanup;
+    }
+
+    state cleanup
     {
-        run getcred_entry;
+        run getcred_cleanup;
         default => terminate;
     }
 }
 
 %%
 
-PVFS_error PVFS_isys_getcred(const char *certificate,
+PVFS_error PVFS_isys_getcred(PVFS_fs_id fs_id,
+                             const char *certificate,
+                             const PVFS_sig signature,
+                             uint32_t sig_size,
+                             PVFS_BMI_addr_t addr,
                              PVFS_sysresp_getcred *resp_p,
                              PVFS_sys_op_id *op_id,
                              void *user_ptr)
@@ -45,7 +64,7 @@ PVFS_error PVFS_isys_getcred(const char 
 
     gossip_debug(GOSSIP_CLIENT_DEBUG, "PVFS_isys_getcred entered\n");
 
-    if (!certificate || !resp_p)
+    if ((fs_id == PVFS_FS_ID_NULL) || !certificate || !resp_p)
     {
         gossip_err("invalid (NULL) argument\n");
         return ret;
@@ -62,12 +81,31 @@ PVFS_error PVFS_isys_getcred(const char 
     }
     sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
 
-    /* TODO: continue filling out stuff */
+    PINT_init_msgarray_params(sm_p, fs_id);
+    sm_p->object_ref.fs_id = fs_id;
+    sm_p->u.getcred.certificate = strdup(certificate);
+    sm_p->u.getcred.signature = malloc(sig_size);
+    if (sm_p->u.getcred.signature)
+    {
+        memcpy(sm_p->u.getcred.signature, signature, sig_size);
+    }
+    sm_p->u.getcred.sig_size = sig_size;
+    sm_p->u.getcred.getcred_resp = resp_p;
+
+    PINT_msgpair_init(&sm_p->msgarray_op);
+    sm_p->msgarray_op.msgpair.fs_id = fs_id;
+    sm_p->msgarray_op.msgpair.retry_flag = PVFS_MSGPAIR_RETRY;
+    sm_p->msgarray_op.msgpair.comp_fn = getcred_comp_fn;
+    sm_p->msgarray_op.msgpair.svr_addr = addr;
 
     return PINT_client_state_machine_post(smcb, op_id, user_ptr);
 }
 
-PVFS_error PVFS_sys_getcred(const char *certificate,
+PVFS_error PVFS_sys_getcred(PVFS_fs_id fs_id,
+                            const char *certificate,
+                            const PVFS_sig signature,
+                            uint32_t sig_size,
+                            PVFS_BMI_addr_t addr,
                             PVFS_sysresp_getcred *resp_p)
 {
     PVFS_error ret = -PVFS_EINVAL;
@@ -76,7 +114,8 @@ PVFS_error PVFS_sys_getcred(const char *
 
     gossip_debug(GOSSIP_CLIENT_DEBUG, "PVFS_sys_getcred entered\n");
 
-    ret = PVFS_isys_getcred(certificate, resp_p, &op_id, NULL);
+    ret = PVFS_isys_getcred(fs_id, certificate, signature, sig_size,
+                            addr, resp_p, &op_id, NULL);
     if (ret)
     {
         PVFS_perror_gossip("PVFS_isys_getcred call", ret);
@@ -96,12 +135,61 @@ PVFS_error PVFS_sys_getcred(const char *
     return error;
 }
 
-/* TODO: replace with real states */
-static int getcred_entry(struct PINT_smcb *smcb, job_status_s *js_p)
+static int getcred_setup_msgpair(struct PINT_smcb *smcb, job_status_s *js_p)
 {
+    struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
+    const PVFS_capability *capability;
+
+    gossip_debug(GOSSIP_CLIENT_DEBUG, 
+                 "getcred state: getcred_setup_msgpair\n");
+    
+    capability = PINT_null_capability();
+
+    PINT_SERVREQ_GETCRED_FILL(sm_p->msgarray_op.msgpair.req,
+                              *capability,
+                              sm_p->u.getcred.certificate,
+                              sm_p->u.getcred.sig_size,
+                              sm_p->u.getcred.signature);
 
-    js_p->error_code = 0;
+    PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op);
     return SM_ACTION_COMPLETE;
+}
+
+static int getcred_comp_fn(void *v_p, struct PVFS_server_resp *resp_p, 
+                           int index)
+{
+    PINT_smcb *smcb = v_p;
+    PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM);
+    int ret;
+
+    gossip_debug(GOSSIP_CLIENT_DEBUG, "getcred_comp_fn\n");
+
+    assert(resp_p->op == PVFS_SERV_GETCRED);
+
+    if (resp_p->status)
+    {
+        return resp_p->status;
+    }
+
+    ret = PINT_copy_credential(&resp_p->u.getcred.credential,
+                               &sm_p->u.getcred.getcred_resp->credential);
+
+    return ret;
+}
+
+static int getcred_cleanup(struct PINT_smcb *smcb, job_status_s *js_p)
+{
+    struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
+
+    gossip_debug(GOSSIP_CLIENT_DEBUG, "getcred state: getcred_cleanup\n");
+
+    free(sm_p->u.getcred.certificate);
+    free(sm_p->u.getcred.signature);
+
+    sm_p->error_code = js_p->error_code;
+
+    PINT_SET_OP_COMPLETE;
+    return SM_ACTION_TERMINATE;
 }
 
 



More information about the Pvfs2-cvs mailing list