Ignore:
Timestamp:
Apr 21, 2007, 10:55:18 PM (18 years ago)
Author:
bird
Message:

hacking...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/ash-messup/error.c

    r809 r883  
    6161#include "error.h"
    6262#include "show.h"
     63#include "shinstance.h"
    6364
    6465
     
    6768 */
    6869
    69 struct jmploc *handler;
     70/*struct jmploc *handler;
    7071int exception;
    7172volatile int suppressint;
    7273volatile int intpending;
    73 char *commandname;
    74 
    75 
    76 static void exverror(int, const char *, va_list)
    77     __attribute__((__noreturn__));
     74char *commandname;*/
     75
     76
     77static void exverror(shinstance *psh, int, const char *, va_list)
     78    /*__attribute__((__noreturn__))*/;
    7879
    7980/*
     
    8485
    8586void
    86 exraise(int e)
    87 {
    88         if (handler == NULL)
     87exraise(shinstance *psh, int e)
     88{
     89        if (psh->handler == NULL)
    8990                abort();
    90         exception = e;
    91         longjmp(handler->loc, 1);
     91        psh->exception = e;
     92        longjmp(psh->handler->loc, 1);
    9293}
    9394
     
    104105
    105106void
    106 onint(void)
    107 {
    108         sigset_t nsigset;
    109 
    110         if (suppressint) {
    111                 intpending = 1;
     107onint(shinstance *psh)
     108{
     109        sh_sigset_t nsigset;
     110
     111        if (psh->suppressint) {
     112                psh->intpending = 1;
    112113                return;
    113114        }
    114         intpending = 0;
    115         sigemptyset(&nsigset);
    116         sigprocmask(SIG_SETMASK, &nsigset, NULL);
    117         if (rootshell && iflag)
    118                 exraise(EXINT);
     115        psh->intpending = 0;
     116        sh_sigemptyset(&nsigset);
     117        sh_sigprocmask(psh, SIG_SETMASK, &nsigset, NULL);
     118        if (psh->rootshell && psh->iflag)
     119                exraise(psh, EXINT);
    119120        else {
    120                 signal(SIGINT, SIG_DFL);
    121                 raise(SIGINT);
     121                sh_signal(psh, SIGINT, SIG_DFL);
     122                sh_raise_sigint(psh);/*raise(psh, SIGINT);*/
    122123        }
    123124        /* NOTREACHED */
     
    125126
    126127static void
    127 exvwarning(int sv_errno, const char *msg, va_list ap)
     128exvwarning(shinstance *psh, int sv_errno, const char *msg, va_list ap)
    128129{
    129130        /* Partially emulate line buffered output so that:
     
    133134         * both generate sensible text when stdout and stderr are merged.
    134135         */
    135         if (output.nextc != output.buf && output.nextc[-1] == '\n')
    136                 flushout(&output);
    137         if (commandname)
    138                 outfmt(&errout, "%s: ", commandname);
     136        if (psh->output.nextc != psh->output.buf && psh->output.nextc[-1] == '\n')
     137                flushout(&psh->output);
     138        if (psh->commandname)
     139                outfmt(&psh->errout, "%s: ", psh->commandname);
    139140        if (msg != NULL) {
    140                 doformat(&errout, msg, ap);
     141                doformat(&psh->errout, msg, ap);
    141142                if (sv_errno >= 0)
    142                         outfmt(&errout, ": ");
     143                        outfmt(&psh->errout, ": ");
    143144        }
    144145        if (sv_errno >= 0)
    145                 outfmt(&errout, "%s", strerror(sv_errno));
    146         out2c('\n');
    147         flushout(&errout);
     146                outfmt(&psh->errout, "%s", strerror(sv_errno));
     147        out2c(psh, '\n');
     148        flushout(&psh->errout);
    148149}
    149150
     
    154155 */
    155156static void
    156 exverror(int cond, const char *msg, va_list ap)
     157exverror(shinstance *psh, int cond, const char *msg, va_list ap)
    157158{
    158159        CLEAR_PENDING_INT;
     
    168169#endif
    169170        if (msg)
    170                 exvwarning(-1, msg, ap);
    171 
    172         output_flushall();
    173         exraise(cond);
     171                exvwarning(psh, -1, msg, ap);
     172
     173        output_flushall(psh);
     174        exraise(psh, cond);
    174175        /* NOTREACHED */
    175176}
     
    177178
    178179void
    179 error(const char *msg, ...)
     180error(shinstance *psh, const char *msg, ...)
    180181{
    181182        va_list ap;
    182183
    183184        va_start(ap, msg);
    184         exverror(EXERROR, msg, ap);
     185        exverror(psh, EXERROR, msg, ap);
    185186        /* NOTREACHED */
    186187        va_end(ap);
     
    189190
    190191void
    191 exerror(int cond, const char *msg, ...)
     192exerror(shinstance *psh, int cond, const char *msg, ...)
    192193{
    193194        va_list ap;
    194195
    195196        va_start(ap, msg);
    196         exverror(cond, msg, ap);
     197        exverror(psh, cond, msg, ap);
    197198        /* NOTREACHED */
    198199        va_end(ap);
     
    204205
    205206void
    206 sh_exit(int rval)
    207 {
    208         exerrno = rval & 255;
    209         exraise(EXEXEC);
    210 }
    211 
    212 void
    213 sh_err(int status, const char *fmt, ...)
     207sh_exit(shinstance *psh, int rval)
     208{
     209        psh->exerrno = rval & 255;
     210        exraise(psh, EXEXEC);
     211}
     212
     213void
     214sh_err(shinstance *psh, int status, const char *fmt, ...)
    214215{
    215216        va_list ap;
    216217
    217218        va_start(ap, fmt);
    218         exvwarning(errno, fmt, ap);
    219         va_end(ap);
    220         sh_exit(status);
    221 }
    222 
    223 void
    224 sh_verr(int status, const char *fmt, va_list ap)
    225 {
    226         exvwarning(errno, fmt, ap);
    227         sh_exit(status);
    228 }
    229 
    230 void
    231 sh_errx(int status, const char *fmt, ...)
     219        exvwarning(psh, errno, fmt, ap);
     220        va_end(ap);
     221        sh_exit(psh, status);
     222}
     223
     224void
     225sh_verr(shinstance *psh, int status, const char *fmt, va_list ap)
     226{
     227        exvwarning(psh, errno, fmt, ap);
     228        sh_exit(psh, status);
     229}
     230
     231void
     232sh_errx(shinstance *psh, int status, const char *fmt, ...)
    232233{
    233234        va_list ap;
    234235
    235236        va_start(ap, fmt);
    236         exvwarning(-1, fmt, ap);
    237         va_end(ap);
    238         sh_exit(status);
    239 }
    240 
    241 void
    242 sh_verrx(int status, const char *fmt, va_list ap)
    243 {
    244         exvwarning(-1, fmt, ap);
    245         sh_exit(status);
    246 }
    247 
    248 void
    249 sh_warn(const char *fmt, ...)
     237        exvwarning(psh, -1, fmt, ap);
     238        va_end(ap);
     239        sh_exit(psh, status);
     240}
     241
     242void
     243sh_verrx(shinstance *psh, int status, const char *fmt, va_list ap)
     244{
     245        exvwarning(psh, -1, fmt, ap);
     246        sh_exit(psh, status);
     247}
     248
     249void
     250sh_warn(shinstance *psh, const char *fmt, ...)
    250251{
    251252        va_list ap;
    252253
    253254        va_start(ap, fmt);
    254         exvwarning(errno, fmt, ap);
    255         va_end(ap);
    256 }
    257 
    258 void
    259 sh_vwarn(const char *fmt, va_list ap)
    260 {
    261         exvwarning(errno, fmt, ap);
    262 }
    263 
    264 void
    265 sh_warnx(const char *fmt, ...)
     255        exvwarning(psh, errno, fmt, ap);
     256        va_end(ap);
     257}
     258
     259void
     260sh_vwarn(shinstance *psh, const char *fmt, va_list ap)
     261{
     262        exvwarning(psh, errno, fmt, ap);
     263}
     264
     265void
     266sh_warnx(shinstance *psh, const char *fmt, ...)
    266267{
    267268        va_list ap;
    268269
    269270        va_start(ap, fmt);
    270         exvwarning(-1, fmt, ap);
    271         va_end(ap);
    272 }
    273 
    274 void
    275 sh_vwarnx(const char *fmt, va_list ap)
    276 {
    277         exvwarning(-1, fmt, ap);
     271        exvwarning(psh, -1, fmt, ap);
     272        va_end(ap);
     273}
     274
     275void
     276sh_vwarnx(shinstance *psh, const char *fmt, va_list ap)
     277{
     278        exvwarning(psh, -1, fmt, ap);
    278279}
    279280
     
    357358
    358359const char *
    359 errmsg(int e, int action)
     360errmsg(shinstance *psh, int e, int action)
    360361{
    361362        struct errname const *ep;
    362         static char buf[12];
     363        /*static char buf[12];*/
    363364
    364365        for (ep = errormsg ; ep->errcode ; ep++) {
     
    366367                        return ep->msg;
    367368        }
    368         fmtstr(buf, sizeof buf, "error %d", e);
    369         return buf;
    370 }
     369        fmtstr(psh->errmsg_buf, sizeof psh->errmsg_buf, "error %d", e);
     370        return psh->errmsg_buf;
     371}
Note: See TracChangeset for help on using the changeset viewer.