blob: 357a6476bad7bff550d23cbe0e1b4744bab6d2e4 [file] [log] [blame]
Junxiao Shi6c135622016-11-21 14:30:33 +00001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesaventoe0bae0f2018-02-17 22:07:52 -05002/*
Davide Pesaventoa3a7a4e2022-05-29 16:06:22 -04003 * Copyright (c) 2014-2022, Regents of the University of California,
Junxiao Shi6c135622016-11-21 14:30:33 +00004 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology,
9 * The University of Memphis.
10 *
11 * This file is part of NFD (Named Data Networking Forwarding Daemon).
12 * See AUTHORS.md for complete list of NFD authors and contributors.
13 *
14 * NFD is free software: you can redistribute it and/or modify it under the terms
15 * of the GNU General Public License as published by the Free Software Foundation,
16 * either version 3 of the License, or (at your option) any later version.
17 *
18 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20 * PURPOSE. See the GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along with
23 * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
24 */
25
26#include "help.hpp"
27#include "format-helpers.hpp"
Davide Pesaventoe0bae0f2018-02-17 22:07:52 -050028
Junxiao Shi6c135622016-11-21 14:30:33 +000029#include <ndn-cxx/util/logger.hpp>
Davide Pesaventoe0bae0f2018-02-17 22:07:52 -050030
Davide Pesavento2a588152018-02-19 18:10:03 -050031#include <cerrno>
32#include <cstring>
Junxiao Shi6c135622016-11-21 14:30:33 +000033#include <unistd.h>
34
Davide Pesaventoe422f9e2022-06-03 01:30:23 -040035namespace nfd::tools::nfdc {
Junxiao Shi6c135622016-11-21 14:30:33 +000036
37NDN_LOG_INIT(nfdc.Help);
38
Davide Pesaventoa3a7a4e2022-05-29 16:06:22 -040039constexpr int LIST_COMMAND_NAME_COLUMN_WIDTH = 16;
Junxiao Shi6c135622016-11-21 14:30:33 +000040
41void
Davide Pesaventoa3a7a4e2022-05-29 16:06:22 -040042helpList(std::ostream& os, const CommandParser& parser, ParseMode mode, std::string_view noun)
Junxiao Shi6c135622016-11-21 14:30:33 +000043{
Alexander Afanasyevc414ca52021-06-09 12:15:19 -040044 os << "nfdc [-h|--help] [-V|--version] [-f|--batch <batch-file>] [<command> [<args>]]\n\n";
Junxiao Shi6c135622016-11-21 14:30:33 +000045 if (noun.empty()) {
46 os << "All subcommands:\n";
47 }
48 else {
49 os << "Subcommands starting with " << noun << ":\n";
50 }
51
52 std::vector<const CommandDefinition*> commands = parser.listCommands(noun, mode);
53 if (commands.empty()) {
54 os << " (none)\n";
55 return;
56 }
57
58 for (auto def : commands) {
59 os << " " << def->getNoun() << ' ' << def->getVerb() << ' '
60 << text::Spaces{static_cast<int>(LIST_COMMAND_NAME_COLUMN_WIDTH -
61 def->getNoun().size() - def->getVerb().size() - 2)}
62 << def->getTitle() << '\n';
63 }
64
65 os << "\nSee 'nfdc help <command>' to read about a specific subcommand.\n";
66}
67
Junxiao Shi88a062d2017-01-26 03:10:05 +000068static void
Davide Pesaventoe0bae0f2018-02-17 22:07:52 -050069helpCommand(const std::string& noun, const std::string& verb)
Junxiao Shi6c135622016-11-21 14:30:33 +000070{
Davide Pesaventoa3a7a4e2022-05-29 16:06:22 -040071 const std::string manpage = "nfdc-" + noun;
Junxiao Shi6c135622016-11-21 14:30:33 +000072
Davide Pesaventoe0bae0f2018-02-17 22:07:52 -050073 ::execlp("man", "man", manpage.data(), nullptr);
Davide Pesavento2a588152018-02-19 18:10:03 -050074 NDN_LOG_FATAL("Error opening man page for " << manpage << ": " << std::strerror(errno));
Junxiao Shi6c135622016-11-21 14:30:33 +000075}
76
Davide Pesavento2a588152018-02-19 18:10:03 -050077int
78help(std::ostream& os, const CommandParser& parser, std::vector<std::string> args)
Junxiao Shi6c135622016-11-21 14:30:33 +000079{
Davide Pesaventoa3a7a4e2022-05-29 16:06:22 -040080 const auto helpOpts = {"help"sv, "--help"sv, "-h"sv};
Davide Pesavento2a588152018-02-19 18:10:03 -050081 auto it = std::find_first_of(args.begin(), args.end(), helpOpts.begin(), helpOpts.end());
82 if (it == args.end())
83 return 2;
84
85 args.erase(it);
86 auto noun = args.size() > 0 ? args[0] : "";
87 auto verb = args.size() > 1 ? args[1] : "";
Junxiao Shi6c135622016-11-21 14:30:33 +000088
89 if (noun.empty()) {
Davide Pesavento2a588152018-02-19 18:10:03 -050090 helpList(os, parser);
91 return 0;
Junxiao Shi6c135622016-11-21 14:30:33 +000092 }
93 else {
Davide Pesaventoe0bae0f2018-02-17 22:07:52 -050094 helpCommand(noun, verb); // should not return
Davide Pesavento2a588152018-02-19 18:10:03 -050095 return 1;
Junxiao Shi6c135622016-11-21 14:30:33 +000096 }
97}
98
Davide Pesaventoe422f9e2022-06-03 01:30:23 -040099} // namespace nfd::tools::nfdc