 +  // Update environ.
 +  maybe_make_export_env ();
 +  args = strvec_from_word_list (words, 0, 0, (int *)NULL);
++  pathname = words->word->word;
 +  pid = nacl_spawn_simple(args);
 +  free(args);
-+  if (pid < 0)
++  if (pid < 0) {
++    /* Make sure filenames are displayed using printable characters */
++    if (ansic_shouldquote (pathname))
++      pathname = ansic_quote (pathname, 0, NULL);
++    if (errno == ENOENT) {
++      internal_error (_("%s: command not found"), pathname);
++    } else {
++      internal_error (_("%s: nacl_spawn failed (errno %d)"), pathname, errno);
++    }
++    return EX_NOTFOUND;  /* Posix.2 says the exit status is 127 */
++  }
++  if (nacl_waitpid(pid, &result, 0) < 0) {
++    if (ansic_shouldquote (pathname))
++      pathname = ansic_quote (pathname, 0, NULL);
++    internal_error (_("%s: nacl_waitpid failed (errno %d)"), pathname, errno);
 +    return EXECUTION_FAILURE;
-+  if (nacl_waitpid(pid, NULL, 0) < 0)
-+    return EXECUTION_FAILURE;
-+  return EXECUTION_SUCCESS;
++  }
++  /* TODO(bradnelson): Make this more general once we support signals. */
++  return WEXITSTATUS(result);
 +#else
    nofork = (cmdflags & CMD_NO_FORK);  /* Don't fork, just exec, if no pipes */
    pathname = words->word->word;
  
-@@ -4760,6 +4776,7 @@ parent_return:
+@@ -4760,6 +4791,7 @@ parent_return:
        FREE (command);
        return (result);
      }

     {
       lstdin = move_to_high_fd (0, 0, 255);
       if (lstdin > 0)
@@ -4631,6 +4635,18 @@ execute_disk_command (words, redirects, command_line, pipe_in, pipe_out,
   SHELL_VAR *hookf;
   WORD_LIST *wl;
 

 esac
 
diff --git a/execute_cmd.c b/execute_cmd.c
index 485b0c7..de77f14 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -2202,7 +2202,11 @@ execute_pipeline (command, asynchronous, pipe_in, pipe_out, fds_to_close)
