Back out last change; correct fix is in NSH

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3311 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2011-02-23 03:17:29 +00:00
parent ab9715b9c6
commit 7ff5349649
3 changed files with 131 additions and 69 deletions

View File

@ -1,7 +1,7 @@
/****************************************************************************
* examples/nsh/nsh_fscmds.c
*
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
@ -663,6 +663,7 @@ int cmd_losetup(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
bool teardown = false;
bool readonly = false;
off_t offset = 0;
bool badarg = false;
int ret = ERROR;
int option;
@ -695,10 +696,18 @@ int cmd_losetup(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
case '?':
default:
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
return ERROR;
badarg = true;
break;
}
}
/* If a bad argument was encountered, then return without processing the command */
if (badarg)
{
return ERROR;
}
/* If this is not a tear down operation, then additional command line
* parameters are required.
*/
@ -783,6 +792,7 @@ int cmd_ls(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
const char *relpath;
unsigned int lsflags = 0;
char *fullpath;
bool badarg = false;
int ret;
/* Get the ls options */
@ -807,10 +817,18 @@ int cmd_ls(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
case '?':
default:
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
return ERROR;
badarg = true;
break;
}
}
/* If a bad argument was encountered, then return without processing the command */
if (badarg)
{
return ERROR;
}
/* There may be one argument after the options */
if (optind + 1 < argc)
@ -943,6 +961,7 @@ int cmd_mkrd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
const char *fmt;
uint8_t *buffer;
uint32_t nsectors;
bool badarg = false;
int sectsize = 512;
int minor = 0;
int ret;
@ -958,8 +977,8 @@ int cmd_mkrd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
minor = atoi(optarg);
if (minor < 0 || minor > 255)
{
fmt = g_fmtargrange;
goto errout_with_fmt;
nsh_output(vtbl, g_fmtargrange, argv[0]);
badarg = true;
}
break;
@ -967,22 +986,31 @@ int cmd_mkrd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
sectsize = atoi(optarg);
if (minor < 0 || minor > 16384)
{
fmt = g_fmtargrange;
goto errout_with_fmt;
nsh_output(vtbl, g_fmtargrange, argv[0]);
badarg = true;
}
break;
case ':':
fmt = g_fmtargrequired;
goto errout_with_fmt;
nsh_output(vtbl, g_fmtargrequired, argv[0]);
badarg = true;
break;
case '?':
default:
fmt = g_fmtarginvalid;
goto errout_with_fmt;
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
badarg = true;
break;
}
}
/* If a bad argument was encountered, then return without processing the command */
if (badarg)
{
return ERROR;
}
/* There should be exactly on parameter left on the command-line */
if (optind == argc-1)
@ -1043,6 +1071,7 @@ int cmd_mount(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
char *source;
char *target;
char *filesystem = 0;
bool badarg = false;
int ret;
/* Get the mount options */
@ -1058,15 +1087,24 @@ int cmd_mount(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
case ':':
nsh_output(vtbl, g_fmtargrequired, argv[0]);
return ERROR;
badarg = true;
break;
case '?':
default:
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
return ERROR;
badarg = true;
break;
}
}
/* If a bad argument was encountered, then return without processing the command */
if (badarg)
{
return ERROR;
}
/* There are two required arguments after the options */
if (optind + 2 < argc)

View File

@ -1,7 +1,7 @@
/****************************************************************************
* examples/nsh/nsh_netcmds.c
*
* Copyright (C) 2007-2010 Gregory Nutt. All rights reserved.
* Copyright (C) 2007-2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
@ -281,6 +281,7 @@ int tftpc_parseargs(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv,
struct tftpc_args_s *args)
{
FAR const char *fmt = g_fmtarginvalid;
bool badarg = false;
int option;
/* Get the ping options */
@ -306,21 +307,30 @@ int tftpc_parseargs(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv,
if (!uiplib_ipaddrconv(optarg, (FAR unsigned char*)&args->ipaddr))
{
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
goto errout;
badarg = true;
}
break;
case ':':
fmt = g_fmtargrequired;
goto errout;
nsh_output(vtbl, g_fmtargrequired, argv[0]);
badarg = true;
break;
case '?':
default:
fmt = g_fmtarginvalid;
goto errout;
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
badarg = true;
break;
}
}
/* If a bad argument was encountered, then return without processing the command */
if (badarg)
{
return ERROR;
}
/* There should be exactly on parameter left on the command-line */
if (optind == argc-1)
@ -478,6 +488,7 @@ int cmd_ping(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
uint32_t next;
uint32_t dsec = 10;
uint16_t id;
bool badarg = false;
int count = 10;
int option;
int seqno;
@ -496,8 +507,8 @@ int cmd_ping(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
count = atoi(optarg);
if (count < 1 || count > 10000)
{
fmt = g_fmtargrange;
goto errout;
nsh_output(vtbl, g_fmtargrange, argv[0]);
badarg = true;
}
break;
@ -505,21 +516,35 @@ int cmd_ping(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
tmp = atoi(optarg);
if (tmp < 1 || tmp >= 4294)
{
fmt = g_fmtargrange;
goto errout;
nsh_output(vtbl, g_fmtargrange, argv[0]);
badarg = true;
}
else
{
dsec = 10 * tmp;
}
dsec = 10 * tmp;
break;
case ':':
fmt = g_fmtargrequired;
nsh_output(vtbl, g_fmtargrequired, argv[0]);
badarg = true;
break;
case '?':
default:
goto errout;
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
badarg = true;
break;
}
}
/* If a bad argument was encountered, then return without processing the command */
if (badarg)
{
return ERROR;
}
/* There should be exactly on parameter left on the command-line */
if (optind == argc-1)
@ -666,6 +691,7 @@ int cmd_wget(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
char *fullpath = NULL;
char *url;
const char *fmt;
bool badarg = false;
int option;
int fd = -1;
int ret;
@ -681,16 +707,25 @@ int cmd_wget(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv)
break;
case ':':
fmt = g_fmtargrequired;
goto errout;
nsh_output(vtbl, g_fmtargrequired, argv[0]);
badarg = true;
break;
case '?':
default:
fmt = g_fmtarginvalid;
goto errout;
nsh_output(vtbl, g_fmtarginvalid, argv[0]);
badarg = true;
break;
}
}
/* If a bad argument was encountered, then return without processing the command */
if (badarg)
{
return ERROR;
}
/* There should be exactly on parameter left on the command-line */
if (optind == argc-1)

View File

@ -1,7 +1,7 @@
/****************************************************************************
* lib/lib_getopt.c
*
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved.
* Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
@ -85,7 +85,7 @@ static bool g_binitialized = false;
* If there are no more option characters, getopt() returns -1. Then optind
* is the index in argv of the first argv-element that is not an option.
*
* The 'optstring' argument is a string containing the legitimate option
* The 'optstring argument is a string containing the legitimate option
* characters. If such a character is followed by a colon, this indicates
* that the option requires an argument. If an argument is required for an
* option so getopt() places a pointer to the following text in the same
@ -104,19 +104,6 @@ static bool g_binitialized = false;
* first character in optstring: if it is ':', then ':' is returned;
* otherwise '?' is returned.
*
* Assumptions:
* - getopt() uses global varialbles and, hence, can only be used on a single
* thread.
* - This version of getopt() implements a state machine with certain, strict
* rules. If these rules are not obeyed, the state machine will get out of
* sync and incorrect results will occur. The rules:
* 1. getopt() must be called repeatedly until a terminating value is
* returned. Terminating values include: {-1, ?, : }.
* 2. After a terminating value is returned, getopt() resets the global
* data and is ready for the next command line.
* 3. If the program chooses to violate rule #1, it may do so if it sets
* optind == -1.
*
****************************************************************************/
int getopt(int argc, FAR char *const argv[], FAR const char *optstring)
@ -175,6 +162,9 @@ int getopt(int argc, FAR char *const argv[], FAR const char *optstring)
/* There are no more arguments, we are finished */
g_binitialized = false;
/* Return -1 with optind == all of the arguments */
return ERROR;
}
@ -186,38 +176,38 @@ int getopt(int argc, FAR char *const argv[], FAR const char *optstring)
{
/* The argument does not start with '-', we are finished */
g_optptr = NULL;
g_binitialized = false;
/* Return the -1 with optind set to the non-option argument */
return ERROR;
}
/* Skip over the '-' */
g_optptr++;
/* Special case handling of "-" */
if (!*g_optptr)
{
optopt = '\0';
g_binitialized = false;
return '?';
}
}
/* Handle the case of ":" or '?' in the option list. We need to pick
* these off so that the return values cannot be confused with errors.
*/
/* Special case handling of "-" and "-:" */
if (*g_optptr == ':' || *g_optptr == '?')
if (!*g_optptr)
{
optopt = *g_optptr;
g_binitialized = false;
optopt = '\0'; /* We'll fix up g_optptr the next time we are called */
return '?';
}
/* Handle the case of "-:" */
if (*g_optptr == ':')
{
optopt = ':';
g_optptr++;
return '?';
}
/* g_optptr now points at the next option and it is not something crazy
* (like NULL or ? or :). Check if the option is in the list of valid
* options.
/* g_optptr now points at the next option and it is not something crazy.
* check if the option is in the list of valid options.
*/
optchar = strchr(optstring, *g_optptr);
@ -226,7 +216,7 @@ int getopt(int argc, FAR char *const argv[], FAR const char *optstring)
/* No this character is not in the list of valid options */
optopt = *g_optptr;
g_binitialized = false;
g_optptr++;
return '?';
}
@ -242,9 +232,7 @@ int getopt(int argc, FAR char *const argv[], FAR const char *optstring)
return *optchar;
}
/* Yes... It has a required argument. Is the required argument after
* the command in this same argument?
*/
/* Yes. Is the required argument after the command in this same argument? */
if (g_optptr[1] != '\0')
{
@ -270,11 +258,12 @@ int getopt(int argc, FAR char *const argv[], FAR const char *optstring)
/* No argument was supplied */
optarg = NULL;
optopt = *optchar;
g_binitialized = false;
optind++;
return noarg_ret;
}
g_binitialized = false;
optind = 1;
return ERROR;
}