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_options[] = {
66 {"enumerate", no_argument, 0, 'e'},
67 {"help", no_argument, 0, 'h'},
68 {"lookup", no_argument, 0, 'l'},
69 {"verbose", no_argument, 0, 'v'},
73 static void usage(void)
75 fprintf(stderr, "usage: %s [-e] [-h] [-l] [-v]\n", prog);
79 int main(int argc, char **argv)
86 prog = basename(argv[0]);
88 while ((opt = getopt_long(argc, argv, OPTIONS, long_options,
91 case 'e': /* --enumerate */
94 case 'l': /* --lookup */
97 case 'v': /* --verbose */
100 case 'h': /* --help */
106 if (lshowmount(lopt, eopt, vopt) == 0) {
107 fprintf(stderr, "%s: lustre server modules not loaded\n", prog);
114 static void print_expname(const char *path)
116 char *hp, buf[PATH_MAX + 1];
118 strncpy(buf, path, PATH_MAX);
119 buf[PATH_MAX] = '\0';
120 hp = strstr(buf, "exports");
121 if (hp && hp > buf) {
123 for (; *hp == '/' && hp > buf; hp--)
125 for (; *hp != '/' && hp > buf; hp--)
127 printf("%s:\n", hp + 1);
131 static void print_nids(NIDList nidlist, int lookup, int enumerate, int indent)
133 char *s, *sep = "\n", *pfx = "";
136 nl_lookup_ip(nidlist);
139 if (nl_count(nidlist) > 0) {
145 s = nl_string(nidlist, sep);
147 s = nl_xstring(nidlist, sep);
148 printf("%s%s\n", pfx, s);
153 static int lshowmount(int lookup, int enumerate, int verbose)
155 NIDList nidlist = NULL;
159 i = get_lustre_param_path("{mgs,mdt,obdfilter}", "*",
160 FILTER_BY_EXACT, "exports", &exp_list);
164 nidlist = nl_create();
165 for (i = 0; i < exp_list.gl_pathc; i++) {
167 nidlist = nl_create();
168 read_exports(exp_list.gl_pathv[i], nidlist);
169 print_expname(exp_list.gl_pathv[i]);
170 print_nids(nidlist, lookup, enumerate, 1);
173 read_exports(exp_list.gl_pathv[i], nidlist);
176 print_nids(nidlist, lookup, enumerate, 0);
179 cfs_free_param_data(&exp_list);
183 static int empty_proc_file(char *path)
189 fd = open(path, O_RDONLY);
190 if (fd < 0 || read(fd, buf, sizeof(buf)) <= 0)
197 static void read_exports(char *exports, NIDList nidlist)
201 char path[PATH_MAX + 1];
203 dirp = opendir(exports);
205 while ((dp = readdir(dirp))) {
206 if (dp->d_type != DT_DIR)
208 if (!strcmp(dp->d_name, "."))
210 if (!strcmp(dp->d_name, ".."))
212 if (strchr(dp->d_name, '@') == NULL)
214 snprintf(path, sizeof(path), PROC_UUID_TMPL, exports,
216 if (empty_proc_file(path))
219 nl_add(nidlist, dp->d_name);