Whamcloud - gitweb
LU-5030 utils: migrate most lustre utils to use cfs_get_paths()
[fs/lustre-release.git] / lustre / utils / gss / lgss_keyring.c
index cf252aa..c50f4b8 100644 (file)
 #include <stdlib.h>
 #include <stdio.h>
 #include <fcntl.h>
+#include <inttypes.h>
 #include <string.h>
 #include <errno.h>
 #include <pwd.h>
 #include <keyutils.h>
 #include <gssapi/gssapi.h>
 
+#include <libcfs/util/param.h>
+#include <libcfs/util/string.h>
 #include "lsupport.h"
 #include "lgss_utils.h"
 #include "write_bytes.h"
@@ -64,67 +67,68 @@ static char *g_service = NULL;
  * all data about negotiation
  */
 struct lgss_nego_data {
-        uint32_t        lnd_established:1;
-
-        int             lnd_secid;
-        uint32_t        lnd_uid;
-        uint32_t        lnd_lsvc;
-        char           *lnd_uuid;
-
-        gss_OID         lnd_mech;               /* mech OID */
-        gss_name_t      lnd_svc_name;           /* service name */
-        u_int           lnd_req_flags;          /* request flags */
-        gss_cred_id_t   lnd_cred;               /* credential */
-        gss_ctx_id_t    lnd_ctx;                /* session context */
-        gss_buffer_desc lnd_rmt_ctx;            /* remote handle of context */
-        uint32_t        lnd_seq_win;            /* sequence window */
-
-        int             lnd_rpc_err;
-        int             lnd_gss_err;
+       uint32_t        lnd_established:1;
+
+       int             lnd_secid;
+       uint32_t        lnd_uid;
+       uint32_t        lnd_lsvc;
+       char           *lnd_uuid;
+
+       gss_OID         lnd_mech;               /* mech OID */
+       gss_name_t      lnd_svc_name;           /* service name */
+       unsigned int    lnd_req_flags;          /* request flags */
+       gss_cred_id_t   lnd_cred;               /* credential */
+       gss_ctx_id_t    lnd_ctx;                /* session context */
+       gss_buffer_desc lnd_rmt_ctx;            /* remote handle of context */
+       uint32_t        lnd_seq_win;            /* sequence window */
+
+       int             lnd_rpc_err;
+       int             lnd_gss_err;
 };
 
 /*
  * context creation response
  */
 struct lgss_init_res {
-        gss_buffer_desc gr_ctx;         /* context handle */
-        u_int           gr_major;       /* major status */
-        u_int           gr_minor;       /* minor status */
-        u_int           gr_win;         /* sequence window */
-        gss_buffer_desc gr_token;       /* token */
+       gss_buffer_desc gr_ctx;         /* context handle */
+       unsigned int    gr_major;       /* major status */
+       unsigned int    gr_minor;       /* minor status */
+       unsigned int    gr_win;         /* sequence window */
+       gss_buffer_desc gr_token;       /* token */
 };
 
 struct keyring_upcall_param {
-        uint32_t        kup_ver;
-        uint32_t        kup_secid;
-        uint32_t        kup_uid;
-        uint32_t        kup_fsuid;
-        uint32_t        kup_gid;
-        uint32_t        kup_fsgid;
-        uint32_t        kup_svc;
-        uint64_t        kup_nid;
-        char            kup_tgt[64];
-        char            kup_mech[16];
-        unsigned int    kup_is_root:1,
-                        kup_is_mdt:1,
-                        kup_is_ost:1;
+       uint32_t        kup_ver;
+       uint32_t        kup_secid;
+       uint32_t        kup_uid;
+       uint32_t        kup_fsuid;
+       uint32_t        kup_gid;
+       uint32_t        kup_fsgid;
+       uint32_t        kup_svc;
+       uint64_t        kup_nid;
+       uint64_t        kup_selfnid;
+       char            kup_tgt[64];
+       char            kup_mech[16];
+       unsigned int    kup_is_root:1,
+                       kup_is_mdt:1,
+                       kup_is_ost:1;
 };
 
 /****************************************
  * child process: gss negotiation       *
  ****************************************/
 
-#define INIT_CHANNEL    "/proc/fs/lustre/sptlrpc/gss/init_channel"
-
 int do_nego_rpc(struct lgss_nego_data *lnd,
                 gss_buffer_desc *gss_token,
                 struct lgss_init_res *gr)
 {
-        struct lgssd_ioctl_param  param;
-        struct passwd            *pw;
-        int                       fd, ret, res;
-        char                      outbuf[8192];
-        unsigned int             *p;
+       struct lgssd_ioctl_param param;
+       struct passwd *pw;
+       int fd, ret, res;
+       char outbuf[8192];
+       unsigned int *p;
+       glob_t path;
+       int rc;
 
         logmsg(LL_TRACE, "start negotiation rpc\n");
 
@@ -146,38 +150,44 @@ int do_nego_rpc(struct lgss_nego_data *lnd,
         param.reply_buf_size = sizeof(outbuf);
         param.reply_buf = outbuf;
 
-        logmsg(LL_TRACE, "to open " INIT_CHANNEL "\n");
+       rc = cfs_get_param_paths(&path, "sptlrpc/gss/init_channel");
+       if (rc != 0)
+               return rc;
+
+       logmsg(LL_TRACE, "to open %s\n", path.gl_pathv[0]);
 
-        fd = open(INIT_CHANNEL, O_WRONLY);
+       fd = open(path.gl_pathv[0], O_WRONLY);
         if (fd < 0) {
-                logmsg(LL_ERR, "can't open " INIT_CHANNEL "\n");
-                return -EACCES;
+               logmsg(LL_ERR, "can't open %s\n", path.gl_pathv[0]);
+               rc = -EACCES;
+               goto out_params;
         }
 
-        logmsg(LL_TRACE, "to down-write\n");
+       logmsg(LL_TRACE, "to down-write\n");
 
-        ret = write(fd, &param, sizeof(param));
-        if (ret != sizeof(param)) {
-                logmsg(LL_ERR, "lustre ioctl err: %d\n", strerror(errno));
-                close(fd);
-                return -EACCES;
-        }
-        close(fd);
+       ret = write(fd, &param, sizeof(param));
+       close(fd);
+       if (ret != sizeof(param)) {
+               logmsg(LL_ERR, "lustre ioctl err: %s\n", strerror(errno));
+               rc = -EACCES;
+               goto out_params;
+       }
 
         logmsg(LL_TRACE, "do_nego_rpc: to parse reply\n");
         if (param.status) {
-                logmsg(LL_ERR, "status: %d (%s)\n",
-                       param.status, strerror((int)param.status));
+               logmsg(LL_ERR, "status: %ld (%s)\n",
+                      param.status, strerror((int)param.status));
 
                 /* kernel return -ETIMEDOUT means the rpc timedout, we should
                  * notify the caller to reinitiate the gss negotiation, by
                  * returning -ERESTART
                  */
                 if (param.status == -ETIMEDOUT)
-                        return -ERESTART;
-                else
-                        return param.status;
-        }
+                       rc = -ERESTART;
+               else
+                       rc = param.status;
+               goto out_params;
+       }
 
         p = (unsigned int *)outbuf;
         res = *p++;
@@ -195,9 +205,11 @@ int do_nego_rpc(struct lgss_nego_data *lnd,
         memcpy(gr->gr_token.value, p, gr->gr_token.length);
         p += (((gr->gr_token.length + 3) & ~3) / 4);
 
-       logmsg(LL_DEBUG, "do_nego_rpc: receive handle len %d, token len %d, " \
+       logmsg(LL_DEBUG, "do_nego_rpc: receive handle len %zu, token len %zu, "
               "res %d\n", gr->gr_ctx.length, gr->gr_token.length, res);
-       return 0;
+out_params:
+       cfs_free_param_data(&path);
+       return rc;
 }
 
 /*
@@ -473,10 +485,10 @@ static int lgssc_kr_negotiate(key_serial_t keyid, struct lgss_cred *cred,
         OM_uint32               min_stat;
         int                     rc = -1;
 
-        logmsg(LL_TRACE, "child start on behalf of key %08x: "
-               "cred %p, uid %u, svc %u, nid %llx, uids: %u:%u/%u:%u\n",
-               keyid, cred, cred->lc_uid, cred->lc_tgt_svc, cred->lc_tgt_nid,
-               kup->kup_uid, kup->kup_gid, kup->kup_fsuid, kup->kup_fsgid);
+       logmsg(LL_TRACE, "child start on behalf of key %08x: "
+              "cred %p, uid %u, svc %u, nid %"PRIx64", uids: %u:%u/%u:%u\n",
+              keyid, cred, cred->lc_uid, cred->lc_tgt_svc, cred->lc_tgt_nid,
+              kup->kup_uid, kup->kup_gid, kup->kup_fsuid, kup->kup_fsgid);
 
         if (lgss_get_service_str(&g_service, kup->kup_svc, kup->kup_nid)) {
                 logmsg(LL_ERR, "key %08x: failed to construct service "
@@ -540,16 +552,17 @@ out_cred:
  *  [5]: lustre_svc     (uint)
  *  [6]: target_nid     (uint64)
  *  [7]: target_uuid    (string)
+ *  [8]: self_nid        (uint64)
  */
 static int parse_callout_info(const char *coinfo,
                               struct keyring_upcall_param *uparam)
 {
-        const int       nargs = 8;
-        char            buf[1024];
-        char           *string = buf;
-        int             length, i;
-        char           *data[nargs];
-        char           *pos;
+       const int       nargs = 9;
+       char            buf[1024];
+       char           *string = buf;
+       int             length, i;
+       char           *data[nargs];
+       char           *pos;
 
         length = strlen(coinfo) + 1;
         if (length > 1024) {
@@ -571,53 +584,61 @@ static int parse_callout_info(const char *coinfo,
         }
         data[i] = string;
 
-        logmsg(LL_TRACE, "components: %s,%s,%s,%s,%s,%s,%s,%s\n",
-               data[0], data[1], data[2], data[3], data[4], data[5],
-               data[6], data[7]);
+       logmsg(LL_TRACE, "components: %s,%s,%s,%s,%s,%s,%s,%s,%s\n",
+              data[0], data[1], data[2], data[3], data[4], data[5],
+              data[6], data[7], data[8]);
 
-        uparam->kup_secid = strtol(data[0], NULL, 0);
+       uparam->kup_secid = strtol(data[0], NULL, 0);
        strlcpy(uparam->kup_mech, data[1], sizeof(uparam->kup_mech));
-        uparam->kup_uid = strtol(data[2], NULL, 0);
-        uparam->kup_gid = strtol(data[3], NULL, 0);
-        if (strchr(data[4], 'r'))
-                uparam->kup_is_root = 1;
-        if (strchr(data[4], 'm'))
-                uparam->kup_is_mdt = 1;
-        if (strchr(data[4], 'o'))
-                uparam->kup_is_ost = 1;
-        uparam->kup_svc = strtol(data[5], NULL, 0);
-        uparam->kup_nid = strtoll(data[6], NULL, 0);
+       uparam->kup_uid = strtol(data[2], NULL, 0);
+       uparam->kup_gid = strtol(data[3], NULL, 0);
+       if (strchr(data[4], 'r'))
+               uparam->kup_is_root = 1;
+       if (strchr(data[4], 'm'))
+               uparam->kup_is_mdt = 1;
+       if (strchr(data[4], 'o'))
+               uparam->kup_is_ost = 1;
+       uparam->kup_svc = strtol(data[5], NULL, 0);
+       uparam->kup_nid = strtoll(data[6], NULL, 0);
        strlcpy(uparam->kup_tgt, data[7], sizeof(uparam->kup_tgt));
-
-        logmsg(LL_DEBUG, "parse call out info: secid %d, mech %s, ugid %u:%u "
-               "is_root %d, is_mdt %d, is_ost %d, svc %d, nid 0x%llx, tgt %s\n",
-               uparam->kup_secid, uparam->kup_mech,
-               uparam->kup_uid, uparam->kup_gid,
-               uparam->kup_is_root, uparam->kup_is_mdt, uparam->kup_is_ost,
-               uparam->kup_svc, uparam->kup_nid, uparam->kup_tgt);
-        return 0;
+       uparam->kup_selfnid = strtoll(data[8], NULL, 0);
+
+       logmsg(LL_DEBUG, "parse call out info: secid %d, mech %s, ugid %u:%u, "
+              "is_root %d, is_mdt %d, is_ost %d, svc %d, nid 0x%"PRIx64", "
+              "tgt %s, self nid 0x%"PRIx64"\n",
+              uparam->kup_secid, uparam->kup_mech,
+              uparam->kup_uid, uparam->kup_gid,
+              uparam->kup_is_root, uparam->kup_is_mdt, uparam->kup_is_ost,
+              uparam->kup_svc, uparam->kup_nid, uparam->kup_tgt,
+              uparam->kup_selfnid);
+       return 0;
 }
 
-#define LOG_LEVEL_PATH  "/proc/fs/lustre/sptlrpc/gss/lgss_keyring/debug_level"
-
 static void set_log_level()
 {
-        FILE         *file;
-        unsigned int  level;
-
-        file = fopen(LOG_LEVEL_PATH, "r");
-        if (file == NULL)
-                return;
-
-        if (fscanf(file, "%u", &level) != 1)
-                goto out;
-
-        if (level >= LL_MAX)
-                goto out;
-
-        lgss_set_loglevel(level);
+       unsigned int level;
+       glob_t path;
+       FILE *file;
+
+       if (cfs_get_param_paths(&path,
+                               "sptlrpc/gss/lgss_keyring/debug_level") != 0)
+               return;
+       file = fopen(path.gl_pathv[0], "r");
+       if (file == NULL) {
+               cfs_free_param_data(&path);
+               return;
+       }
+
+       if (fscanf(file, "%u", &level) != 1)
+               goto out;
+
+       if (level >= LL_MAX)
+               goto out;
+
+       lgss_set_loglevel(level);
 out:
-        fclose(file);
+       cfs_free_param_data(&path);
+       fclose(file);
 }
 
 /****************************************
@@ -716,12 +737,13 @@ int main(int argc, char *argv[])
                 return 1;
         }
 
-        cred->lc_uid = uparam.kup_uid;
-        cred->lc_root_flags |= uparam.kup_is_root ? LGSS_ROOT_CRED_ROOT : 0;
-        cred->lc_root_flags |= uparam.kup_is_mdt ? LGSS_ROOT_CRED_MDT : 0;
-        cred->lc_root_flags |= uparam.kup_is_ost ? LGSS_ROOT_CRED_OST : 0;
-        cred->lc_tgt_nid = uparam.kup_nid;
-        cred->lc_tgt_svc = uparam.kup_svc;
+       cred->lc_uid = uparam.kup_uid;
+       cred->lc_root_flags |= uparam.kup_is_root ? LGSS_ROOT_CRED_ROOT : 0;
+       cred->lc_root_flags |= uparam.kup_is_mdt ? LGSS_ROOT_CRED_MDT : 0;
+       cred->lc_root_flags |= uparam.kup_is_ost ? LGSS_ROOT_CRED_OST : 0;
+       cred->lc_tgt_nid = uparam.kup_nid;
+       cred->lc_tgt_svc = uparam.kup_svc;
+       cred->lc_self_nid = uparam.kup_selfnid;
 
         if (lgss_prepare_cred(cred)) {
                 logmsg(LL_ERR, "key %08x: failed to prepare credentials "