diff options
| author | Pranith K <pranithk@gluster.com> | 2011-03-10 02:18:22 +0000 | 
|---|---|---|
| committer | Vijay Bellur <vijay@dev.gluster.com> | 2011-03-10 08:09:30 -0800 | 
| commit | d23585307a0e333c9b1ff627df4c7e30b3642201 (patch) | |
| tree | 0e900775fff91686474051cf55375966e7028eec /rpc/rpc-lib/src/rpcsvc.c | |
| parent | 45fd0d904d11f07f8b523af2d1357f081e3c5dc1 (diff) | |
rpc: Changes for handling unix domain sockets avoid race
Signed-off-by: Pranith Kumar K <pranithk@gluster.com>
Signed-off-by: Vijay Bellur <vijay@dev.gluster.com>
BUG: 1965 (need a cmd to get io-stat details)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1965
Diffstat (limited to 'rpc/rpc-lib/src/rpcsvc.c')
| -rw-r--r-- | rpc/rpc-lib/src/rpcsvc.c | 65 | 
1 files changed, 58 insertions, 7 deletions
diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c index d949677c3..3e9d58530 100644 --- a/rpc/rpc-lib/src/rpcsvc.c +++ b/rpc/rpc-lib/src/rpcsvc.c @@ -937,6 +937,7 @@ rpcsvc_handle_rpc_call (rpcsvc_t *svc, rpc_transport_t *trans,          rpcsvc_request_t        *req = NULL;          int                     ret = -1;          uint16_t                port = 0; +        gf_boolean_t            is_unix = _gf_false;          if (!trans || !svc)                  return -1; @@ -949,7 +950,9 @@ rpcsvc_handle_rpc_call (rpcsvc_t *svc, rpc_transport_t *trans,          case AF_INET6:                  port = ((struct sockaddr_in6 *)&trans->peerinfo.sockaddr)->sin6_port;                  break; - +        case AF_UNIX: +                is_unix = _gf_true; +                break;          default:                  gf_log (GF_RPCSVC, GF_LOG_DEBUG,                          "invalid address family (%d)", @@ -959,14 +962,16 @@ rpcsvc_handle_rpc_call (rpcsvc_t *svc, rpc_transport_t *trans, -        port = ntohs (port); +        if (is_unix == _gf_false) { +                port = ntohs (port); -        gf_log ("rpcsvc", GF_LOG_TRACE, "Client port: %d", (int)port); +                gf_log ("rpcsvc", GF_LOG_TRACE, "Client port: %d", (int)port); -        if (port > 1024) {  //Non-privilaged user, fail request -                gf_log ("glusterd", GF_LOG_ERROR, "Request received from non-" -                        "privileged port. Failing request"); -                return -1; +                if (port > 1024) {  //Non-privilaged user, fail request +                        gf_log ("glusterd", GF_LOG_ERROR, "Request received from non-" +                                "privileged port. Failing request"); +                        return -1; +                }          }          req = rpcsvc_request_create (svc, trans, msg); @@ -2193,6 +2198,52 @@ rpcsvc_init_options (rpcsvc_t *svc, dict_t *options)          return 0;  } +int +rpcsvc_transport_unix_options_build (dict_t **options, char *filepath) +{ +        dict_t                  *dict = NULL; +        char                    *fpath = NULL; +        int                     ret = -1; + +        GF_ASSERT (filepath); +        GF_ASSERT (options); + +        dict = dict_new (); +        if (!dict) +                goto out; + +        fpath = gf_strdup (filepath); +        if (!fpath) { +                ret = -1; +                goto out; +        } + +        ret = dict_set_dynstr (dict, "transport.socket.listen-path", fpath); +        if (ret) +                goto out; + +        ret = dict_set_str (dict, "transport.address-family", "unix"); +        if (ret) +                goto out; + +        ret = dict_set_str (dict, "transport.socket.nodelay", "off"); +        if (ret) +                goto out; + +        ret = dict_set_str (dict, "transport-type", "socket"); +        if (ret) +                goto out; + +        *options = dict; +out: +        if (ret) { +                if (fpath) +                        GF_FREE (fpath); +                if (dict) +                        dict_unref (dict); +        } +        return ret; +}  /* The global RPC service initializer.   */  | 
