[Settings] show_setting() functions return snprintf()-style length.
[people/mdeck/gpxe.git] / src / hci / commands / nvo_cmd.c
1 #include <stdint.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <string.h>
5 #include <errno.h>
6 #include <getopt.h>
7 #include <gpxe/nvo.h>
8 #include <gpxe/dhcp.h>
9 #include <gpxe/settings.h>
10 #include <gpxe/command.h>
11
12 extern struct nvo_block *ugly_nvo_hack;
13
14 static int show_exec ( int argc, char **argv ) {
15         struct config_context dummy_context;
16         char buf[256];
17         int rc;
18
19         if ( ! ugly_nvo_hack ) {
20                 printf ( "No non-volatile option storage available\n" );
21                 return 1;
22         }
23
24         if ( argc != 2 ) {
25                 printf ( "Syntax: %s <identifier>\n", argv[0] );
26                 return 1;
27         }
28
29         dummy_context.options = ugly_nvo_hack->options;
30         if ( ( rc = show_named_setting ( &dummy_context, argv[1], buf,
31                                          sizeof ( buf ) ) ) < 0 ) {
32                 printf ( "Could not find \"%s\": %s\n",
33                          argv[1], strerror ( -rc ) );
34                 return 1;
35         }
36
37         printf ( "%s = %s\n", argv[1], buf );
38         return 0;
39 }
40
41 static int set_exec ( int argc, char **argv ) {
42         struct config_context dummy_context;
43         int rc;
44
45         if ( ! ugly_nvo_hack ) {
46                 printf ( "No non-volatile option storage available\n" );
47                 return 1;
48         }
49
50         if ( argc != 3 ) {
51                 printf ( "Syntax: %s <identifier> <value>\n",
52                          argv[0] );
53                 return 1;
54         }
55
56         dummy_context.options = ugly_nvo_hack->options;
57         if ( ( rc = set_named_setting ( &dummy_context, argv[1],
58                                         argv[2] ) ) != 0 ) {
59                 printf ( "Could not set \"%s\"=\"%s\": %s\n",
60                          argv[1], argv[2], strerror ( -rc ) );
61                 return 1;
62         }
63         
64         if ( nvo_save ( ugly_nvo_hack ) != 0 ) {
65                 printf ( "Could not save options to non-volatile storage\n" );
66                 return 1;
67         }
68
69         return 0;
70 }
71
72 static int clear_exec ( int argc, char **argv ) {
73         struct config_context dummy_context;
74         int rc;
75
76         if ( ! ugly_nvo_hack ) {
77                 printf ( "No non-volatile option storage available\n" );
78                 return 1;
79         }
80
81         if ( argc != 2 ) {
82                 printf ( "Syntax: %s <identifier>\n",
83                          argv[0] );
84                 return 1;
85         }
86
87         dummy_context.options = ugly_nvo_hack->options;
88         if ( ( rc = clear_named_setting ( &dummy_context, argv[1] ) ) != 0 ) {
89                 printf ( "Could not clear \"%s\": %s\n",
90                          argv[1], strerror ( -rc ) );
91                 return 1;
92         }
93         
94         return 0;
95 }
96
97 struct command nvo_commands[] __command = {
98         {
99                 .name = "show",
100                 .exec = show_exec,
101         },
102         {
103                 .name = "set",
104                 .exec = set_exec,
105         },      
106         {
107                 .name = "clear",
108                 .exec = clear_exec,
109         },
110 };