4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; If not, see
18 * http://www.gnu.org/licenses/gpl-2.0.html
23 * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
24 * Use is subject to license terms.
27 * This file is part of Lustre, http://www.lustre.org/
29 * lustre/utils/lshowmount.h
31 * Author: Herb Wartens <wartens2@llnl.gov>
32 * Author: Jim Garlick <garlick@llnl.gov>
47 #include <arpa/inet.h>
52 #include <lustre/lustre_user.h>
54 #include "lustreapi_internal.h"
56 #define PROC_UUID_TMPL "%s/%s/uuid"
58 static void print_nids(NIDList nidlist, int lookup, int enumerate, int indent);
59 static int lshowmount(int lookup, int enumerate, int verbose);
60 static void read_exports(char *exports, NIDList nidlist);
64 #define OPTIONS "ehlv"
65 static struct option long_opts[] = {
66 { .val = 'e', .name = "enumerate", .has_arg = no_argument },
67 { .val = 'h', .name = "help", .has_arg = no_argument },
68 { .val = 'l', .name = "lookup", .has_arg = no_argument },
69 { .val = 'v', .name = "verbose", .has_arg = no_argument },
72 static void usage(void)
74 fprintf(stderr, "usage: %s [-e] [-h] [-l] [-v]\n", prog);
78 int main(int argc, char **argv)
85 prog = basename(argv[0]);
87 while ((opt = getopt_long(argc, argv, OPTIONS, long_opts,
90 case 'e': /* --enumerate */
93 case 'l': /* --lookup */
96 case 'v': /* --verbose */
99 case 'h': /* --help */
105 if (lshowmount(lopt, eopt, vopt) == 0) {
106 fprintf(stderr, "%s: lustre server modules not loaded\n", prog);
113 static void print_expname(const char *path)
115 char *hp, buf[PATH_MAX + 1];
117 strncpy(buf, path, PATH_MAX);
118 buf[PATH_MAX] = '\0';
119 hp = strstr(buf, "exports");
120 if (hp && hp > buf) {
122 for (; *hp == '/' && hp > buf; hp--)
124 for (; *hp != '/' && hp > buf; hp--)
126 printf("%s:\n", hp + 1);
130 static void print_nids(NIDList nidlist, int lookup, int enumerate, int indent)
132 char *s, *sep = "\n", *pfx = "";
135 nl_lookup_ip(nidlist);
138 if (nl_count(nidlist) > 0) {
144 s = nl_string(nidlist, sep);
146 s = nl_xstring(nidlist, sep);
147 printf("%s%s\n", pfx, s);
152 static int lshowmount(int lookup, int enumerate, int verbose)
154 NIDList nidlist = NULL;
158 i = get_lustre_param_path("{mgs,mdt,obdfilter}", "*",
159 FILTER_BY_EXACT, "exports", &exp_list);
163 nidlist = nl_create();
164 for (i = 0; i < exp_list.gl_pathc; i++) {
166 nidlist = nl_create();
167 read_exports(exp_list.gl_pathv[i], nidlist);
168 print_expname(exp_list.gl_pathv[i]);
169 print_nids(nidlist, lookup, enumerate, 1);
172 read_exports(exp_list.gl_pathv[i], nidlist);
175 print_nids(nidlist, lookup, enumerate, 0);
178 cfs_free_param_data(&exp_list);
182 static int empty_proc_file(char *path)
188 fd = open(path, O_RDONLY);
189 if (fd < 0 || read(fd, buf, sizeof(buf)) <= 0)
196 static void read_exports(char *exports, NIDList nidlist)
200 char path[PATH_MAX + 1];
202 dirp = opendir(exports);
204 while ((dp = readdir(dirp))) {
205 if (dp->d_type != DT_DIR)
207 if (!strcmp(dp->d_name, "."))
209 if (!strcmp(dp->d_name, ".."))
211 if (strchr(dp->d_name, '@') == NULL)
213 snprintf(path, sizeof(path), PROC_UUID_TMPL, exports,
215 if (empty_proc_file(path))
218 nl_add(nidlist, dp->d_name);