ash: rearrange code to reduce forward references, rename some functions
authorDenis Vlasenko <vda.linux@googlemail.com>
Mon, 19 Feb 2007 22:43:01 +0000 (22:43 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Mon, 19 Feb 2007 22:43:01 +0000 (22:43 -0000)
shell/ash.c

index 242e3b765ef582f79b81537c2da0faa9a9e63c34..ffe29e066d0b208983e65f946fe2a6129a86b09c 100644 (file)
@@ -31,7 +31,6 @@
  *
  */
 
-
 /*
  * The follow should be set to reflect the type of system you have:
  *      JOBS -> 1 if you have Berkeley job control, 0 otherwise.
  * a quit signal will generate a core dump.
  */
 #define DEBUG 0
-
-
 #define IFS_BROKEN
-
 #define PROFILE 0
-
-#include "busybox.h"
+#if ENABLE_ASH_JOB_CONTROL
+#define JOBS 1
+#else
+#define JOBS 0
+#endif
 
 #if DEBUG
 #define _GNU_SOURCE
 #endif
-
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/param.h>
-#include <sys/resource.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <stdarg.h>
-#include <stddef.h>
-#include <assert.h>
-#include <ctype.h>
-#include <dirent.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <limits.h>
+#include "busybox.h"
 #include <paths.h>
 #include <setjmp.h>
-#include <signal.h>
-/*#include <stdint.h>*/
-#include <time.h>
 #include <fnmatch.h>
-
-#if ENABLE_ASH_JOB_CONTROL
-#define JOBS 1
-#else
-#define JOBS 0
-#endif
-
 #if JOBS || ENABLE_ASH_READ_NCHARS
 #include <termios.h>
 #endif
 
+#if defined(__uClinux__)
+#error "Do not even bother, ash will not run on uClinux"
+#endif
+
 
 #ifdef __GLIBC__
 /* glibc sucks */
@@ -100,59 +73,90 @@ static int *dash_errno;
 #define errno (*dash_errno)
 #endif
 
-#if defined(__uClinux__)
-#error "Do not even bother, ash will not run on uClinux"
-#endif
-
-#if DEBUG
-#define _DIAGASSERT(assert_expr) assert(assert_expr)
-#else
-#define _DIAGASSERT(assert_expr)
-#endif
-
 
 #if ENABLE_ASH_ALIAS
-/*      alias.h       */
-
-#define ALIASINUSE      1
-#define ALIASDEAD       2
-
+#define ALIASINUSE 1
+#define ALIASDEAD  2
 struct alias {
        struct alias *next;
        char *name;
        char *val;
        int flag;
 };
-
-static struct alias *lookupalias(const char *, int);
 static int aliascmd(int, char **);
 static int unaliascmd(int, char **);
-static void rmaliases(void);
-static int unalias(const char *);
 static void printalias(const struct alias *);
 #endif
 
-/*      cd.h  */
 
+/* ============ Shell options */
 
-static void    setpwd(const char *, int);
+static const char *const optletters_optnames[] = {
+       "e"   "errexit",
+       "f"   "noglob",
+       "I"   "ignoreeof",
+       "i"   "interactive",
+       "m"   "monitor",
+       "n"   "noexec",
+       "s"   "stdin",
+       "x"   "xtrace",
+       "v"   "verbose",
+       "C"   "noclobber",
+       "a"   "allexport",
+       "b"   "notify",
+       "u"   "nounset",
+       "\0"  "vi",
+#if DEBUG
+       "\0"  "nolog",
+       "\0"  "debug",
+#endif
+};
 
-/*      error.h      */
+#define optletters(n) optletters_optnames[(n)][0]
+#define optnames(n) (&optletters_optnames[(n)][1])
 
+#define NOPTS (sizeof(optletters_optnames)/sizeof(optletters_optnames[0]))
 
-/*
- * Types of operations (passed to the errmsg routine).
- */
+static char optlist[NOPTS];
 
+#define eflag optlist[0]
+#define fflag optlist[1]
+#define Iflag optlist[2]
+#define iflag optlist[3]
+#define mflag optlist[4]
+#define nflag optlist[5]
+#define sflag optlist[6]
+#define xflag optlist[7]
+#define vflag optlist[8]
+#define Cflag optlist[9]
+#define aflag optlist[10]
+#define bflag optlist[11]
+#define uflag optlist[12]
+#define viflag optlist[13]
+#if DEBUG
+#define nolog optlist[14]
+#define debug optlist[15]
+#endif
 
-static const char not_found_msg[] = "%s: not found";
 
+/* ============ Misc data */
 
-#define E_OPEN  "No such file"          /* opening a file */
-#define E_CREAT "Directory nonexistent" /* creating a file */
-#define E_EXEC  not_found_msg+4         /* executing a program */
+/* pid of main shell */
+static int rootpid;
+/* shell level: 0 for the main shell, 1 for its children, and so on */
+static int shlvl;
+#define rootshell (!shlvl)
+/* trap handler commands */
+static char *trap[NSIG];
+/* current value of signal */
+static char sigmode[NSIG - 1];
+/* indicates specified signal received */
+static char gotsig[NSIG - 1];
+static char *arg0; /* value of $0 */
 
-/*
+
+/* ============ Interrupts / exceptions
+ *
  * We enclose jmp_buf in a structure so that we can declare pointers to
  * jump locations.  The global variable handler contains the location to
  * jump to when an exception occurs, and the global variable exception
@@ -161,16 +165,11 @@ static const char not_found_msg[] = "%s: not found";
  * to an inner scope, set handler to point to a jmploc structure for the
  * inner scope, and restore handler on exit from the scope.
  */
-
 struct jmploc {
        jmp_buf loc;
 };
-
 static struct jmploc *handler;
 static int exception;
-static volatile int suppressint;
-static volatile sig_atomic_t intpending;
-
 /* exceptions */
 #define EXINT 0         /* SIGINT received */
 #define EXERROR 1       /* a generic error */
@@ -178,8 +177,8 @@ static volatile sig_atomic_t intpending;
 #define EXEXEC 3        /* command execution failed */
 #define EXEXIT 4        /* exit the shell */
 #define EXSIG 5         /* trapped signal in wait(1) */
-
-
+static volatile int suppressint;
+static volatile sig_atomic_t intpending;
 /* do we generate EXSIG events */
 static int exsig;
 /* last pending signal */
@@ -191,73 +190,323 @@ static volatile sig_atomic_t pendingsigs;
  * much more efficient and portable.  (But hacking the kernel is so much
  * more fun than worrying about efficiency and portability. :-))
  */
-
 #define xbarrier() ({ __asm__ __volatile__ ("": : :"memory"); })
-#define INTOFF \
+#define INT_OFF \
        ({ \
                suppressint++; \
                xbarrier(); \
                0; \
        })
-#define SAVEINT(v) ((v) = suppressint)
-#define RESTOREINT(v) \
-       ({ \
-               xbarrier(); \
-               suppressint = (v); \
-               if (suppressint == 0 && intpending) onint(); \
-               0; \
-       })
-#define EXSIGON() \
-       ({ \
-               exsig++; \
-               xbarrier(); \
-               if (pendingsigs) \
-                       exraise(EXSIG); \
-               0; \
-       })
-/* EXSIG is turned off by evalbltin(). */
-
 
-static void exraise(int) ATTRIBUTE_NORETURN;
-static void onint(void) ATTRIBUTE_NORETURN;
+/*
+ * Called to raise an exception.  Since C doesn't include exceptions, we
+ * just do a longjmp to the exception handler.  The type of exception is
+ * stored in the global variable "exception".
+ */
+static void raise_exception(int) ATTRIBUTE_NORETURN;
+static void
+raise_exception(int e)
+{
+#if DEBUG
+       if (handler == NULL)
+               abort();
+#endif
+       INT_OFF;
+       exception = e;
+       longjmp(handler->loc, 1);
+}
 
-static void sh_error(const char *, ...) ATTRIBUTE_NORETURN;
-static void exerror(int, const char *, ...) ATTRIBUTE_NORETURN;
+/*
+ * Called from trap.c when a SIGINT is received.  (If the user specifies
+ * that SIGINT is to be trapped or ignored using the trap builtin, then
+ * this routine is not called.)  Suppressint is nonzero when interrupts
+ * are held using the INT_OFF macro.  (The test for iflag is just
+ * defensive programming.)
+ */
+static void raise_interrupt(void) ATTRIBUTE_NORETURN;
+static void
+raise_interrupt(void)
+{
+       int i;
 
-static void sh_warnx(const char *, ...);
+       intpending = 0;
+       i = EXSIG;
+       if (gotsig[SIGINT - 1] && !trap[SIGINT]) {
+               if (!(rootshell && iflag)) {
+                       signal(SIGINT, SIG_DFL);
+                       raise(SIGINT);
+               }
+               i = EXINT;
+       }
+       raise_exception(i);
+       /* NOTREACHED */
+}
 
 #if ENABLE_ASH_OPTIMIZE_FOR_SIZE
-static void
-inton(void)
+static void int_on(void)
 {
        if (--suppressint == 0 && intpending) {
-               onint();
+               raise_interrupt();
        }
 }
-#define INTON inton()
-static void forceinton(void)
+#define INT_ON int_on()
+static void force_int_on(void)
 {
        suppressint = 0;
        if (intpending)
-               onint();
+               raise_interrupt();
 }
-#define FORCEINTON forceinton()
+#define FORCE_INT_ON force_int_on()
 #else
-#define INTON \
+#define INT_ON \
        ({ \
                xbarrier(); \
-               if (--suppressint == 0 && intpending) onint(); \
+               if (--suppressint == 0 && intpending) raise_interrupt(); \
                0; \
        })
-#define FORCEINTON \
+#define FORCE_INT_ON \
        ({ \
                xbarrier(); \
                suppressint = 0; \
-               if (intpending) onint(); \
+               if (intpending) raise_interrupt(); \
                0; \
        })
 #endif /* ASH_OPTIMIZE_FOR_SIZE */
 
+#define SAVE_INT(v) ((v) = suppressint)
+
+#define RESTORE_INT(v) \
+       ({ \
+               xbarrier(); \
+               suppressint = (v); \
+               if (suppressint == 0 && intpending) raise_interrupt(); \
+               0; \
+       })
+
+#define EXSIGON \
+       ({ \
+               exsig++; \
+               xbarrier(); \
+               if (pendingsigs) \
+                       raise_exception(EXSIG); \
+               0; \
+       })
+/* EXSIG is turned off by evalbltin(). */
+
+
+/* ============ stdout/stderr output */
+
+static void
+outstr(const char *p, FILE *file)
+{
+       INT_OFF;
+       fputs(p, file);
+       INT_ON;
+}
+
+static void
+flush_stdout_stderr(void)
+{
+       INT_OFF;
+       fflush(stdout);
+       fflush(stderr);
+       INT_ON;
+}
+
+static void
+flush_stderr(void)
+{
+       INT_OFF;
+       fflush(stderr);
+       INT_ON;
+}
+
+static void
+outcslow(int c, FILE *dest)
+{
+       INT_OFF;
+       putc(c, dest);
+       fflush(dest);
+       INT_ON;
+}
+
+static int out1fmt(const char *, ...) __attribute__((__format__(__printf__,1,2)));
+static int
+out1fmt(const char *fmt, ...)
+{
+       va_list ap;
+       int r;
+
+       INT_OFF;
+       va_start(ap, fmt);
+       r = vprintf(fmt, ap);
+       va_end(ap);
+       INT_ON;
+       return r;
+}
+
+static int fmtstr(char *, size_t, const char *, ...) __attribute__((__format__(__printf__,3,4)));
+static int
+fmtstr(char *outbuf, size_t length, const char *fmt, ...)
+{
+       va_list ap;
+       int ret;
+
+       va_start(ap, fmt);
+       INT_OFF;
+       ret = vsnprintf(outbuf, length, fmt, ap);
+       va_end(ap);
+       INT_ON;
+       return ret;
+}
+
+static void
+out1str(const char *p)
+{
+       outstr(p, stdout);
+}
+
+static void
+out2str(const char *p)
+{
+       outstr(p, stderr);
+       flush_stderr();
+}
+
+
+/* ============ Parser data
+ *
+ * ash_vmsg() needs parsefile->fd, hence parsefile definition is moved up.
+ */
+
+struct strpush {
+       struct strpush *prev;   /* preceding string on stack */
+       char *prevstring;
+       int prevnleft;
+#if ENABLE_ASH_ALIAS
+       struct alias *ap;       /* if push was associated with an alias */
+#endif
+       char *string;           /* remember the string since it may change */
+};
+
+struct parsefile {
+       struct parsefile *prev; /* preceding file on stack */
+       int linno;              /* current line */
+       int fd;                 /* file descriptor (or -1 if string) */
+       int nleft;              /* number of chars left in this line */
+       int lleft;              /* number of chars left in this buffer */
+       char *nextc;            /* next char in buffer */
+       char *buf;              /* input buffer */
+       struct strpush *strpush; /* for pushing strings at this level */
+       struct strpush basestrpush; /* so pushing one is fast */
+};
+
+static struct parsefile basepf;         /* top level input file */
+static struct parsefile *parsefile = &basepf;  /* current input file */
+static int startlinno;                 /* line # where last token started */
+static char *commandname;              /* currently executing command */
+static struct strlist *cmdenviron;     /* environment for builtin command */
+static int exitstatus;                 /* exit status of last command */
+static int back_exitstatus;            /* exit status of backquoted command */
+
+
+/* ============ Message printing */
+
+static void
+ash_vmsg(const char *msg, va_list ap)
+{
+       fprintf(stderr, "%s: ", arg0);
+       if (commandname) {
+               const char *fmt = (!iflag || parsefile->fd) ?
+                                       "%s: %d: " : "%s: ";
+               fprintf(stderr, fmt, commandname, startlinno);
+       }
+       vfprintf(stderr, msg, ap);
+       outcslow('\n', stderr);
+}
+
+/*
+ * Exverror is called to raise the error exception.  If the second argument
+ * is not NULL then error prints an error message using printf style
+ * formatting.  It then raises the error exception.
+ */
+static void ash_vmsg_and_raise(int, const char *, va_list) ATTRIBUTE_NORETURN;
+static void
+ash_vmsg_and_raise(int cond, const char *msg, va_list ap)
+{
+#if DEBUG
+       if (msg) {
+               TRACE(("ash_vmsg_and_raise(%d, \"", cond));
+               TRACEV((msg, ap));
+               TRACE(("\") pid=%d\n", getpid()));
+       } else
+               TRACE(("ash_vmsg_and_raise(%d, NULL) pid=%d\n", cond, getpid()));
+       if (msg)
+#endif
+               ash_vmsg(msg, ap);
+
+       flush_stdout_stderr();
+       raise_exception(cond);
+       /* NOTREACHED */
+}
+
+static void ash_msg_and_raise_error(const char *, ...) ATTRIBUTE_NORETURN;
+static void
+ash_msg_and_raise_error(const char *msg, ...)
+{
+       va_list ap;
+
+       va_start(ap, msg);
+       ash_vmsg_and_raise(EXERROR, msg, ap);
+       /* NOTREACHED */
+       va_end(ap);
+}
+
+static void ash_msg_and_raise(int, const char *, ...) ATTRIBUTE_NORETURN;
+static void
+ash_msg_and_raise(int cond, const char *msg, ...)
+{
+       va_list ap;
+
+       va_start(ap, msg);
+       ash_vmsg_and_raise(cond, msg, ap);
+       /* NOTREACHED */
+       va_end(ap);
+}
+
+/*
+ * error/warning routines for external builtins
+ */
+static void
+ash_msg(const char *fmt, ...)
+{
+       va_list ap;
+
+       va_start(ap, fmt);
+       ash_vmsg(fmt, ap);
+       va_end(ap);
+}
+
+/*
+ * Return a string describing an error.  The returned string may be a
+ * pointer to a static buffer that will be overwritten on the next call.
+ * Action describes the operation that got the error.
+ */
+static const char *
+errmsg(int e, const char *em)
+{
+       if (e == ENOENT || e == ENOTDIR) {
+               return em;
+       }
+       return strerror(e);
+}
+
+
+/* ============ Unsorted yet */
+
+
+static void setpwd(const char *, int);
+
 /*      expand.h     */
 
 struct strlist {
@@ -297,10 +546,6 @@ static void expari(int);
 
 /*      eval.h       */
 
-static char *commandname;              /* currently executing command */
-static struct strlist *cmdenviron;     /* environment for builtin command */
-static int exitstatus;                 /* exit status of last command */
-static int back_exitstatus;            /* exit status of backquoted command */
 
 
 struct backcmd {                /* result of evalbackcmd */
@@ -505,37 +750,13 @@ static void freefunc(struct funcnode *);
 static int plinno = 1;                  /* input line number */
 
 /* number of characters left in input buffer */
-static int parsenleft;                  /* copy of parsefile->nleft */
-static int parselleft;                  /* copy of parsefile->lleft */
-
-/* next character in input buffer */
-static char *parsenextc;                /* copy of parsefile->nextc */
-
-struct strpush {
-       struct strpush *prev;   /* preceding string on stack */
-       char *prevstring;
-       int prevnleft;
-#if ENABLE_ASH_ALIAS
-       struct alias *ap;       /* if push was associated with an alias */
-#endif
-       char *string;           /* remember the string since it may change */
-};
-
-struct parsefile {
-       struct parsefile *prev; /* preceding file on stack */
-       int linno;              /* current line */
-       int fd;                 /* file descriptor (or -1 if string) */
-       int nleft;              /* number of chars left in this line */
-       int lleft;              /* number of chars left in this buffer */
-       char *nextc;            /* next char in buffer */
-       char *buf;              /* input buffer */
-       struct strpush *strpush; /* for pushing strings at this level */
-       struct strpush basestrpush; /* so pushing one is fast */
-};
+static int parsenleft;                  /* copy of parsefile->nleft */
+static int parselleft;                  /* copy of parsefile->lleft */
+
+/* next character in input buffer */
+static char *parsenextc;                /* copy of parsefile->nextc */
 
-static struct parsefile basepf;         /* top level input file */
 #define basebuf bb_common_bufsiz1       /* buffer for top level input file */
-static struct parsefile *parsefile = &basepf;  /* current input file */
 
 
 static int tokpushback;                 /* last token pushed back */
@@ -550,7 +771,6 @@ static struct nodelist *backquotelist;
 static union node *redirnode;
 static struct heredoc *heredoc;
 static int quoteflag;                  /* set if (part of) last token was quoted */
-static int startlinno;                 /* line # where last token started */
 
 static union node *parsecmd(int);
 static void fixredir(union node *, const char *, int);
@@ -1597,32 +1817,10 @@ static int nullredirs;
 
 extern char **environ;
 
-/*      output.h     */
-
-
-static void outstr(const char *, FILE *);
-static void outcslow(int, FILE *);
-static void flushall(void);
-static void flusherr(void);
-static int  out1fmt(const char *, ...)
-       __attribute__((__format__(__printf__,1,2)));
-static int fmtstr(char *, size_t, const char *, ...)
-       __attribute__((__format__(__printf__,3,4)));
 
 static int preverrout_fd;   /* save fd2 before print debug if xflag is set. */
 
 
-static void out1str(const char *p)
-{
-       outstr(p, stdout);
-}
-
-static void out2str(const char *p)
-{
-       outstr(p, stderr);
-       flusherr();
-}
-
 /*
  * Initialization code.
  */
@@ -1790,12 +1988,6 @@ static void showjobs(FILE *, int);
 /*      main.h        */
 
 
-/* pid of main shell */
-static int rootpid;
-/* shell level: 0 for the main shell, 1 for its children, and so on */
-static int shlvl;
-#define rootshell (!shlvl)
-
 static void readcmdfile(char *);
 static int cmdloop(int);
 
@@ -1871,8 +2063,6 @@ static char *_STPUTC(int c, char *p)
 #define ungrabstackstr(s, p) stunalloc((s))
 #define stackstrend() ((void *)sstrend)
 
-#define ckfree(p)       free((pointer)(p))
-
 /*      mystring.h   */
 
 
@@ -1900,59 +2090,6 @@ struct shparam {
 };
 
 
-#define eflag optlist[0]
-#define fflag optlist[1]
-#define Iflag optlist[2]
-#define iflag optlist[3]
-#define mflag optlist[4]
-#define nflag optlist[5]
-#define sflag optlist[6]
-#define xflag optlist[7]
-#define vflag optlist[8]
-#define Cflag optlist[9]
-#define aflag optlist[10]
-#define bflag optlist[11]
-#define uflag optlist[12]
-#define viflag optlist[13]
-
-#if DEBUG
-#define nolog optlist[14]
-#define debug optlist[15]
-#endif
-
-/*      options.c */
-
-
-static const char *const optletters_optnames[] = {
-       "e"   "errexit",
-       "f"   "noglob",
-       "I"   "ignoreeof",
-       "i"   "interactive",
-       "m"   "monitor",
-       "n"   "noexec",
-       "s"   "stdin",
-       "x"   "xtrace",
-       "v"   "verbose",
-       "C"   "noclobber",
-       "a"   "allexport",
-       "b"   "notify",
-       "u"   "nounset",
-       "\0"  "vi",
-#if DEBUG
-       "\0"  "nolog",
-       "\0"  "debug",
-#endif
-};
-
-#define optletters(n) optletters_optnames[(n)][0]
-#define optnames(n) (&optletters_optnames[(n)][1])
-
-#define NOPTS (sizeof(optletters_optnames)/sizeof(optletters_optnames[0]))
-
-static char optlist[NOPTS];
-
-
-static char *arg0;                     /* value of $0 */
 static struct shparam shellparam;      /* $@ current positional parameters */
 static char **argptr;                  /* argument list for builtin commands */
 static char *optionarg;                /* set by nextopt (like getopt) */
@@ -1998,13 +2135,6 @@ static void opentrace(void);
 /*      trap.h       */
 
 
-/* trap handler commands */
-static char *trap[NSIG];
-/* current value of signal */
-static char sigmode[NSIG - 1];
-/* indicates specified signal received */
-static char gotsig[NSIG - 1];
-
 static void clear_traps(void);
 static void setsignal(int);
 static void ignoresig(int);
@@ -2094,10 +2224,10 @@ setalias(const char *name, const char *val)
 
        app = __lookupalias(name);
        ap = *app;
-       INTOFF;
+       INT_OFF;
        if (ap) {
                if (!(ap->flag & ALIASINUSE)) {
-                       ckfree(ap->val);
+                       free(ap->val);
                }
                ap->val = savestr(val);
                ap->flag &= ~ALIASDEAD;
@@ -2110,7 +2240,7 @@ setalias(const char *name, const char *val)
                ap->next = 0;
                *app = ap;
        }
-       INTON;
+       INT_ON;
 }
 
 static int
@@ -2121,9 +2251,9 @@ unalias(const char *name)
        app = __lookupalias(name);
 
        if (*app) {
-               INTOFF;
+               INT_OFF;
                *app = freealias(*app);
-               INTON;
+               INT_ON;
                return 0;
        }
 
@@ -2136,7 +2266,7 @@ rmaliases(void)
        struct alias *ap, **app;
        int i;
 
-       INTOFF;
+       INT_OFF;
        for (i = 0; i < ATABSIZE; i++) {
                app = &atab[i];
                for (ap = *app; ap; ap = *app) {
@@ -2146,7 +2276,7 @@ rmaliases(void)
                        }
                }
        }
-       INTON;
+       INT_ON;
 }
 
 static struct alias *
@@ -2228,9 +2358,9 @@ freealias(struct alias *ap)
        }
 
        next = ap->next;
-       ckfree(ap->name);
-       ckfree(ap->val);
-       ckfree(ap);
+       free(ap->name);
+       free(ap->val);
+       free(ap);
        return next;
 }
 
@@ -2356,7 +2486,7 @@ cdcmd(int argc, char **argv)
                        break;
                }
        } while (path);
-       sh_error("can't cd to %s", dest);
+       ash_msg_and_raise_error("can't cd to %s", dest);
        /* NOTREACHED */
  out:
        if (flags & CD_PRINT)
@@ -2438,7 +2568,7 @@ docd(const char *dest, int flags)
 
        TRACE(("docd(\"%s\", %d) called\n", dest, flags));
 
-       INTOFF;
+       INT_OFF;
        if (!(flags & CD_PHYSICAL)) {
                dir = updatepwd(dest);
                if (dir)
@@ -2450,7 +2580,7 @@ docd(const char *dest, int flags)
        setpwd(dir, 1);
        hashcd();
  out:
-       INTON;
+       INT_ON;
        return err;
 }
 
@@ -2490,7 +2620,7 @@ setpwd(const char *val, int setold)
        if (setold) {
                setvar("OLDPWD", oldcur, VEXPORT);
        }
-       INTOFF;
+       INT_OFF;
        if (physdir != nullstr) {
                if (physdir != oldcur)
                        free(physdir);
@@ -2507,161 +2637,10 @@ setpwd(const char *val, int setold)
                free(oldcur);
        }
        curdir = dir;
-       INTON;
+       INT_ON;
        setvar("PWD", dir, VEXPORT);
 }
 
-/*      error.c   */
-
-/*
- * Errors and exceptions.
- */
-
-/*
- * Code to handle exceptions in C.
- */
-
-
-static void exverror(int, const char *, va_list) ATTRIBUTE_NORETURN;
-
-/*
- * Called to raise an exception.  Since C doesn't include exceptions, we
- * just do a longjmp to the exception handler.  The type of exception is
- * stored in the global variable "exception".
- */
-static void
-exraise(int e)
-{
-#if DEBUG
-       if (handler == NULL)
-               abort();
-#endif
-       INTOFF;
-
-       exception = e;
-       longjmp(handler->loc, 1);
-}
-
-
-/*
- * Called from trap.c when a SIGINT is received.  (If the user specifies
- * that SIGINT is to be trapped or ignored using the trap builtin, then
- * this routine is not called.)  Suppressint is nonzero when interrupts
- * are held using the INTOFF macro.  (The test for iflag is just
- * defensive programming.)
- */
-static void
-onint(void)
-{
-       int i;
-
-       intpending = 0;
-       i = EXSIG;
-       if (gotsig[SIGINT - 1] && !trap[SIGINT]) {
-               if (!(rootshell && iflag)) {
-                       signal(SIGINT, SIG_DFL);
-                       raise(SIGINT);
-               }
-               i = EXINT;
-       }
-       exraise(i);
-       /* NOTREACHED */
-}
-
-static void
-exvwarning(const char *msg, va_list ap)
-{
-        FILE *errs;
-
-        errs = stderr;
-        fprintf(errs, "%s: ", arg0);
-        if (commandname) {
-                const char *fmt = (!iflag || parsefile->fd) ?
-                                       "%s: %d: " : "%s: ";
-                fprintf(errs, fmt, commandname, startlinno);
-        }
-        vfprintf(errs, msg, ap);
-        outcslow('\n', errs);
-}
-
-/*
- * Exverror is called to raise the error exception.  If the second argument
- * is not NULL then error prints an error message using printf style
- * formatting.  It then raises the error exception.
- */
-static void
-exverror(int cond, const char *msg, va_list ap)
-{
-#if DEBUG
-       if (msg) {
-               TRACE(("exverror(%d, \"", cond));
-               TRACEV((msg, ap));
-               TRACE(("\") pid=%d\n", getpid()));
-       } else
-               TRACE(("exverror(%d, NULL) pid=%d\n", cond, getpid()));
-       if (msg)
-#endif
-               exvwarning(msg, ap);
-
-       flushall();
-       exraise(cond);
-       /* NOTREACHED */
-}
-
-
-static void
-sh_error(const char *msg, ...)
-{
-       va_list ap;
-
-       va_start(ap, msg);
-       exverror(EXERROR, msg, ap);
-       /* NOTREACHED */
-       va_end(ap);
-}
-
-
-static void
-exerror(int cond, const char *msg, ...)
-{
-       va_list ap;
-
-       va_start(ap, msg);
-       exverror(cond, msg, ap);
-       /* NOTREACHED */
-       va_end(ap);
-}
-
-
-/*
- * error/warning routines for external builtins
- */
-static void
-sh_warnx(const char *fmt, ...)
-{
-       va_list ap;
-
-       va_start(ap, fmt);
-       exvwarning(fmt, ap);
-       va_end(ap);
-}
-
-
-/*
- * Return a string describing an error.  The returned string may be a
- * pointer to a static buffer that will be overwritten on the next call.
- * Action describes the operation that got the error.
- */
-static const char *
-errmsg(int e, const char *em)
-{
-       if (e == ENOENT || e == ENOTDIR) {
-               return em;
-       }
-       return strerror(e);
-}
-
-
 /*      eval.c  */
 
 /*
@@ -2870,7 +2849,7 @@ evaltree(union node *n, int flags)
 
        if (flags & EV_EXIT) {
  exexit:
-               exraise(EXEXIT);
+               raise_exception(EXEXIT);
        }
 }
 
@@ -2998,10 +2977,10 @@ evalsubshell(union node *n, int flags)
        expredir(n->nredir.redirect);
        if (!backgnd && flags & EV_EXIT && !trap[0])
                goto nofork;
-       INTOFF;
+       INT_OFF;
        jp = makejob(n, 1);
        if (forkshell(jp, n, backgnd) == 0) {
-               INTON;
+               INT_ON;
                flags |= EV_EXIT;
                if (backgnd)
                        flags &=~ EV_TESTED;
@@ -3014,7 +2993,7 @@ nofork:
        if (! backgnd)
                status = waitforjob(jp);
        exitstatus = status;
-       INTON;
+       INT_ON;
 }
 
 
@@ -3046,7 +3025,7 @@ expredir(union node *n)
                                if (fn.list != NULL)
                                        fixredir(redir, fn.list->text, 1);
                                else
-                                       sh_error("redir error");
+                                       ash_msg_and_raise_error("redir error");
                        }
                        break;
                }
@@ -3074,7 +3053,7 @@ evalpipe(union node *n, int flags)
        for (lp = n->npipe.cmdlist ; lp ; lp = lp->next)
                pipelen++;
        flags |= EV_EXIT;
-       INTOFF;
+       INT_OFF;
        jp = makejob(n, pipelen);
        prevfd = -1;
        for (lp = n->npipe.cmdlist ; lp ; lp = lp->next) {
@@ -3083,11 +3062,11 @@ evalpipe(union node *n, int flags)
                if (lp->next) {
                        if (pipe(pip) < 0) {
                                close(prevfd);
-                               sh_error("Pipe call failed");
+                               ash_msg_and_raise_error("Pipe call failed");
                        }
                }
                if (forkshell(jp, lp->n, n->npipe.backgnd) == 0) {
-                       INTON;
+                       INT_ON;
                        if (pip[1] >= 0) {
                                close(pip[0]);
                        }
@@ -3111,7 +3090,7 @@ evalpipe(union node *n, int flags)
                exitstatus = waitforjob(jp);
                TRACE(("evalpipe:  job done exit status %d\n", exitstatus));
        }
-       INTON;
+       INT_ON;
 }
 
 
@@ -3142,10 +3121,10 @@ evalbackcmd(union node *n, struct backcmd *result)
                struct job *jp;
 
                if (pipe(pip) < 0)
-                       sh_error("Pipe call failed");
+                       ash_msg_and_raise_error("Pipe call failed");
                jp = makejob(n, 1);
                if (forkshell(jp, n, FORK_NOJOB) == 0) {
-                       FORCEINTON;
+                       FORCE_INT_ON;
                        close(pip[0]);
                        if (pip[1] != 1) {
                                close(1);
@@ -3250,8 +3229,7 @@ evalcommand(union node *cmd, int flags)
        *arglist.lastp = NULL;
 
        argc = 0;
-       if (cmd->ncmd.args)
-       {
+       if (cmd->ncmd.args) {
                bcmd = find_builtin(cmd->ncmd.args->narg.text);
                pseudovarflag = bcmd && IS_BUILTIN_ASSIGN(bcmd);
        }
@@ -3337,7 +3315,7 @@ evalcommand(union node *cmd, int flags)
                        find_command(argv[0], &cmdentry, cmd_flag, path);
                        if (cmdentry.cmdtype == CMDUNKNOWN) {
                                status = 127;
-                               flusherr();
+                               flush_stderr();
                                goto bail;
                        }
 
@@ -3367,7 +3345,7 @@ evalcommand(union node *cmd, int flags)
        if (status) {
                /* We have a redirection error. */
                if (spclbltin > 0)
-                       exraise(EXERROR);
+                       raise_exception(EXERROR);
  bail:
                exitstatus = status;
                goto out;
@@ -3378,14 +3356,14 @@ evalcommand(union node *cmd, int flags)
        default:
                /* Fork off a child process if necessary. */
                if (!(flags & EV_EXIT) || trap[0]) {
-                       INTOFF;
+                       INT_OFF;
                        jp = makejob(cmd, 1);
                        if (forkshell(jp, cmd, FORK_FG) != 0) {
                                exitstatus = waitforjob(jp);
-                               INTON;
+                               INT_ON;
                                break;
                        }
-                       FORCEINTON;
+                       FORCE_INT_ON;
                }
                listsetvar(varlist.list, VEXPORT|VSTACK);
                shellexec(argv, path, cmdentry.u.index);
@@ -3425,7 +3403,7 @@ evalcommand(union node *cmd, int flags)
  raise:
                                longjmp(handler->loc, 1);
                        }
-                       FORCEINTON;
+                       FORCE_INT_ON;
                }
                break;
 
@@ -3465,7 +3443,7 @@ evalbltin(const struct builtincmd *cmd, int argc, char **argv)
        argptr = argv + 1;
        optptr = NULL;                  /* initialize nextopt */
        exitstatus = (*cmd->builtin)(argc, argv);
-       flushall();
+       flush_stdout_stderr();
  cmddone:
        exitstatus |= ferror(stdout);
        clearerr(stdout);
@@ -3491,14 +3469,14 @@ evalfun(struct funcnode *func, int argc, char **argv, int flags)
        if (e) {
                goto funcdone;
        }
-       INTOFF;
+       INT_OFF;
        savehandler = handler;
        handler = &jmploc;
        localvars = NULL;
        shellparam.malloc = 0;
        func->count++;
        funcnest++;
-       INTON;
+       INT_ON;
        shellparam.nparam = argc - 1;
        shellparam.p = argv + 1;
 #if ENABLE_ASH_GETOPTS
@@ -3507,7 +3485,7 @@ evalfun(struct funcnode *func, int argc, char **argv, int flags)
 #endif
        evaltree(&func->n, flags & EV_TESTED);
 funcdone:
-       INTOFF;
+       INT_OFF;
        funcnest--;
        freefunc(func);
        poplocalvars();
@@ -3515,7 +3493,7 @@ funcdone:
        freeparam(&shellparam);
        shellparam = saveparam;
        handler = savehandler;
-       INTON;
+       INT_ON;
        evalskip &= ~SKIPFUNC;
        return e;
 }
@@ -3580,7 +3558,7 @@ breakcmd(int argc, char **argv)
        int n = argc > 1 ? number(argv[1]) : 1;
 
        if (n <= 0)
-               sh_error(illnum, argv[1]);
+               ash_msg_and_raise_error(illnum, argv[1]);
        if (n > loopnest)
                n = loopnest;
        if (n > 0) {
@@ -3716,7 +3694,7 @@ shellexec(char **argv, const char *path, int idx)
        exitstatus = exerrno;
        TRACE(("shellexec failed for %s, errno %d, suppressint %d\n",
                argv[0], e, suppressint ));
-       exerror(EXEXEC, "%s: %s", argv[0], errmsg(e, E_EXEC));
+       ash_msg_and_raise(EXEXEC, "%s: %s", argv[0], errmsg(e, "not found"));
        /* NOTREACHED */
 }
 
@@ -3758,7 +3736,7 @@ tryexec(char *cmd, char **argv, char **envp)
        execve(cmd, argv, envp);
 #endif
        if (repeated++) {
-               ckfree(argv);
+               free(argv);
        } else if (errno == ENOEXEC) {
                char **ap;
                char **new;
@@ -4020,7 +3998,7 @@ find_command(char *name, struct cmdentry *entry, int act, const char *path)
                        readcmdfile(fullname);
                        cmdp = cmdlookup(name, 0);
                        if (cmdp == NULL || cmdp->cmdtype != CMDFUNCTION)
-                               sh_error("%s not defined in %s", name, fullname);
+                               ash_msg_and_raise_error("%s not defined in %s", name, fullname);
                        stunalloc(fullname);
                        goto success;
                }
@@ -4030,11 +4008,11 @@ find_command(char *name, struct cmdentry *entry, int act, const char *path)
                        entry->u.index = idx;
                        return;
                }
-               INTOFF;
+               INT_OFF;
                cmdp = cmdlookup(name, 1);
                cmdp->cmdtype = CMDNORMAL;
                cmdp->param.index = idx;
-               INTON;
+               INT_ON;
                goto success;
        }
 
@@ -4042,7 +4020,7 @@ find_command(char *name, struct cmdentry *entry, int act, const char *path)
        if (cmdp && updatetbl)
                delete_cmd_entry();
        if (act & DO_ERR)
-               sh_warnx("%s: %s", name, errmsg(e, E_EXEC));
+               ash_msg("%s: %s", name, errmsg(e, "not found"));
        entry->cmdtype = CMDUNKNOWN;
        return;
 
@@ -4052,11 +4030,11 @@ find_command(char *name, struct cmdentry *entry, int act, const char *path)
                entry->u.cmd = bcmd;
                return;
        }
-       INTOFF;
+       INT_OFF;
        cmdp = cmdlookup(name, 1);
        cmdp->cmdtype = CMDBUILTIN;
        cmdp->param.cmd = bcmd;
-       INTON;
+       INT_ON;
  success:
        cmdp->rehash = 0;
        entry->cmdtype = cmdp->cmdtype;
@@ -4168,7 +4146,7 @@ clearcmdentry(int firstchange)
        struct tblentry **pp;
        struct tblentry *cmdp;
 
-       INTOFF;
+       INT_OFF;
        for (tblp = cmdtable ; tblp < &cmdtable[CMDTABLESIZE] ; tblp++) {
                pp = tblp;
                while ((cmdp = *pp) != NULL) {
@@ -4178,13 +4156,13 @@ clearcmdentry(int firstchange)
                             builtinloc >= firstchange)
                        ) {
                                *pp = cmdp->next;
-                               ckfree(cmdp);
+                               free(cmdp);
                        } else {
                                pp = &cmdp->next;
                        }
                }
        }
-       INTON;
+       INT_ON;
 }
 
 
@@ -4238,13 +4216,13 @@ delete_cmd_entry(void)
 {
        struct tblentry *cmdp;
 
-       INTOFF;
+       INT_OFF;
        cmdp = *lastcmdentry;
        *lastcmdentry = cmdp->next;
        if (cmdp->cmdtype == CMDFUNCTION)
                freefunc(cmdp->param.func);
-       ckfree(cmdp);
-       INTON;
+       free(cmdp);
+       INT_ON;
 }
 
 
@@ -4295,11 +4273,11 @@ defun(char *name, union node *func)
 {
        struct cmdentry entry;
 
-       INTOFF;
+       INT_OFF;
        entry.cmdtype = CMDFUNCTION;
        entry.u.func = copyfunc(func);
        addcmdentry(name, &entry);
-       INTON;
+       INT_ON;
 }
 
 
@@ -4819,11 +4797,11 @@ removerecordregions(int endoff)
        if (ifsfirst.endoff > endoff) {
                while (ifsfirst.next != NULL) {
                        struct ifsregion *ifsp;
-                       INTOFF;
+                       INT_OFF;
                        ifsp = ifsfirst.next->next;
-                       ckfree(ifsfirst.next);
+                       free(ifsfirst.next);
                        ifsfirst.next = ifsp;
-                       INTON;
+                       INT_ON;
                }
                if (ifsfirst.begoff > endoff)
                        ifslastp = NULL;
@@ -4839,11 +4817,11 @@ removerecordregions(int endoff)
                ifslastp=ifslastp->next;
        while (ifslastp->next != NULL) {
                struct ifsregion *ifsp;
-               INTOFF;
+               INT_OFF;
                ifsp = ifslastp->next->next;
-               ckfree(ifslastp->next);
+               free(ifslastp->next);
                ifslastp->next = ifsp;
-               INTON;
+               INT_ON;
        }
        if (ifslastp->endoff > endoff)
                ifslastp->endoff = endoff;
@@ -4881,7 +4859,7 @@ expari(int quotes)
                        p--;
 #if DEBUG
                        if (p < start) {
-                               sh_error("missing CTLARI (shouldn't happen)");
+                               ash_msg_and_raise_error("missing CTLARI (shouldn't happen)");
                        }
 #endif
                }
@@ -4928,7 +4906,7 @@ expbackq(union node *cmd, int quoted, int quotes)
        int syntax = quoted? DQSYNTAX : BASESYNTAX;
        struct stackmark smark;
 
-       INTOFF;
+       INT_OFF;
        setstackmark(&smark);
        dest = expdest;
        startloc = dest - (char *)stackblock();
@@ -4953,12 +4931,12 @@ expbackq(union node *cmd, int quoted, int quotes)
        }
 
        if (in.buf)
-               ckfree(in.buf);
+               free(in.buf);
        if (in.fd >= 0) {
                close(in.fd);
                back_exitstatus = waitforjob(in.jp);
        }
-       INTON;
+       INT_ON;
 
        /* Eat all trailing newlines */
        dest = expdest;
@@ -5408,11 +5386,11 @@ recordregion(int start, int end, int nulonly)
        if (ifslastp == NULL) {
                ifsp = &ifsfirst;
        } else {
-               INTOFF;
+               INT_OFF;
                ifsp = (struct ifsregion *)ckmalloc(sizeof(struct ifsregion));
                ifsp->next = NULL;
                ifslastp->next = ifsp;
-               INTON;
+               INT_ON;
        }
        ifslastp = ifsp;
        ifslastp->begoff = start;
@@ -5515,17 +5493,17 @@ ifsfree(void)
 {
        struct ifsregion *p;
 
-       INTOFF;
+       INT_OFF;
        p = ifsfirst.next;
        do {
                struct ifsregion *ifsp;
                ifsp = p->next;
-               ckfree(p);
+               free(p);
                p = ifsp;
        } while (p);
        ifslastp = NULL;
        ifsfirst.next = NULL;
-       INTON;
+       INT_ON;
 }
 
 static void expmeta(char *, char *);
@@ -5554,7 +5532,7 @@ expandmeta(struct strlist *str, int flag)
                        goto nometa;
                savelastp = exparg.lastp;
 
-               INTOFF;
+               INT_OFF;
                p = preglob(str->text, 0, RMESCAPE_ALLOC | RMESCAPE_HEAP);
                {
                        int i = strlen(str->text);
@@ -5562,10 +5540,10 @@ expandmeta(struct strlist *str, int flag)
                }
 
                expmeta(expdir, p);
-               ckfree(expdir);
+               free(expdir);
                if (p != str->text)
-                       ckfree(p);
-               INTON;
+                       free(p);
+               INT_ON;
                if (exparg.lastp == savelastp) {
                        /*
                         * no matches
@@ -5911,7 +5889,7 @@ varunset(const char *end, const char *var, const char *umsg, int varflags)
                } else
                        msg = umsg;
        }
-       sh_error("%.*s: %s%s", end - var - 1, var, msg, tail);
+       ash_msg_and_raise_error("%.*s: %s%s", end - var - 1, var, msg, tail);
 }
 
 
@@ -6104,7 +6082,7 @@ preadbuffer(void)
        }
        if (parsenleft == EOF_NLEFT || parsefile->buf == NULL)
                return PEOF;
-       flushall();
+       flush_stdout_stderr();
 
        more = parselleft;
        if (more <= 0) {
@@ -6178,7 +6156,7 @@ pushstring(char *s, void *ap)
        size_t len;
 
        len = strlen(s);
-       INTOFF;
+       INT_OFF;
 /*dprintf("*** calling pushstring: %s, %d\n", s, len);*/
        if (parsefile->strpush) {
                sp = ckmalloc(sizeof(struct strpush));
@@ -6197,7 +6175,7 @@ pushstring(char *s, void *ap)
 #endif
        parsenextc = s;
        parsenleft = len;
-       INTON;
+       INT_ON;
 }
 
 static void
@@ -6205,14 +6183,14 @@ popstring(void)
 {
        struct strpush *sp = parsefile->strpush;
 
-       INTOFF;
+       INT_OFF;
 #if ENABLE_ASH_ALIAS
        if (sp->ap) {
                if (parsenextc[-1] == ' ' || parsenextc[-1] == '\t') {
                        checkkwd |= CHKALIAS;
                }
                if (sp->string != sp->ap->val) {
-                       ckfree(sp->string);
+                       free(sp->string);
                }
                sp->ap->flag &= ~ALIASINUSE;
                if (sp->ap->flag & ALIASDEAD) {
@@ -6225,8 +6203,8 @@ popstring(void)
 /*dprintf("*** calling popstring: restoring to '%s'\n", parsenextc);*/
        parsefile->strpush = sp->prev;
        if (sp != &(parsefile->basestrpush))
-               ckfree(sp);
-       INTON;
+               free(sp);
+       INT_ON;
 }
 
 
@@ -6240,23 +6218,23 @@ setinputfile(const char *fname, int flags)
        int fd;
        int fd2;
 
-       INTOFF;
+       INT_OFF;
        fd = open(fname, O_RDONLY);
        if (fd < 0) {
                if (flags & INPUT_NOFILE_OK)
                        goto out;
-               sh_error("Can't open %s", fname);
+               ash_msg_and_raise_error("Can't open %s", fname);
        }
        if (fd < 10) {
                fd2 = copyfd(fd, 10);
                close(fd);
                if (fd2 < 0)
-                       sh_error("Out of file descriptors");
+                       ash_msg_and_raise_error("Out of file descriptors");
                fd = fd2;
        }
        setinputfd(fd, flags & INPUT_PUSH_FILE);
  out:
-       INTON;
+       INT_ON;
        return fd;
 }
 
@@ -6287,13 +6265,13 @@ setinputfd(int fd, int push)
 static void
 setinputstring(char *string)
 {
-       INTOFF;
+       INT_OFF;
        pushfile();
        parsenextc = string;
        parsenleft = strlen(string);
        parsefile->buf = NULL;
        plinno = 1;
-       INTON;
+       INT_ON;
 }
 
 
@@ -6324,20 +6302,20 @@ popfile(void)
 {
        struct parsefile *pf = parsefile;
 
-       INTOFF;
+       INT_OFF;
        if (pf->fd >= 0)
                close(pf->fd);
        if (pf->buf)
-               ckfree(pf->buf);
+               free(pf->buf);
        while (pf->strpush)
                popstring();
        parsefile = pf->prev;
-       ckfree(pf);
+       free(pf);
        parsenleft = parsefile->nleft;
        parselleft = parsefile->lleft;
        parsenextc = parsefile->nextc;
        plinno = parsefile->linno;
-       INTON;
+       INT_ON;
 }
 
 
@@ -6497,7 +6475,7 @@ setjobctl(int on)
                        pgrp = tcgetpgrp(fd);
                        if (pgrp < 0) {
  out:
-                               sh_warnx("can't access tty; job control turned off");
+                               ash_msg("can't access tty; job control turned off");
                                mflag = on = 0;
                                goto close;
                        }
@@ -6541,7 +6519,7 @@ killcmd(int argc, char **argv)
 
        if (argc <= 1) {
  usage:
-               sh_error(
+               ash_msg_and_raise_error(
 "Usage: kill [-s sigspec | -signum | -sigspec] [pid | job]... or\n"
 "kill -l [exitstatus]"
                );
@@ -6564,7 +6542,7 @@ killcmd(int argc, char **argv)
                                case 's':
                                        signo = get_signum(optionarg);
                                        if (signo < 0) {
-                                               sh_error(
+                                               ash_msg_and_raise_error(
                                                        "invalid signal number or name: %s",
                                                        optionarg
                                                );
@@ -6598,7 +6576,7 @@ killcmd(int argc, char **argv)
                if (isdigit(*name))
                        out1fmt(snlfmt, name);
                else
-                       sh_error("invalid signal number or exit status: %s", *argptr);
+                       ash_msg_and_raise_error("invalid signal number or exit status: %s", *argptr);
                return 0;
        }
 
@@ -6612,7 +6590,7 @@ killcmd(int argc, char **argv)
                                -number(*argv + 1) : number(*argv);
                }
                if (kill(pid, signo) != 0) {
-                       sh_warnx("(%d) - %m", pid);
+                       ash_msg("(%d) - %m", pid);
                        i = 1;
                }
        } while (*++argv);
@@ -6666,7 +6644,7 @@ restartjob(struct job *jp, int mode)
        int status;
        pid_t pgid;
 
-       INTOFF;
+       INT_OFF;
        if (jp->state == JOBDONE)
                goto out;
        jp->state = JOBRUNNING;
@@ -6683,7 +6661,7 @@ restartjob(struct job *jp, int mode)
        } while (ps++, --i);
  out:
        status = (mode == FORK_FG) ? waitforjob(jp) : 0;
-       INTON;
+       INT_ON;
        return status;
 }
 #endif
@@ -6855,16 +6833,16 @@ freejob(struct job *jp)
        struct procstat *ps;
        int i;
 
-       INTOFF;
+       INT_OFF;
        for (i = jp->nprocs, ps = jp->ps ; --i >= 0 ; ps++) {
                if (ps->cmd != nullstr)
-                       ckfree(ps->cmd);
+                       free(ps->cmd);
        }
        if (jp->ps != &jp->ps0)
-               ckfree(jp->ps);
+               free(jp->ps);
        jp->used = 0;
        set_curjob(jp, CUR_DELETE);
-       INTON;
+       INT_ON;
 }
 
 
@@ -6875,7 +6853,7 @@ waitcmd(int argc, char **argv)
        int retval;
        struct job *jp;
 
-       EXSIGON();
+       EXSIGON;
 
        nextopt(nullstr);
        retval = 0;
@@ -7008,7 +6986,7 @@ getjob(const char *name, int getctl)
 #endif
        return jp;
  err:
-       sh_error(err_msg, name);
+       ash_msg_and_raise_error(err_msg, name);
 }
 
 
@@ -7150,7 +7128,7 @@ static void forkchild(struct job *jp, union node *n, int mode)
                if (jp->nprocs == 0) {
                        close(0);
                        if (open(bb_dev_null, O_RDONLY) != 0)
-                               sh_error("Can't open %s", bb_dev_null);
+                               ash_msg_and_raise_error("Can't open %s", bb_dev_null);
                }
        }
        if (!oldlvl && iflag) {
@@ -7210,7 +7188,7 @@ forkshell(struct job *jp, union node *n, int mode)
                TRACE(("Fork failed, errno=%d", errno));
                if (jp)
                        freejob(jp);
-               sh_error("Cannot fork");
+               ash_msg_and_raise_error("Cannot fork");
        }
        if (pid == 0)
                forkchild(jp, n, mode);
@@ -7330,7 +7308,7 @@ dowait(int block, struct job *job)
        TRACE(("wait returns pid %d, status=%d\n", pid, status));
        if (pid <= 0)
                return pid;
-       INTOFF;
+       INT_OFF;
        thisjob = NULL;
        for (jp = curjob; jp; jp = jp->prev_job) {
                struct procstat *sp;
@@ -7386,7 +7364,7 @@ dowait(int block, struct job *job)
        }
 
  out:
-       INTON;
+       INT_ON;
 
        if (thisjob && thisjob == job) {
                char s[48 + 1];
@@ -7716,14 +7694,14 @@ showpipe(struct job *jp, FILE *out)
        for (sp = jp->ps + 1; sp < spend; sp++)
                fprintf(out, " | %s", sp->cmd);
        outcslow('\n', out);
-       flushall();
+       flush_stdout_stderr();
 }
 
 static void
 xtcsetpgrp(int fd, pid_t pgrp)
 {
        if (tcsetpgrp(fd, pgrp))
-               sh_error("Cannot set tty process group (%m)");
+               ash_msg_and_raise_error("Cannot set tty process group (%m)");
 }
 #endif /* JOBS */
 
@@ -7881,7 +7859,7 @@ int ash_main(int argc, char **argv)
                        outcslow('\n', stderr);
                }
                popstackmark(&smark);
-               FORCEINTON;                             /* enable interrupts */
+               FORCE_INT_ON; /* enable interrupts */
                if (s == 1)
                        goto state1;
                else if (s == 2)
@@ -8085,7 +8063,7 @@ static char * find_dot_file(char *name)
        }
 
        /* not found in the PATH */
-       sh_error(not_found_msg, name);
+       ash_msg_and_raise_error("%s: not found", name);
        /* NOTREACHED */
 }
 
@@ -8132,7 +8110,7 @@ exitcmd(int argc, char **argv)
                return 0;
        if (argc > 1)
                exitstatus = number(argv[1]);
-       exraise(EXEXIT);
+       raise_exception(EXEXIT);
        /* NOTREACHED */
 }
 
@@ -8162,7 +8140,7 @@ ckrealloc(pointer p, size_t nbytes)
 {
        p = realloc(p, nbytes);
        if (p == NULL)
-               sh_error(bb_msg_memory_exhausted);
+               ash_msg_and_raise_error(bb_msg_memory_exhausted);
        return p;
 }
 
@@ -8180,7 +8158,7 @@ savestr(const char *s)
 {
        char *p = strdup(s);
        if (!p)
-               sh_error(bb_msg_memory_exhausted);
+               ash_msg_and_raise_error(bb_msg_memory_exhausted);
        return p;
 }
 
@@ -8210,15 +8188,15 @@ stalloc(size_t nbytes)
                        blocksize = MINSIZE;
                len = sizeof(struct stack_block) - MINSIZE + blocksize;
                if (len < blocksize)
-                       sh_error(bb_msg_memory_exhausted);
-               INTOFF;
+                       ash_msg_and_raise_error(bb_msg_memory_exhausted);
+               INT_OFF;
                sp = ckmalloc(len);
                sp->prev = stackp;
                stacknxt = sp->space;
                stacknleft = blocksize;
                sstrend = stacknxt + blocksize;
                stackp = sp;
-               INTON;
+               INT_ON;
        }
        p = stacknxt;
        stacknxt += aligned;
@@ -8257,17 +8235,17 @@ popstackmark(struct stackmark *mark)
 {
        struct stack_block *sp;
 
-       INTOFF;
+       INT_OFF;
        markp = mark->marknext;
        while (stackp != mark->stackp) {
                sp = stackp;
                stackp = sp->prev;
-               ckfree(sp);
+               free(sp);
        }
        stacknxt = mark->stacknxt;
        stacknleft = mark->stacknleft;
        sstrend = mark->stacknxt + mark->stacknleft;
-       INTON;
+       INT_ON;
 }
 
 
@@ -8287,7 +8265,7 @@ growstackblock(void)
 
        newlen = stacknleft * 2;
        if (newlen < stacknleft)
-               sh_error(bb_msg_memory_exhausted);
+               ash_msg_and_raise_error(bb_msg_memory_exhausted);
        if (newlen < 128)
                newlen += 128;
 
@@ -8298,7 +8276,7 @@ growstackblock(void)
                struct stack_block *prevstackp;
                size_t grosslen;
 
-               INTOFF;
+               INT_OFF;
                oldstackp = stackp;
                sp = stackp;
                prevstackp = sp->prev;
@@ -8321,7 +8299,7 @@ growstackblock(void)
                        xmark->stacknleft = stacknleft;
                        xmark = xmark->marknext;
                }
-               INTON;
+               INT_ON;
        } else {
                char *oldspace = stacknxt;
                int oldlen = stacknleft;
@@ -8436,7 +8414,7 @@ static int
 number(const char *s)
 {
        if (! is_number(s))
-               sh_error(illnum, s);
+               ash_msg_and_raise_error(illnum, s);
        return atoi(s);
 }
 
@@ -8729,7 +8707,7 @@ static void
 freefunc(struct funcnode *f)
 {
        if (f && --f->count < 0)
-               ckfree(f);
+               free(f);
 }
 
 
@@ -8759,7 +8737,7 @@ procargs(int argc, char **argv)
        xminusc = minusc;
        if (*xargv == NULL) {
                if (xminusc)
-                       sh_error(bb_msg_requires_arg, "-c");
+                       ash_msg_and_raise_error(bb_msg_requires_arg, "-c");
                sflag = 1;
        }
        if (iflag == 2 && sflag == 1 && isatty(0) && isatty(1))
@@ -8824,7 +8802,7 @@ static void minus_o(char *name, int val)
                                optlist[i] = val;
                                return;
                        }
-               sh_error("Illegal option -o %s", name);
+               ash_msg_and_raise_error("Illegal option -o %s", name);
        }
 }
 
@@ -8893,7 +8871,7 @@ setoption(int flag, int val)
                        optlist[i] = val;
                        return;
                }
-       sh_error("Illegal option -%c", flag);
+       ash_msg_and_raise_error("Illegal option -%c", flag);
        /* NOTREACHED */
 }
 
@@ -8935,8 +8913,8 @@ freeparam(volatile struct shparam *param)
 
        if (param->malloc) {
                for (ap = param->p ; *ap ; ap++)
-                       ckfree(*ap);
-               ckfree(param->p);
+                       free(*ap);
+               free(param->p);
        }
 }
 
@@ -8954,12 +8932,12 @@ shiftcmd(int argc, char **argv)
        if (argc > 1)
                n = number(argv[1]);
        if (n > shellparam.nparam)
-               sh_error("can't shift that many");
-       INTOFF;
+               ash_msg_and_raise_error("can't shift that many");
+       INT_OFF;
        shellparam.nparam -= n;
        for (ap1 = shellparam.p ; --n >= 0 ; ap1++) {
                if (shellparam.malloc)
-                       ckfree(*ap1);
+                       free(*ap1);
        }
        ap2 = shellparam.p;
        while ((*ap2++ = *ap1++) != NULL);
@@ -8967,7 +8945,7 @@ shiftcmd(int argc, char **argv)
        shellparam.optind = 1;
        shellparam.optoff = -1;
 #endif
-       INTON;
+       INT_ON;
        return 0;
 }
 
@@ -8980,13 +8958,13 @@ setcmd(int argc, char **argv)
 {
        if (argc == 1)
                return showvars(nullstr, 0, VUNSET);
-       INTOFF;
+       INT_OFF;
        options(0);
        optschanged();
        if (*argptr != NULL) {
                setparam(argptr);
        }
-       INTON;
+       INT_ON;
        return 0;
 }
 
@@ -9119,8 +9097,8 @@ getopts(char *optstr, char *optvar, char **optfirst, int *param_optind, int *opt
        if (err) {
                *param_optind = 1;
                *optoff = -1;
-               flushall();
-               exraise(EXERROR);
+               flush_stdout_stderr();
+               raise_exception(EXERROR);
        }
        return done;
 }
@@ -9138,7 +9116,7 @@ getoptscmd(int argc, char **argv)
        char **optbase;
 
        if (argc < 3)
-               sh_error("Usage: getopts optstring var [arg]");
+               ash_msg_and_raise_error("Usage: getopts optstring var [arg]");
        else if (argc == 3) {
                optbase = shellparam.p;
                if (shellparam.optind > shellparam.nparam + 1) {
@@ -9187,13 +9165,13 @@ nextopt(const char *optstring)
        c = *p++;
        for (q = optstring ; *q != c ; ) {
                if (*q == '\0')
-                       sh_error("Illegal option -%c", c);
+                       ash_msg_and_raise_error("Illegal option -%c", c);
                if (*++q == ':')
                        q++;
        }
        if (*++q == ':') {
                if (*p == '\0' && (p = *argptr++) == NULL)
-                       sh_error("No arg for -%c option", c);
+                       ash_msg_and_raise_error("No arg for -%c option", c);
                optionarg = p;
                p = NULL;
        }
@@ -9202,73 +9180,6 @@ nextopt(const char *optstring)
 }
 
 
-/*      output.c     */
-
-static void
-outstr(const char *p, FILE *file)
-{
-       INTOFF;
-       fputs(p, file);
-       INTON;
-}
-
-static void
-flushall(void)
-{
-       INTOFF;
-       fflush(stdout);
-       fflush(stderr);
-       INTON;
-}
-
-static void
-flusherr(void)
-{
-       INTOFF;
-       fflush(stderr);
-       INTON;
-}
-
-static void
-outcslow(int c, FILE *dest)
-{
-       INTOFF;
-       putc(c, dest);
-       fflush(dest);
-       INTON;
-}
-
-
-static int
-out1fmt(const char *fmt, ...)
-{
-       va_list ap;
-       int r;
-
-       INTOFF;
-       va_start(ap, fmt);
-       r = vprintf(fmt, ap);
-       va_end(ap);
-       INTON;
-       return r;
-}
-
-
-static int
-fmtstr(char *outbuf, size_t length, const char *fmt, ...)
-{
-       va_list ap;
-       int ret;
-
-       va_start(ap, fmt);
-       INTOFF;
-       ret = vsnprintf(outbuf, length, fmt, ap);
-       va_end(ap);
-       INTON;
-       return ret;
-}
-
-
 /*      parser.c     */
 
 
@@ -10551,12 +10462,12 @@ parsebackq: {
        savepbq = parsebackquote;
        if (setjmp(jmploc.loc)) {
                if (str)
-                       ckfree(str);
+                       free(str);
                parsebackquote = 0;
                handler = savehandler;
                longjmp(handler->loc, 1);
        }
-       INTOFF;
+       INT_OFF;
        str = NULL;
        savelen = out - (char *)stackblock();
        if (savelen > 0) {
@@ -10565,7 +10476,7 @@ parsebackq: {
        }
        savehandler = handler;
        handler = &jmploc;
-       INTON;
+       INT_ON;
        if (oldstyle) {
                /* We must read until the closing backquote, giving special
                   treatment to some slashes, and then push the string and
@@ -10669,10 +10580,10 @@ parsebackq: {
        if (str) {
                memcpy(out, str, savelen);
                STADJUST(savelen, out);
-               INTOFF;
-               ckfree(str);
+               INT_OFF;
+               free(str);
                str = NULL;
-               INTON;
+               INT_ON;
        }
        parsebackquote = savepbq;
        handler = savehandler;
@@ -10776,7 +10687,7 @@ static void synexpect(int token)
 static void
 synerror(const char *msg)
 {
-       sh_error("Syntax error: %s", msg);
+       ash_msg_and_raise_error("Syntax error: %s", msg);
        /* NOTREACHED */
 }
 
@@ -10925,7 +10836,7 @@ static int openhere(union node *redir)
        size_t len = 0;
 
        if (pipe(pip) < 0)
-               sh_error("Pipe call failed");
+               ash_msg_and_raise_error("Pipe call failed");
        if (redir->type == NHERE) {
                len = strlen(redir->nhere.doc->narg.text);
                if (len <= PIPESIZE) {
@@ -11011,9 +10922,9 @@ openredirect(union node *redir)
 
        return f;
  ecreate:
-       sh_error("cannot create %s: %s", fname, errmsg(errno, E_CREAT));
+       ash_msg_and_raise_error("cannot create %s: %s", fname, errmsg(errno, "Directory nonexistent"));
  eopen:
-       sh_error("cannot open %s: %s", fname, errmsg(errno, E_OPEN));
+       ash_msg_and_raise_error("cannot open %s: %s", fname, errmsg(errno, "No such file"));
 }
 
 static void dupredirect(union node *redir, int f)
@@ -11055,7 +10966,7 @@ redirect(union node *redir, int flags)
                return;
        }
        sv = NULL;
-       INTOFF;
+       INT_OFF;
        if (flags & REDIR_PUSH) {
                struct redirtab *q;
                q = ckmalloc(sizeof(struct redirtab));
@@ -11085,7 +10996,7 @@ redirect(union node *redir, int flags)
                                if (i != EBADF) {
                                        close(newfd);
                                        errno = i;
-                                       sh_error("%d: %m", fd);
+                                       ash_msg_and_raise_error("%d: %m", fd);
                                        /* NOTREACHED */
                                }
                        } else {
@@ -11097,7 +11008,7 @@ redirect(union node *redir, int flags)
                }
                dupredirect(n, newfd);
        } while ((n = n->nfile.next));
-       INTON;
+       INT_ON;
        if (flags & REDIR_SAVEFD2 && sv && sv->renamed[2] >= 0)
                preverrout_fd = sv->renamed[2];
 }
@@ -11114,7 +11025,7 @@ popredir(int drop)
 
        if (--nullredirs >= 0)
                return;
-       INTOFF;
+       INT_OFF;
        rp = redirlist;
        for (i = 0 ; i < 10 ; i++) {
                if (rp->renamed[i] != EMPTY) {
@@ -11127,8 +11038,8 @@ popredir(int drop)
        }
        redirlist = rp->next;
        nullredirs = rp->nullredirs;
-       ckfree(rp);
-       INTON;
+       free(rp);
+       INT_ON;
 }
 
 /*
@@ -11165,7 +11076,7 @@ copyfd(int from, int to)
                if (errno == EMFILE)
                        return EMPTY;
                else
-                       sh_error("%d: %m", from);
+                       ash_msg_and_raise_error("%d: %m", from);
        }
        return newfd;
 }
@@ -11179,7 +11090,7 @@ redirectsafe(union node *redir, int flags)
        struct jmploc *volatile savehandler = handler;
        struct jmploc jmploc;
 
-       SAVEINT(saveint);
+       SAVE_INT(saveint);
        err = setjmp(jmploc.loc) * 2;
        if (!err) {
                handler = &jmploc;
@@ -11188,7 +11099,7 @@ redirectsafe(union node *redir, int flags)
        handler = savehandler;
        if (err && exception != EXERROR)
                longjmp(handler->loc, 1);
-       RESTOREINT(saveint);
+       RESTORE_INT(saveint);
        return err;
 }
 
@@ -11585,8 +11496,8 @@ trapcmd(int argc, char **argv)
        while (*ap) {
                signo = get_signum(*ap);
                if (signo < 0)
-                       sh_error("%s: bad trap", *ap);
-               INTOFF;
+                       ash_msg_and_raise_error("%s: bad trap", *ap);
+               INT_OFF;
                if (action) {
                        if (LONE_DASH(action))
                                action = NULL;
@@ -11594,11 +11505,11 @@ trapcmd(int argc, char **argv)
                                action = savestr(action);
                }
                if (trap[signo])
-                       ckfree(trap[signo]);
+                       free(trap[signo]);
                trap[signo] = action;
                if (signo != 0)
                        setsignal(signo);
-               INTON;
+               INT_ON;
                ap++;
        }
        return 0;
@@ -11615,12 +11526,12 @@ clear_traps(void)
 
        for (tp = trap ; tp < &trap[NSIG] ; tp++) {
                if (*tp && **tp) {      /* trap not NULL or SIG_IGN */
-                       INTOFF;
-                       ckfree(*tp);
+                       INT_OFF;
+                       free(*tp);
                        *tp = NULL;
                        if (tp != &trap[0])
                                setsignal(tp - trap);
-                       INTON;
+                       INT_ON;
                }
        }
 }
@@ -11738,7 +11649,7 @@ onsig(int signo)
 
        if (exsig || (signo == SIGINT && !trap[SIGINT])) {
                if (!suppressint)
-                       onint();
+                       raise_interrupt();
                intpending = 1;
        }
 }
@@ -11868,7 +11779,7 @@ exitshell(void)
                trap[0] = NULL;
                evalstring(p, 0);
        }
-       flushall();
+       flush_stdout_stderr();
  out:
        setjobctl(0);
        _exit(status);
@@ -11899,7 +11810,7 @@ setvarsafe(const char *name, const char *val, int flags)
        struct jmploc *volatile savehandler = handler;
        struct jmploc jmploc;
 
-       SAVEINT(saveint);
+       SAVE_INT(saveint);
        if (setjmp(jmploc.loc))
                err = 1;
        else {
@@ -11908,7 +11819,7 @@ setvarsafe(const char *name, const char *val, int flags)
                err = 0;
        }
        handler = savehandler;
-       RESTOREINT(saveint);
+       RESTORE_INT(saveint);
        return err;
 }
 #endif
@@ -11930,14 +11841,14 @@ setvar(const char *name, const char *val, int flags)
        p = strchrnul(q, '=');
        namelen = p - name;
        if (!namelen || p != q)
-               sh_error("%.*s: bad variable name", namelen, name);
+               ash_msg_and_raise_error("%.*s: bad variable name", namelen, name);
        vallen = 0;
        if (val == NULL) {
                flags |= VUNSET;
        } else {
                vallen = strlen(val);
        }
-       INTOFF;
+       INT_OFF;
        nameeq = ckmalloc(namelen + vallen + 2);
        p = memcpy(nameeq, name, namelen) + namelen;
        if (val) {
@@ -11946,7 +11857,7 @@ setvar(const char *name, const char *val, int flags)
        }
        *p = '\0';
        setvareq(nameeq, flags | VNOSAVE);
-       INTON;
+       INT_ON;
 }
 
 
@@ -11972,7 +11883,7 @@ setvareq(char *s, int flags)
                        if (flags & VNOSAVE)
                                free(s);
                        n = vp->text;
-                       sh_error("%.*s: is read only", strchrnul(n, '=') - n, n);
+                       ash_msg_and_raise_error("%.*s: is read only", strchrnul(n, '=') - n, n);
                }
 
                if (flags & VNOSET)
@@ -11982,7 +11893,7 @@ setvareq(char *s, int flags)
                        (*vp->func)(strchrnul(s, '=') + 1);
 
                if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0)
-                       ckfree(vp->text);
+                       free((char*)vp->text);
 
                flags |= vp->flags & ~(VTEXTFIXED|VSTACK|VNOSAVE|VUNSET);
        } else {
@@ -12011,11 +11922,11 @@ listsetvar(struct strlist *list_set_var, int flags)
 
        if (!lp)
                return;
-       INTOFF;
+       INT_OFF;
        do {
                setvareq(lp->text, flags);
        } while ((lp = lp->next));
-       INTON;
+       INT_ON;
 }
 
 
@@ -12175,7 +12086,7 @@ static void mklocal(char *name)
        struct var **vpp;
        struct var *vp;
 
-       INTOFF;
+       INT_OFF;
        lvp = ckmalloc(sizeof(struct localvar));
        if (LONE_DASH(name)) {
                char *p;
@@ -12206,7 +12117,7 @@ static void mklocal(char *name)
        lvp->vp = vp;
        lvp->next = localvars;
        localvars = lvp;
-       INTON;
+       INT_ON;
 }
 
 
@@ -12242,7 +12153,7 @@ poplocalvars(void)
                TRACE(("poplocalvar %s", vp ? vp->text : "-"));
                if (vp == NULL) {       /* $- saved */
                        memcpy(optlist, lvp->text, sizeof(optlist));
-                       ckfree(lvp->text);
+                       free((char*)lvp->text);
                        optschanged();
                } else if ((lvp->flags & (VUNSET|VSTRFIXED)) == VUNSET) {
                        unsetvar(vp->text);
@@ -12250,11 +12161,11 @@ poplocalvars(void)
                        if (vp->func)
                                (*vp->func)(strchrnul(lvp->text, '=') + 1);
                        if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0)
-                               ckfree(vp->text);
+                               free((char*)vp->text);
                        vp->flags = lvp->flags;
                        vp->text = lvp->text;
                }
-               ckfree(lvp);
+               free(lvp);
        }
 }
 
@@ -12315,17 +12226,17 @@ unsetvar(const char *s)
                if (flags & VUNSET)
                        goto ok;
                if ((flags & VSTRFIXED) == 0) {
-                       INTOFF;
+                       INT_OFF;
                        if ((flags & (VTEXTFIXED|VSTACK)) == 0)
-                               ckfree(vp->text);
+                               free((char*)vp->text);
                        *vpp = vp->next;
-                       ckfree(vp);
-                       INTON;
+                       free(vp);
+                       INT_ON;
                } else {
                        setvar(s, 0, 0);
                        vp->flags &= ~VEXPORT;
                }
-ok:
+ ok:
                retval = 0;
        }
  out:
@@ -12429,19 +12340,19 @@ dash_arith(const char *s)
        arith_t result;
        int errcode = 0;
 
-       INTOFF;
+       INT_OFF;
        result = arith(s, &errcode);
        if (errcode < 0) {
                if (errcode == -3)
-                       sh_error("exponent less than 0");
+                       ash_msg_and_raise_error("exponent less than 0");
                else if (errcode == -2)
-                       sh_error("divide by zero");
+                       ash_msg_and_raise_error("divide by zero");
                else if (errcode == -5)
-                       sh_error("expression recursion loop detected");
+                       ash_msg_and_raise_error("expression recursion loop detected");
                else
                        synerror(s);
        }
-       INTON;
+       INT_ON;
 
        return result;
 }
@@ -12461,7 +12372,7 @@ letcmd(int argc, char **argv)
 
        ap = argv + 1;
        if (!*ap)
-               sh_error("expression expected");
+               ash_msg_and_raise_error("expression expected");
        for (ap = argv + 1; *ap; ap++) {
                i = dash_arith(*ap);
        }
@@ -12535,7 +12446,7 @@ readcmd(int argc, char **argv)
                case 'n':
                        nchars = strtol(optionarg, &p, 10);
                        if (*p)
-                               sh_error("invalid count");
+                               ash_msg_and_raise_error("invalid count");
                        nch_flag = (nchars > 0);
                        break;
                case 's':
@@ -12552,19 +12463,19 @@ readcmd(int argc, char **argv)
                                        int scale;
                                        ts.tv_usec = strtol(p, &p2, 10);
                                        if (*p2)
-                                               sh_error("invalid timeout");
+                                               ash_msg_and_raise_error("invalid timeout");
                                        scale = p2 - p;
                                        /* normalize to usec */
                                        if (scale > 6)
-                                               sh_error("invalid timeout");
+                                               ash_msg_and_raise_error("invalid timeout");
                                        while (scale++ < 6)
                                                ts.tv_usec *= 10;
                                }
                        } else if (*p) {
-                               sh_error("invalid timeout");
+                               ash_msg_and_raise_error("invalid timeout");
                        }
                        if ( ! ts.tv_sec && ! ts.tv_usec)
-                               sh_error("invalid timeout");
+                               ash_msg_and_raise_error("invalid timeout");
                        break;
 #endif
                case 'r':
@@ -12579,7 +12490,7 @@ readcmd(int argc, char **argv)
        }
        ap = argptr;
        if (*ap == NULL)
-               sh_error("arg count");
+               ash_msg_and_raise_error("arg count");
        ifs = bltinlookup("IFS");
        if (ifs == NULL)
                ifs = defifs;
@@ -12691,10 +12602,10 @@ static int umaskcmd(int argc, char **argv)
                symbolic_mode = 1;
        }
 
-       INTOFF;
+       INT_OFF;
        mask = umask(0);
        umask(mask);
-       INTON;
+       INT_ON;
 
        ap = *argptr;
        if (ap == NULL) {
@@ -12724,14 +12635,14 @@ static int umaskcmd(int argc, char **argv)
                        mask = 0;
                        do {
                                if (*ap >= '8' || *ap < '0')
-                                       sh_error(illnum, argv[1]);
+                                       ash_msg_and_raise_error(illnum, argv[1]);
                                mask = (mask << 3) + (*ap - '0');
                        } while (*++ap != '\0');
                        umask(mask);
                } else {
                        mask = ~mask & 0777;
                        if (!bb_parse_mode(ap, &mask)) {
-                               sh_error("Illegal mode: %s", ap);
+                               ash_msg_and_raise_error("Illegal mode: %s", ap);
                        }
                        umask(~mask & 0777);
                }
@@ -12881,7 +12792,7 @@ ulimitcmd(int argc, char **argv)
                char *p = *argptr;
 
                if (all || argptr[1])
-                       sh_error("too many arguments");
+                       ash_msg_and_raise_error("too many arguments");
                if (strncmp(p, "unlimited\n", 9) == 0)
                        val = RLIM_INFINITY;
                else {
@@ -12893,7 +12804,7 @@ ulimitcmd(int argc, char **argv)
                                        break;
                        }
                        if (c)
-                               sh_error("bad number");
+                               ash_msg_and_raise_error("bad number");
                        val *= l->factor;
                }
        }
@@ -12913,7 +12824,7 @@ ulimitcmd(int argc, char **argv)
                if (how & SOFT)
                        limit.rlim_cur = val;
                if (setrlimit(l->cmd, &limit) < 0)
-                       sh_error("error setting limit (%m)");
+                       ash_msg_and_raise_error("error setting limit (%m)");
        } else {
                printlim(how, &limit, l);
        }