diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-11-22 04:00:03 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-11-22 04:00:03 +0000 |
commit | a15c3f7b2464eff86ec0a1de89518e4d5a57d811 (patch) | |
tree | d60cd10a685a805d69575e5779eb899e6ba97898 /ext | |
parent | dc32688f002f36a4aed31525df0a9a4eff239c60 (diff) | |
download | ruby-a15c3f7b2464eff86ec0a1de89518e4d5a57d811.tar.gz ruby-a15c3f7b2464eff86ec0a1de89518e4d5a57d811.tar.xz ruby-a15c3f7b2464eff86ec0a1de89518e4d5a57d811.zip |
* gc.c (Init_stack): stack region is far smaller than usual if
pthread is used.
* marshal.c (w_extended): singleton methods should not be checked
when dumping via marshal_dump() or _dump(). [ruby-talk:85909]
* file.c (getcwdofdrv): avoid using getcwd() directly, use
my_getcwd() instead.
* merged NeXT, OpenStep, Rhapsody ports patch from Eric Sunshine
<sunshine@sunshineco.com>. [ruby-core:01596]
* marshal.c (w_object): LINK check earlier than anything else,
i.e. do not dump TYPE_IVAR for already dumped objects.
(ruby-bugs PR#1220)
* eval.c (rb_eval): call "inherited" only when a new class is
generated; not on reopening.
* eval.c (eval): prepend error position in evaluating string to
* configure.in: revived NextStep, OpenStep, and Rhapsody ports which
had become unbuildable; enhanced --enable-fat-binary option so that
it accepts a list of desired architectures (rather than assuming a
fixed list), or defaults to a platform-appropriate list if user does
not provide an explicit list; made the default list of architectures
for MAB (fat binary) more comprehensive; now uses -fno-common even
when building the interpreter (in addition to using it for
extensions), thus allowing the interpreter to be embedded into a
plugin module of an external project (in addition to allowing
embedding directly into an application); added checks for
<netinet/in_systm.h> (needed by `socket' extension) and getcwd(); now
ensures that -I/usr/local/include is employed when extensions'
extconf.rb scripts invoke have_header() since extension checks on
NextStep and OpenStep will fail without it if the desired resource
resides in the /usr/local tree; fixed formatting of --help message.
* Makefile.in: $(LIBRUBY_A) rule now deletes the archive before
invoking $(AR) since `ar' on Apple/NeXT can not "update" MAB archives
(see configure's --enable-fat-binary option); added rule for new
missing/getcwd.c.
* defines.h: fixed endian handling during MAB build (see configure's
--enable-fat-binary option) to ensure that all portions of the
project see the correct WORDS_BIGENDIAN value (some extension modules
were getting the wrong endian setting); added missing constants
GETPGRP_VOID, WNOHANG, WUNTRACED, X_OK, and type pid_t for NextStep
and OpenStep; removed unnecessary and problematic HAVE_SYS_WAIT_H
define in NeXT section.
* dir.c: do not allow NAMLEN() macro to trust dirent::d_namlen on
NextStep since, on some installations, this value always resolves
uselessly to zero.
* dln.c: added error reporting to NextStep extension loader since the
previous behavior of failing silently was not useful; now ensures
that NSLINKMODULE_OPTION_BINDNOW compatibility constant is defined
for OpenStep and Rhapsody; no longer includes <mach-o/dyld.h> twice
on Rhapsody since this header lacks multiple-include protection,
which resulted in "redefinition" compilation errors.
* main.c: also create hard reference to objc_msgSend() on NeXT
platforms (in addition to Apple platforms).
* lib/mkmf.rb: now exports XCFLAGS from configure script to extension
makefiles so that extensions can be built MAB (see configure's
--enable-fat-binary option); also utilize XCFLAGS in cc_command()
(but not cpp_command() because MAB flags are incompatible with
direct invocation of `cpp').
* ext/curses/extconf.rb: now additionally checks for presence of these
curses functions which are not present on NextStep or Openstep:
bkgd(), bkgdset(), color(), curs(), getbkgd(), init(), scrl(), set(),
setscrreg(), wattroff(), wattron(), wattrset(), wbkgd(), wbkgdset(),
wscrl(), wsetscrreg()
* ext/curses/curses.c: added appropriate #ifdef's for additional set of
curses functions now checked by extconf.rb; fixed curses_bkgd() and
window_bkgd() to correctly return boolean result rather than numeric
result; fixed window_getbkgd() to correctly signal an error by
returning nil rather than -1.
* ext/etc/etc.c: setup_passwd() and setup_group() now check for null
pointers before invoking rb_tainted_str_new2() upon fields extracted
from `struct passwd' and `struct group' since null pointers in some
fields are common on NextStep/OpenStep (especially so for the
`pw_comment' field) and rb_tainted_str_new2() throws an exception
when it receives a null pointer.
* ext/pty/pty.c: include "util.h" for strdup()/ruby_strdup() for
platforms such as NextStep and OpenStep which lack strdup().
* ext/socket/getaddrinfo.c: cast first argument of getservbyname(),
gethostbyaddr(), and gethostbyname() from (const char*) to non-const
(char*) for older platforms such as NextStep and OpenStep.
* ext/socket/socket.c: include "util.h" for strdup()/ruby_strdup() for
platforms such as NextStep and OpenStep which lack strdup(); include
<netinet/in_systm.h> if present for NextStep and OpenStep; cast first
argument of gethostbyaddr() and getservbyname() from (const char*) to
non-const (char*) for older platforms.
* ext/syslog/syslog.c: include "util.h" for strdup()/ruby_strdup() for
platforms such as NextStep and OpenStep which lack strdup().
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@5002 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
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 8aa095e5a..7900573df 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 a79cebf60..d0eed198d 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 f64b30604..807a98c6b 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 cea0de50a..01382e881 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 4f58a23d2..c05fbd57b 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 e30d25404..5cebe593b 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 5ee2c6b89..ce386eda3 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 */ |