Warnings purge: src/{crypto,hci,net}
[people/pcmattman/gpxe.git] / src / hci / commands / dhcp_cmd.c
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
19 #include <stdio.h>
20 #include <stdint.h>
21 #include <stdlib.h>
22 #include <stdio.h>
23 #include <errno.h>
24 #include <stddef.h>
25 #include <string.h>
26 #include <assert.h>
27 #include <getopt.h>
28 #include <gpxe/netdevice.h>
29 #include <gpxe/command.h>
30 #include <usr/dhcpmgmt.h>
31
32 /** @file
33  *
34  * DHCP management commands
35  *
36  */
37
38 /**
39  * "dhcp" command syntax message
40  *
41  * @v argv              Argument list
42  */
43 static void dhcp_syntax ( char **argv ) {
44         printf ( "Usage:\n"
45                  "  %s <interface>\n"
46                  "\n"
47                  "Configure a network interface using DHCP\n",
48                  argv[0] );
49 }
50
51 /**
52  * The "dhcp" command
53  *
54  * @v argc              Argument count
55  * @v argv              Argument list
56  * @ret rc              Exit code
57  */
58 static int dhcp_exec ( int argc, char **argv ) {
59         static struct option longopts[] = {
60                 { "help", 0, NULL, 'h' },
61                 { NULL, 0, NULL, 0 },
62         };
63         const char *name;
64         struct net_device *netdev;
65         int c;
66         int rc;
67
68         /* Parse options */
69         while ( ( c = getopt_long ( argc, argv, "h", longopts, NULL ) ) >= 0 ){
70                 switch ( c ) {
71                 case 'h':
72                         /* Display help text */
73                 default:
74                         /* Unrecognised/invalid option */
75                         dhcp_syntax ( argv );
76                         return 1;
77                 }
78         }
79
80         /* Need exactly one interface name remaining after the options */
81         if ( optind != ( argc - 1 ) ) {
82                 dhcp_syntax ( argv );
83                 return 1;
84         }
85         name = argv[optind];
86
87         /* Perform DHCP */
88         netdev = find_netdev ( name );
89         if ( ! netdev ) {
90                 printf ( "No such interface: %s\n", name );
91                 return 1;
92         }
93         if ( ( rc = dhcp ( netdev ) ) != 0 ) {
94                 printf ( "Could not configure %s: %s\n", netdev->name,
95                          strerror ( rc ) );
96                 return 1;
97         }
98
99         return 0;
100 }
101
102 /** DHCP management commands */
103 struct command dhcp_commands[] __command = {
104         {
105                 .name = "dhcp",
106                 .exec = dhcp_exec,
107         },
108 };