[WSD] Change ib_listen to return an error value rather than set it
[mirror/winof/.git] / tools / fwupdate / user / flint-tools.cpp
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  * Copyright (c) 2004-2005 Mellanox Technologies Ltd.  All rights reserved.\r
4  *\r
5  * This software is available to you under the OpenIB.org BSD license\r
6  * below:\r
7  *\r
8  *     Redistribution and use in source and binary forms, with or\r
9  *     without modification, are permitted provided that the following\r
10  *     conditions are met:\r
11  *\r
12  *      - Redistributions of source code must retain the above\r
13  *        copyright notice, this list of conditions and the following\r
14  *        disclaimer.\r
15  *\r
16  *      - Redistributions in binary form must reproduce the above\r
17  *        copyright notice, this list of conditions and the following\r
18  *        disclaimer in the documentation and/or other materials\r
19  *        provided with the distribution.\r
20  *\r
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
22  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
23  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
24  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
25  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
26  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
27  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
28  * SOFTWARE.\r
29  *\r
30  * $Id$\r
31  */\r
32 \r
33 #include <string.h>\r
34 #include <stdio.h>\r
35 #include <stdlib.h>\r
36 #include "flint-tools.h"\r
37 \r
38 FlashCommandLine::FlashCommandLine()\r
39 {\r
40     initialize();\r
41 }\r
42 \r
43 FlashCommandLine::FlashCommandLine(int argc, char **argv)\r
44 {\r
45     initialize();\r
46     parse(argc, argv);\r
47 }\r
48 \r
49 void FlashCommandLine::initialize()\r
50 {\r
51     m_options = no_prompts;\r
52     m_usedefaultdevice = true; // use the default device name\r
53     m_readguidsfromflash = true; // read the current guids from the flash  \r
54     m_isFlashDeviceOption = false;\r
55     //m_device[MAXPATHLEN];\r
56     m_defaultdevice = "//mt23108_pciconf"; // default the device for now\r
57     //m_nodeguidstr[MAXPATHLEN];\r
58     //m_rawfile[MAXPATHLEN]; \r
59 }\r
60 \r
61 bool FlashCommandLine::isOption(Options opt)\r
62 {\r
63     return ((m_options & opt)==opt);\r
64 }\r
65 \r
66 bool FlashCommandLine::isFlashDeviceOption(void)\r
67 {\r
68     return (m_isFlashDeviceOption);\r
69 }\r
70 \r
71 static char                     optarg[MAXPATHLEN];\r
72         static struct option long_options[] = \r
73         {\r
74            {"noquery"        , 0, 0, 'q'},\r
75            {"silent"         , 0, 0, 's'},\r
76            {"burn"           , 0, 0, 'b'},\r
77            {"debug"          , 0, 0, 'x'},\r
78            {"dump-flash"     , 0, 0, 'p'},\r
79            {"dump-image"     , 0, 0, 'z'},\r
80            {"device"         , 1, 0, 'd'},\r
81            {"guid"           , 1, 0, 'n'},\r
82            {"noverify"       , 0, 0, 'y'},\r
83            {"verify-flash"   , 0, 0, 'v'},\r
84            {"verify-image"   , 0, 0, 'g'},\r
85            {"image-info"     , 0, 0, 'i'},\r
86            {"flash-info"     , 0, 0, 'j'},\r
87            {"no-prompts"     , 0, 0, 'k'},\r
88            {"prompt"         , 0, 0, 'l'},\r
89            {"write-file"     , 1, 0, 'w'},\r
90            {"force"          , 0, 0, 'f'},\r
91            {"flash-format"   , 0, 0, 'A'},\r
92            {"nobestdevice"   , 0, 0, 'c'},\r
93            {"burn-invariant" , 0, 0, 'B'},\r
94            {"help"           , 0, 0, 'h'},\r
95            {0, 0, 0, 0}\r
96         };\r
97         static char *short_options="qsbxpzdnyvgijwfcBh";\r
98 \r
99 \r
100 char getopt_long(\r
101         int                             argc,\r
102         char                            *argv[],\r
103         const char                      *short_option,\r
104         const struct option *long_option,\r
105         void                            *unused )\r
106 {\r
107         static int i = 1;\r
108         char            ret = -1;\r
109 \r
110         UNUSED_PARAM( unused );\r
111         \r
112         if ( i == argc )\r
113                 return ret;\r
114 \r
115         if( argv[i][0] != '-' )\r
116                 return ret;\r
117         \r
118         if ( isalpha(argv[i][1]))\r
119         {\r
120                 ret = argv[i][1];\r
121                 char *tmp_buf = &argv[i][2];\r
122                 \r
123                 for(;;)\r
124                 {\r
125                         if ( *tmp_buf == '\0')\r
126                         {\r
127                                 i++;\r
128                                 tmp_buf = &argv[i][0];\r
129                         }\r
130 \r
131                         if (  *tmp_buf != '-' )\r
132                         {\r
133                                 \r
134                                 if (isalnum( *tmp_buf ) )\r
135                                 {\r
136                                         sscanf(argv[i],"%s", &optarg);\r
137                                         return ret;\r
138                                 }\r
139                         }\r
140                         return ret;\r
141                 }\r
142         }\r
143         return ret;\r
144 }\r
145 \r
146 int32_t FlashCommandLine::parse(int argc, char **argv)\r
147 {\r
148     int opt; \r
149     bool rawFileRequired=false;\r
150         int i = 0;\r
151 \r
152         cl_memset (m_device,0, MAXPATHLEN );\r
153         cl_memset (m_rawfile,0, MAXPATHLEN );\r
154     strncpy(m_program, argv[0], MAXPATHLEN);\r
155         strncpy(m_device, m_defaultdevice, MAXPATHLEN); // set the device name to the default\r
156         \r
157 \r
158     // process the FlashCommandLine to determine desired actions\r
159     if (argc < 2)\r
160     {\r
161         usage(argv[0]);\r
162         return -1;\r
163     }\r
164 \r
165     while (1) \r
166     {\r
167         int option_index = 0;\r
168                 cl_memset (optarg, 0, sizeof(optarg));\r
169                 if (++i >= argc )\r
170                         return 1;\r
171                 \r
172                 //opt = getopt_long (argc, argv, short_options , long_options, &option_index);\r
173                 opt = argv[i][1];\r
174                 if (argv[i][2] != '\0')\r
175                         cl_memcpy(optarg, &argv[i][2], min( strlen(argv[i]), MAXPATHLEN));\r
176                 if ( ++i < argc && argv[i][0] != '-' )\r
177                 {\r
178                         cl_memcpy(optarg, &argv[i][0], min( strlen(argv[i]), MAXPATHLEN));\r
179                 }\r
180                         \r
181         if (opt == -1)\r
182            break;\r
183         \r
184         switch (opt) \r
185         {\r
186             case 'q':\r
187                 m_options |= noquery; // query and show guids, no write\r
188                 break;\r
189             case 'b':\r
190                 m_options |= burn; // query and show guids, no write\r
191                 m_isFlashDeviceOption = true;\r
192                 rawFileRequired=true;\r
193                 break;\r
194             case 'd':\r
195                 m_usedefaultdevice=false; // don't use the default device\r
196                 //m_options |= disable_bestdevice; \r
197                 //strncpy(m_device, optarg, MAXPATHLEN); // set the device name\r
198                                 strncpy(m_device, m_defaultdevice, MAXPATHLEN); // use default - we don't export device name so far\r
199                 break;           \r
200             case 'n':\r
201                 m_readguidsfromflash=false;\r
202                 strncpy(m_nodeguidstr, optarg, MAXPATHLEN); // set the node guid string\r
203                 break;            \r
204             case 's':\r
205                 m_options |= silent; // be very quite\r
206                 break;\r
207             case 'x':\r
208                 m_options |= debug; // be very noisy\r
209                 break;\r
210             case 'y':\r
211                 m_options ^= verify_flash;               \r
212                 m_isFlashDeviceOption = true;\r
213                 break;\r
214             case 'v':\r
215                 m_options |= verify_flash;                 \r
216                 m_isFlashDeviceOption = true;\r
217                 break;\r
218             case 'g':\r
219                 m_options |= verify_image; \r
220                 rawFileRequired=true;\r
221                                 strncpy(m_rawfile, optarg, min(strlen (optarg),MAXPATHLEN));\r
222                 break;\r
223             case 'p':\r
224                 m_options |= dump_flash;\r
225                 m_isFlashDeviceOption = true;\r
226                 break;\r
227             case 'z':\r
228                 m_options |= dump_image; \r
229                 rawFileRequired=true;\r
230                                 strncpy(m_rawfile, optarg, min(strlen (optarg),MAXPATHLEN));\r
231                 break;            \r
232             case 'i':\r
233                 m_options |= show_image_info; \r
234                 rawFileRequired = true;\r
235                 break;            \r
236             case 'j':\r
237                 m_options |= show_flash_info; \r
238                 m_isFlashDeviceOption = true;\r
239                 break;\r
240             case 'k':\r
241                 break;  // obsolete be silent about for backward support\r
242             case 'l':\r
243                 m_options ^= no_prompts; \r
244                 break;\r
245             case 'f':\r
246                 m_options |= force; \r
247                 break;\r
248             case 'A':\r
249                 m_options |= flash_format;\r
250                 m_isFlashDeviceOption = true;\r
251                 break;\r
252             case 'w':\r
253                 strncpy(m_revision, optarg, revisionStringLength); // set the node guid string\r
254                 m_options |= write_file;\r
255                 rawFileRequired=true;\r
256                 break;\r
257             case 'c':\r
258                 m_options |= disable_bestdevice; \r
259                 break;\r
260             case 'B':\r
261                 m_options |= burn_invariant_section; \r
262                 break;            \r
263             case 'h': // display some useful usage information           \r
264             default:\r
265                 usage(argv[0]);\r
266                 exit(-1);\r
267         } // end case\r
268 \r
269                 if ( rawFileRequired && m_rawfile[0] == '\0' )\r
270                 {\r
271                         cl_memcpy(m_rawfile, optarg, min(strlen (optarg),MAXPATHLEN));\r
272                         if ( strlen (m_rawfile ) == 0 )\r
273                         {\r
274                                 fprintf(stderr, "Empty firmware filename.\n");\r
275                         usage(argv[0]);\r
276                         exit(-1);\r
277                         }\r
278                 }\r
279     } // end while\r
280 \r
281     return 1;\r
282 }\r
283 \r
284 uint8_t FlashCommandLine::getOptions()\r
285 {\r
286     return (uint8_t)m_options;\r
287 }\r
288 \r
289 char *FlashCommandLine::getProgramName()\r
290 {\r
291     return m_program;\r
292 }\r
293 \r
294 \r
295 char *FlashCommandLine::getDeviceName()\r
296 {\r
297     return m_device;\r
298 }\r
299 \r
300 char *FlashCommandLine::getDefaultDeviceName()\r
301 {\r
302     return m_defaultdevice;\r
303 }\r
304 \r
305 char *FlashCommandLine::getNodeGUID()\r
306 {\r
307     return m_nodeguidstr;\r
308 }\r
309 \r
310 char *FlashCommandLine::getRawFileName()\r
311 {\r
312     return m_rawfile;\r
313 }\r
314 \r
315 char *FlashCommandLine::getRevisionString()\r
316 {\r
317     return m_revision;\r
318 }\r
319 \r
320 \r
321 bool FlashCommandLine::useDefaultDevice()\r
322 {\r
323     return m_usedefaultdevice;\r
324 }\r
325 \r
326 bool FlashCommandLine::useFlashNodeGUID()\r
327 {\r
328     return m_readguidsfromflash;\r
329 }\r
330 \r
331 \r
332 void FlashCommandLine::usage(const char *progname)\r
333 {\r
334     char *rversion = "$Revision$";\r
335     char version[128];\r
336     uint32_t x;\r
337 \r
338     for (x=0;x<128;x++)\r
339     {\r
340         if (rversion[x+11] == '$')\r
341         {\r
342             break;\r
343         }\r
344         version[x] = rversion[x+11];\r
345     }\r
346 \r
347     fprintf(stdout, "usage: %s [-b][-q][-x][-p][-z][-d device][-n 0x0000000000000000]\n"                    \r
348                     "                   [-v][-g][-i][-w revision][-h][-c][raw-firmware-file]\n"\r
349                     "version: %s\n"\r
350                     "  --noquery       |-q  - do not query device guids\n"\r
351                     "  --burn          |-b  - burn raw image file to flash device\n"\r
352                     "  --debug         |-x  - enable debug mode\n"\r
353                     "  --dump-flash    |-p  - dump flash image to stdout\n"\r
354                     "  --dump-image    |-z  - dump raw file image to stdout\n"\r
355                     "  --device        |-d  - the hca configuration device (*_pciconf# or *_cr#)\n"\r
356                     "  --guid          |-n  - the 64 bit GUID to use for the hca device\n"\r
357                     "  --verify-flash  |-v  - verify the flash image\n"\r
358                     "  --verify-image  |-g  - verify the raw file image\n"\r
359                     "  --image-info    |-i  - display raw file image information\n"\r
360                     "  --flash-info    |-j  - display flash image information\n"                   \r
361                     "  --prompts       |-l  - at decision points prompt the end user\n"\r
362                     "  --write-file    |-w  - write image to file injecting the VSD section\n"\r
363                     "  --nobestdevice  |-c  - use exactly the device the -d option specified\n"\r
364                     "  --burn-invariant|-B  - burn the invariant section\n"\r
365                     "  --help          |-h  - this usage clause\n",\r
366                     progname, version);\r
367 }\r
368 \r