diff --git a/src/include/getopt_long.h b/src/include/getopt_long.h
index e23c21f333cadda7eb6130d8cff66419d3a3fbbd..71a884c49c2d6a980c755fc7bca58a8f753f7aba 100644
--- a/src/include/getopt_long.h
+++ b/src/include/getopt_long.h
@@ -23,6 +23,7 @@ struct option
 
 #define no_argument 0
 #define required_argument 1
+#define optional_argument 2
 #endif
 
 #ifndef HAVE_GETOPT_LONG
diff --git a/src/port/getopt_long.c b/src/port/getopt_long.c
index b099091a76d01308ab02a08856dbb9d9d2713cbe..aa5b7319fd56acd55720819d35e6a53c8caca0a6 100644
--- a/src/port/getopt_long.c
+++ b/src/port/getopt_long.c
@@ -100,11 +100,14 @@ getopt_long(int argc, char *const argv[],
 				if (strlen(longopts[i].name) == namelen
 					&& strncmp(place, longopts[i].name, namelen) == 0)
 				{
-					if (longopts[i].has_arg)
+					int			has_arg = longopts[i].has_arg;
+
+					if (has_arg != no_argument)
 					{
 						if (place[namelen] == '=')
 							optarg = place + namelen + 1;
-						else if (optind < argc - 1)
+						else if (optind < argc - 1 &&
+								 has_arg == required_argument)
 						{
 							optind++;
 							optarg = argv[optind];
@@ -113,13 +116,18 @@ getopt_long(int argc, char *const argv[],
 						{
 							if (optstring[0] == ':')
 								return BADARG;
-							if (opterr)
+
+							if (opterr && has_arg == required_argument)
 								fprintf(stderr,
 								   "%s: option requires an argument -- %s\n",
 										argv[0], place);
+
 							place = EMSG;
 							optind++;
-							return BADCH;
+
+							if (has_arg == required_argument)
+								return BADCH;
+							optarg = NULL;
 						}
 					}
 					else