/* * Errors */ void ossl_raise(VALUE exc, const char *fmt, ...) { va_list args; char buf[BUFSIZ]; const char *msg; long e; int len = 0; #ifdef HAVE_ERR_PEEK_LAST_ERROR e = ERR_peek_last_error(); #else e = ERR_peek_error(); #endif if (fmt) { va_start(args, fmt); len = vsnprintf(buf, BUFSIZ, fmt, args); va_end(args); } if (len < BUFSIZ && e) { if (dOSSL == Qtrue) /* FULL INFO */ msg = ERR_error_string(e, NULL); else msg = ERR_reason_error_string(e); fmt = len ? ": %s" : "%s"; len += snprintf(buf+len, BUFSIZ-len, fmt, msg); } if (dOSSL == Qtrue){ /* show all errors on the stack */ while ((e = ERR_get_error()) != 0){ rb_warn("error on stack: %s", ERR_error_string(e, NULL)); } } ERR_clear_error(); if(len > BUFSIZ) len = strlen(buf); rb_exc_raise(rb_exc_new(exc, buf, len)); }
VALUE rb_exc_new_cstr(VALUE etype, const char *s) { return rb_exc_new(etype, s, strlen(s)); }
VALUE rb_exc_new3(VALUE etype, VALUE str) { StringValue(str); return rb_exc_new(etype, RSTRING(str)->ptr, RSTRING(str)->len); }
VALUE exception_spec_rb_exc_new(VALUE self, VALUE str) { char *cstr = StringValuePtr(str); return rb_exc_new(rb_eException, cstr, strlen(cstr)); }