summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2008-12-10 20:25:42 +0000
committerNicholas Marriott <nicholas.marriott@gmail.com>2008-12-10 20:25:42 +0000
commit5c3d973a4ae3b94db65a8198759ea911a6e097e8 (patch)
tree6d1d0b317a5c7fde6864f22cf58d83e1fb790ff0
parent3b2859e9dcebc268241f76eec9a1b80b2dc3e129 (diff)
Import OpenBSD's getopt(3) to workaround broken glibc version.
-rw-r--r--CHANGES12
-rw-r--r--GNUmakefile13
-rw-r--r--Makefile4
-rw-r--r--cmd-attach-session.c4
-rw-r--r--cmd-bind-key.c6
-rw-r--r--cmd-delete-buffer.c3
-rw-r--r--cmd-generic.c11
-rw-r--r--cmd-link-window.c3
-rw-r--r--cmd-move-window.c3
-rw-r--r--cmd-new-session.c6
-rw-r--r--cmd-new-window.c5
-rw-r--r--cmd-rename-session.c3
-rw-r--r--cmd-rename-window.c3
-rw-r--r--cmd-select-window.c3
-rw-r--r--cmd-send-keys.c5
-rw-r--r--cmd-set-buffer.c3
-rw-r--r--cmd-set-option.c3
-rw-r--r--cmd-set-window-option.c3
-rw-r--r--cmd-show-buffer.c3
-rw-r--r--cmd-show-options.c3
-rw-r--r--cmd-show-window-options.c3
-rw-r--r--cmd-swap-window.c3
-rw-r--r--cmd-switch-client.c5
-rw-r--r--cmd-unbind-key.c6
-rw-r--r--cmd.c8
-rw-r--r--compat/getopt.h78
-rw-r--r--compat/getopt_long.c519
-rw-r--r--tmux.c4
-rw-r--r--tmux.h8
29 files changed, 659 insertions, 74 deletions
diff --git a/CHANGES b/CHANGES
index a9bf027b..6c86011b 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,13 @@
+10 December 2008
+
+* glibc's getopt(3) is useless: it is not POSIX compliant without jumping through
+ non-portable hoops, and the method of resetting it is unclear (the man page
+ on my system says set optind to 1, but other sources say 0). So, import
+ OpenBSD's getopt_long.c into compat/ for use on Linux and use the clearly
+ documented optreset = optind = 1 method. This fixes some strange issues
+ with command parsing (getting the syntax would prevent any further commands
+ being parsed).
+
06 December 2008
* Bring set/setw/show/showw into line with other commands. This means that by
@@ -762,7 +772,7 @@
(including mutt, emacs). No status bar yet and no key remapping or other
customisation.
-$Id: CHANGES,v 1.170 2008-12-08 16:19:51 nicm Exp $
+$Id: CHANGES,v 1.171 2008-12-10 20:25:41 nicm Exp $
LocalWords: showw utf UTF fulvio ciriaco joshe OSC APC gettime abc DEF OA clr
LocalWords: rivo nurges lscm Erdely eol smysession mysession ek dstname RB
diff --git a/GNUmakefile b/GNUmakefile
index eaf27ff8..5753eb7b 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -1,4 +1,4 @@
-# $Id: GNUmakefile,v 1.43 2008-12-08 16:19:51 nicm Exp $
+# $Id: GNUmakefile,v 1.44 2008-12-10 20:25:41 nicm Exp $
.PHONY: clean
@@ -87,15 +87,12 @@ endif
ifeq ($(shell uname),Linux)
INCDIRS+= -Icompat
-SRCS+= compat/strlcpy.c compat/strlcat.c compat/strtonum.c compat/fgetln.c
+SRCS+= compat/strlcpy.c compat/strlcat.c compat/strtonum.c \
+ compat/fgetln.c compat/getopt_long.c
CFLAGS+= $(shell getconf LFS_CFLAGS) -D_GNU_SOURCE \
-DNO_STRLCPY -DNO_STRLCAT -DNO_STRTONUM -DNO_SETPROCTITLE \
- -DNO_QUEUE_H -DNO_TREE_H -DUSE_PTY_H -DNO_FGETLN -std=c99
-
-# GNU, as usual, decided on the insance default. So their stupid extensions
-# are default and POSIX-compliance is optional (!).
-CFLAGS+= -DGETOPT_PREFIX="\"+\""
-
+ -DNO_QUEUE_H -DNO_TREE_H -DUSE_PTY_H -DNO_FGETLN \
+ -DBROKEN_GETOPT -std=c99
LIBS+= -lrt -lutil
endif
diff --git a/Makefile b/Makefile
index b331580e..26b0cc97 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.79 2008-12-08 16:19:51 nicm Exp $
+# $Id: Makefile,v 1.80 2008-12-10 20:25:41 nicm Exp $
.SUFFIXES: .c .o .y .h
.PHONY: clean update-index.html upload-index.html
@@ -79,7 +79,7 @@ CFLAGS+= -DUSE_LIBUTIL_H
OBJS= ${SRCS:S/.c/.o/:S/.y/.o/}
DISTDIR= ${PROG}-${VERSION}
-DISTFILES= *.[chyl] Makefile GNUmakefile *.[1-9] NOTES TODO \
+DISTFILES= *.[chyl] Makefile GNUmakefile *.[1-9] NOTES TODO CHANGES \
`find examples compat -type f -and ! -path '*CVS*'`
CLEANFILES= ${PROG} *.o .depend *~ ${PROG}.core *.log index.html
diff --git a/cmd-attach-session.c b/cmd-attach-session.c
index 1ebcb64d..b622aaab 100644
--- a/cmd-attach-session.c
+++ b/cmd-attach-session.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-attach-session.c,v 1.20 2008-06-21 10:19:36 nicm Exp $ */
+/* $Id: cmd-attach-session.c,v 1.21 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,8 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
-
#include "tmux.h"
/*
diff --git a/cmd-bind-key.c b/cmd-bind-key.c
index 25a60e86..11d63c04 100644
--- a/cmd-bind-key.c
+++ b/cmd-bind-key.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-bind-key.c,v 1.16 2008-09-25 23:28:12 nicm Exp $ */
+/* $Id: cmd-bind-key.c,v 1.17 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,8 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
-
#include "tmux.h"
/*
@@ -60,7 +58,7 @@ cmd_bind_key_parse(struct cmd *self, int argc, char **argv, char **cause)
self->data = data = xmalloc(sizeof *data);
data->cmd = NULL;
- while ((opt = getopt(argc, argv, GETOPT_PREFIX "")) != EOF) {
+ while ((opt = getopt(argc, argv, "")) != -1) {
switch (opt) {
default:
goto usage;
diff --git a/cmd-delete-buffer.c b/cmd-delete-buffer.c
index e0a67559..073dbf04 100644
--- a/cmd-delete-buffer.c
+++ b/cmd-delete-buffer.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-delete-buffer.c,v 1.2 2008-09-26 06:45:25 nicm Exp $ */
+/* $Id: cmd-delete-buffer.c,v 1.3 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include "tmux.h"
diff --git a/cmd-generic.c b/cmd-generic.c
index c3632055..5b4d74c6 100644
--- a/cmd-generic.c
+++ b/cmd-generic.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-generic.c,v 1.14 2008-12-08 16:19:51 nicm Exp $ */
+/* $Id: cmd-generic.c,v 1.15 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include "tmux.h"
@@ -44,7 +43,7 @@ cmd_target_parse(struct cmd *self, int argc, char **argv, char **cause)
cmd_target_init(self, 0);
data = self->data;
- while ((opt = getopt(argc, argv, GETOPT_PREFIX "dgkt:")) != EOF) {
+ while ((opt = getopt(argc, argv, "dgkt:")) != -1) {
switch (opt) {
case 'd':
if (self->entry->flags & CMD_DFLAG) {
@@ -174,7 +173,7 @@ cmd_srcdst_parse(struct cmd *self, int argc, char **argv, char **cause)
cmd_srcdst_init(self, 0);
data = self->data;
- while ((opt = getopt(argc, argv, GETOPT_PREFIX "dgks:t:")) != EOF) {
+ while ((opt = getopt(argc, argv, "dgks:t:")) != -1) {
switch (opt) {
case 'd':
if (self->entry->flags & CMD_DFLAG) {
@@ -315,7 +314,7 @@ cmd_buffer_parse(struct cmd *self, int argc, char **argv, char **cause)
cmd_buffer_init(self, 0);
data = self->data;
- while ((opt = getopt(argc, argv, GETOPT_PREFIX "b:dgkt:")) != EOF) {
+ while ((opt = getopt(argc, argv, "b:dgkt:")) != -1) {
switch (opt) {
case 'b':
if (data->buffer == -1) {
@@ -460,7 +459,7 @@ cmd_option_parse(struct cmd *self, int argc, char **argv, char **cause)
cmd_option_init(self, 0);
data = self->data;
- while ((opt = getopt(argc, argv, GETOPT_PREFIX "dgkt:")) != EOF) {
+ while ((opt = getopt(argc, argv, "dgkt:")) != -1) {
switch (opt) {
case 'd':
if (self->entry->flags & CMD_DFLAG) {
diff --git a/cmd-link-window.c b/cmd-link-window.c
index a4557bc8..ac3e4a25 100644
--- a/cmd-link-window.c
+++ b/cmd-link-window.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-link-window.c,v 1.25 2008-11-16 10:10:26 nicm Exp $ */
+/* $Id: cmd-link-window.c,v 1.26 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include "tmux.h"
diff --git a/cmd-move-window.c b/cmd-move-window.c
index aca44d31..4420006f 100644
--- a/cmd-move-window.c
+++ b/cmd-move-window.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-move-window.c,v 1.2 2008-11-16 10:10:26 nicm Exp $ */
+/* $Id: cmd-move-window.c,v 1.3 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include "tmux.h"
diff --git a/cmd-new-session.c b/cmd-new-session.c
index 626854ff..32bb94b4 100644
--- a/cmd-new-session.c
+++ b/cmd-new-session.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-new-session.c,v 1.31 2008-09-25 23:28:12 nicm Exp $ */
+/* $Id: cmd-new-session.c,v 1.32 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,8 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
-
#include "tmux.h"
/*
@@ -75,7 +73,7 @@ cmd_new_session_parse(struct cmd *self, int argc, char **argv, char **cause)
self->entry->init(self, 0);
data = self->data;
- while ((opt = getopt(argc, argv, GETOPT_PREFIX "ds:n:")) != EOF) {
+ while ((opt = getopt(argc, argv, "ds:n:")) != -1) {
switch (opt) {
case 'd':
data->flag_detached = 1;
diff --git a/cmd-new-window.c b/cmd-new-window.c
index b1642626..f730e3ac 100644
--- a/cmd-new-window.c
+++ b/cmd-new-window.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-new-window.c,v 1.25 2008-09-25 23:28:12 nicm Exp $ */
+/* $Id: cmd-new-window.c,v 1.26 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include "tmux.h"
@@ -76,7 +75,7 @@ cmd_new_window_parse(struct cmd *self, int argc, char **argv, char **cause)
self->entry->init(self, 0);
data = self->data;
- while ((opt = getopt(argc, argv, GETOPT_PREFIX "dt:n:")) != EOF) {
+ while ((opt = getopt(argc, argv, "dt:n:")) != -1) {
switch (opt) {
case 'd':
data->flag_detached = 1;
diff --git a/cmd-rename-session.c b/cmd-rename-session.c
index c9c3d302..6a5ed884 100644
--- a/cmd-rename-session.c
+++ b/cmd-rename-session.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-rename-session.c,v 1.12 2008-06-18 22:21:51 nicm Exp $ */
+/* $Id: cmd-rename-session.c,v 1.13 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include "tmux.h"
diff --git a/cmd-rename-window.c b/cmd-rename-window.c
index f8a87560..bcbdacf4 100644
--- a/cmd-rename-window.c
+++ b/cmd-rename-window.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-rename-window.c,v 1.22 2008-06-05 21:25:00 nicm Exp $ */
+/* $Id: cmd-rename-window.c,v 1.23 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include "tmux.h"
diff --git a/cmd-select-window.c b/cmd-select-window.c
index 11ad106b..716e633a 100644
--- a/cmd-select-window.c
+++ b/cmd-select-window.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-select-window.c,v 1.19 2008-06-06 20:02:27 nicm Exp $ */
+/* $Id: cmd-select-window.c,v 1.20 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include "tmux.h"
diff --git a/cmd-send-keys.c b/cmd-send-keys.c
index d26ec520..ac03a5ec 100644
--- a/cmd-send-keys.c
+++ b/cmd-send-keys.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-send-keys.c,v 1.14 2008-09-25 23:28:12 nicm Exp $ */
+/* $Id: cmd-send-keys.c,v 1.15 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include "tmux.h"
@@ -67,7 +66,7 @@ cmd_send_keys_parse(struct cmd *self, int argc, char **argv, char **cause)
data->nkeys = 0;
data->keys = NULL;
- while ((opt = getopt(argc, argv, GETOPT_PREFIX "t:")) != EOF) {
+ while ((opt = getopt(argc, argv, "t:")) != -1) {
switch (opt) {
case 't':
if (data->target == NULL)
diff --git a/cmd-set-buffer.c b/cmd-set-buffer.c
index 6fe81ce7..db4c0bed 100644
--- a/cmd-set-buffer.c
+++ b/cmd-set-buffer.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-set-buffer.c,v 1.3 2008-09-26 06:45:25 nicm Exp $ */
+/* $Id: cmd-set-buffer.c,v 1.4 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include "tmux.h"
diff --git a/cmd-set-option.c b/cmd-set-option.c
index 72f6c0a2..a2d11f82 100644
--- a/cmd-set-option.c
+++ b/cmd-set-option.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-set-option.c,v 1.46 2008-12-08 16:19:51 nicm Exp $ */
+/* $Id: cmd-set-option.c,v 1.47 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include <string.h>
diff --git a/cmd-set-window-option.c b/cmd-set-window-option.c
index c628da8d..36bd3e81 100644
--- a/cmd-set-window-option.c
+++ b/cmd-set-window-option.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-set-window-option.c,v 1.14 2008-12-08 16:19:51 nicm Exp $ */
+/* $Id: cmd-set-window-option.c,v 1.15 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include <string.h>
diff --git a/cmd-show-buffer.c b/cmd-show-buffer.c
index 226dbc78..25bc4bd3 100644
--- a/cmd-show-buffer.c
+++ b/cmd-show-buffer.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-show-buffer.c,v 1.2 2008-09-26 06:45:26 nicm Exp $ */
+/* $Id: cmd-show-buffer.c,v 1.3 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include "tmux.h"
diff --git a/cmd-show-options.c b/cmd-show-options.c
index de1e728e..66390ca4 100644
--- a/cmd-show-options.c
+++ b/cmd-show-options.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-show-options.c,v 1.8 2008-12-08 16:19:51 nicm Exp $ */
+/* $Id: cmd-show-options.c,v 1.9 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include <string.h>
diff --git a/cmd-show-window-options.c b/cmd-show-window-options.c
index 1336a2c6..126b69a6 100644
--- a/cmd-show-window-options.c
+++ b/cmd-show-window-options.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-show-window-options.c,v 1.4 2008-12-08 16:19:51 nicm Exp $ */
+/* $Id: cmd-show-window-options.c,v 1.5 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include <string.h>
diff --git a/cmd-swap-window.c b/cmd-swap-window.c
index 4593ba24..a0224d2b 100644
--- a/cmd-swap-window.c
+++ b/cmd-swap-window.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-swap-window.c,v 1.13 2008-06-06 20:02:27 nicm Exp $ */
+/* $Id: cmd-swap-window.c,v 1.14 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include "tmux.h"
diff --git a/cmd-switch-client.c b/cmd-switch-client.c
index bc5c9682..22db9aba 100644
--- a/cmd-switch-client.c
+++ b/cmd-switch-client.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-switch-client.c,v 1.12 2008-09-25 23:28:15 nicm Exp $ */
+/* $Id: cmd-switch-client.c,v 1.13 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
#include <stdlib.h>
#include <string.h>
@@ -63,7 +62,7 @@ cmd_switch_client_parse(struct cmd *self, int argc, char **argv, char **cause)
data->name = NULL;
data->target = NULL;
- while ((opt = getopt(argc, argv, GETOPT_PREFIX "c:t:")) != EOF) {
+ while ((opt = getopt(argc, argv, "c:t:")) != -1) {
switch (opt) {
case 'c':
data->name = xstrdup(optarg);
diff --git a/cmd-unbind-key.c b/cmd-unbind-key.c
index c5074a77..7dcd1d5f 100644
--- a/cmd-unbind-key.c
+++ b/cmd-unbind-key.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-unbind-key.c,v 1.14 2008-09-25 23:28:15 nicm Exp $ */
+/* $Id: cmd-unbind-key.c,v 1.15 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,8 +18,6 @@
#include <sys/types.h>
-#include <getopt.h>
-
#include "tmux.h"
/*
@@ -57,7 +55,7 @@ cmd_unbind_key_parse(struct cmd *self, int argc, char **argv, char **cause)
self->data = data = xmalloc(sizeof *data);
- while ((opt = getopt(argc, argv, GETOPT_PREFIX "")) != EOF) {
+ while ((opt = getopt(argc, argv, "")) != -1) {
switch (opt) {
default:
goto usage;
diff --git a/cmd.c b/cmd.c
index 525df0bf..00560933 100644
--- a/cmd.c
+++ b/cmd.c
@@ -1,4 +1,4 @@
-/* $Id: cmd.c,v 1.65 2008-09-26 06:45:26 nicm Exp $ */
+/* $Id: cmd.c,v 1.66 2008-12-10 20:25:41 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -19,7 +19,6 @@
#include <sys/types.h>
#include <sys/time.h>
-#include <getopt.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@@ -159,10 +158,11 @@ cmd_parse(int argc, char **argv, char **cause)
xasprintf(cause, "unknown command: %s", argv[0]);
return (NULL);
}
-
+
+ optreset = 1;
optind = 1;
if (entry->parse == NULL) {
- while ((opt = getopt(argc, argv, GETOPT_PREFIX "")) != EOF) {
+ while ((opt = getopt(argc, argv, "")) != -1) {
switch (opt) {
default:
goto usage;
diff --git a/compat/getopt.h b/compat/getopt.h
new file mode 100644
index 00000000..0311b078
--- /dev/null
+++ b/compat/getopt.h
@@ -0,0 +1,78 @@
+/* $OpenBSD: getopt.h,v 1.2 2008/06/26 05:42:04 ray Exp $ */
+/* $NetBSD: getopt.h,v 1.4 2000/07/07 10:43:54 ad Exp $ */
+
+/*-
+ * Copyright (c) 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Dieter Baron and Thomas Klausner.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _GETOPT_H_
+#define _GETOPT_H_
+
+#include <sys/cdefs.h>
+
+/*
+ * GNU-like getopt_long() and 4.4BSD getsubopt()/optreset extensions
+ */
+#define no_argument 0
+#define required_argument 1
+#define optional_argument 2
+
+struct option {
+ /* name of long option */
+ const char *name;
+ /*
+ * one of no_argument, required_argument, and optional_argument:
+ * whether option takes an argument
+ */
+ int has_arg;
+ /* if not NULL, set *flag to val when option found */
+ int *flag;
+ /* if flag not NULL, value to set *flag to; else return value */
+ int val;
+};
+
+__BEGIN_DECLS
+int getopt_long(int, char * const *, const char *,
+ const struct option *, int *);
+int getopt_long_only(int, char * const *, const char *,
+ const struct option *, int *);
+#ifndef _GETOPT_DEFINED_
+#define _GETOPT_DEFINED_
+int getopt(int, char * const *, const char *);
+int getsubopt(char **, char * const *, char **);
+
+extern char *optarg; /* getopt(3) external variables */
+extern int opterr;
+extern int optind;
+extern int optopt;
+extern int optreset;
+extern char *suboptarg; /* getsubopt(3) external variable */
+#endif
+__END_DECLS
+
+#endif /* !_GETOPT_H_ */
diff --git a/compat/getopt_long.c b/compat/getopt_long.c
new file mode 100644
index 00000000..20555612
--- /dev/null
+++ b/compat/getopt_long.c
@@ -0,0 +1,519 @@
+/* $OpenBSD: getopt_long.c,v 1.23 2007/10/31 12:34:57 chl Exp $ */
+/* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */
+
+/*
+ * Copyright (c) 2002 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Sponsored in part by the Defense Advanced Research Projects
+ * Agency (DARPA) and Air Force Research Laboratory, Air Force
+ * Materiel Command, USAF, under agreement number F39502-99-1-0512.
+ */
+/*-
+ * Copyright (c) 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Dieter Baron and Thomas Klausner.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <err.h>
+#include <errno.h>
+/* #include <getopt.h> */
+#include <stdlib.h>
+#include <string.h>
+
+#include "tmux.h"
+
+#define REPLACE_GETOPT /* use this getopt as the system getopt(3) */
+
+#ifdef REPLACE_GETOPT
+int opterr = 1; /* if error message should be printed */
+int optind = 1; /* index into parent argv vector */
+int optopt = '?'; /* character checked for validity */
+int optreset; /* reset getopt */
+char *optarg; /* argument associated with option */
+#endif
+
+#define PRINT_ERROR ((opterr) && (*options != ':'))
+
+#define FLAG_PERMUTE 0x01 /* permute non-options to the end of argv */
+#define FLAG_ALLARGS 0x02 /* treat non-options as args to option "-1" */
+#define FLAG_LONGONLY 0x04 /* operate as getopt_long_only */
+
+/* return values */
+#define BADCH (int)'?'
+#define BADARG ((*options == ':') ? (int)':' : (int)'?')
+#define INORDER (int)1
+
+#define EMSG ""
+
+static int getopt_internal(int, char * const *, const char *,
+ const struct option *, int *, int);
+static int parse_long_options(char * const *, const char *,
+ const struct option *, int *, int);
+static int gcd(int, int);
+static void permute_args(int, int, int, char * const *);
+
+static char *place = EMSG; /* option letter processing */
+
+/* XXX: set optreset to 1 rather than these two */
+static int nonopt_start = -1; /* first non option argument (for permute) */
+static int nonopt_end = -1; /* first option after non options (for permute) */
+
+/* Error messages */
+static const char recargchar[] = "option requires an argument -- %c";
+static const char recargstring[] = "option requires an argument -- %s";
+static const char ambig[] = "ambiguous option -- %.*s";
+static const char noarg[] = "option doesn't take an argument -- %.*s";
+static const char illoptchar[] = "unknown option -- %c";
+static const char illoptstring[] = "unknown option -- %s";
+
+/*
+ * Compute the greatest common divisor of a and b.
+ */
+static int
+gcd(int a, int b)
+{
+ int c;
+
+ c = a % b;
+ while (c != 0) {
+ a = b;
+ b = c;
+ c = a % b;
+ }
+
+ return (b);
+}
+
+/*
+ * Exchange the block from nonopt_start to nonopt_end with the block
+ * from nonopt_end to opt_end (keeping the same order of arguments
+ * in each block).
+ */
+static void
+permute_args(int panonopt_start, int panonopt_end, int opt_end,
+ char * const *nargv)
+{
+ int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos;
+ char *swap;
+
+ /*
+ * compute lengths of blocks and number and size of cycles
+ */
+ nnonopts = panonopt_end - panonopt_start;
+ nopts = opt_end - panonopt_end;
+ ncycle = gcd(nnonopts, nopts);
+ cyclelen = (opt_end - panonopt_start) / ncycle;
+
+ for (i = 0; i < ncycle; i++) {
+ cstart = panonopt_end+i;
+ pos = cstart;
+ for (j = 0; j < cyclelen; j++) {
+ if (pos >= panonopt_end)
+ pos -= nnonopts;
+ else
+ pos += nopts;
+ swap = nargv[pos];
+ /* LINTED const cast */
+ ((char **) nargv)[pos] = nargv[cstart];
+ /* LINTED const cast */
+ ((char **)nargv)[cstart] = swap;
+ }
+ }
+}
+
+/*
+ * parse_long_options --
+ * Parse long options in argc/argv argument vector.
+ * Returns -1 if short_too is set and the option does not match long_options.
+ */
+static int
+parse_long_options(char * const *nargv, const char *options,
+ const struct option *long_options, int *idx, int short_too)
+{
+ char *current_argv, *has_equal;
+ size_t current_argv_len;
+ int i, match;
+
+ current_argv = place;
+ match = -1;
+
+ optind++;
+
+ if ((has_equal = strchr(current_argv, '=')) != NULL) {
+ /* argument found (--option=arg) */
+ current_argv_len = has_equal - current_argv;
+ has_equal++;
+ } else
+ current_argv_len = strlen(current_argv);
+
+ for (i = 0; long_options[i].name; i++) {
+ /* find