diff options
| -rw-r--r-- | cli/src/cli-cmd-system.c | 28 | ||||
| -rw-r--r-- | cli/src/cli-rpc-ops.c | 56 | ||||
| -rw-r--r-- | rpc/rpc-lib/src/protocol-common.h | 1 | ||||
| -rw-r--r-- | rpc/xdr/src/cli1-xdr.c | 20 | ||||
| -rw-r--r-- | rpc/xdr/src/cli1-xdr.h | 16 | ||||
| -rw-r--r-- | rpc/xdr/src/cli1-xdr.x | 12 | ||||
| -rw-r--r-- | rpc/xdr/src/cli1.c | 28 | ||||
| -rw-r--r-- | rpc/xdr/src/cli1.h | 12 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 27 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd.h | 3 | 
10 files changed, 201 insertions, 2 deletions
diff --git a/cli/src/cli-cmd-system.c b/cli/src/cli-cmd-system.c index e9d017f1d16..36300248909 100644 --- a/cli/src/cli-cmd-system.c +++ b/cli/src/cli-cmd-system.c @@ -154,6 +154,30 @@ out:          return ret;  } +int +cli_cmd_getwd_cbk (struct cli_state *state, struct cli_cmd_word *word, +                   const char **words, int wordcount) +{ +        int                             ret = -1; +        rpc_clnt_procedure_t            *proc = NULL; +        call_frame_t                    *frame = NULL; + +        if (wordcount != 2) { +                cli_usage_out (word->pattern); +                goto out; +        } + +        proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GETWD]; +        if (proc && proc->fn) { +                frame = create_frame (THIS, THIS->ctx->pool); +                if (!frame) +                        goto out; +                ret = proc->fn (frame, THIS, NULL); +        } +out: +        return ret; +} +  struct cli_cmd cli_system_cmds[] = {          { "system:: getspec <VOLID>",            cli_cmd_getspec_cbk, @@ -167,6 +191,10 @@ struct cli_cmd cli_system_cmds[] = {            cli_cmd_fsm_log_cbk,            "display fsm transitions"}, +        { "system:: getwd", +          cli_cmd_getwd_cbk, +          "query glusterd work directory"}, +          { "system:: help",             cli_cmd_system_help_cbk,             "display help for system commands"}, diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index 20d4c6f4a04..d6c507d2c9d 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -3348,6 +3348,59 @@ out:          return ret;  } + +int +gf_cli3_1_getwd_cbk (struct rpc_req *req, struct iovec *iov, +                       int count, void *myframe) +{ +        gf1_cli_getwd_rsp rsp   = {0,}; +        int               ret   = 0; + +        if (-1 == req->rpc_status) { +                goto out; +        } + +        ret = gf_xdr_to_cli_getwd_rsp (*iov, &rsp); +        if (ret < 0 || rsp.op_ret == -1) { +                gf_log ("", GF_LOG_ERROR, "error"); +                goto out; +        } + +        gf_log ("cli", GF_LOG_INFO, "Received resp to getwd"); + +        cli_out (rsp.wd); + +        ret = 0; + +out: +        cli_cmd_broadcast_response (ret); +        return ret; +} + +int32_t +gf_cli3_1_getwd (call_frame_t *frame, xlator_t *this, void *data) +{ +        int                      ret = -1; +        gf1_cli_getwd_req        req = {0,}; + +        GF_ASSERT (frame); +        GF_ASSERT (this); + +        if (!frame || !this) +                goto out; + +        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, +                              GLUSTER_CLI_GETWD, NULL, +                              gf_xdr_from_cli_getwd_req, +                              this, gf_cli3_1_getwd_cbk); + +out: +        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + +        return ret; +} + +  struct rpc_clnt_procedure gluster_cli_actors[GLUSTER_CLI_MAXVALUE] = {          [GLUSTER_CLI_NULL]             = {"NULL", NULL },          [GLUSTER_CLI_PROBE]            = {"PROBE_QUERY", gf_cli3_1_probe}, @@ -3376,7 +3429,8 @@ struct rpc_clnt_procedure gluster_cli_actors[GLUSTER_CLI_MAXVALUE] = {          [GLUSTER_CLI_GSYNC_SET]        = {"GSYNC_SET", gf_cli3_1_gsync_set},          [GLUSTER_CLI_PROFILE_VOLUME]   = {"PROFILE_VOLUME", gf_cli3_1_profile_volume},          [GLUSTER_CLI_QUOTA]            = {"QUOTA", gf_cli3_1_quota}, -        [GLUSTER_CLI_TOP_VOLUME]       = {"TOP_VOLUME", gf_cli3_1_top_volume} +        [GLUSTER_CLI_TOP_VOLUME]       = {"TOP_VOLUME", gf_cli3_1_top_volume}, +        [GLUSTER_CLI_GETWD]            = {"GETWD", gf_cli3_1_getwd}  };  struct rpc_clnt_program cli_prog = { diff --git a/rpc/rpc-lib/src/protocol-common.h b/rpc/rpc-lib/src/protocol-common.h index 8483fbcf459..a54c29fc55a 100644 --- a/rpc/rpc-lib/src/protocol-common.h +++ b/rpc/rpc-lib/src/protocol-common.h @@ -198,6 +198,7 @@ enum gluster_cli_procnum {          GLUSTER_CLI_PROFILE_VOLUME,          GLUSTER_CLI_QUOTA,          GLUSTER_CLI_TOP_VOLUME, +        GLUSTER_CLI_GETWD,          GLUSTER_CLI_MAXVALUE,  }; diff --git a/rpc/xdr/src/cli1-xdr.c b/rpc/xdr/src/cli1-xdr.c index f1594eb9662..0f5dc98669c 100644 --- a/rpc/xdr/src/cli1-xdr.c +++ b/rpc/xdr/src/cli1-xdr.c @@ -796,3 +796,23 @@ xdr_gf1_cli_stats_volume_rsp (XDR *xdrs, gf1_cli_stats_volume_rsp *objp)  		 return FALSE;  	return TRUE;  } + +bool_t +xdr_gf1_cli_getwd_req (XDR *xdrs, gf1_cli_getwd_req *objp) +{ +	 if (!xdr_int (xdrs, &objp->unused)) +		 return FALSE; +	return TRUE; +} + +bool_t +xdr_gf1_cli_getwd_rsp (XDR *xdrs, gf1_cli_getwd_rsp *objp) +{ +	 if (!xdr_int (xdrs, &objp->op_ret)) +		 return FALSE; +	 if (!xdr_int (xdrs, &objp->op_errno)) +		 return FALSE; +	 if (!xdr_string (xdrs, &objp->wd, ~0)) +		 return FALSE; +	return TRUE; +} diff --git a/rpc/xdr/src/cli1-xdr.h b/rpc/xdr/src/cli1-xdr.h index 0a4b4ebd5f5..96f8def58c7 100644 --- a/rpc/xdr/src/cli1-xdr.h +++ b/rpc/xdr/src/cli1-xdr.h @@ -512,6 +512,18 @@ struct gf1_cli_stats_volume_rsp {  };  typedef struct gf1_cli_stats_volume_rsp gf1_cli_stats_volume_rsp; +struct gf1_cli_getwd_req { +	int unused; +}; +typedef struct gf1_cli_getwd_req gf1_cli_getwd_req; + +struct gf1_cli_getwd_rsp { +	int op_ret; +	int op_errno; +	char *wd; +}; +typedef struct gf1_cli_getwd_rsp gf1_cli_getwd_rsp; +  /* the xdr functions */  #if defined(__STDC__) || defined(__cplusplus) @@ -572,6 +584,8 @@ extern  bool_t xdr_gf1_cli_gsync_set_req (XDR *, gf1_cli_gsync_set_req*);  extern  bool_t xdr_gf1_cli_gsync_set_rsp (XDR *, gf1_cli_gsync_set_rsp*);  extern  bool_t xdr_gf1_cli_stats_volume_req (XDR *, gf1_cli_stats_volume_req*);  extern  bool_t xdr_gf1_cli_stats_volume_rsp (XDR *, gf1_cli_stats_volume_rsp*); +extern  bool_t xdr_gf1_cli_getwd_req (XDR *, gf1_cli_getwd_req*); +extern  bool_t xdr_gf1_cli_getwd_rsp (XDR *, gf1_cli_getwd_rsp*);  #else /* K&R C */  extern bool_t xdr_gf1_cluster_type (); @@ -631,6 +645,8 @@ extern bool_t xdr_gf1_cli_gsync_set_req ();  extern bool_t xdr_gf1_cli_gsync_set_rsp ();  extern bool_t xdr_gf1_cli_stats_volume_req ();  extern bool_t xdr_gf1_cli_stats_volume_rsp (); +extern bool_t xdr_gf1_cli_getwd_req (); +extern bool_t xdr_gf1_cli_getwd_rsp ();  #endif /* K&R C */ diff --git a/rpc/xdr/src/cli1-xdr.x b/rpc/xdr/src/cli1-xdr.x index fc38cf7b252..99344a94909 100644 --- a/rpc/xdr/src/cli1-xdr.x +++ b/rpc/xdr/src/cli1-xdr.x @@ -57,7 +57,7 @@ enum gf1_cli_stats_op {          GF_CLI_STATS_NONE  = 0,          GF_CLI_STATS_START = 1,          GF_CLI_STATS_STOP  = 2, -        GF_CLI_STATS_INFO  = 3 +        GF_CLI_STATS_INFO  = 3,          GF_CLI_STATS_TOP = 4  }; @@ -375,3 +375,13 @@ struct gf1_cli_quota_rsp {          string  limit_list<>;          gf_quota_type type;  }; + +struct gf1_cli_getwd_req { +        int     unused; +} ; + +struct gf1_cli_getwd_rsp { +        int     op_ret; +        int     op_errno; +        string  wd<>; +}; diff --git a/rpc/xdr/src/cli1.c b/rpc/xdr/src/cli1.c index bd3cbf0c7bd..e917929b349 100644 --- a/rpc/xdr/src/cli1.c +++ b/rpc/xdr/src/cli1.c @@ -712,3 +712,31 @@ gf_xdr_from_cli_stats_volume_rsp (struct iovec outmsg, void *args)          return xdr_serialize_generic (outmsg, (void *)args,                                        (xdrproc_t)xdr_gf1_cli_stats_volume_rsp);  } + +ssize_t +gf_xdr_to_cli_getwd_req (struct iovec inmsg, void *args) +{ +        return xdr_to_generic (inmsg, (void *)args, +                               (xdrproc_t)xdr_gf1_cli_getwd_req); +} + +ssize_t +gf_xdr_from_cli_getwd_req (struct iovec outmsg, void *args) +{ +        return xdr_serialize_generic (outmsg, (void *)args, +                                     (xdrproc_t)xdr_gf1_cli_getwd_req); +} + +ssize_t +gf_xdr_to_cli_getwd_rsp (struct iovec inmsg, void *args) +{ +        return xdr_to_generic (inmsg, (void *)args, +                               (xdrproc_t)xdr_gf1_cli_getwd_rsp); +} + +ssize_t +gf_xdr_from_cli_getwd_rsp (struct iovec outmsg, void *args) +{ +        return xdr_serialize_generic (outmsg, (void *)args, +                                      (xdrproc_t)xdr_gf1_cli_getwd_rsp); +} diff --git a/rpc/xdr/src/cli1.h b/rpc/xdr/src/cli1.h index 9bc3a196ae5..32e310aae83 100644 --- a/rpc/xdr/src/cli1.h +++ b/rpc/xdr/src/cli1.h @@ -315,4 +315,16 @@ gf_xdr_to_cli_stats_volume_rsp (struct iovec inmsg, void *args);  ssize_t  gf_xdr_from_cli_stats_volume_rsp (struct iovec outmsg, void *args); + +ssize_t +gf_xdr_to_cli_getwd_req (struct iovec inmsg, void *args); + +ssize_t +gf_xdr_from_cli_getwd_req (struct iovec outmsg, void *args); + +ssize_t +gf_xdr_to_cli_getwd_rsp (struct iovec inmsg, void *args); + +ssize_t +gf_xdr_from_cli_getwd_rsp (struct iovec outmsg, void *args);  #endif /* !_CLI1_H */ diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 42909136a8c..a78c876e3f5 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -3202,6 +3202,32 @@ out:  }  int +glusterd_handle_getwd (rpcsvc_request_t *req) +{ +        int32_t                 ret = -1; +        gf1_cli_getwd_rsp     rsp = {0,}; +        glusterd_conf_t         *priv = NULL; + +        GF_ASSERT (req); + +        priv = THIS->private; +        GF_ASSERT (priv); + +        gf_log ("glusterd", GF_LOG_INFO, "Received getwd req"); + +        rsp.wd = priv->workdir; + +        ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, +                                     gf_xdr_from_cli_getwd_rsp); + +        glusterd_friend_sm (); +        glusterd_op_sm (); + +        return ret; +} + + +int  glusterd_friend_remove (uuid_t uuid, char *hostname)  {          int                           ret = 0; @@ -3899,6 +3925,7 @@ rpcsvc_actor_t gd_svc_cli_actors[] = {          [GLUSTER_CLI_GSYNC_SET]     = { "GSYNC_SET", GLUSTER_CLI_GSYNC_SET, glusterd_handle_gsync_set, NULL, NULL},          [GLUSTER_CLI_PROFILE_VOLUME] = { "STATS_VOLUME", GLUSTER_CLI_PROFILE_VOLUME, glusterd_handle_cli_profile_volume, NULL, NULL},          [GLUSTER_CLI_QUOTA]         = { "QUOTA", GLUSTER_CLI_QUOTA, glusterd_handle_quota, NULL, NULL}, +        [GLUSTER_CLI_GETWD]         = { "GETWD", GLUSTER_CLI_GETWD, glusterd_handle_getwd, NULL, NULL},  }; diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index 9175983c7c9..2fcd11c11f1 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -495,6 +495,9 @@ glusterd_validate_reconfopts (glusterd_volinfo_t *volinfo, dict_t *val_dict, cha  int  glusterd_handle_cli_profile_volume (rpcsvc_request_t *req); +int +glusterd_handle_getwd (rpcsvc_request_t *req); +  int32_t  glusterd_set_volume (rpcsvc_request_t *req, dict_t *dict);  int  | 
