Index: /trunk/src/kash/error.c
===================================================================
--- /trunk/src/kash/error.c	(revision 2297)
+++ /trunk/src/kash/error.c	(revision 2298)
@@ -69,7 +69,6 @@
 char *commandname;*/
 
-
-static void exverror(shinstance *psh, int, const char *, va_list)
-    __attribute__((__noreturn__));
+SH_NORETURN_1
+static void exverror(shinstance *psh, int, const char *, va_list) SH_NORETURN_2;
 
 /*
@@ -79,5 +78,5 @@
  */
 
-void
+SH_NORETURN_1 void
 exraise(shinstance *psh, int e)
 {
@@ -172,5 +171,5 @@
 
 
-void
+SH_NORETURN_1 void
 error(shinstance *psh, const char *msg, ...)
 {
@@ -184,5 +183,5 @@
 
 
-void
+SH_NORETURN_1 void
 exerror(shinstance *psh, int cond, const char *msg, ...)
 {
@@ -199,5 +198,5 @@
  */
 
-void
+SH_NORETURN_1 void
 sh_exit(shinstance *psh, int rval)
 {
@@ -206,5 +205,5 @@
 }
 
-void
+SH_NORETURN_1 void
 sh_err(shinstance *psh, int status, const char *fmt, ...)
 {
@@ -217,5 +216,5 @@
 }
 
-void
+SH_NORETURN_1 void
 sh_verr(shinstance *psh, int status, const char *fmt, va_list ap)
 {
@@ -224,5 +223,5 @@
 }
 
-void
+SH_NORETURN_1 void
 sh_errx(shinstance *psh, int status, const char *fmt, ...)
 {
@@ -235,5 +234,5 @@
 }
 
-void
+SH_NORETURN_1 void
 sh_verrx(shinstance *psh, int status, const char *fmt, va_list ap)
 {
Index: /trunk/src/kash/error.h
===================================================================
--- /trunk/src/kash/error.h	(revision 2297)
+++ /trunk/src/kash/error.h	(revision 2298)
@@ -98,14 +98,14 @@
 #endif
 
-void exraise(struct shinstance *, int) __attribute__((__noreturn__));
+SH_NORETURN_1 void exraise(struct shinstance *, int) SH_NORETURN_2;
 void onint(struct shinstance *);
-void error(struct shinstance *, const char *, ...) __attribute__((__noreturn__));
-void exerror(struct shinstance *, int, const char *, ...) __attribute__((__noreturn__));
+SH_NORETURN_1 void error(struct shinstance *, const char *, ...) SH_NORETURN_2;
+SH_NORETURN_1 void exerror(struct shinstance *, int, const char *, ...) SH_NORETURN_2;
 const char *errmsg(struct shinstance *, int, int);
 
-void sh_err(struct shinstance *, int, const char *, ...) __attribute__((__noreturn__));
-void sh_verr(struct shinstance *, int, const char *, va_list) __attribute__((__noreturn__));
-void sh_errx(struct shinstance *, int, const char *, ...) __attribute__((__noreturn__));
-void sh_verrx(struct shinstance *, int, const char *, va_list) __attribute__((__noreturn__));
+SH_NORETURN_1 void sh_err(struct shinstance *, int, const char *, ...) SH_NORETURN_2;
+SH_NORETURN_1 void sh_verr(struct shinstance *, int, const char *, va_list) SH_NORETURN_2;
+SH_NORETURN_1 void sh_errx(struct shinstance *, int, const char *, ...) SH_NORETURN_2;
+SH_NORETURN_1 void sh_verrx(struct shinstance *, int, const char *, va_list) SH_NORETURN_2;
 void sh_warn(struct shinstance *, const char *, ...);
 void sh_vwarn(struct shinstance *, const char *, va_list);
@@ -113,5 +113,5 @@
 void sh_vwarnx(struct shinstance *, const char *, va_list);
 
-void sh_exit(struct shinstance *, int) __attribute__((__noreturn__));
+SH_NORETURN_1 void sh_exit(struct shinstance *, int) SH_NORETURN_2;
 
 
Index: /trunk/src/kash/exec.c
===================================================================
--- /trunk/src/kash/exec.c	(revision 2297)
+++ /trunk/src/kash/exec.c	(revision 2298)
@@ -117,5 +117,5 @@
  */
 
-void
+SH_NORETURN_1 void
 shellexec(shinstance *psh, char **argv, char **envp, const char *path, int idx, int vforked)
 {
Index: /trunk/src/kash/exec.h
===================================================================
--- /trunk/src/kash/exec.h	(revision 2297)
+++ /trunk/src/kash/exec.h	(revision 2298)
@@ -69,6 +69,5 @@
 #endif
 
-void shellexec(struct shinstance *, char **, char **, const char *, int, int)
-    __attribute__((__noreturn__));
+SH_NORETURN_1 void shellexec(struct shinstance *, char **, char **, const char *, int, int) SH_NORETURN_2;
 char *padvance(struct shinstance *, const char **, const char *);
 int hashcmd(struct shinstance *, int, char **);
Index: /trunk/src/kash/main.c
===================================================================
--- /trunk/src/kash/main.c	(revision 2297)
+++ /trunk/src/kash/main.c	(revision 2298)
@@ -85,5 +85,5 @@
 STATIC char *find_dot_file(struct shinstance *, char *);
 int main(int, char **, char **);
-int shell_main(shinstance *, int, char **);
+SH_NORETURN_1 void shell_main(shinstance *, int, char **) SH_NORETURN_2;
 #ifdef _MSC_VER
 extern void init_syntax(void);
@@ -134,8 +134,10 @@
 		return 2;
 	shthread_set_shell(psh);
-	return shell_main(psh, argc, psh->argptr);
-}
-
-int
+	shell_main(psh, argc, psh->argptr);
+	/* Not reached. */
+	return 89;
+}
+
+SH_NORETURN_1 void
 shell_main(shinstance *psh, int argc, char **argv)
 {
@@ -251,5 +253,4 @@
 	exitshell(psh, psh->exitstatus);
 	/* NOTREACHED */
-	return 1;
 }
 
Index: /trunk/src/kash/parser.c
===================================================================
--- /trunk/src/kash/parser.c	(revision 2297)
+++ /trunk/src/kash/parser.c	(revision 2298)
@@ -116,6 +116,6 @@
 STATIC int readtoken1(shinstance *, int, char const *, char *, int);
 STATIC int noexpand(shinstance *, char *);
-STATIC void synexpect(shinstance *, int) __attribute__((__noreturn__));
-STATIC void synerror(shinstance *, const char *) __attribute__((__noreturn__));
+SH_NORETURN_1 STATIC void synexpect(shinstance *, int) SH_NORETURN_2;
+SH_NORETURN_1 STATIC void synerror(shinstance *, const char *) SH_NORETURN_2;
 STATIC void setprompt(shinstance *, int);
 
@@ -1596,5 +1596,5 @@
  */
 
-STATIC void
+SH_NORETURN_1 STATIC void
 synexpect(shinstance *psh, int token)
 {
@@ -1612,5 +1612,5 @@
 
 
-STATIC void
+SH_NORETURN_1 STATIC void
 synerror(shinstance *psh, const char *msg)
 {
Index: /trunk/src/kash/shfile.c
===================================================================
--- /trunk/src/kash/shfile.c	(revision 2297)
+++ /trunk/src/kash/shfile.c	(revision 2298)
@@ -625,5 +625,6 @@
     SecurityAttributes.bInheritHandle = TRUE;
 
-    if (!CreatePipe(&hRead, &hWrite, &SecurityAttributes, 4096))
+    fds[1] = fds[0] = -1;
+    if (CreatePipe(&hRead, &hWrite, &SecurityAttributes, 4096))
     {
         fds[0] = shfile_insert(pfdtab, (intptr_t)hRead, O_RDONLY, -1, "shfile_pipe");
@@ -637,7 +638,8 @@
 # else
     int native_fds[2];
+
+    fds[1] = fds[0] = -1;
     if (!pipe(native_fds))
     {
-        fds[1] = -1;
         fds[0] = shfile_insert(pfdtab, native_fds[0], O_RDONLY, -1, "shfile_pipe");
         if (fds[0] != -1)
@@ -673,4 +675,11 @@
             rc = -1;
         }
+    }
+    else
+    {
+# if K_OS == K_OS_WINDOWS
+        errno = shfile_dos2errno(GetLastError());
+# endif
+        rc = -1;
     }
 
Index: /trunk/src/kash/shinstance.c
===================================================================
--- /trunk/src/kash/shinstance.c	(revision 2297)
+++ /trunk/src/kash/shinstance.c	(revision 2298)
@@ -744,5 +744,5 @@
 }
 
-void sh_abort(shinstance *psh)
+SH_NORETURN_1 void sh_abort(shinstance *psh)
 {
     shsigset_t set;
@@ -910,4 +910,5 @@
     return 0;
 }
+#include <setjmp.h>
 
 pid_t sh_fork(shinstance *psh)
@@ -921,8 +922,4 @@
 #elif K_OS == K_OS_WINDOWS //&& defined(SH_FORKED_MODE)
     pid = shfork_do_it(psh);
-# ifdef DEBUG
-    if (!pid)
-        opentrace(psh);
-# endif
 
 #elif defined(SH_STUB_MODE) || defined(SH_FORKED_MODE)
@@ -1069,5 +1066,5 @@
 }
 
-void sh__exit(shinstance *psh, int rc)
+SH_NORETURN_1 void sh__exit(shinstance *psh, int rc)
 {
     TRACE2((psh, "sh__exit(%d)\n", rc));
Index: /trunk/src/kash/shinstance.h
===================================================================
--- /trunk/src/kash/shinstance.h	(revision 2297)
+++ /trunk/src/kash/shinstance.h	(revision 2298)
@@ -390,5 +390,5 @@
 int sh_sigismember(shsigset_t const *, int);
 int sh_sigprocmask(shinstance *, int, shsigset_t const *, shsigset_t *);
-void sh_abort(shinstance *) __attribute__((__noreturn__));
+SH_NORETURN_1 void sh_abort(shinstance *) SH_NORETURN_2;
 void sh_raise_sigint(shinstance *);
 int sh_kill(shinstance *, pid_t, int);
@@ -438,5 +438,5 @@
 pid_t sh_fork(shinstance *);
 pid_t sh_waitpid(shinstance *, pid_t, int *, int);
-void sh__exit(shinstance *, int) __attribute__((__noreturn__));
+SH_NORETURN_1 void sh__exit(shinstance *, int) SH_NORETURN_2;
 int sh_execve(shinstance *, const char *, const char * const*, const char * const *);
 uid_t sh_getuid(shinstance *);
Index: /trunk/src/kash/shtypes.h
===================================================================
--- /trunk/src/kash/shtypes.h	(revision 2297)
+++ /trunk/src/kash/shtypes.h	(revision 2298)
@@ -113,4 +113,14 @@
 } shsigaction_t;
 
+/* SH_NORETURN_1 must be both on prototypes and definitions, while
+   SH_NORETURN_2 should at least be on the prototype. */
+#ifdef _MSC_VER
+# define SH_NORETURN_1 __declspec(noreturn)
+# define SH_NORETURN_2
+#else
+# define SH_NORETURN_1
+# define SH_NORETURN_2 __attribute__((__noreturn__));
 #endif
 
+#endif
+
Index: /trunk/src/kash/trap.c
===================================================================
--- /trunk/src/kash/trap.c	(revision 2297)
+++ /trunk/src/kash/trap.c	(revision 2298)
@@ -434,5 +434,5 @@
  */
 
-void
+SH_NORETURN_1 void
 exitshell(shinstance *psh, int status)
 {
Index: /trunk/src/kash/trap.h
===================================================================
--- /trunk/src/kash/trap.h	(revision 2297)
+++ /trunk/src/kash/trap.h	(revision 2298)
@@ -44,3 +44,3 @@
 void dotrap(struct shinstance *);
 void setinteractive(struct shinstance *, int);
-void exitshell(struct shinstance *, int) __attribute__((__noreturn__));
+SH_NORETURN_1 void exitshell(struct shinstance *, int) SH_NORETURN_2;
