Main Page | Modules | Alphabetical List | Data Structures | File List | Data Fields | Globals

error.c

Go to the documentation of this file.
00001 /**********************************************************************
00002 
00003   error.c -
00004 
00005   $Author: matz $
00006   $Date: 2005/07/20 01:09:53 $
00007   created at: Mon Aug  9 16:11:34 JST 1993
00008 
00009   Copyright (C) 1993-2003 Yukihiro Matsumoto
00010 
00011 **********************************************************************/
00012 
00013 #include "ruby.h"
00014 #include "env.h"
00015 #include "st.h"
00016 
00017 #include <stdio.h>
00018 #ifdef HAVE_STDARG_PROTOTYPES
00019 #include <stdarg.h>
00020 #define va_init_list(a,b) va_start(a,b)
00021 #else
00022 #include <varargs.h>
00023 #define va_init_list(a,b) va_start(a)
00024 #endif
00025 #ifdef HAVE_STDLIB_H
00026 #include <stdlib.h>
00027 #endif
00028 #ifndef EXIT_SUCCESS
00029 #define EXIT_SUCCESS 0
00030 #endif
00031 
00032 extern const char ruby_version[], ruby_release_date[], ruby_platform[];
00033 
00034 int ruby_nerrs;
00035 
00036 static int
00037 err_position(buf, len)
00038     char *buf;
00039     long len;
00040 {
00041     ruby_set_current_source();
00042     if (!ruby_sourcefile) {
00043         return 0;
00044     }
00045     else if (ruby_sourceline == 0) {
00046         return snprintf(buf, len, "%s: ", ruby_sourcefile);
00047     }
00048     else {
00049         return snprintf(buf, len, "%s:%d: ", ruby_sourcefile, ruby_sourceline);
00050     }
00051 }
00052 
00053 static void
00054 err_snprintf(buf, len, fmt, args)
00055     char *buf;
00056     long len;
00057     const char *fmt;
00058     va_list args;
00059 {
00060     long n;
00061 
00062     n = err_position(buf, len);
00063     if (len > n) {
00064         vsnprintf((char*)buf+n, len-n, fmt, args);
00065     }
00066 }
00067 
00068 static void err_append (const char*);
00069 static void
00070 err_print(fmt, args)
00071     const char *fmt;
00072     va_list args;
00073 {
00074     char buf[BUFSIZ];
00075 
00076     err_snprintf(buf, BUFSIZ, fmt, args);
00077     err_append(buf);
00078 }
00079 
00080 void
00081 #ifdef HAVE_STDARG_PROTOTYPES
00082 rb_compile_error(const char *fmt, ...)
00083 #else
00084 rb_compile_error(fmt, va_alist)
00085     const char *fmt;
00086     va_dcl
00087 #endif
00088 {
00089     va_list args;
00090 
00091     va_init_list(args, fmt);
00092     err_print(fmt, args);
00093     va_end(args);
00094     ruby_nerrs++;
00095 }
00096 
00097 void
00098 #ifdef HAVE_STDARG_PROTOTYPES
00099 rb_compile_error_append(const char *fmt, ...)
00100 #else
00101 rb_compile_error_append(fmt, va_alist)
00102     const char *fmt;
00103     va_dcl
00104 #endif
00105 {
00106     va_list args;
00107     char buf[BUFSIZ];
00108 
00109     va_init_list(args, fmt);
00110     vsnprintf(buf, BUFSIZ, fmt, args);
00111     va_end(args);
00112     err_append(buf);
00113 }
00114 
00115 static void
00116 warn_print(fmt, args)
00117     const char *fmt;
00118     va_list args;
00119 {
00120     char buf[BUFSIZ];
00121     int len;
00122 
00123     err_snprintf(buf, BUFSIZ, fmt, args);
00124     len = strlen(buf);
00125     buf[len++] = '\n';
00126     rb_write_error2(buf, len);
00127 }
00128 
00129 void
00130 #ifdef HAVE_STDARG_PROTOTYPES
00131 rb_warn(const char *fmt, ...)
00132 #else
00133 rb_warn(fmt, va_alist)
00134     const char *fmt;
00135     va_dcl
00136 #endif
00137 {
00138     char buf[BUFSIZ];
00139     va_list args;
00140 
00141     if (NIL_P(ruby_verbose)) return;
00142 
00143     snprintf(buf, BUFSIZ, "warning: %s", fmt);
00144 
00145     va_init_list(args, fmt);
00146     warn_print(buf, args);
00147     va_end(args);
00148 }
00149 
00150 /* rb_warning() reports only in verbose mode */
00151 void
00152 #ifdef HAVE_STDARG_PROTOTYPES
00153 rb_warning(const char *fmt, ...)
00154 #else
00155 rb_warning(fmt, va_alist)
00156     const char *fmt;
00157     va_dcl
00158 #endif
00159 {
00160     char buf[BUFSIZ];
00161     va_list args;
00162 
00163     if (!RTEST(ruby_verbose)) return;
00164 
00165     snprintf(buf, BUFSIZ, "warning: %s", fmt);
00166 
00167     va_init_list(args, fmt);
00168     warn_print(buf, args);
00169     va_end(args);
00170 }
00171 
00172 /*
00173  * call-seq:
00174  *    warn(msg)   => nil
00175  *
00176  * Display the given message (followed by a newline) on STDERR unless
00177  * warnings are disabled (for example with the <code>-W0</code> flag).
00178  */
00179 
00180 static VALUE
00181 rb_warn_m(self, mesg)
00182     VALUE self, mesg;
00183 {
00184     if (!NIL_P(ruby_verbose)) {
00185         rb_io_write(rb_stderr, mesg);
00186         rb_io_write(rb_stderr, rb_default_rs);
00187     }
00188     return Qnil;
00189 }
00190 
00191 void
00192 #ifdef HAVE_STDARG_PROTOTYPES
00193 rb_bug(const char *fmt, ...)
00194 #else
00195 rb_bug(fmt, va_alist)
00196     const char *fmt;
00197     va_dcl
00198 #endif
00199 {
00200     char buf[BUFSIZ];
00201     va_list args;
00202     FILE *out = stderr;
00203     int len = err_position(buf, BUFSIZ);
00204 
00205     if (fwrite(buf, 1, len, out) == len ||
00206         fwrite(buf, 1, len, (out = stdout)) == len) {
00207         fputs("[BUG] ", out);
00208         va_init_list(args, fmt);
00209         vfprintf(out, fmt, args);
00210         va_end(args);
00211         fprintf(out, "\nruby %s (%s) [%s]\n\n",
00212                 ruby_version, ruby_release_date, ruby_platform);
00213     }
00214     abort();
00215 }
00216 
00217 static struct types {
00218     int type;
00219     const char *name;
00220 } builtin_types[] = {
00221     {T_NIL,     "nil"},
00222     {T_OBJECT,  "Object"},
00223     {T_CLASS,   "Class"},
00224     {T_ICLASS,  "iClass"},      /* internal use: mixed-in module holder */
00225     {T_MODULE,  "Module"},
00226     {T_FLOAT,   "Float"},
00227     {T_STRING,  "String"},
00228     {T_REGEXP,  "Regexp"},
00229     {T_ARRAY,   "Array"},
00230     {T_FIXNUM,  "Fixnum"},
00231     {T_HASH,    "Hash"},
00232     {T_STRUCT,  "Struct"},
00233     {T_BIGNUM,  "Bignum"},
00234     {T_FILE,    "File"},
00235     {T_TRUE,    "true"},
00236     {T_FALSE,   "false"},
00237     {T_SYMBOL,  "Symbol"},      /* :symbol */
00238     {T_DATA,    "Data"},        /* internal use: wrapped C pointers */
00239     {T_MATCH,   "MatchData"},   /* data of $~ */
00240     {T_VARMAP,  "Varmap"},      /* internal use: dynamic variables */
00241     {T_SCOPE,   "Scope"},       /* internal use: variable scope */
00242     {T_NODE,    "Node"},        /* internal use: syntax tree node */
00243     {T_UNDEF,   "undef"},       /* internal use: #undef; should not happen */
00244     {-1,        0}
00245 };
00246 
00247 void
00248 rb_check_type(x, t)
00249     VALUE x;
00250     int t;
00251 {
00252     struct types *type = builtin_types;
00253 
00254     if (x == Qundef) {
00255         rb_bug("undef leaked to the Ruby space");
00256     }
00257 
00258     if (TYPE(x) != t) {
00259         while (type->type >= 0) {
00260             if (type->type == t) {
00261                 char *etype;
00262 
00263                 if (NIL_P(x)) {
00264                     etype = "nil";
00265                 }
00266                 else if (FIXNUM_P(x)) {
00267                     etype = "Fixnum";
00268                 }
00269                 else if (SYMBOL_P(x)) {
00270                     etype = "Symbol";
00271                 }
00272                 else if (rb_special_const_p(x)) {
00273                     etype = RSTRING(rb_obj_as_string(x))->ptr;
00274                 }
00275                 else {
00276                     etype = rb_obj_classname(x);
00277                 }
00278                 rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)",
00279                          etype, type->name);
00280             }
00281             type++;
00282         }
00283         rb_bug("unknown type 0x%x", t);
00284     }
00285 }
00286 
00287 /* exception classes */
00288 #include <errno.h>
00289 
00290 VALUE rb_eException;
00291 VALUE rb_eSystemExit;
00292 VALUE rb_eInterrupt;
00293 VALUE rb_eSignal;
00294 VALUE rb_eFatal;
00295 VALUE rb_eStandardError;
00296 VALUE rb_eRuntimeError;
00297 VALUE rb_eTypeError;
00298 VALUE rb_eArgError;
00299 VALUE rb_eIndexError;
00300 VALUE rb_eRangeError;
00301 VALUE rb_eNameError;
00302 VALUE rb_eNoMethodError;
00303 VALUE rb_eSecurityError;
00304 VALUE rb_eNotImpError;
00305 VALUE rb_eNoMemError;
00306 static VALUE rb_cNameErrorMesg;
00307 
00308 VALUE rb_eScriptError;
00309 VALUE rb_eSyntaxError;
00310 VALUE rb_eLoadError;
00311 
00312 VALUE rb_eSystemCallError;
00313 VALUE rb_mErrno;
00314 
00315 VALUE
00316 rb_exc_new(etype, ptr, len)
00317     VALUE etype;
00318     const char *ptr;
00319     long len;
00320 {
00321     return rb_funcall(etype, rb_intern("new"), 1, rb_str_new(ptr, len));
00322 }
00323 
00324 VALUE
00325 rb_exc_new2(etype, s)
00326     VALUE etype;
00327     const char *s;
00328 {
00329     return rb_exc_new(etype, s, strlen(s));
00330 }
00331 
00332 VALUE
00333 rb_exc_new3(etype, str)
00334     VALUE etype, str;
00335 {
00336     StringValue(str);
00337     return rb_exc_new(etype, RSTRING(str)->ptr, RSTRING(str)->len);
00338 }
00339 
00340 /*
00341  * call-seq:
00342  *    Exception.new(msg = nil)   =>  exception
00343  *
00344  *  Construct a new Exception object, optionally passing in 
00345  *  a message.
00346  */
00347 
00348 static VALUE
00349 exc_initialize(argc, argv, exc)
00350     int argc;
00351     VALUE *argv;
00352     VALUE exc;
00353 {
00354     VALUE arg;
00355 
00356     rb_scan_args(argc, argv, "01", &arg);
00357     rb_iv_set(exc, "mesg", arg);
00358     rb_iv_set(exc, "bt", Qnil);
00359 
00360     return exc;
00361 }
00362 
00363 /*
00364  *  Document-method: exception
00365  *
00366  *  call-seq:
00367  *     exc.exception(string) -> an_exception or exc
00368  *  
00369  *  With no argument, or if the argument is the same as the receiver,
00370  *  return the receiver. Otherwise, create a new
00371  *  exception object of the same class as the receiver, but with a
00372  *  message equal to <code>string.to_str</code>.
00373  *     
00374  */
00375 
00376 static VALUE
00377 exc_exception(argc, argv, self)
00378     int argc;
00379     VALUE *argv;
00380     VALUE self;
00381 {
00382     VALUE exc;
00383 
00384     if (argc == 0) return self;
00385     if (argc == 1 && self == argv[0]) return self;
00386     exc = rb_obj_clone(self);
00387     exc_initialize(argc, argv, exc);
00388 
00389     return exc;
00390 }
00391 
00392 /*
00393  * call-seq:
00394  *   exception.to_s   =>  string
00395  *
00396  * Returns exception's message (or the name of the exception if
00397  * no message is set).
00398  */
00399 
00400 static VALUE
00401 exc_to_s(exc)
00402     VALUE exc;
00403 {
00404     VALUE mesg = rb_attr_get(exc, rb_intern("mesg"));
00405 
00406     if (NIL_P(mesg)) return rb_class_name(CLASS_OF(exc));
00407     if (OBJ_TAINTED(exc)) OBJ_TAINT(mesg);
00408     return mesg;
00409 }
00410 
00411 /*
00412  * call-seq:
00413  *   exception.message   =>  string
00414  *   exception.to_str    =>  string
00415  *
00416  * Returns the result of invoking <code>exception.to_s</code>.
00417  * Normally this returns the exception's message or name. By
00418  * supplying a to_str method, exceptions are agreeing to
00419  * be used where Strings are expected.
00420  */
00421 
00422 static VALUE
00423 exc_to_str(exc)
00424     VALUE exc;
00425 {
00426     return rb_funcall(exc, rb_intern("to_s"), 0, 0);
00427 }
00428 
00429 /*
00430  * call-seq:
00431  *   exception.inspect   => string
00432  *
00433  * Return this exception's class name an message
00434  */
00435 
00436 static VALUE
00437 exc_inspect(exc)
00438     VALUE exc;
00439 {
00440     VALUE str, klass;
00441 
00442     klass = CLASS_OF(exc);
00443     exc = rb_obj_as_string(exc);
00444     if (RSTRING(exc)->len == 0) {
00445         return rb_str_dup(rb_class_name(klass));
00446     }
00447 
00448     str = rb_str_buf_new2("#<");
00449     klass = rb_class_name(klass);
00450     rb_str_buf_append(str, klass);
00451     rb_str_buf_cat(str, ": ", 2);
00452     rb_str_buf_append(str, exc);
00453     rb_str_buf_cat(str, ">", 1);
00454 
00455     return str;
00456 }
00457 
00458 /*
00459  *  call-seq:
00460  *     exception.backtrace    => array
00461  *  
00462  *  Returns any backtrace associated with the exception. The backtrace
00463  *  is an array of strings, each containing either ``filename:lineNo: in
00464  *  `method''' or ``filename:lineNo.''
00465  *     
00466  *     def a
00467  *       raise "boom"
00468  *     end
00469  *     
00470  *     def b
00471  *       a()
00472  *     end
00473  *     
00474  *     begin
00475  *       b()
00476  *     rescue => detail
00477  *       print detail.backtrace.join("\n")
00478  *     end
00479  *     
00480  *  <em>produces:</em>
00481  *     
00482  *     prog.rb:2:in `a'
00483  *     prog.rb:6:in `b'
00484  *     prog.rb:10
00485 */
00486 
00487 static VALUE
00488 exc_backtrace(exc)
00489     VALUE exc;
00490 {
00491     ID bt = rb_intern("bt");
00492 
00493     if (!rb_ivar_defined(exc, bt)) return Qnil;
00494     return rb_ivar_get(exc, bt);
00495 }
00496 
00497 static VALUE
00498 check_backtrace(bt)
00499     VALUE bt;
00500 {
00501     long i;
00502     static char *err = "backtrace must be Array of String";
00503 
00504     if (!NIL_P(bt)) {
00505         int t = TYPE(bt);
00506 
00507         if (t == T_STRING) return rb_ary_new3(1, bt);
00508         if (t != T_ARRAY) {
00509             rb_raise(rb_eTypeError, err);
00510         }
00511         for (i=0;i<RARRAY(bt)->len;i++) {
00512             if (TYPE(RARRAY(bt)->ptr[i]) != T_STRING) {
00513                 rb_raise(rb_eTypeError, err);
00514             }
00515         }
00516     }
00517     return bt;
00518 }
00519 
00520 /*
00521  *  call-seq:
00522  *     exc.set_backtrace(array)   =>  array
00523  *  
00524  *  Sets the backtrace information associated with <i>exc</i>. The
00525  *  argument must be an array of <code>String</code> objects in the
00526  *  format described in <code>Exception#backtrace</code>.
00527  *     
00528  */
00529 
00530 static VALUE
00531 exc_set_backtrace(exc, bt)
00532     VALUE exc;
00533     VALUE bt;
00534 {
00535     return rb_iv_set(exc, "bt", check_backtrace(bt));
00536 }
00537 
00538 /*
00539  * call-seq:
00540  *   SystemExit.new(status=0)   => system_exit
00541  *
00542  * Create a new +SystemExit+ exception with the given status.
00543  */
00544 
00545 static VALUE
00546 exit_initialize(argc, argv, exc)
00547     int argc;
00548     VALUE *argv;
00549     VALUE exc;
00550 {
00551     VALUE status = INT2FIX(EXIT_SUCCESS);
00552     if (argc > 0 && FIXNUM_P(argv[0])) {
00553         status = *argv++;
00554         --argc;
00555     }
00556     rb_call_super(argc, argv);
00557     rb_iv_set(exc, "status", status);
00558     return exc;
00559 }
00560 
00561 
00562 /*
00563  * call-seq:
00564  *   system_exit.status   => fixnum
00565  *
00566  * Return the status value associated with this system exit.
00567  */
00568 
00569 static VALUE
00570 exit_status(exc)
00571     VALUE exc;
00572 {
00573     return rb_attr_get(exc, rb_intern("status"));
00574 }
00575 
00576 
00577 /*
00578  * call-seq:
00579  *   system_exit.success?  => true or false
00580  *
00581  * Returns +true+ if exiting successful, +false+ if not.
00582  */
00583 
00584 static VALUE
00585 exit_success_p(exc)
00586     VALUE exc;
00587 {
00588     VALUE status = rb_attr_get(exc, rb_intern("status"));
00589     if (NIL_P(status)) return Qtrue;
00590     if (status == INT2FIX(EXIT_SUCCESS)) return Qtrue;
00591     return Qfalse;
00592 }
00593 
00594 void
00595 #ifdef HAVE_STDARG_PROTOTYPES
00596 rb_name_error(ID id, const char *fmt, ...)
00597 #else
00598 rb_name_error(id, fmt, va_alist)
00599     ID id;
00600     const char *fmt;
00601     va_dcl
00602 #endif
00603 {
00604     VALUE exc, argv[2];
00605     va_list args;
00606     char buf[BUFSIZ];
00607 
00608     va_init_list(args, fmt);
00609     vsnprintf(buf, BUFSIZ, fmt, args);
00610     va_end(args);
00611 
00612     argv[0] = rb_str_new2(buf);
00613     argv[1] = ID2SYM(id);
00614     exc = rb_class_new_instance(2, argv, rb_eNameError);
00615     rb_exc_raise(exc);
00616 }
00617 
00618 /*
00619  * call-seq:
00620  *   NameError.new(msg [, name])  => name_error
00621  *
00622  * Construct a new NameError exception. If given the <i>name</i>
00623  * parameter may subsequently be examined using the <code>NameError.name</code>
00624  * method.
00625  */
00626 
00627 static VALUE
00628 name_err_initialize(argc, argv, self)
00629     int argc;
00630     VALUE *argv;
00631     VALUE self;
00632 {
00633     VALUE name;
00634 
00635     name = (argc > 1) ? argv[--argc] : Qnil;
00636     rb_call_super(argc, argv);
00637     rb_iv_set(self, "name", name);
00638     return self;
00639 }
00640 
00641 /*
00642  *  call-seq:
00643  *    name_error.name    =>  string or nil
00644  *
00645  *  Return the name associated with this NameError exception.
00646  */
00647 
00648 static VALUE
00649 name_err_name(self)
00650     VALUE self;
00651 {
00652     return rb_attr_get(self, rb_intern("name"));
00653 }
00654 
00655 /*
00656  * call-seq:
00657  *  name_error.to_s   => string
00658  *
00659  * Produce a nicely-formated string representing the +NameError+.
00660  */
00661 
00662 static VALUE
00663 name_err_to_s(exc)
00664     VALUE exc;
00665 {
00666     VALUE mesg = rb_attr_get(exc, rb_intern("mesg")), str = mesg;
00667 
00668     if (NIL_P(mesg)) return rb_class_name(CLASS_OF(exc));
00669     StringValue(str);
00670     if (str != mesg) {
00671         rb_iv_set(exc, "mesg", mesg = str);
00672     }
00673     if (OBJ_TAINTED(exc)) OBJ_TAINT(mesg);
00674     return mesg;
00675 }
00676 
00677 /*
00678  * call-seq:
00679  *   NoMethodError.new(msg, name [, args])  => no_method_error
00680  *
00681  * Construct a NoMethodError exception for a method of the given name
00682  * called with the given arguments. The name may be accessed using
00683  * the <code>#name</code> method on the resulting object, and the
00684  * arguments using the <code>#args</code> method.
00685  */
00686 
00687 static VALUE
00688 nometh_err_initialize(argc, argv, self)
00689     int argc;
00690     VALUE *argv;
00691     VALUE self;
00692 {
00693     VALUE args = (argc > 2) ? argv[--argc] : Qnil;
00694     name_err_initialize(argc, argv, self);
00695     rb_iv_set(self, "args", args);
00696     return self;
00697 }
00698 
00699 /* :nodoc: */
00700 static void
00701 name_err_mesg_mark(ptr)
00702     VALUE *ptr;
00703 {
00704     rb_gc_mark_locations(ptr, ptr+3);
00705 }
00706 
00707 /* :nodoc: */
00708 static VALUE
00709 name_err_mesg_new(obj, mesg, recv, method)
00710     VALUE obj, mesg, recv, method;
00711 {
00712     VALUE *ptr = ALLOC_N(VALUE, 3);
00713 
00714     ptr[0] = mesg;
00715     ptr[1] = recv;
00716     ptr[2] = method;
00717     return Data_Wrap_Struct(rb_cNameErrorMesg, name_err_mesg_mark, -1, ptr);
00718 }
00719 
00720 /* :nodoc: */
00721 static VALUE
00722 name_err_mesg_to_str(obj)
00723     VALUE obj;
00724 {
00725     VALUE *ptr, mesg;
00726     Data_Get_Struct(obj, VALUE, ptr);
00727 
00728     mesg = ptr[0];
00729     if (NIL_P(mesg)) return Qnil;
00730     else {
00731         char *desc = 0;
00732         VALUE d = 0, args[3];
00733 
00734         obj = ptr[1];
00735         switch (TYPE(obj)) {
00736           case T_NIL:
00737             desc = "nil";
00738             break;
00739           case T_TRUE:
00740             desc = "true";
00741             break;
00742           case T_FALSE:
00743             desc = "false";
00744             break;
00745           default:
00746             d = rb_protect(rb_inspect, obj, 0);
00747             if (NIL_P(d) || RSTRING(d)->len > 65) {
00748                 d = rb_any_to_s(obj);
00749             }
00750             desc = RSTRING(d)->ptr;
00751             break;
00752         }
00753         if (desc && desc[0] != '#') {
00754             d = rb_str_new2(desc);
00755             rb_str_cat2(d, ":");
00756             rb_str_cat2(d, rb_obj_classname(obj));
00757         }
00758         args[0] = mesg;
00759         args[1] = ptr[2];
00760         args[2] = d;
00761         mesg = rb_f_sprintf(3, args);
00762     }
00763     if (OBJ_TAINTED(obj)) OBJ_TAINT(mesg);
00764     return mesg;
00765 }
00766 
00767 /* :nodoc: */
00768 static VALUE
00769 name_err_mesg_load(klass, str)
00770     VALUE klass, str;
00771 {
00772     return str;
00773 }
00774 
00775 /*
00776  * call-seq:
00777  *   no_method_error.args  => obj
00778  *
00779  * Return the arguments passed in as the third parameter to
00780  * the constructor.
00781  */
00782 
00783 static VALUE
00784 nometh_err_args(self)
00785     VALUE self;
00786 {
00787     return rb_attr_get(self, rb_intern("args"));
00788 }
00789 
00790 void
00791 rb_invalid_str(str, type)
00792     const char *str, *type;
00793 {
00794     VALUE s = rb_str_inspect(rb_str_new2(str));
00795 
00796     rb_raise(rb_eArgError, "invalid value for %s: %s", type, RSTRING(s)->ptr);
00797 }
00798 
00799 /* 
00800  *  Document-module: Errno
00801  *
00802  *  Ruby exception objects are subclasses of <code>Exception</code>.
00803  *  However, operating systems typically report errors using plain
00804  *  integers. Module <code>Errno</code> is created dynamically to map
00805  *  these operating system errors to Ruby classes, with each error
00806  *  number generating its own subclass of <code>SystemCallError</code>.
00807  *  As the subclass is created in module <code>Errno</code>, its name
00808  *  will start <code>Errno::</code>.
00809  *     
00810  *  The names of the <code>Errno::</code> classes depend on
00811  *  the environment in which Ruby runs. On a typical Unix or Windows
00812  *  platform, there are <code>Errno</code> classes such as
00813  *  <code>Errno::EACCES</code>, <code>Errno::EAGAIN</code>,
00814  *  <code>Errno::EINTR</code>, and so on.
00815  *     
00816  *  The integer operating system error number corresponding to a
00817  *  particular error is available as the class constant
00818  *  <code>Errno::</code><em>error</em><code>::Errno</code>.
00819  *     
00820  *     Errno::EACCES::Errno   #=> 13
00821  *     Errno::EAGAIN::Errno   #=> 11
00822  *     Errno::EINTR::Errno    #=> 4
00823  *     
00824  *  The full list of operating system errors on your particular platform
00825  *  are available as the constants of <code>Errno</code>.
00826  *
00827  *     Errno.constants   #=> E2BIG, EACCES, EADDRINUSE, EADDRNOTAVAIL, ...
00828  */
00829 
00830 static st_table *syserr_tbl;
00831 
00832 static VALUE
00833 set_syserr(n, name)
00834     int n;
00835     const char *name;
00836 {
00837     VALUE error;
00838 
00839     if (!st_lookup(syserr_tbl, n, &error)) {
00840         error = rb_define_class_under(rb_mErrno, name, rb_eSystemCallError);
00841         rb_define_const(error, "Errno", INT2NUM(n));
00842         st_add_direct(syserr_tbl, n, error);
00843     }
00844     else {
00845         rb_define_const(rb_mErrno, name, error);
00846     }
00847     return error;
00848 }
00849 
00850 static VALUE
00851 get_syserr(n)
00852     int n;
00853 {
00854     VALUE error;
00855 
00856     if (!st_lookup(syserr_tbl, n, &error)) {
00857         char name[8];   /* some Windows' errno have 5 digits. */
00858 
00859         snprintf(name, sizeof(name), "E%03d", n);
00860         error = set_syserr(n, name);
00861     }
00862     return error;
00863 }
00864 
00865 /*
00866  * call-seq:
00867  *   SystemCallError.new(msg, errno)  => system_call_error_subclass
00868  *
00869  * If _errno_ corresponds to a known system error code, constructs
00870  * the appropriate <code>Errno</code> class for that error, otherwise
00871  * constructs a generic <code>SystemCallError</code> object. The
00872  * error number is subsequently available via the <code>errno</code>
00873  * method.
00874  */
00875 
00876 static VALUE
00877 syserr_initialize(argc, argv, self)
00878     int argc;
00879     VALUE *argv;
00880     VALUE self;
00881 {
00882 #if !defined(_WIN32) && !defined(__VMS)
00883     char *strerror();
00884 #endif
00885     char *err;
00886     VALUE mesg, error;
00887     VALUE klass = rb_obj_class(self);
00888 
00889     if (klass == rb_eSystemCallError) {
00890         rb_scan_args(argc, argv, "11", &mesg, &error);
00891         if (argc == 1 && FIXNUM_P(mesg)) {
00892             error = mesg; mesg = Qnil;
00893         }
00894         if (!NIL_P(error) && st_lookup(syserr_tbl, NUM2LONG(error), &klass)) {
00895             /* change class */
00896             if (TYPE(self) != T_OBJECT) { /* insurance to avoid type crash */
00897                 rb_raise(rb_eTypeError, "invalid instance type");
00898             }
00899             RBASIC(self)->klass = klass;
00900         }
00901     }
00902     else {
00903         rb_scan_args(argc, argv, "01", &mesg);
00904         error = rb_const_get(klass, rb_intern("Errno"));
00905     }
00906     if (!NIL_P(error)) err = strerror(NUM2LONG(error));
00907     else err = "unknown error";
00908     if (!NIL_P(mesg)) {
00909         VALUE str = mesg;
00910         size_t len;
00911 
00912         StringValue(str);
00913         len = strlen(err)+RSTRING(str)->len+3;
00914         mesg = rb_str_new(0, len);
00915         snprintf(RSTRING(mesg)->ptr, len+1, "%s - %.*s", err,
00916                 (int)RSTRING(str)->len, RSTRING(str)->ptr);
00917         rb_str_resize(mesg, strlen(RSTRING(mesg)->ptr));
00918     }
00919     else {
00920         mesg = rb_str_new2(err);
00921     }
00922     rb_call_super(1, &mesg);
00923     rb_iv_set(self, "errno", error);
00924     return self;
00925 }
00926 
00927 /*
00928  * call-seq:
00929  *   system_call_error.errno   => fixnum
00930  *
00931  * Return this SystemCallError's error number.
00932  */
00933 
00934 static VALUE
00935 syserr_errno(self)
00936     VALUE self;
00937 {
00938     return rb_attr_get(self, rb_intern("errno"));
00939 }
00940 
00941 /*
00942  * call-seq:
00943  *   system_call_error === other  => true or false
00944  *
00945  * Return +true+ if the receiver is a generic +SystemCallError+, or
00946  * if the error numbers _self_ and _other_ are the same.
00947  */
00948 
00949 
00950 static VALUE
00951 syserr_eqq(self, exc)
00952     VALUE self, exc;
00953 {
00954     VALUE num, e;
00955 
00956     if (!rb_obj_is_kind_of(exc, rb_eSystemCallError)) return Qfalse;
00957     if (self == rb_eSystemCallError) return Qtrue;
00958 
00959     num = rb_attr_get(exc, rb_intern("errno"));
00960     if (NIL_P(num)) {
00961         VALUE klass = CLASS_OF(exc);
00962 
00963         while (TYPE(klass) == T_ICLASS || FL_TEST(klass, FL_SINGLETON)) {
00964             klass = (VALUE)RCLASS(klass)->super;
00965         }
00966         num = rb_const_get(klass, rb_intern("Errno"));
00967     }
00968     e = rb_const_get(self, rb_intern("Errno"));
00969     if (FIXNUM_P(num) ? num == e : rb_equal(num, e))
00970         return Qtrue;
00971     return Qfalse;
00972 }
00973 
00974 /*
00975  *  Descendents of class <code>Exception</code> are used to communicate
00976  *  between <code>raise</code> methods and <code>rescue</code>
00977  *  statements in <code>begin/end</code> blocks. <code>Exception</code>
00978  *  objects carry information about the exception---its type (the
00979  *  exception's class name), an optional descriptive string, and
00980  *  optional traceback information. Programs may subclass 
00981  *  <code>Exception</code> to add additional information.
00982  */
00983 
00984 void
00985 Init_Exception()
00986 {
00987     rb_eException   = rb_define_class("Exception", rb_cObject);
00988     rb_define_singleton_method(rb_eException, "exception", rb_class_new_instance, -1);
00989     rb_define_method(rb_eException, "exception", exc_exception, -1);
00990     rb_define_method(rb_eException, "initialize", exc_initialize, -1);
00991     rb_define_method(rb_eException, "to_s", exc_to_s, 0);
00992     rb_define_method(rb_eException, "to_str", exc_to_str, 0);
00993     rb_define_method(rb_eException, "message", exc_to_str, 0);
00994     rb_define_method(rb_eException, "inspect", exc_inspect, 0);
00995     rb_define_method(rb_eException, "backtrace", exc_backtrace, 0);
00996     rb_define_method(rb_eException, "set_backtrace", exc_set_backtrace, 1);
00997 
00998     rb_eSystemExit  = rb_define_class("SystemExit", rb_eException);
00999     rb_define_method(rb_eSystemExit, "initialize", exit_initialize, -1);
01000     rb_define_method(rb_eSystemExit, "status", exit_status, 0);
01001     rb_define_method(rb_eSystemExit, "success?", exit_success_p, 0);
01002 
01003     rb_eFatal       = rb_define_class("fatal", rb_eException);
01004     rb_eSignal      = rb_define_class("SignalException", rb_eException);
01005     rb_eInterrupt   = rb_define_class("Interrupt", rb_eSignal);
01006 
01007     rb_eStandardError = rb_define_class("StandardError", rb_eException);
01008     rb_eTypeError     = rb_define_class("TypeError", rb_eStandardError);
01009     rb_eArgError      = rb_define_class("ArgumentError", rb_eStandardError);
01010     rb_eIndexError    = rb_define_class("IndexError", rb_eStandardError);
01011     rb_eRangeError    = rb_define_class("RangeError", rb_eStandardError);
01012     rb_eNameError     = rb_define_class("NameError", rb_eStandardError);
01013     rb_define_method(rb_eNameError, "initialize", name_err_initialize, -1);
01014     rb_define_method(rb_eNameError, "name", name_err_name, 0);
01015     rb_define_method(rb_eNameError, "to_s", name_err_to_s, 0);
01016     rb_cNameErrorMesg = rb_define_class_under(rb_eNameError, "message", rb_cData);
01017     rb_define_singleton_method(rb_cNameErrorMesg, "!", name_err_mesg_new, 3);
01018     rb_define_method(rb_cNameErrorMesg, "to_str", name_err_mesg_to_str, 0);
01019     rb_define_method(rb_cNameErrorMesg, "_dump", name_err_mesg_to_str, 1);
01020     rb_define_singleton_method(rb_cNameErrorMesg, "_load", name_err_mesg_load, 1);
01021     rb_eNoMethodError = rb_define_class("NoMethodError", rb_eNameError);
01022     rb_define_method(rb_eNoMethodError, "initialize", nometh_err_initialize, -1);
01023     rb_define_method(rb_eNoMethodError, "args", nometh_err_args, 0);
01024 
01025     rb_eScriptError = rb_define_class("ScriptError", rb_eException);
01026     rb_eSyntaxError = rb_define_class("SyntaxError", rb_eScriptError);
01027     rb_eLoadError   = rb_define_class("LoadError", rb_eScriptError);
01028     rb_eNotImpError = rb_define_class("NotImplementedError", rb_eScriptError);
01029 
01030     rb_eRuntimeError = rb_define_class("RuntimeError", rb_eStandardError);
01031     rb_eSecurityError = rb_define_class("SecurityError", rb_eStandardError);
01032     rb_eNoMemError = rb_define_class("NoMemoryError", rb_eException);
01033 
01034     syserr_tbl = st_init_numtable();
01035     rb_eSystemCallError = rb_define_class("SystemCallError", rb_eStandardError);
01036     rb_define_method(rb_eSystemCallError, "initialize", syserr_initialize, -1);
01037     rb_define_method(rb_eSystemCallError, "errno", syserr_errno, 0);
01038     rb_define_singleton_method(rb_eSystemCallError, "===", syserr_eqq, 1);
01039 
01040     rb_mErrno = rb_define_module("Errno");
01041 
01042     rb_define_global_function("warn", rb_warn_m, 1);
01043 }
01044 
01045 void
01046 #ifdef HAVE_STDARG_PROTOTYPES
01047 rb_raise(VALUE exc, const char *fmt, ...)
01048 #else
01049 rb_raise(exc, fmt, va_alist)
01050     VALUE exc;
01051     const char *fmt;
01052     va_dcl
01053 #endif
01054 {
01055     va_list args;
01056     char buf[BUFSIZ];
01057 
01058     va_init_list(args,fmt);
01059     vsnprintf(buf, BUFSIZ, fmt, args);
01060     va_end(args);
01061     rb_exc_raise(rb_exc_new2(exc, buf));
01062 }
01063 
01064 void
01065 #ifdef HAVE_STDARG_PROTOTYPES
01066 rb_loaderror(const char *fmt, ...)
01067 #else
01068 rb_loaderror(fmt, va_alist)
01069     const char *fmt;
01070     va_dcl
01071 #endif
01072 {
01073     va_list args;
01074     char buf[BUFSIZ];
01075 
01076     va_init_list(args, fmt);
01077     vsnprintf(buf, BUFSIZ, fmt, args);
01078     va_end(args);
01079     rb_exc_raise(rb_exc_new2(rb_eLoadError, buf));
01080 }
01081 
01082 void
01083 rb_notimplement()
01084 {
01085     rb_raise(rb_eNotImpError,
01086              "the %s() function is unimplemented on this machine",
01087              rb_id2name(ruby_frame->last_func));
01088 }
01089 
01090 void
01091 #ifdef HAVE_STDARG_PROTOTYPES
01092 rb_fatal(const char *fmt, ...)
01093 #else
01094 rb_fatal(fmt, va_alist)
01095     const char *fmt;
01096     va_dcl
01097 #endif
01098 {
01099     va_list args;
01100     char buf[BUFSIZ];
01101 
01102     va_init_list(args, fmt);
01103     vsnprintf(buf, BUFSIZ, fmt, args);
01104     va_end(args);
01105 
01106     ruby_in_eval = 0;
01107     rb_exc_fatal(rb_exc_new2(rb_eFatal, buf));
01108 }
01109 
01110 void
01111 rb_sys_fail(mesg)
01112     const char *mesg;
01113 {
01114     int n = errno;
01115     VALUE arg;
01116 
01117     errno = 0;
01118     if (n == 0) {
01119         rb_bug("rb_sys_fail(%s) - errno == 0", mesg ? mesg : "");
01120     }
01121 
01122     arg = mesg ? rb_str_new2(mesg) : Qnil;
01123     rb_exc_raise(rb_class_new_instance(1, &arg, get_syserr(n)));
01124 }
01125 
01126 void
01127 #ifdef HAVE_STDARG_PROTOTYPES
01128 rb_sys_warning(const char *fmt, ...)
01129 #else
01130 rb_sys_warning(fmt, va_alist)
01131      const char *fmt;
01132      va_dcl
01133 #endif
01134 {
01135      char buf[BUFSIZ];
01136      va_list args;
01137      int errno_save;
01138      
01139      errno_save = errno;
01140 
01141      if (!RTEST(ruby_verbose)) return;
01142 
01143      snprintf(buf, BUFSIZ, "warning: %s", fmt);
01144      snprintf(buf+strlen(buf), BUFSIZ-strlen(buf), ": %s", strerror(errno_save));
01145      
01146      va_init_list(args, fmt);
01147      warn_print(buf, args);
01148      va_end(args);
01149      errno = errno_save;
01150 }
01151 
01152 void
01153 rb_load_fail(path)
01154     const char *path;
01155 {
01156     rb_loaderror("%s -- %s", strerror(errno), path);
01157 }
01158 
01159 void
01160 rb_error_frozen(what)
01161     const char *what;
01162 {
01163     rb_raise(rb_eTypeError, "can't modify frozen %s", what);
01164 }
01165 
01166 void
01167 rb_check_frozen(obj)
01168     VALUE obj;
01169 {
01170     if (OBJ_FROZEN(obj)) rb_error_frozen(rb_obj_classname(obj));
01171 }
01172 
01173 void
01174 Init_syserr()
01175 {
01176 #ifdef EPERM
01177     set_syserr(EPERM, "EPERM");
01178 #endif
01179 #ifdef ENOENT
01180     set_syserr(ENOENT, "ENOENT");
01181 #endif
01182 #ifdef ESRCH
01183     set_syserr(ESRCH, "ESRCH");
01184 #endif
01185 #ifdef EINTR
01186     set_syserr(EINTR, "EINTR");
01187 #endif
01188 #ifdef EIO
01189     set_syserr(EIO, "EIO");
01190 #endif
01191 #ifdef ENXIO
01192     set_syserr(ENXIO, "ENXIO");
01193 #endif
01194 #ifdef E2BIG
01195     set_syserr(E2BIG, "E2BIG");
01196 #endif
01197 #ifdef ENOEXEC
01198     set_syserr(ENOEXEC, "ENOEXEC");
01199 #endif
01200 #ifdef EBADF
01201     set_syserr(EBADF, "EBADF");
01202 #endif
01203 #ifdef ECHILD
01204     set_syserr(ECHILD, "ECHILD");
01205 #endif
01206 #ifdef EAGAIN
01207     set_syserr(EAGAIN, "EAGAIN");
01208 #endif
01209 #ifdef ENOMEM
01210     set_syserr(ENOMEM, "ENOMEM");
01211 #endif
01212 #ifdef EACCES
01213     set_syserr(EACCES, "EACCES");
01214 #endif
01215 #ifdef EFAULT
01216     set_syserr(EFAULT, "EFAULT");
01217 #endif
01218 #ifdef ENOTBLK
01219     set_syserr(ENOTBLK, "ENOTBLK");
01220 #endif
01221 #ifdef EBUSY
01222     set_syserr(EBUSY, "EBUSY");
01223 #endif
01224 #ifdef EEXIST
01225     set_syserr(EEXIST, "EEXIST");
01226 #endif
01227 #ifdef EXDEV
01228     set_syserr(EXDEV, "EXDEV");
01229 #endif
01230 #ifdef ENODEV
01231     set_syserr(ENODEV, "ENODEV");
01232 #endif
01233 #ifdef ENOTDIR
01234     set_syserr(ENOTDIR, "ENOTDIR");
01235 #endif
01236 #ifdef EISDIR
01237     set_syserr(EISDIR, "EISDIR");
01238 #endif
01239 #ifdef EINVAL
01240     set_syserr(EINVAL, "EINVAL");
01241 #endif
01242 #ifdef ENFILE
01243     set_syserr(ENFILE, "ENFILE");
01244 #endif
01245 #ifdef EMFILE
01246     set_syserr(EMFILE, "EMFILE");
01247 #endif
01248 #ifdef ENOTTY
01249     set_syserr(ENOTTY, "ENOTTY");
01250 #endif
01251 #ifdef ETXTBSY
01252     set_syserr(ETXTBSY, "ETXTBSY");
01253 #endif
01254 #ifdef EFBIG
01255     set_syserr(EFBIG, "EFBIG");
01256 #endif
01257 #ifdef ENOSPC
01258     set_syserr(ENOSPC, "ENOSPC");
01259 #endif
01260 #ifdef ESPIPE
01261     set_syserr(ESPIPE, "ESPIPE");
01262 #endif
01263 #ifdef EROFS
01264     set_syserr(EROFS, "EROFS");
01265 #endif
01266 #ifdef EMLINK
01267     set_syserr(EMLINK, "EMLINK");
01268 #endif
01269 #ifdef EPIPE
01270     set_syserr(EPIPE, "EPIPE");
01271 #endif
01272 #ifdef EDOM
01273     set_syserr(EDOM, "EDOM");
01274 #endif
01275 #ifdef ERANGE
01276     set_syserr(ERANGE, "ERANGE");
01277 #endif
01278 #ifdef EDEADLK
01279     set_syserr(EDEADLK, "EDEADLK");
01280 #endif
01281 #ifdef ENAMETOOLONG
01282     set_syserr(ENAMETOOLONG, "ENAMETOOLONG");
01283 #endif
01284 #ifdef ENOLCK
01285     set_syserr(ENOLCK, "ENOLCK");
01286 #endif
01287 #ifdef ENOSYS
01288     set_syserr(ENOSYS, "ENOSYS");
01289 #endif
01290 #ifdef ENOTEMPTY
01291     set_syserr(ENOTEMPTY, "ENOTEMPTY");
01292 #endif
01293 #ifdef ELOOP
01294     set_syserr(ELOOP, "ELOOP");
01295 #endif
01296 #ifdef EWOULDBLOCK
01297     set_syserr(EWOULDBLOCK, "EWOULDBLOCK");
01298 #endif
01299 #ifdef ENOMSG
01300     set_syserr(ENOMSG, "ENOMSG");
01301 #endif
01302 #ifdef EIDRM
01303     set_syserr(EIDRM, "EIDRM");
01304 #endif
01305 #ifdef ECHRNG
01306     set_syserr(ECHRNG, "ECHRNG");
01307 #endif
01308 #ifdef EL2NSYNC
01309     set_syserr(EL2NSYNC, "EL2NSYNC");
01310 #endif
01311 #ifdef EL3HLT
01312     set_syserr(EL3HLT, "EL3HLT");
01313 #endif
01314 #ifdef EL3RST
01315     set_syserr(EL3RST, "EL3RST");
01316 #endif
01317 #ifdef ELNRNG
01318     set_syserr(ELNRNG, "ELNRNG");
01319 #endif
01320 #ifdef EUNATCH
01321     set_syserr(EUNATCH, "EUNATCH");
01322 #endif
01323 #ifdef ENOCSI
01324     set_syserr(ENOCSI, "ENOCSI");
01325 #endif
01326 #ifdef EL2HLT
01327     set_syserr(EL2HLT, "EL2HLT");
01328 #endif
01329 #ifdef EBADE
01330     set_syserr(EBADE, "EBADE");
01331 #endif
01332 #ifdef EBADR
01333     set_syserr(EBADR, "EBADR");
01334 #endif
01335 #ifdef EXFULL
01336     set_syserr(EXFULL, "EXFULL");
01337 #endif
01338 #ifdef ENOANO
01339     set_syserr(ENOANO, "ENOANO");
01340 #endif
01341 #ifdef EBADRQC
01342     set_syserr(EBADRQC, "EBADRQC");
01343 #endif
01344 #ifdef EBADSLT
01345     set_syserr(EBADSLT, "EBADSLT");
01346 #endif
01347 #ifdef EDEADLOCK
01348     set_syserr(EDEADLOCK, "EDEADLOCK");
01349 #endif
01350 #ifdef EBFONT
01351     set_syserr(EBFONT, "EBFONT");
01352 #endif
01353 #ifdef ENOSTR
01354     set_syserr(ENOSTR, "ENOSTR");
01355 #endif
01356 #ifdef ENODATA
01357     set_syserr(ENODATA, "ENODATA");
01358 #endif
01359 #ifdef ETIME
01360     set_syserr(ETIME, "ETIME");
01361 #endif
01362 #ifdef ENOSR
01363     set_syserr(ENOSR, "ENOSR");
01364 #endif
01365 #ifdef ENONET
01366     set_syserr(ENONET, "ENONET");
01367 #endif
01368 #ifdef ENOPKG
01369     set_syserr(ENOPKG, "ENOPKG");
01370 #endif
01371 #ifdef EREMOTE
01372     set_syserr(EREMOTE, "EREMOTE");
01373 #endif
01374 #ifdef ENOLINK
01375     set_syserr(ENOLINK, "ENOLINK");
01376 #endif
01377 #ifdef EADV
01378     set_syserr(EADV, "EADV");
01379 #endif
01380 #ifdef ESRMNT
01381     set_syserr(ESRMNT, "ESRMNT");
01382 #endif
01383 #ifdef ECOMM
01384     set_syserr(ECOMM, "ECOMM");
01385 #endif
01386 #ifdef EPROTO
01387     set_syserr(EPROTO, "EPROTO");
01388 #endif
01389 #ifdef EMULTIHOP
01390     set_syserr(EMULTIHOP, "EMULTIHOP");
01391 #endif
01392 #ifdef EDOTDOT
01393     set_syserr(EDOTDOT, "EDOTDOT");
01394 #endif
01395 #ifdef EBADMSG
01396     set_syserr(EBADMSG, "EBADMSG");
01397 #endif
01398 #ifdef EOVERFLOW
01399     set_syserr(EOVERFLOW, "EOVERFLOW");
01400 #endif
01401 #ifdef ENOTUNIQ
01402     set_syserr(ENOTUNIQ, "ENOTUNIQ");
01403 #endif
01404 #ifdef EBADFD
01405     set_syserr(EBADFD, "EBADFD");
01406 #endif
01407 #ifdef EREMCHG
01408     set_syserr(EREMCHG, "EREMCHG");
01409 #endif
01410 #ifdef ELIBACC
01411     set_syserr(ELIBACC, "ELIBACC");
01412 #endif
01413 #ifdef ELIBBAD
01414     set_syserr(ELIBBAD, "ELIBBAD");
01415 #endif
01416 #ifdef ELIBSCN
01417     set_syserr(ELIBSCN, "ELIBSCN");
01418 #endif
01419 #ifdef ELIBMAX
01420     set_syserr(ELIBMAX, "ELIBMAX");
01421 #endif
01422 #ifdef ELIBEXEC
01423     set_syserr(ELIBEXEC, "ELIBEXEC");
01424 #endif
01425 #ifdef EILSEQ
01426     set_syserr(EILSEQ, "EILSEQ");
01427 #endif
01428 #ifdef ERESTART
01429     set_syserr(ERESTART, "ERESTART");
01430 #endif
01431 #ifdef ESTRPIPE
01432     set_syserr(ESTRPIPE, "ESTRPIPE");
01433 #endif
01434 #ifdef EUSERS
01435     set_syserr(EUSERS, "EUSERS");
01436 #endif
01437 #ifdef ENOTSOCK
01438     set_syserr(ENOTSOCK, "ENOTSOCK");
01439 #endif
01440 #ifdef EDESTADDRREQ
01441     set_syserr(EDESTADDRREQ, "EDESTADDRREQ");
01442 #endif
01443 #ifdef EMSGSIZE
01444     set_syserr(EMSGSIZE, "EMSGSIZE");
01445 #endif
01446 #ifdef EPROTOTYPE
01447     set_syserr(EPROTOTYPE, "EPROTOTYPE");
01448 #endif
01449 #ifdef ENOPROTOOPT
01450     set_syserr(ENOPROTOOPT, "ENOPROTOOPT");
01451 #endif
01452 #ifdef EPROTONOSUPPORT
01453     set_syserr(EPROTONOSUPPORT, "EPROTONOSUPPORT");
01454 #endif
01455 #ifdef ESOCKTNOSUPPORT
01456     set_syserr(ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT");
01457 #endif
01458 #ifdef EOPNOTSUPP
01459     set_syserr(EOPNOTSUPP, "EOPNOTSUPP");
01460 #endif
01461 #ifdef EPFNOSUPPORT
01462     set_syserr(EPFNOSUPPORT, "EPFNOSUPPORT");
01463 #endif
01464 #ifdef EAFNOSUPPORT
01465     set_syserr(EAFNOSUPPORT, "EAFNOSUPPORT");
01466 #endif
01467 #ifdef EADDRINUSE
01468     set_syserr(EADDRINUSE, "EADDRINUSE");
01469 #endif
01470 #ifdef EADDRNOTAVAIL
01471     set_syserr(EADDRNOTAVAIL, "EADDRNOTAVAIL");
01472 #endif
01473 #ifdef ENETDOWN
01474     set_syserr(ENETDOWN, "ENETDOWN");
01475 #endif
01476 #ifdef ENETUNREACH
01477     set_syserr(ENETUNREACH, "ENETUNREACH");
01478 #endif
01479 #ifdef ENETRESET
01480     set_syserr(ENETRESET, "EN