diff options
Diffstat (limited to 'ext')
-rw-r--r-- | ext/curses/curses.c | 128 | ||||
-rw-r--r-- | ext/curses/extconf.rb | 2 | ||||
-rw-r--r-- | ext/etc/etc.c | 30 | ||||
-rw-r--r-- | ext/pty/pty.c | 1 | ||||
-rw-r--r-- | ext/socket/getaddrinfo.c | 6 | ||||
-rw-r--r-- | ext/socket/socket.c | 8 | ||||
-rw-r--r-- | ext/syslog/syslog.c | 1 |
7 files changed, 153 insertions, 23 deletions
diff --git a/ext/curses/curses.c b/ext/curses/curses.c index 8aa095e5a5..7900573df7 100644 --- a/ext/curses/curses.c +++ b/ext/curses/curses.c @@ -477,22 +477,34 @@ curses_cols() static VALUE curses_curs_set(VALUE obj, VALUE visibility) { +#ifdef HAVE_CURS_SET int n; return (n = curs_set(NUM2INT(visibility)) != ERR) ? INT2FIX(n) : Qnil; +#else + return Qnil; +#endif } static VALUE curses_scrl(VALUE obj, VALUE n) { /* may have to raise exception on ERR */ +#ifdef HAVE_SCRL return (scrl(NUM2INT(n)) == OK) ? Qtrue : Qfalse; +#else + return Qfalse; +#endif } static VALUE curses_setscrreg(VALUE obj, VALUE top, VALUE bottom) { /* may have to raise exception on ERR */ +#ifdef HAVE_SETSCRREG return (setscrreg(NUM2INT(top), NUM2INT(bottom)) == OK) ? Qtrue : Qfalse; +#else + return Qfalse; +#endif } static VALUE @@ -519,14 +531,20 @@ curses_attrset(VALUE obj, VALUE attrs) static VALUE curses_bkgdset(VALUE obj, VALUE ch) { +#ifdef HAVE_BKGDSET bkgdset(NUM2CHR(ch)); +#endif return Qnil; } static VALUE curses_bkgd(VALUE obj, VALUE ch) { - return CHR2FIX(bkgd(NUM2CHR(ch))); +#ifdef HAVE_BKGD + return (bkgd(NUM2CHR(ch)) == OK) ? Qtrue : Qfalse; +#else + return Qfalse; +#endif } static VALUE @@ -679,6 +697,37 @@ DEFINE_MOUSE_GET_MEMBER(curs_mouse_bstate, bstate) #undef define_curs_mouse_member #endif /* USE_MOUSE */ +static VALUE +curses_timeout(VALUE obj, VALUE delay) +{ +#ifdef HAVE_TIMEOUT + timeout(NUM2INT(delay)); + return Qnil; +#else + rb_notimplement(); +#endif +} + +static VALUE +curses_def_prog_mode(VALUE obj) +{ +#ifdef HAVE_DEF_PROG_MODE + return def_prog_mode() == OK ? Qtrue : Qfalse; +#else + rb_notimplement(); +#endif +} + +static VALUE +curses_reset_prog_mode(VALUE obj) +{ +#ifdef HAVE_RESET_PROG_MODE + return reset_prog_mode() == OK ? Qtrue : Qfalse; +#else + rb_notimplement(); +#endif +} + /*-------------------------- class Window --------------------------*/ /* def self.allocate */ @@ -1125,6 +1174,7 @@ window_idlok(VALUE obj, VALUE bf) static VALUE window_setscrreg(VALUE obj, VALUE top, VALUE bottom) { +#ifdef HAVE_WSETSCRREG struct windata *winp; int res; @@ -1132,6 +1182,9 @@ window_setscrreg(VALUE obj, VALUE top, VALUE bottom) res = wsetscrreg(winp->window, NUM2INT(top), NUM2INT(bottom)); /* may have to raise exception on ERR */ return (res == OK) ? Qtrue : Qfalse; +#else + return Qfalse; +#endif } static VALUE @@ -1147,25 +1200,34 @@ window_scroll(VALUE obj) static VALUE window_scrl(VALUE obj, VALUE n) { +#ifdef HAVE_WSCRL struct windata *winp; GetWINDOW(obj, winp); /* may have to raise exception on ERR */ return (wscrl(winp->window,NUM2INT(n)) == OK) ? Qtrue : Qfalse; +#else + return Qfalse; +#endif } static VALUE window_attroff(VALUE obj, VALUE attrs) { +#ifdef HAVE_WATTROFF struct windata *winp; GetWINDOW(obj,winp); return INT2FIX(wattroff(winp->window,NUM2INT(attrs))); +#else + return Qtrue; +#endif } static VALUE window_attron(VALUE obj, VALUE attrs) { +#ifdef HAVE_WATTRON struct windata *winp; VALUE val; @@ -1179,43 +1241,61 @@ window_attron(VALUE obj, VALUE attrs) else{ return val; } +#else + return Qtrue; +#endif } static VALUE window_attrset(VALUE obj, VALUE attrs) { +#ifdef HAVE_WATTRSET struct windata *winp; GetWINDOW(obj,winp); return INT2FIX(wattrset(winp->window,NUM2INT(attrs))); +#else + return Qtrue; +#endif } static VALUE window_bkgdset(VALUE obj, VALUE ch) { +#ifdef HAVE_WBKGDSET struct windata *winp; GetWINDOW(obj,winp); wbkgdset(winp->window, NUM2CHR(ch)); +#endif return Qnil; } static VALUE window_bkgd(VALUE obj, VALUE ch) { +#ifdef HAVE_WBKGD struct windata *winp; GetWINDOW(obj,winp); - return CHR2FIX(wbkgd(winp->window, NUM2CHR(ch))); + return (wbkgd(winp->window, NUM2CHR(ch)) == OK) ? Qtrue : Qfalse; +#else + return Qfalse; +#endif } static VALUE window_getbkgd(VALUE obj) { +#ifdef HAVE_WGETBKGD + char c; struct windata *winp; GetWINDOW(obj,winp); - return CHR2FIX(getbkgd(winp->window)); + return (c = getbkgd(winp->window) != ERR) ? CHR2FIX(c) : Qnil; +#else + return Qnil; +#endif } static VALUE @@ -1232,10 +1312,10 @@ window_resize(VALUE obj, VALUE lin, VALUE col) } -#ifdef HAVE_KEYPAD static VALUE window_keypad(VALUE obj, VALUE val) { +#ifdef HAVE_KEYPAD struct windata *winp; GetWINDOW(obj,winp); @@ -1248,8 +1328,37 @@ window_keypad(VALUE obj, VALUE val) return (keypad(winp->window,RTEST(val) ? TRUE : FALSE)) == OK ? Qtrue : Qfalse; #endif -} +#else + rb_notimplement(); #endif /* HAVE_KEYPAD */ +} + +static VALUE +window_nodelay(VALUE obj, VALUE val) +{ +#ifdef HAVE_NODELAY + struct windata *winp; + GetWINDOW(obj,winp); + + return nodelay(winp->window,RTEST(val) ? TRUE : FALSE) == OK ? Qtrue : Qfalse; +#else + rb_notimplement(); +#endif +} + +static VALUE +window_timeout(VALUE obj, VALUE delay) +{ +#ifdef HAVE_WTIMEOUT + struct windata *winp; + GetWINDOW(obj,winp); + + wtimeout(winp->window,NUM2INT(delay)); + return Qnil; +#else + rb_notimplement(); +#endif +} /*------------------------- Initialization -------------------------*/ void @@ -1333,6 +1442,10 @@ Init_curses() rb_define_module_function(mCurses, "mousemask", curses_mousemask, 1); #endif /* USE_MOUSE */ + rb_define_module_function(mCurses, "timeout=", curses_timeout, 1); + rb_define_module_function(mCurses, "def_prog_mode", curses_def_prog_mode, 0); + rb_define_module_function(mCurses, "reset_prog_mode", curses_reset_prog_mode, 0); + cWindow = rb_define_class_under(mCurses, "Window", rb_cData); rb_define_alloc_func(cWindow, window_s_allocate); rb_define_method(cWindow, "initialize", window_initialize, 4); @@ -1367,10 +1480,9 @@ Init_curses() rb_define_method(cWindow, "setscrreg", window_setscrreg, 2); rb_define_method(cWindow, "scrl", window_scrl, 1); rb_define_method(cWindow, "resize", window_resize, 2); -#ifdef HAVE_KEYPAD rb_define_method(cWindow, "keypad", window_keypad, 1); rb_define_method(cWindow, "keypad=", window_keypad, 1); -#endif + #ifdef USE_COLOR rb_define_method(cWindow, "attroff", window_attroff, 1); rb_define_method(cWindow, "attron", window_attron, 1); @@ -1380,6 +1492,8 @@ Init_curses() rb_define_method(cWindow, "getbkgd", window_getbkgd, 0); #endif /* USE_COLOR */ + rb_define_method(cWindow, "nodelay=", window_nodelay, 1); + rb_define_method(cWindow, "timeout=", window_timeout, 1); #define rb_curses_define_const(c) rb_define_const(mCurses,#c,UINT2NUM(c)) diff --git a/ext/curses/extconf.rb b/ext/curses/extconf.rb index a79cebf600..d0eed198d3 100644 --- a/ext/curses/extconf.rb +++ b/ext/curses/extconf.rb @@ -19,7 +19,7 @@ elsif have_header(*curses=%w"curses.h") and have_library("curses", "initscr") end if make - for f in %w(isendwin ungetch beep getnstr wgetnstr doupdate flash deleteln wdeleteln keypad keyname init_color wresize resizeterm) + for f in %w(beep bkgd bkgdset color curs deleteln doupdate flash getbkgd getnstr init isendwin keyname keypad resizeterm scrl set setscrreg ungetch wattroff wattron wattrset wbkgd wbkgdset wdeleteln wgetnstr wresize wscrl wsetscrreg def_prog_mode reset_prog_mode timeout wtimeout nodelay) have_func(f) end flag = "-D_XOPEN_SOURCE_EXTENDED" diff --git a/ext/etc/etc.c b/ext/etc/etc.c index f64b30604a..807a98c6b7 100644 --- a/ext/etc/etc.c +++ b/ext/etc/etc.c @@ -49,6 +49,16 @@ etc_getlogin(obj) return Qnil; } +#if defined(HAVE_GETPWENT) || defined(HAVE_GETGRENT) +static VALUE +safe_setup_str(str) + const char *str; +{ + if (str == 0) str = ""; + return rb_tainted_str_new2(str); +} +#endif + #ifdef HAVE_GETPWENT static VALUE setup_passwd(pwd) @@ -56,15 +66,15 @@ setup_passwd(pwd) { if (pwd == 0) rb_sys_fail("/etc/passwd"); return rb_struct_new(sPasswd, - rb_tainted_str_new2(pwd->pw_name), - rb_tainted_str_new2(pwd->pw_passwd), + safe_setup_str(pwd->pw_name), + safe_setup_str(pwd->pw_passwd), INT2FIX(pwd->pw_uid), INT2FIX(pwd->pw_gid), #ifdef HAVE_ST_PW_GECOS - rb_tainted_str_new2(pwd->pw_gecos), + safe_setup_str(pwd->pw_gecos), #endif - rb_tainted_str_new2(pwd->pw_dir), - rb_tainted_str_new2(pwd->pw_shell), + safe_setup_str(pwd->pw_dir), + safe_setup_str(pwd->pw_shell), #ifdef HAVE_ST_PW_CHANGE INT2FIX(pwd->pw_change), #endif @@ -75,10 +85,10 @@ setup_passwd(pwd) INT2FIX(pwd->pw_age), #endif #ifdef HAVE_ST_PW_CLASS - rb_tainted_str_new2(pwd->pw_class), + safe_setup_str(pwd->pw_class), #endif #ifdef HAVE_ST_PW_COMMENT - rb_tainted_str_new2(pwd->pw_comment), + safe_setup_str(pwd->pw_comment), #endif #ifdef HAVE_ST_PW_EXPIRE INT2FIX(pwd->pw_expire), @@ -220,12 +230,12 @@ setup_group(grp) mem = rb_ary_new(); tbl = grp->gr_mem; while (*tbl) { - rb_ary_push(mem, rb_tainted_str_new2(*tbl)); + rb_ary_push(mem, safe_setup_str(*tbl)); tbl++; } return rb_struct_new(sGroup, - rb_tainted_str_new2(grp->gr_name), - rb_tainted_str_new2(grp->gr_passwd), + safe_setup_str(grp->gr_name), + safe_setup_str(grp->gr_passwd), INT2FIX(grp->gr_gid), mem); } diff --git a/ext/pty/pty.c b/ext/pty/pty.c index cea0de50a2..01382e881a 100644 --- a/ext/pty/pty.c +++ b/ext/pty/pty.c @@ -24,6 +24,7 @@ #include "ruby.h" #include "rubyio.h" +#include "util.h" #include <signal.h> #ifdef HAVE_SYS_STROPTS_H diff --git a/ext/socket/getaddrinfo.c b/ext/socket/getaddrinfo.c index 4f58a23d2d..c05fbd57ba 100644 --- a/ext/socket/getaddrinfo.c +++ b/ext/socket/getaddrinfo.c @@ -397,7 +397,7 @@ getaddrinfo(hostname, servname, hints, res) fprintf(stderr, "panic!\n"); break; } - if ((sp = getservbyname(servname, proto)) == NULL) + if ((sp = getservbyname((char*)servname, proto)) == NULL) ERR(EAI_SERVICE); port = sp->s_port; if (pai->ai_socktype == ANY) @@ -554,7 +554,7 @@ get_name(addr, afd, res, numaddr, pai, port0) #ifdef INET6 hp = getipnodebyaddr(addr, afd->a_addrlen, afd->a_af, &h_error); #else - hp = gethostbyaddr(addr, afd->a_addrlen, AF_INET); + hp = gethostbyaddr((char*)addr, afd->a_addrlen, AF_INET); #endif if (hp && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) { GET_AI(cur, afd, hp->h_addr_list[0], port); @@ -606,7 +606,7 @@ get_addr(hostname, af, res, pai, port0) } else hp = getipnodebyname(hostname, af, AI_ADDRCONFIG, &h_error); #else - hp = gethostbyname(hostname); + hp = gethostbyname((char*)hostname); h_error = h_errno; #endif if (hp == NULL) { diff --git a/ext/socket/socket.c b/ext/socket/socket.c index e30d25404d..5cebe593bc 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -13,6 +13,7 @@ #include "ruby.h" #include "rubyio.h" #include "rubysig.h" +#include "util.h" #include <stdio.h> #include <sys/types.h> @@ -31,6 +32,9 @@ # include <sys/socket.h> #endif #include <netinet/in.h> +#ifdef HAVE_NETINET_IN_SYSTM_H +# include <netinet/in_systm.h> +#endif #ifdef HAVE_NETINET_TCP_H # include <netinet/tcp.h> #endif @@ -2016,7 +2020,7 @@ sock_s_gethostbyaddr(argc, argv) t = AF_INET6; } #endif - h = gethostbyaddr(RSTRING(addr)->ptr, RSTRING(addr)->len, t); + h = gethostbyaddr((char*)RSTRING(addr)->ptr, RSTRING(addr)->len, t); if (h == NULL) { #ifdef HAVE_HSTRERROR extern int h_errno; @@ -2061,7 +2065,7 @@ sock_s_getservbyaname(argc, argv) else proto = StringValuePtr(protocol); StringValue(service); - sp = getservbyname(RSTRING(service)->ptr, proto); + sp = getservbyname((char*)RSTRING(service)->ptr, proto); if (sp) { port = ntohs(sp->s_port); } diff --git a/ext/syslog/syslog.c b/ext/syslog/syslog.c index 5ee2c6b89a..ce386eda30 100644 --- a/ext/syslog/syslog.c +++ b/ext/syslog/syslog.c @@ -8,6 +8,7 @@ */ #include "ruby.h" +#include "util.h" #include <syslog.h> /* Syslog class */ |