Index: /trunk/src/kmk/kmkbuiltin/chmod.c
===================================================================
--- /trunk/src/kmk/kmkbuiltin/chmod.c	(revision 3219)
+++ /trunk/src/kmk/kmkbuiltin/chmod.c	(revision 3220)
@@ -42,4 +42,8 @@
 /*__FBSDID("$FreeBSD: src/bin/chmod/chmod.c,v 1.33 2005/01/10 08:39:20 imp Exp $");*/
 
+/*********************************************************************************************************************************
+*   Header Files                                                                                                                 *
+*********************************************************************************************************************************/
+#define FAKES_NO_GETOPT_H /* bird */
 #include "config.h"
 #include <sys/types.h>
@@ -64,17 +68,11 @@
 # include "haikufakes.h"
 #endif
-#include "getopt.h"
+#include "getopt_r.h"
 #include "kmkbuiltin.h"
 
-extern void * bsd_setmode(const char *p);
-extern mode_t bsd_getmode(const void *bbox, mode_t omode);
-extern void bsd_strmode(mode_t mode, char *p);
-
-#if (defined(__APPLE__) && !defined(_DARWIN_FEATURE_UNIX_CONFORMANCE)) || defined(__OpenBSD__)
-extern int lchmod(const char *, mode_t);
-#endif
-
-static int usage(PKMKBUILTINCTX pCtx, int is_err);
-
+
+/*********************************************************************************************************************************
+*   Global Variables                                                                                                             *
+*********************************************************************************************************************************/
 static struct option long_options[] =
 {
@@ -85,7 +83,22 @@
 
 
+/*********************************************************************************************************************************
+*   Internal Functions                                                                                                           *
+*********************************************************************************************************************************/
+extern void * bsd_setmode(const char *p);
+extern mode_t bsd_getmode(const void *bbox, mode_t omode);
+extern void bsd_strmode(mode_t mode, char *p);
+
+#if (defined(__APPLE__) && !defined(_DARWIN_FEATURE_UNIX_CONFORMANCE)) || defined(__OpenBSD__)
+extern int lchmod(const char *, mode_t);
+#endif
+
+static int usage(PKMKBUILTINCTX pCtx, int is_err);
+
+
 int
 kmk_builtin_chmod(int argc, char *argv[], char **envp, PKMKBUILTINCTX pCtx)
 {
+	struct getopt_state_r gos;
 	FTS *ftsp;
 	FTSENT *p;
@@ -97,13 +110,9 @@
 	int (*change_mode)(const char *, mode_t);
 
-	/* kmk: reset getopt and set progname */
-	opterr = 1;
-	optarg = NULL;
-	optopt = 0;
-	optind = 0; /* init */
-
 	set = NULL;
 	Hflag = Lflag = Rflag = fflag = hflag = vflag = 0;
-	while ((ch = getopt_long(argc, argv, "HLPRXfghorstuvwx", long_options, NULL)) != -1)
+
+	getopt_initialize_r(&gos, argc, argv, "HLPRXfghorstuvwx", long_options, envp, pCtx);
+	while ((ch = getopt_long_r(&gos, NULL)) != -1)
 		switch (ch) {
 		case 'H':
@@ -143,8 +152,8 @@
 		case 'g': case 'o': case 'r': case 's':
 		case 't': case 'u': case 'w': case 'X': case 'x':
-			if (argv[optind - 1][0] == '-' &&
-			    argv[optind - 1][1] == ch &&
-			    argv[optind - 1][2] == '\0')
-				--optind;
+			if (argv[gos.optind - 1][0] == '-' &&
+			    argv[gos.optind - 1][1] == ch &&
+			    argv[gos.optind - 1][2] == '\0')
+				--gos.optind;
 			goto done;
 		case 'v':
@@ -160,6 +169,6 @@
 			return usage(pCtx, 1);
 		}
-done:	argv += optind;
-	argc -= optind;
+done:	argv += gos.optind;
+	argc -= gos.optind;
 
 	if (argc < 2)
@@ -179,4 +188,7 @@
 	} else
 		fts_options = hflag ? FTS_PHYSICAL : FTS_LOGICAL;
+#ifndef KMK_BUILTIN_STANDALONE
+	fts_options |= FTS_NOCHDIR; /* Don't change the CWD while inside kmk. */
+#endif
 
 	if (hflag)
