#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"
* 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");
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, ¶m, 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, ¶m, 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++;
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;
}
/*
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 "
* [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) {
}
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);
}
/****************************************
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 "