summaryrefslogtreecommitdiffstats
path: root/bin/sh/var.c
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2012-09-15 21:56:30 +0000
committerjilles <jilles@FreeBSD.org>2012-09-15 21:56:30 +0000
commit99ca87dd2daf11623d11838ece4dba4e0ab94951 (patch)
tree8f1502baabb3376aec513c46c8781c9f452a7b3d /bin/sh/var.c
parent56fd9326eeef1f0702902d3716e1551e76049d94 (diff)
downloadFreeBSD-src-99ca87dd2daf11623d11838ece4dba4e0ab94951.zip
FreeBSD-src-99ca87dd2daf11623d11838ece4dba4e0ab94951.tar.gz
sh: Prefer internal nextopt() to libc getopt().
This reduces code duplication and code size. /usr/bin/printf is not affected. Side effect: different error messages when certain builtins are passed invalid options.
Diffstat (limited to 'bin/sh/var.c')
-rw-r--r--bin/sh/var.c18
1 files changed, 6 insertions, 12 deletions
diff --git a/bin/sh/var.c b/bin/sh/var.c
index 6041459..48a0dc5 100644
--- a/bin/sh/var.c
+++ b/bin/sh/var.c
@@ -640,10 +640,11 @@ showvarscmd(int argc __unused, char **argv __unused)
*/
int
-exportcmd(int argc, char **argv)
+exportcmd(int argc __unused, char **argv)
{
struct var **vpp;
struct var *vp;
+ char **ap;
char *name;
char *p;
char *cmdname;
@@ -651,26 +652,19 @@ exportcmd(int argc, char **argv)
int flag = argv[0][0] == 'r'? VREADONLY : VEXPORT;
cmdname = argv[0];
- optreset = optind = 1;
- opterr = 0;
values = 0;
- while ((ch = getopt(argc, argv, "p")) != -1) {
+ while ((ch = nextopt("p")) != '\0') {
switch (ch) {
case 'p':
values = 1;
break;
- case '?':
- default:
- error("unknown option: -%c", optopt);
}
}
- argc -= optind;
- argv += optind;
- if (values && argc != 0)
+ if (values && *argptr != NULL)
error("-p requires no arguments");
- if (argc != 0) {
- while ((name = *argv++) != NULL) {
+ if (*argptr != NULL) {
+ for (ap = argptr; (name = *ap) != NULL; ap++) {
if ((p = strchr(name, '=')) != NULL) {
p++;
} else {
OpenPOWER on IntegriCloud