#include #include #include #include "lx.h" #include "internal.h" static LX_X_ERR_ACTION lx__default_x_err(LX_CONN *xc, const LX_X_ERR *err) { (void)xc; (void)err; return(LX_X_ERR_CRASH); } static void lx__default_lib_err(LX_CONN *xc, const LX_LIB_ERR *err) { fprintf(stderr,"X library error [%s]: ",xc->text); switch (err->type) { case LXLE_NOMEM: fprintf(stderr,"out of memory\n"); break; case LXLE_SYSERR: fprintf(stderr,"%s: %s\n",err->u.syserr.call,strerror(err->u.syserr.err)); break; case LXLE_OSLIBERR: if (err->u.osliberr.msg) { fprintf(stderr,"%s: %s\n",err->u.osliberr.call,err->u.osliberr.msg); } else { fprintf(stderr,"%s failed\n",err->u.osliberr.call); } break; case LXLE_BAD_CALL: fprintf(stderr,"invalid call to %s\n",err->u.bad_call.fn); break; case LXLE_NO_DISPLAY: fprintf(stderr,"no display specified\n"); break; case LXLE_BAD_DISPLAY: fprintf(stderr,"invalid display string specified\n"); break; case LXLE_UNX_EOF: fprintf(stderr,"unexpected EOF on server connection\n"); break; case LXLE_ALL_FAIL: fprintf(stderr,"can't connect: %s\n",err->u.all_fail.msg); break; case LXLE_PROTO_ERR: fprintf(stderr,"protocol error: %s\n",err->u.proto_err.msg); break; case LXLE_REJECTED: fprintf(stderr,"server rejected connection: %s\n",err->u.rejected.msg); break; default: fprintf(stderr,"impossible error type %d\n",(int)err->type); lx_abort(); break; } exit(1); } // lx_open depends on this working on an only-partially-set-up LX_CONN. LX_X_ERR_ACTION (*lx_err_set_X(LX_CONN *c, LX_X_ERR_ACTION (*h)(LX_CONN *, const LX_X_ERR *)))(LX_CONN *, const LX_X_ERR *) { LX_X_ERR_ACTION (*prev)(LX_CONN *, const LX_X_ERR *); prev = c->x_err; c->x_err = h ? h : &lx__default_x_err; return(prev); } // lx_open depends on this working on an only-partially-set-up LX_CONN. void (*lx_err_set_lib(LX_CONN *c, void (*h)(LX_CONN *, const LX_LIB_ERR *)))(LX_CONN *, const LX_LIB_ERR *) { void (*prev)(LX_CONN *, const LX_LIB_ERR *); prev = c->lib_err; c->lib_err = h ? h : &lx__default_lib_err; return(prev); }