source: bootcd/isolinux/syslinux-6.03/gpxe/src/hci/commands/ifmgmt_cmd.c

Last change on this file was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 4.0 KB
Line 
1/*
2 * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19FILE_LICENCE ( GPL2_OR_LATER );
20
21#include <stdio.h>
22#include <getopt.h>
23#include <gpxe/netdevice.h>
24#include <gpxe/command.h>
25#include <usr/ifmgmt.h>
26#include <hci/ifmgmt_cmd.h>
27
28/** @file
29 *
30 * Network interface management commands
31 *
32 */
33
34/** Options shared by all if<xxx> commands */
35static struct option ifcommon_longopts[] = {
36        { "help", 0, NULL, 'h' },
37        { NULL, 0, NULL, 0 },
38};
39
40/**
41 * Print syntax of if<xxx> command
42 *
43 * @v argv              Command arguments
44 * @v verb              Verb describing the action of the command
45 */
46static void ifcommon_syntax ( char **argv, const char *verb ) {
47        printf ( "Usage:\n"
48                 "  %s [<interface>] [<interface>...]\n"
49                 "\n"
50                 "%s the specified network interfaces\n",
51                 argv[0], verb );
52}
53
54/**
55 * Execute if<xxx> command over all network devices
56 *
57 * @v payload           Command to execute
58 * @ret rc              Exit code
59 */
60static int ifcommon_do_all ( int ( * payload ) ( struct net_device * ) ) {
61        struct net_device *netdev;
62        int rc = 0;
63
64        /* Execute payload for each network device */
65        for_each_netdev ( netdev ) {
66                if ( payload ( netdev ) != 0 )
67                        rc = 1;
68        }
69        return rc;
70}
71
72/**
73 * Execute if<xxx> command over list of network devices
74 *
75 * @v payload           Command to execute
76 * @ret rc              Exit code
77 */
78static int ifcommon_do_list ( int ( * payload ) ( struct net_device * ),
79                              char **list, unsigned int count ) {
80        const char *netdev_name;
81        struct net_device *netdev;
82        int rc = 0;
83
84        while ( count-- ) {
85                netdev_name = *(list++);
86                netdev = find_netdev ( netdev_name );
87                if ( ! netdev ) {
88                        printf ( "%s: no such interface\n", netdev_name );
89                        rc = 1;
90                        continue;
91                }
92                if ( payload ( netdev ) != 0 )
93                        rc = 1;
94        }
95        return rc;
96}
97
98/**
99 * Execute if<xxx> command
100 *
101 * @v argc              Argument count
102 * @v argv              Argument list
103 * @v payload           Command to execute
104 * @v verb              Verb describing the action of the command
105 * @ret rc              Exit code
106 */
107int ifcommon_exec ( int argc, char **argv,
108                    int ( * payload ) ( struct net_device * ),
109                    const char *verb ) {
110        int c;
111
112        /* Parse options */
113        while ( ( c = getopt_long ( argc, argv, "h", ifcommon_longopts,
114                                    NULL ) ) >= 0 ) {
115                switch ( c ) {
116                case 'h':
117                        /* Display help text */
118                default:
119                        /* Unrecognised/invalid option */
120                        ifcommon_syntax ( argv, verb );
121                        return 1;
122                }
123        }
124
125        if ( optind == argc ) {
126                return ifcommon_do_all ( payload );
127        } else {
128                return ifcommon_do_list ( payload, &argv[optind],
129                                          ( argc - optind ) );
130        }
131}
132
133/* "ifopen" command */
134
135static int ifopen_payload ( struct net_device *netdev ) {
136        return ifopen ( netdev );
137}
138
139static int ifopen_exec ( int argc, char **argv ) {
140        return ifcommon_exec ( argc, argv, ifopen_payload, "Open" );
141}
142
143/* "ifclose" command */
144
145static int ifclose_payload ( struct net_device *netdev ) {
146        ifclose ( netdev );
147        return 0;
148}
149
150static int ifclose_exec ( int argc, char **argv ) {
151        return ifcommon_exec ( argc, argv, ifclose_payload, "Close" );
152}
153
154/* "ifstat" command */
155
156static int ifstat_payload ( struct net_device *netdev ) {
157        ifstat ( netdev );
158        return 0;
159}
160
161static int ifstat_exec ( int argc, char **argv ) {
162        return ifcommon_exec ( argc, argv,
163                               ifstat_payload, "Display status of" );
164}
165
166/** Interface management commands */
167struct command ifmgmt_commands[] __command = {
168        {
169                .name = "ifopen",
170                .exec = ifopen_exec,
171        },
172        {
173                .name = "ifclose",
174                .exec = ifclose_exec,
175        },
176        {
177                .name = "ifstat",
178                .exec = ifstat_exec,
179        },
180};
Note: See TracBrowser for help on using the repository browser.