diff --git a/main.c b/main.c
index 8bd0fee..c705d64 100644
--- a/main.c
+++ b/main.c
@@ -1,4 +1,3 @@
-/* vi: set ts=4 :*/
 /* Toybox infrastructure.
  *
  * Copyright 2006 Rob Landley <rob@landley.net>
@@ -25,27 +24,27 @@
 
 struct toy_list *toy_find(char *name)
 {
-	int top, bottom, middle;
+  int top, bottom, middle;
 
-	// If the name starts with "toybox" accept that as a match.  Otherwise
-	// skip the first entry, which is out of order.
+  // If the name starts with "toybox" accept that as a match.  Otherwise
+  // skip the first entry, which is out of order.
 
-	if (!strncmp(name,"toybox",6)) return toy_list;
-	bottom = 1;
+  if (!strncmp(name,"toybox",6)) return toy_list;
+  bottom = 1;
 
-	// Binary search to find this applet.
+  // Binary search to find this applet.
 
-	top = ARRAY_LEN(toy_list)-1;
-	for (;;) {
-		int result;
+  top = ARRAY_LEN(toy_list)-1;
+  for (;;) {
+    int result;
 
-		middle = (top+bottom)/2;
-		if (middle<bottom || middle>top) return NULL;
-		result = strcmp(name,toy_list[middle].name);
-		if (!result) return toy_list+middle;
-		if (result<0) top=--middle;
-		else bottom = ++middle;
-	}
+    middle = (top+bottom)/2;
+    if (middle<bottom || middle>top) return NULL;
+    result = strcmp(name,toy_list[middle].name);
+    if (!result) return toy_list+middle;
+    if (result<0) top=--middle;
+    else bottom = ++middle;
+  }
 }
 
 // Figure out whether or not anything is using the option parsing logic,
@@ -65,44 +64,42 @@
 
 void toy_init(struct toy_list *which, char *argv[])
 {
-	// Drop permissions for non-suid commands.
+  // Drop permissions for non-suid commands.
 
-	if (CFG_TOYBOX_SUID) {
-		uid_t uid = getuid(), euid = geteuid();
+  if (CFG_TOYBOX_SUID) {
+    uid_t uid = getuid(), euid = geteuid();
 
-		if (!(which->flags & TOYFLAG_STAYROOT)) {
-			if (uid != euid) xsetuid(euid=uid);
-		} else if (CFG_TOYBOX_DEBUG && uid)
-			error_exit("Not installed suid root");
+    if (!(which->flags & TOYFLAG_STAYROOT)) {
+      if (uid != euid) xsetuid(euid=uid);
+    } else if (CFG_TOYBOX_DEBUG && uid) error_exit("Not installed suid root");
 
-		if ((which->flags & TOYFLAG_NEEDROOT) && euid)
-			error_exit("Not root");
-	}
+    if ((which->flags & TOYFLAG_NEEDROOT) && euid) error_exit("Not root");
+  }
 
-	// Free old toys contents (to be reentrant)
+  // Free old toys contents (to be reentrant)
 
-	if (toys.optargs != toys.argv+1) free(toys.optargs);
-	memset(&toys, 0, sizeof(struct toy_context));
+  if (toys.optargs != toys.argv+1) free(toys.optargs);
+  memset(&toys, 0, sizeof(struct toy_context));
 
-	toys.which = which;
-	toys.argv = argv;
-	if (NEED_OPTIONS && which->options) get_optflags();
-	else toys.optargs = argv+1;
-	toys.old_umask = umask(0);
-	if (!(which->flags & TOYFLAG_UMASK)) umask(toys.old_umask);
+  toys.which = which;
+  toys.argv = argv;
+  if (NEED_OPTIONS && which->options) get_optflags();
+  else toys.optargs = argv+1;
+  toys.old_umask = umask(0);
+  if (!(which->flags & TOYFLAG_UMASK)) umask(toys.old_umask);
 }
 
 // Like exec() but runs an internal toybox command instead of another file.
 // Only returns if it can't find the command, otherwise exit() when done.
 void toy_exec(char *argv[])
 {
-	struct toy_list *which;
+  struct toy_list *which;
 
-	which = toy_find(argv[0]);
-	if (!which) return;
-	toy_init(which, argv);
-	toys.which->toy_main();
-	exit(toys.exitval);
+  which = toy_find(argv[0]);
+  if (!which) return;
+  toy_init(which, argv);
+  toys.which->toy_main();
+  exit(toys.exitval);
 }
 
 // Multiplexer command, first argument is command to run, rest are args to that.
@@ -110,52 +107,52 @@
 
 void toybox_main(void)
 {
-	static char *toy_paths[]={"usr/","bin/","sbin/",0};
-	int i, len = 0;
+  static char *toy_paths[]={"usr/","bin/","sbin/",0};
+  int i, len = 0;
 
-	if (toys.argv[1]) {
-		if (toys.argv[1][0]!='-') {
-			toy_exec(toys.argv+1);
-			toys.which = toy_list;
-			error_exit("Unknown command %s",toys.argv[1]);
-		}
-	}
+  if (toys.argv[1]) {
+    if (toys.argv[1][0]!='-') {
+      toy_exec(toys.argv+1);
+      toys.which = toy_list;
+      error_exit("Unknown command %s",toys.argv[1]);
+    }
+  }
 
-	// Output list of applets.
-	for (i=1; i<ARRAY_LEN(toy_list); i++) {
-		int fl = toy_list[i].flags;
-		if (fl & TOYMASK_LOCATION) {
-			if (toys.argv[1]) {
-				int j;
-				for (j=0; toy_paths[j]; j++)
-					if (fl & (1<<j)) len += printf("%s", toy_paths[j]);
-			}
-			len += printf("%s ",toy_list[i].name);
-			if (len>65) {
-				xputc('\n');
-				len=0;
-			}
-		}
-	}
-	xputc('\n');
+  // Output list of applets.
+  for (i=1; i<ARRAY_LEN(toy_list); i++) {
+    int fl = toy_list[i].flags;
+    if (fl & TOYMASK_LOCATION) {
+      if (toys.argv[1]) {
+        int j;
+        for (j=0; toy_paths[j]; j++)
+          if (fl & (1<<j)) len += printf("%s", toy_paths[j]);
+      }
+      len += printf("%s ",toy_list[i].name);
+      if (len>65) {
+        xputc('\n');
+        len=0;
+      }
+    }
+  }
+  xputc('\n');
 }
 
 int main(int argc, char *argv[])
 {
-	// Artificial scope to eat less stack for things we call
-	{
-		char *name;
+  // Artificial scope to eat less stack for things we call
+  {
+    char *name;
 
-		// Trim path off of command name
-		name = strrchr(argv[0], '/');
-		if (!name) name=argv[0];
-		else name++;
-		argv[0] = name;
-	}
+    // Trim path off of command name
+    name = strrchr(argv[0], '/');
+    if (!name) name=argv[0];
+    else name++;
+    argv[0] = name;
+  }
 
-	// Call the multiplexer, adjusting this argv[] to be its' argv[1].
-	// (It will adjust it back before calling toy_exec().)
-	toys.argv = argv-1;
-	toybox_main();
-	return 0;
+  // Call the multiplexer, adjusting this argv[] to be its' argv[1].
+  // (It will adjust it back before calling toy_exec().)
+  toys.argv = argv-1;
+  toybox_main();
+  return 0;
 }
