Class | SystemCallError |
In: |
error.c
|
Parent: | StandardError |
Return true if the receiver is a generic SystemCallError, or if the error numbers self and other are the same.
/* * call-seq: * system_call_error === other => true or false * * Return +true+ if the receiver is a generic +SystemCallError+, or * if the error numbers _self_ and _other_ are the same. */ static VALUE syserr_eqq(self, exc) VALUE self, exc; { VALUE num, e; if (!rb_obj_is_kind_of(exc, rb_eSystemCallError)) return Qfalse; if (self == rb_eSystemCallError) return Qtrue; num = rb_attr_get(exc, rb_intern("errno")); if (NIL_P(num)) { VALUE klass = CLASS_OF(exc); while (TYPE(klass) == T_ICLASS || FL_TEST(klass, FL_SINGLETON)) { klass = (VALUE)RCLASS(klass)->super; } num = rb_const_get(klass, rb_intern("Errno")); } e = rb_const_get(self, rb_intern("Errno")); if (FIXNUM_P(num) ? num == e : rb_equal(num, e)) return Qtrue; return Qfalse; }
If errno corresponds to a known system error code, constructs the appropriate Errno class for that error, otherwise constructs a generic SystemCallError object. The error number is subsequently available via the errno method.
/* * call-seq: * SystemCallError.new(msg, errno) => system_call_error_subclass * * If _errno_ corresponds to a known system error code, constructs * the appropriate <code>Errno</code> class for that error, otherwise * constructs a generic <code>SystemCallError</code> object. The * error number is subsequently available via the <code>errno</code> * method. */ static VALUE syserr_initialize(argc, argv, self) int argc; VALUE *argv; VALUE self; { #if !defined(_WIN32) && !defined(__VMS) char *strerror(); #endif char *err; VALUE mesg, error; VALUE klass = rb_obj_class(self); if (klass == rb_eSystemCallError) { rb_scan_args(argc, argv, "11", &mesg, &error); if (argc == 1 && FIXNUM_P(mesg)) { error = mesg; mesg = Qnil; } if (!NIL_P(error) && st_lookup(syserr_tbl, NUM2LONG(error), &klass)) { /* change class */ if (TYPE(self) != T_OBJECT) { /* insurance to avoid type crash */ rb_raise(rb_eTypeError, "invalid instance type"); } RBASIC(self)->klass = klass; } } else { rb_scan_args(argc, argv, "01", &mesg); error = rb_const_get(klass, rb_intern("Errno")); } if (!NIL_P(error)) err = strerror(NUM2LONG(error)); else err = "unknown error"; if (!NIL_P(mesg)) { VALUE str = mesg; size_t len; StringValue(str); len = strlen(err)+RSTRING(str)->len+3; mesg = rb_str_new(0, len); snprintf(RSTRING(mesg)->ptr, len+1, "%s - %.*s", err, (int)RSTRING(str)->len, RSTRING(str)->ptr); rb_str_resize(mesg, strlen(RSTRING(mesg)->ptr)); } else { mesg = rb_str_new2(err); } rb_call_super(1, &mesg); rb_iv_set(self, "errno", error); return self; }
Return this SystemCallError‘s error number.
/* * call-seq: * system_call_error.errno => fixnum * * Return this SystemCallError's error number. */ static VALUE syserr_errno(self) VALUE self; { return rb_attr_get(self, rb_intern("errno")); }