iproute2/rdma/rdma.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
   2/*
   3 * rdma.c       RDMA tool
   4 * Authors:     Leon Romanovsky <leonro@mellanox.com>
   5 */
   6
   7#include "rdma.h"
   8#include "version.h"
   9#include "color.h"
  10
  11static void help(char *name)
  12{
  13        pr_out("Usage: %s [ OPTIONS ] OBJECT { COMMAND | help }\n"
  14               "       %s [ -f[orce] ] -b[atch] filename\n"
  15               "where  OBJECT := { dev | link | resource | system | statistic | help }\n"
  16               "       OPTIONS := { -V[ersion] | -d[etails] | -j[son] | -p[retty] -r[aw]}\n", name, name);
  17}
  18
  19static int cmd_help(struct rd *rd)
  20{
  21        help(rd->filename);
  22        return 0;
  23}
  24
  25static int rd_cmd(struct rd *rd, int argc, char **argv)
  26{
  27        const struct rd_cmd cmds[] = {
  28                { NULL,         cmd_help },
  29                { "help",       cmd_help },
  30                { "dev",        cmd_dev },
  31                { "link",       cmd_link },
  32                { "resource",   cmd_res },
  33                { "system",     cmd_sys },
  34                { "statistic",  cmd_stat },
  35                { 0 }
  36        };
  37
  38        rd->argc = argc;
  39        rd->argv = argv;
  40
  41        return rd_exec_cmd(rd, cmds, "object");
  42}
  43
  44static int rd_batch(struct rd *rd, const char *name, bool force)
  45{
  46        char *line = NULL;
  47        size_t len = 0;
  48        int ret = 0;
  49
  50        if (name && strcmp(name, "-") != 0) {
  51                if (!freopen(name, "r", stdin)) {
  52                        pr_err("Cannot open file \"%s\" for reading: %s\n",
  53                               name, strerror(errno));
  54                        return errno;
  55                }
  56        }
  57
  58        cmdlineno = 0;
  59        while (getcmdline(&line, &len, stdin) != -1) {
  60                char *largv[512];
  61                int largc;
  62
  63                largc = makeargs(line, largv, ARRAY_SIZE(largv));
  64                if (!largc)
  65                        continue;       /* blank line */
  66
  67                ret = rd_cmd(rd, largc, largv);
  68                if (ret) {
  69                        pr_err("Command failed %s:%d\n", name, cmdlineno);
  70                        if (!force)
  71                                break;
  72                }
  73        }
  74
  75        free(line);
  76
  77        return ret;
  78}
  79
  80static int rd_init(struct rd *rd, char *filename)
  81{
  82        uint32_t seq;
  83        int ret;
  84
  85        rd->filename = filename;
  86        INIT_LIST_HEAD(&rd->dev_map_list);
  87        INIT_LIST_HEAD(&rd->filter_list);
  88
  89        rd->buff = malloc(MNL_SOCKET_BUFFER_SIZE);
  90        if (!rd->buff)
  91                return -ENOMEM;
  92
  93        rd_prepare_msg(rd, RDMA_NLDEV_CMD_GET,
  94                       &seq, (NLM_F_REQUEST | NLM_F_ACK | NLM_F_DUMP));
  95        ret = rd_send_msg(rd);
  96        if (ret)
  97                return ret;
  98
  99        return rd_recv_msg(rd, rd_dev_init_cb, rd, seq);
 100}
 101
 102static void rd_cleanup(struct rd *rd)
 103{
 104        rd_free(rd);
 105}
 106
 107int main(int argc, char **argv)
 108{
 109        static const struct option long_options[] = {
 110                { "version",            no_argument,            NULL, 'V' },
 111                { "help",               no_argument,            NULL, 'h' },
 112                { "json",               no_argument,            NULL, 'j' },
 113                { "pretty",             no_argument,            NULL, 'p' },
 114                { "details",            no_argument,            NULL, 'd' },
 115                { "raw",                no_argument,            NULL, 'r' },
 116                { "force",              no_argument,            NULL, 'f' },
 117                { "batch",              required_argument,      NULL, 'b' },
 118                { NULL, 0, NULL, 0 }
 119        };
 120        bool show_driver_details = false;
 121        const char *batch_file = NULL;
 122        bool show_details = false;
 123        bool json_output = false;
 124        bool show_raw = false;
 125        bool force = false;
 126        struct rd rd = {};
 127        char *filename;
 128        int opt;
 129        int err;
 130        filename = basename(argv[0]);
 131
 132        while ((opt = getopt_long(argc, argv, ":Vhdrpjfb:",
 133                                  long_options, NULL)) >= 0) {
 134                switch (opt) {
 135                case 'V':
 136                        printf("%s utility, iproute2-%s\n",
 137                               filename, version);
 138                        return EXIT_SUCCESS;
 139                case 'p':
 140                        pretty = 1;
 141                        break;
 142                case 'd':
 143                        if (show_details)
 144                                show_driver_details = true;
 145                        else
 146                                show_details = true;
 147                        break;
 148                case 'r':
 149                        show_raw = true;
 150                        break;
 151                case 'j':
 152                        json_output = 1;
 153                        break;
 154                case 'f':
 155                        force = true;
 156                        break;
 157                case 'b':
 158                        batch_file = optarg;
 159                        break;
 160                case 'h':
 161                        help(filename);
 162                        return EXIT_SUCCESS;
 163                case ':':
 164                        pr_err("-%c option requires an argument\n", optopt);
 165                        return EXIT_FAILURE;
 166                default:
 167                        pr_err("Unknown option.\n");
 168                        help(filename);
 169                        return EXIT_FAILURE;
 170                }
 171        }
 172
 173        argc -= optind;
 174        argv += optind;
 175
 176        rd.show_details = show_details;
 177        rd.show_driver_details = show_driver_details;
 178        rd.json_output = json_output;
 179        rd.pretty_output = pretty;
 180        rd.show_raw = show_raw;
 181
 182        err = rd_init(&rd, filename);
 183        if (err)
 184                goto out;
 185
 186        if (batch_file)
 187                err = rd_batch(&rd, batch_file, force);
 188        else
 189                err = rd_cmd(&rd, argc, argv);
 190out:
 191        /* Always cleanup */
 192        rd_cleanup(&rd);
 193        return err ? EXIT_FAILURE : EXIT_SUCCESS;
 194}
 195