[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