-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see [sun.com URL with a
- * copy of GPLv2].
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * version 2 along with this program; If not, see
+ * http://www.gnu.org/licenses/gpl-2.0.html
*
* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2014, 2017, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
- * Lustre is a trademark of Sun Microsystems, Inc.
*/
#ifndef _GNU_SOURCE
#include <sys/ipc.h>
#include <sys/sem.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
#include <unistd.h>
#include <errno.h>
#include <assert.h>
-#ifdef HAVE_GETHOSTBYNAME
+#ifdef HAVE_NETDB_H
# include <netdb.h>
#endif
-
#ifdef _NEW_BUILD_
# include "lgss_utils.h"
#else
#endif
#include "lsupport.h"
-const char * lustre_svc_name[] =
+const char * lustre_svc_name[] =
{
- [LUSTRE_GSS_SVC_MDS] = "MDS",
- [LUSTRE_GSS_SVC_OSS] = "OSS",
+ [LUSTRE_GSS_SVC_MGS] = "MGS",
+ [LUSTRE_GSS_SVC_MDS] = "MDS",
+ [LUSTRE_GSS_SVC_OSS] = "OSS",
};
/****************************************
head = fgets(buf, bufsize, fghn);
if (head == NULL) {
printerr(0, "can't read from %s\n", gethostname_ex);
+ pclose(fghn);
return -1;
}
if (pclose(fghn) == -1)
head++;
tail = head + strlen(head);
- if (tail <= head) {
+ if (tail <= head) {
printerr(0, "no output from %s\n", gethostname_ex);
return -1;
}
};
static struct convert_struct converter[] = {
- [0] = { "UNUSED0", NULL},
- [QSWLND] = { "QSWLND", external_nid2hostname},
- [SOCKLND] = { "SOCKLND", ipv4_nid2hostname },
- [GMLND] = { "GMLND", external_nid2hostname},
- [PTLLND] = { "PTLLND", external_nid2hostname },
- [O2IBLND] = { "O2IBLND", ipv4_nid2hostname },
- [CIBLND] = { "CIBLND", external_nid2hostname },
- [OPENIBLND] = { "OPENIBLND",external_nid2hostname },
- [IIBLND] = { "IIBLND", external_nid2hostname },
- [LOLND] = { "LOLND", lolnd_nid2hostname },
- [RALND] = { "RALND", external_nid2hostname },
- [VIBLND] = { "VIBLND", external_nid2hostname },
- [MXLND] = { "MXLND", external_nid2hostname },
+ [0] = { .name = "UNUSED0" },
+ [SOCKLND] = { .name = "SOCKLND", .nid2name = ipv4_nid2hostname },
+ [O2IBLND] = { .name = "O2IBLND", .nid2name = ipv4_nid2hostname },
+ [LOLND] = { .name = "LOLND", .nid2name = lolnd_nid2hostname },
+ [PTL4LND] = { .name = "PTL4LND", .nid2name = external_nid2hostname }
};
#define LND_MAX (sizeof(converter) / sizeof(converter[0]))
/****************************************
- * lnet support routine *
- * (from lnet/libcfs/nidstrings.c *
- ****************************************/
-
-#define LNET_NIDSTR_SIZE 32 /* size of each one (see below for usage) */
-
-static int libcfs_lo_str2addr(char *str, int nob, uint32_t *addr);
-static void libcfs_ip_addr2str(uint32_t addr, char *str);
-static int libcfs_ip_str2addr(char *str, int nob, uint32_t *addr);
-static void libcfs_decnum_addr2str(uint32_t addr, char *str);
-static void libcfs_hexnum_addr2str(uint32_t addr, char *str);
-static int libcfs_num_str2addr(char *str, int nob, uint32_t *addr);
-
-struct netstrfns {
- int nf_type;
- char *nf_name;
- char *nf_modname;
- void (*nf_addr2str)(uint32_t addr, char *str);
- int (*nf_str2addr)(char *str, int nob, uint32_t *addr);
-};
-
-static struct netstrfns libcfs_netstrfns[] = {
- {/* .nf_type */ LOLND,
- /* .nf_name */ "lo",
- /* .nf_modname */ "klolnd",
- /* .nf_addr2str */ libcfs_decnum_addr2str,
- /* .nf_str2addr */ libcfs_lo_str2addr},
- {/* .nf_type */ SOCKLND,
- /* .nf_name */ "tcp",
- /* .nf_modname */ "ksocklnd",
- /* .nf_addr2str */ libcfs_ip_addr2str,
- /* .nf_str2addr */ libcfs_ip_str2addr},
- {/* .nf_type */ O2IBLND,
- /* .nf_name */ "o2ib",
- /* .nf_modname */ "ko2iblnd",
- /* .nf_addr2str */ libcfs_ip_addr2str,
- /* .nf_str2addr */ libcfs_ip_str2addr},
- {/* .nf_type */ CIBLND,
- /* .nf_name */ "cib",
- /* .nf_modname */ "kciblnd",
- /* .nf_addr2str */ libcfs_ip_addr2str,
- /* .nf_str2addr */ libcfs_ip_str2addr},
- {/* .nf_type */ OPENIBLND,
- /* .nf_name */ "openib",
- /* .nf_modname */ "kopeniblnd",
- /* .nf_addr2str */ libcfs_ip_addr2str,
- /* .nf_str2addr */ libcfs_ip_str2addr},
- {/* .nf_type */ IIBLND,
- /* .nf_name */ "iib",
- /* .nf_modname */ "kiiblnd",
- /* .nf_addr2str */ libcfs_ip_addr2str,
- /* .nf_str2addr */ libcfs_ip_str2addr},
- {/* .nf_type */ VIBLND,
- /* .nf_name */ "vib",
- /* .nf_modname */ "kviblnd",
- /* .nf_addr2str */ libcfs_ip_addr2str,
- /* .nf_str2addr */ libcfs_ip_str2addr},
- {/* .nf_type */ RALND,
- /* .nf_name */ "ra",
- /* .nf_modname */ "kralnd",
- /* .nf_addr2str */ libcfs_ip_addr2str,
- /* .nf_str2addr */ libcfs_ip_str2addr},
- {/* .nf_type */ QSWLND,
- /* .nf_name */ "elan",
- /* .nf_modname */ "kqswlnd",
- /* .nf_addr2str */ libcfs_decnum_addr2str,
- /* .nf_str2addr */ libcfs_num_str2addr},
- {/* .nf_type */ GMLND,
- /* .nf_name */ "gm",
- /* .nf_modname */ "kgmlnd",
- /* .nf_addr2str */ libcfs_hexnum_addr2str,
- /* .nf_str2addr */ libcfs_num_str2addr},
- {/* .nf_type */ PTLLND,
- /* .nf_name */ "ptl",
- /* .nf_modname */ "kptllnd",
- /* .nf_addr2str */ libcfs_decnum_addr2str,
- /* .nf_str2addr */ libcfs_num_str2addr},
- /* placeholder for net0 alias. It MUST BE THE LAST ENTRY */
- {/* .nf_type */ -1},
-};
-
-const int libcfs_nnetstrfns = sizeof(libcfs_netstrfns)/sizeof(libcfs_netstrfns[0]);
-
-static int
-libcfs_lo_str2addr(char *str, int nob, uint32_t *addr)
-{
- *addr = 0;
- return 1;
-}
-
-static void
-libcfs_ip_addr2str(uint32_t addr, char *str)
-{
- snprintf(str, LNET_NIDSTR_SIZE, "%u.%u.%u.%u",
- (addr >> 24) & 0xff, (addr >> 16) & 0xff,
- (addr >> 8) & 0xff, addr & 0xff);
-}
-
-/* CAVEAT EMPTOR XscanfX
- * I use "%n" at the end of a sscanf format to detect trailing junk. However
- * sscanf may return immediately if it sees the terminating '0' in a string, so
- * I initialise the %n variable to the expected length. If sscanf sets it;
- * fine, if it doesn't, then the scan ended at the end of the string, which is
- * fine too :) */
-
-static int
-libcfs_ip_str2addr(char *str, int nob, uint32_t *addr)
-{
- int a;
- int b;
- int c;
- int d;
- int n = nob; /* XscanfX */
-
- /* numeric IP? */
- if (sscanf(str, "%u.%u.%u.%u%n", &a, &b, &c, &d, &n) >= 4 &&
- n == nob &&
- (a & ~0xff) == 0 && (b & ~0xff) == 0 &&
- (c & ~0xff) == 0 && (d & ~0xff) == 0) {
- *addr = ((a<<24)|(b<<16)|(c<<8)|d);
- return 1;
- }
-
-#ifdef HAVE_GETHOSTBYNAME
- /* known hostname? */
- if (('a' <= str[0] && str[0] <= 'z') ||
- ('A' <= str[0] && str[0] <= 'Z')) {
- char *tmp;
-
- tmp = malloc(nob + 1);
- if (tmp != NULL) {
- struct hostent *he;
-
- memcpy(tmp, str, nob);
- tmp[nob] = 0;
-
- he = gethostbyname(tmp);
-
- free(tmp);
- tmp = NULL;
-
- if (he != NULL) {
- uint32_t ip = *(uint32_t *)he->h_addr;
-
- *addr = ntohl(ip);
- return 1;
- }
- }
- }
-#endif
- return 0;
-}
-
-static void
-libcfs_decnum_addr2str(uint32_t addr, char *str)
-{
- snprintf(str, LNET_NIDSTR_SIZE, "%u", addr);
-}
-
-static void
-libcfs_hexnum_addr2str(uint32_t addr, char *str)
-{
- snprintf(str, LNET_NIDSTR_SIZE, "0x%x", addr);
-}
-
-static int
-libcfs_num_str2addr(char *str, int nob, uint32_t *addr)
-{
- int n;
-
- n = nob;
- if (sscanf(str, "0x%x%n", addr, &n) >= 1 && n == nob)
- return 1;
-
- n = nob;
- if (sscanf(str, "0X%x%n", addr, &n) >= 1 && n == nob)
- return 1;
-
- n = nob;
- if (sscanf(str, "%u%n", addr, &n) >= 1 && n == nob)
- return 1;
-
- return 0;
-}
-
-static struct netstrfns *
-libcfs_lnd2netstrfns(int lnd)
-{
- int i;
-
- if (lnd >= 0)
- for (i = 0; i < libcfs_nnetstrfns; i++)
- if (lnd == libcfs_netstrfns[i].nf_type)
- return &libcfs_netstrfns[i];
-
- return NULL;
-}
-
-static struct netstrfns *
-libcfs_str2net_internal(char *str, uint32_t *net)
-{
- struct netstrfns *nf;
- int nob;
- int netnum;
- int i;
-
- for (i = 0; i < libcfs_nnetstrfns; i++) {
- nf = &libcfs_netstrfns[i];
- if (nf->nf_type >= 0 &&
- !strncmp(str, nf->nf_name, strlen(nf->nf_name)))
- break;
- }
-
- if (i == libcfs_nnetstrfns)
- return NULL;
-
- nob = strlen(nf->nf_name);
-
- if (strlen(str) == (unsigned int)nob) {
- netnum = 0;
- } else {
- if (nf->nf_type == LOLND) /* net number not allowed */
- return NULL;
-
- str += nob;
- i = strlen(str);
- if (sscanf(str, "%u%n", &netnum, &i) < 1 ||
- i != (int)strlen(str))
- return NULL;
- }
-
- *net = LNET_MKNET(nf->nf_type, netnum);
- return nf;
-}
-
-/* FIXME
- * this is duplication in libcfs, but somehow doesn't make into libcfs.a.
- * remove it when libcfs get fixed.
- */
-lnet_nid_t
-libcfs_str2nid(const char *str)
-{
- const char *sep = strchr(str, '@');
- struct netstrfns *nf;
- uint32_t net;
- uint32_t addr;
-
- if (sep != NULL) {
- nf = libcfs_str2net_internal(sep + 1, &net);
- if (nf == NULL)
- return LNET_NID_ANY;
- } else {
- sep = str + strlen(str);
- net = LNET_MKNET(SOCKLND, 0);
- nf = libcfs_lnd2netstrfns(SOCKLND);
- if (!nf)
- return LNET_NID_ANY;
- }
-
- if (!nf->nf_str2addr(str, sep - str, &addr))
- return LNET_NID_ANY;
-
- return LNET_MKNID(net, addr);
-}
-
-/****************************************
* user mapping database handling *
* (very rudiment) *
****************************************/
struct user_map_item *items;
};
-static struct user_mapping mapping = {0, NULL};
+static struct user_mapping mapping;
/* FIXME to be finished: monitor change of mapping database */
static int mapping_mtime = 0;
while ((line = fgets(linebuf, MAX_LINE_LEN, f)) != NULL) {
char *name;
- if (strlen(line) >= MAX_LINE_LEN) {
- printerr(0, "invalid mapping db: line too long (%d)\n",
- strlen(line));
- continue;
- }
-
if (sscanf(line, "%s %s %s", princ, nid_str, dest) != 3) {
printerr(0, "mapping db: syntax error\n");
continue;