static int trap_signm(VALUE vsig) { int sig = -1; const char *s; if (TYPE(vsig) == T_FIXNUM) { sig = FIX2INT(vsig); if (sig < 0 || sig >= NSIG) { rb_raise(rb_eArgError, "invalid signal number (%d)", sig); } } else { if (TYPE(vsig) == T_SYMBOL) { s = rb_sym2name(vsig); if (s == NULL) rb_raise(rb_eArgError, "bad signal"); } else s = StringValuePtr(vsig); if (strncmp("SIG", s, 3) == 0) s += 3; sig = signm2signo(s); if (sig == 0 && strcmp(s, "EXIT") != 0) rb_raise(rb_eArgError, "unsupported signal SIG%s", s); } return sig; }
static VALUE esignal_init(VALUE self, SEL sel, int argc, VALUE *argv) { int argnum = 1; VALUE sig = Qnil; int signo; const char *signm; if (argc > 0) { sig = rb_check_to_integer(argv[0], "to_int"); if (!NIL_P(sig)) argnum = 2; else sig = argv[0]; } if (argc < 1 || argnum < argc) { rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)", argc, argnum); } if (argnum == 2) { signo = NUM2INT(sig); if (signo < 0 || signo > NSIG) { rb_raise(rb_eArgError, "invalid signal number (%d)", signo); } if (argc > 1) { sig = argv[1]; } else { signm = signo2signm(signo); if (signm) { sig = rb_sprintf("SIG%s", signm); } else { sig = rb_sprintf("SIG%u", signo); } } } else { signm = SYMBOL_P(sig) ? rb_sym2name(sig) : StringValuePtr(sig); if (strncmp(signm, "SIG", 3) == 0) signm += 3; signo = signm2signo(signm); if (!signo) { rb_raise(rb_eArgError, "unsupported name `SIG%s'", signm); } sig = rb_sprintf("SIG%s", signm); } rb_vm_call_super(self, selInitialize2, 1, &sig); rb_iv_set(self, "signo", INT2NUM(signo)); return self; }
static inline const char * rval_to_c_str(VALUE rval) { if (NIL_P(rval)) { return NULL; } else { if (CLASS_OF(rval) == rb_cSymbol) { return rb_sym2name(rval); } if (rb_obj_is_kind_of(rval, rb_cPointer)) { return (const char *)rb_pointer_get_data(rval, "^c"); } return StringValueCStr(rval); } }
VALUE rb_f_kill(VALUE self, SEL sel, int argc, VALUE *argv) { int negative = 0; int sig; int i; int type; const char *s = NULL; rb_secure(2); if (argc < 2) rb_raise(rb_eArgError, "wrong number of arguments -- kill(sig, pid...)"); type = TYPE(argv[0]); if (type == T_FIXNUM) { sig = FIX2INT(argv[0]); } else { if (type == T_SYMBOL) { s = rb_sym2name(argv[0]); if (!s) rb_raise(rb_eArgError, "bad signal"); } else if (type == T_STRING) { s = RSTRING_PTR(argv[0]); if (s[0] == '-') { negative++; s++; } } else { VALUE str; str = rb_check_string_type(argv[0]); if (!NIL_P(str)) { s = RSTRING_PTR(str); } } if (s == NULL) rb_raise(rb_eArgError, "bad signal type %s", rb_obj_classname(argv[0])); if (strncmp("SIG", s, 3) == 0) s += 3; if ((sig = signm2signo(s)) == 0) rb_raise(rb_eArgError, "unsupported name `SIG%s'", s); if (negative) sig = -sig; } if (sig < 0) { sig = -sig; for (i = 1; i < argc; i++) { if (killpg(NUM2PIDT(argv[i]), sig) < 0) rb_sys_fail(0); } } else { for (i = 1; i < argc; i++) { if (kill(NUM2PIDT(argv[i]), sig) < 0) rb_sys_fail(0); } } rb_thread_polling(); return INT2FIX(i - 1); }