From fd46a1da0a41b7939424bc5a393027be7940908e Mon Sep 17 00:00:00 2001 From: nagai Date: Wed, 23 Jul 2003 16:07:35 +0000 Subject: process.c : unify indentation configure.in : add --enable-setreuid option tcltklib.c : TclTkIp.new accepts 'ip-name' and 'options' ( e.g. TclTkIp.new('FOO', '-geometry 500x200 -use 0x2200009') ) tk.rb : support arguments of TclTkIp.new ( see TkCore::IP_NAME, TkCore::IP_OPTS ) tk*.rb : preparations for multi-Tk interpreter support git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4127 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- configure.in | 7 + ext/tcltklib/tcltklib.c | 27 ++- ext/tk/lib/tk.rb | 347 +++++++++++++++++++++--------- ext/tk/lib/tkafter.rb | 22 +- ext/tk/lib/tkbgerror.rb | 2 + ext/tk/lib/tkcanvas.rb | 45 ++-- ext/tk/lib/tkconsole.rb | 2 + ext/tk/lib/tkdialog.rb | 2 + ext/tk/lib/tkentry.rb | 2 + ext/tk/lib/tkfont.rb | 17 +- ext/tk/lib/tkmacpkg.rb | 2 + ext/tk/lib/tkmngfocus.rb | 6 + ext/tk/lib/tkpalette.rb | 6 + ext/tk/lib/tktext.rb | 29 +-- ext/tk/lib/tkvirtevent.rb | 15 +- ext/tk/lib/tkwinpkg.rb | 4 + process.c | 526 +++++++++++++++++++++++----------------------- 17 files changed, 612 insertions(+), 449 deletions(-) diff --git a/configure.in b/configure.in index 0cfd147a5a..96fabbf96d 100644 --- a/configure.in +++ b/configure.in @@ -374,6 +374,13 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid syscall chroot fsync\ getpgrp setpgrp getpgid setpgid initgroups getgroups setgroups\ getpriority getrlimit dlopen sigprocmask sigaction _setjmp\ setsid telldir seekdir fchmod mktime timegm cosh sinh tanh) +AC_ARG_ENABLE(setreuid, + [ --enable-setreuid use setreuid()/setregid() according to need even if obsolete.], + [use_setreuid=$enableval]) +if test "$use_setreuid" = yes; then + AC_DEFINE(USE_SETREUID) + AC_DEFINE(USE_SETREGID) +fi AC_STRUCT_TIMEZONE AC_CACHE_CHECK(for struct tm.tm_gmtoff, rb_cv_member_struct_tm_tm_gmtoff, [AC_TRY_COMPILE([#include ], diff --git a/ext/tcltklib/tcltklib.c b/ext/tcltklib/tcltklib.c index 72ca933424..9ebdbb31e7 100644 --- a/ext/tcltklib/tcltklib.c +++ b/ext/tcltklib/tcltklib.c @@ -530,7 +530,7 @@ ip_ruby(clientData, interp, argc, argv) DUMP2("rb_eval_string(%s)", arg); old_trapflg = rb_trap_immediate; rb_trap_immediate = 0; - res = rb_rescue2(rb_eval_string, (VALUE)arg, + res = rb_rescue2(rb_eval_string, (VALUE)arg, ip_eval_rescue, (VALUE)&failed, rb_eStandardError, rb_eScriptError, 0); rb_trap_immediate = old_trapflg; @@ -584,10 +584,14 @@ ip_alloc(self) } static VALUE -ip_init(self) +ip_init(argc, argv, self) + int argc; + VALUE *argv; VALUE self; { struct tcltkip *ptr; /* tcltkip data struct */ + VALUE argv0, opts, opt_n; + int cnt; /* create object */ Data_Get_Struct(self, struct tcltkip, ptr); @@ -605,6 +609,23 @@ ip_init(self) if (Tcl_Init(ptr->ip) == TCL_ERROR) { rb_raise(rb_eRuntimeError, "%s", ptr->ip->result); } + + /* set variables */ + cnt = rb_scan_args(argc, argv, "02", &argv0, &opts); + switch(cnt) { + case 2: + /* options */ + Tcl_SetVar(ptr->ip, "argv", StringValuePtr(opts), 0); + case 1: + /* argv0 */ + if (argv0 != Qnil) { + Tcl_SetVar(ptr->ip, "argv0", StringValuePtr(argv0), 0); + } + case 0: + /* no args */ + } + + /* from Tcl_AppInit() */ DUMP1("Tk_Init"); if (Tk_Init(ptr->ip) == TCL_ERROR) { rb_raise(rb_eRuntimeError, "%s", ptr->ip->result); @@ -989,7 +1010,7 @@ Init_tcltklib() get_eventloop_weight, 0); rb_define_alloc_func(ip, ip_alloc); - rb_define_method(ip, "initialize", ip_init, 0); + rb_define_method(ip, "initialize", ip_init, -1); rb_define_method(ip, "_eval", ip_eval, 1); rb_define_method(ip, "_toUTF8",ip_toUTF8,2); rb_define_method(ip, "_fromUTF8",ip_fromUTF8,2); diff --git a/ext/tk/lib/tk.rb b/ext/tk/lib/tk.rb index ec69fb04ce..e0c11c1c0d 100644 --- a/ext/tk/lib/tk.rb +++ b/ext/tk/lib/tk.rb @@ -15,32 +15,18 @@ module TkComm 'None' end - Tk_CMDTBL = {} - Tk_WINDOWS = {} - Tk_IDs = [0, 0] # [0]-cmdid, [1]-winid + #Tk_CMDTBL = {} + #Tk_WINDOWS = {} + Tk_IDs = ["00000", "00000"] # [0]-cmdid, [1]-winid - INITIALIZE_TARGETS = [self] - - def self.__init_tables__ - Tk_WINDOWS.clear + # for backward compatibility + Tk_CMDTBL = Object.new + def Tk_CMDTBL.method_missing(id, *args) + TkCore::INTERP.tk_cmd_tbl.send(id, *args) end - - def self.__add_target_for_init__(target) - INITIALIZE_TARGETS << target - - if target.const_defined? :TkINTERP_SETUP_SCRIPTS - target::TkINTERP_SETUP_SCRIPTS.collect{|script| - if script.kind_of? Proc - script.call - elsif script.kind_of? Array - Tk.ip_invoke(*script) - else - Tk.ip_eval(script) - end - } - else - nil - end + Tk_WINDOWS = Object.new + def Tk_WINDOWS.method_missing(id, *args) + TkCore::INTERP.tk_windows.send(id, *args) end def error_at @@ -80,7 +66,8 @@ module TkComm #{classname_def} def initialize(path) @path=path - Tk_WINDOWS[@path] = self + #Tk_WINDOWS[@path] = self + TkCore::INTERP.tk_windows[@path] = self end end" end @@ -91,7 +78,8 @@ module TkComm def tk_tcl2ruby(val) if val =~ /^rb_out (c\d+)/ - return Tk_CMDTBL[$1] + #return Tk_CMDTBL[$1] + return TkCore::INTERP.tk_cmd_tbl[$1] end if val.include? ?\s return val.split.collect{|v| tk_tcl2ruby(v)} @@ -102,7 +90,9 @@ module TkComm when /^-?\d+$/ val.to_i when /^\./ - Tk_WINDOWS[val] ? Tk_WINDOWS[val] : _genobj_for_tkwidget(val) + #Tk_WINDOWS[val] ? Tk_WINDOWS[val] : _genobj_for_tkwidget(val) + TkCore::INTERP.tk_windows[val]? + TkCore::INTERP.tk_windows[val] : _genobj_for_tkwidget(val) when /^i\d+$/ TkImage::Tk_IMGTBL[val]? TkImage::Tk_IMGTBL[val] : val when / / @@ -251,14 +241,17 @@ module TkComm end def window(val) if val =~ /^\./ - Tk_WINDOWS[val]? Tk_WINDOWS[val] : _genobj_for_tkwidget(val) + #Tk_WINDOWS[val]? Tk_WINDOWS[val] : _genobj_for_tkwidget(val) + TkCore::INTERP.tk_windows[val]? + TkCore::INTERP.tk_windows[val] : _genobj_for_tkwidget(val) else nil end end def procedure(val) if val =~ /^rb_out (c\d+)/ - Tk_CMDTBL[$1] + #Tk_CMDTBL[$1] + TkCore::INTERP.tk_cmd_tbl[$1] else #nil val @@ -311,11 +304,13 @@ module TkComm private :ruby2tcl def _curr_cmd_id - id = format("c%.4d", Tk_IDs[0]) + #id = format("c%.4d", Tk_IDs[0]) + id = "c" + Tk_IDs[0] end def _next_cmd_id id = _curr_cmd_id - Tk_IDs[0] += 1 + #Tk_IDs[0] += 1 + Tk_IDs[0].succ! id end private :_curr_cmd_id, :_next_cmd_id @@ -323,21 +318,25 @@ module TkComm def install_cmd(cmd) return '' if cmd == '' id = _next_cmd_id - Tk_CMDTBL[id] = cmd + #Tk_CMDTBL[id] = cmd + TkCore::INTERP.tk_cmd_tbl[id] = cmd @cmdtbl = [] unless defined? @cmdtbl @cmdtbl.push id return format("rb_out %s", id); end def uninstall_cmd(id) id = $1 if /rb_out (c\d+)/ =~ id - Tk_CMDTBL.delete(id) + #Tk_CMDTBL.delete(id) + TkCore::INTERP.tk_cmd_tbl.delete(id) end private :install_cmd, :uninstall_cmd def install_win(ppath,name=nil) if !name or name == '' - name = format("w%.4d", Tk_IDs[1]) - Tk_IDs[1] += 1 + #name = format("w%.4d", Tk_IDs[1]) + #Tk_IDs[1] += 1 + name = "w" + Tk_IDs[1] + Tk_IDs[1].succ! end if name[0] == ?. @path = name.dup @@ -346,11 +345,13 @@ module TkComm else @path = format("%s.%s", ppath, name) end - Tk_WINDOWS[@path] = self + #Tk_WINDOWS[@path] = self + TkCore::INTERP.tk_windows[@path] = self end def uninstall_win() - Tk_WINDOWS.delete(@path) + #Tk_WINDOWS.delete(@path) + TkCore::INTERP.tk_windows.delete(@path) end private :install_win, :uninstall_win @@ -552,7 +553,8 @@ module TkComm if context tk_call(*what+["<#{tk_event_sequence(context)}>"]).collect {|cmdline| if cmdline =~ /^rb_out (c\d+)\s+(.*)$/ - [Tk_CMDTBL[$1], $2] + #[Tk_CMDTBL[$1], $2] + [TkCore::INTERP.tk_cmd_tbl[$1], $2] else cmdline end @@ -636,9 +638,75 @@ module TkCore include TkComm extend TkComm - INTERP = TclTkIp.new unless self.const_defined? :INTERP + unless self.const_defined? :INTERP + if self.const_defined? :IP_NAME + name = IP_NAME.to_s + else + name = nil + end + if self.const_defined? :IP_OPTS + if IP_OPTS.kind_of?(Hash) + opts = hash_kv(IP_OPTS).join(' ') + else + opts = IP_OPTS.to_s + end + else + opts = '' + end + + INTERP = TclTkIp.new(name, opts) + + def INTERP.__ip_id + nil + end + + INTERP.instance_eval{ + @tk_cmd_tbl = {} + @tk_windows = {} + + @tk_table_list = [] + + @init_ip_env = [] # table of Procs + @add_tk_procs = [] # table of [name, body] + } + def INTERP.tk_cmd_tbl + @tk_cmd_tbl + end + def INTERP.tk_windows + @tk_windows + end + + def INTERP.tk_object_table(id) + @tk_table_list[id] + end + def INTERP.create_table + id = @tk_table_list.size + @tk_table_list << {} + obj = Object.new + obj.instance_eval <<-EOD + def self.method_missing(m, *args) + TkCore::INTERP.tk_object_table(#{id}).send(m, *args) + end + EOD + return obj + end + + def INTERP.init_ip_env(script = Proc.new) + @init_ip_env << script + script.call(self) + end + def INTERP.add_tk_procs(name, args, body) + @add_tk_procs << [name, args, body] + self._invoke('proc', name, args, body) + end + def INTERP.init_ip_internal + ip = self + @init_ip_env.each{|script| script.call(ip)} + @add_tk_procs.each{|name,args,body| ip._invoke('proc',name,args,body)} + end + end - INTERP._invoke("proc", "rb_out", "args", <<-'EOL') + INTERP.add_tk_procs('rb_out', 'args', <<-'EOL') regsub -all {!} $args {\\!} args regsub -all "{" $args "\\{" args if {[set st [catch {ruby [format "TkCore.callback %%Q!%s!" $args]} ret]] != 0} { @@ -729,7 +797,9 @@ module TkCore def TkCore.callback(arg) # arg = tk_split_list(arg) arg = tk_split_simplelist(arg) - _get_eval_string(TkUtil.eval_cmd(Tk_CMDTBL[arg.shift], *arg)) + #_get_eval_string(TkUtil.eval_cmd(Tk_CMDTBL[arg.shift], *arg)) + _get_eval_string(TkUtil.eval_cmd(TkCore::INTERP.tk_cmd_tbl[arg.shift], + *arg)) end def windowingsystem @@ -824,13 +894,13 @@ module TkCore TclTkLib.get_eventloop_weight end - def restart(app_name = nil, use = nil) - TkComm::INITIALIZE_TARGETS.each{|m| m.__init_tables__ } + def restart(app_name = nil, keys = {}) + TkCore::INTERP.init_ip_internal tk_call('set', 'argv0', app_name) if app_name - if use - tk_call('set', 'argc', 2) - tk_call('set', 'argv', "-use #{use}") + if keys.kind_of?(Hash) && keys.size > 0 + # tk_call('set', 'argc', keys.size * 2) + tk_call('set', 'argv', hash_kv(keys).join(' ')) end INTERP.restart @@ -919,6 +989,8 @@ module TkPackage include TkCore extend TkPackage + TkCommandNames = ['package'.freeze].freeze + def add_path(path) Tk::AUTO_PATH.value = Tk::AUTO_PATH.to_a << path end @@ -1136,6 +1208,9 @@ module Tk module Wm include TkComm + + TkCommandNames = ['wm'.freeze].freeze + def aspect(*args) w = tk_call('wm', 'aspect', path, *args) if args.length == 0 @@ -1403,25 +1478,33 @@ if /^8\.[1-9]/ =~ Tk::TCL_VERSION && !Tk::JAPANIZED_TK end module Tk - def encoding=(name) - INTERP.encoding = name - end + module Encoding + extend Encoding - def encoding - INTERP.encoding - end + TkCommandNames = ['encoding'.freeze].freeze - def encoding_names - tk_split_simplelist(tk_call('encoding', 'names')) - end + def encoding=(name) + INTERP.encoding = name + end - def encoding_system - tk_call('encoding', 'system') - end + def encoding + INTERP.encoding + end - def encoding_system=(enc) - tk_call('encoding', 'system', enc) + def encoding_names + tk_split_simplelist(tk_call('encoding', 'names')) + end + + def encoding_system + tk_call('encoding', 'system') + end + + def encoding_system=(enc) + tk_call('encoding', 'system', enc) + end end + + extend Encoding end # estimate encoding @@ -1443,21 +1526,27 @@ if /^8\.[1-9]/ =~ Tk::TCL_VERSION && !Tk::JAPANIZED_TK else # dummy methods module Tk - def encoding=(name) - nil - end - def encoding - nil - end - def encoding_names - nil - end - def encoding_system - nil - end - def encoding_system=(enc) - nil + module Encoding + extend Encoding + + def encoding=(name) + nil + end + def encoding + nil + end + def encoding_names + nil + end + def encoding_system + nil + end + def encoding_system=(enc) + nil + end end + + extend Encoding end end @@ -1482,15 +1571,11 @@ end class TkBindTag include TkBindCore - BTagID_TBL = {} - Tk_BINDTAG_ID = ["btag00000"] - - TkComm.__add_target_for_init__(self) + #BTagID_TBL = {} + BTagID_TBL = TkCore::INTERP.create_table + Tk_BINDTAG_ID = ["btag".freeze, "00000"] - def self.__init_tables__ - BTagID_TBL.clear - Tk_BINDTAG_ID[0] = "btag00000" - end + TkCore::INTERP.init_ip_env{ BTagID_TBL.clear } def TkBindTag.id2obj(id) BTagID_TBL[id]? BTagID_TBL[id]: id @@ -1506,8 +1591,8 @@ class TkBindTag end def initialize(*args, &b) - @id = Tk_BINDTAG_ID[0] - Tk_BINDTAG_ID[0] = Tk_BINDTAG_ID[0].succ + @id = Tk_BINDTAG_ID.join + Tk_BINDTAG_ID[1].succ! BTagID_TBL[@id] = self bind(*args, &b) if args != [] end @@ -1557,22 +1642,16 @@ class TkVariable include Tk extend TkCore - TkVar_CB_TBL = {} - TkVar_ID_TBL = {} - Tk_VARIABLE_ID = ["v00000"] + TkCommandNames = ['tkwait'.freeze].freeze - # this constant must be defined befor calling __add_target_for_init__ - TkINTERP_SETUP_SCRIPTS = [ - ["proc", "rb_var", "args", - "ruby [format \"TkVariable.callback %%Q!%s!\" $args]"] - ] + #TkVar_CB_TBL = {} + #TkVar_ID_TBL = {} + TkVar_CB_TBL = TkCore::INTERP.create_table + TkVar_ID_TBL = TkCore::INTERP.create_table + Tk_VARIABLE_ID = ["v".freeze, "00000"] - TkComm.__add_target_for_init__(self) - - def self.__init_tables__ - # cannot clear - # Tcl interpreter may keeps callbacks - end + TkCore::INTERP.add_tk_procs('rb_var', 'args', + "ruby [format \"TkVariable.callback %%Q!%s!\" $args]") def TkVariable.callback(args) name1,name2,op = tk_split_list(args) @@ -1584,8 +1663,8 @@ class TkVariable end def initialize(val="") - @id = Tk_VARIABLE_ID[0] - Tk_VARIABLE_ID[0] = Tk_VARIABLE_ID[0].succ + @id = Tk_VARIABLE_ID.join + Tk_VARIABLE_ID[1].succ! TkVar_ID_TBL[@id] = self if val == [] INTERP._eval(format('global %s; set %s(0) 0; unset %s(0)', @@ -1885,6 +1964,8 @@ module TkSelection include Tk extend Tk + TkCommandNames = ['selection'.freeze].freeze + def self.clear(sel=nil) if sel tk_call 'selection', 'clear', '-selection', sel @@ -1960,6 +2041,12 @@ module TkKinput include Tk extend Tk + TkCommandNames = [ + 'kinput_start'.freeze, + 'kinput_send_spot'.freeze, + 'kanjiInput'.freeze + ].freeze + def TkKinput.start(window, style=None) tk_call 'kinput_start', window.path, style end @@ -2022,6 +2109,8 @@ module TkXIM include Tk extend Tk + TkCommandNames = ['imconfigure'.freeze].freeze + def TkXIM.useinputmethods(window=nil, value=nil) if window if value @@ -2107,6 +2196,8 @@ module TkWinfo include Tk extend Tk + TkCommandNames = ['winfo'.freeze].freeze + def TkWinfo.atom(name, win=nil) if win number(tk_call('winfo', 'atom', '-displayof', win, name)) @@ -2481,6 +2572,9 @@ end module TkPack include Tk extend Tk + + TkCommandNames = ['pack'.freeze].freeze + def configure(win, *args) if args[-1].kind_of?(Hash) keys = args.pop @@ -2524,6 +2618,8 @@ module TkGrid include Tk extend Tk + TkCommandNames = ['grid'.freeze].freeze + def bbox(*args) list(tk_call('grid', 'bbox', *args)) end @@ -2619,6 +2715,8 @@ module TkPlace include Tk extend Tk + TkCommandNames = ['place'.freeze].freeze + def configure(win, slot, value=None) if slot.kind_of? Hash tk_call 'place', 'configure', win.epath, *hash_kv(slot) @@ -2668,6 +2766,8 @@ module TkOptionDB include Tk extend Tk + TkCommandNames = ['option'.freeze].freeze + module Priority WidgetDefault = 20 StartupFile = 40 @@ -2695,7 +2795,7 @@ module TkOptionDB private :new CARRIER = '.'.freeze - METHOD_TBL = {} + METHOD_TBL = TkCore::INTERP.create_table ADD_METHOD = false SAFE_MODE = 4 @@ -2765,7 +2865,7 @@ module TkOptionDB body = <<-"EOD" class #{klass} < TkOptionDB.module_eval('@@resource_proc_class') CARRIER = '#{carrier}'.freeze - METHOD_TBL = {} + METHOD_TBL = TkCore::INTERP.create_table ADD_METHOD = #{add} SAFE_MODE = #{safe} %w(#{func_str}).each{|f| METHOD_TBL[f.intern] = nil } @@ -3654,6 +3754,8 @@ end class TkRoottrue, :widgetname=>'.') + end + root = TkCore::INTERP.tk_windows['.'] + if keys # wm commands + keys.each{|k,v| + if v.kind_of? Array + root.send(k,*v) + else + root.send(k,v) + end + } + end + return root + end WidgetClassName = 'Tk'.freeze WidgetClassNames[WidgetClassName] = self @@ -3688,6 +3808,7 @@ end class TkToplevel return value of tk_optionMenu @path = path - TkComm::Tk_WINDOWS[@path] = self + #TkComm::Tk_WINDOWS[@path] = self + TkCore::INTERP.tk_windows[@path] = self end end @@ -4843,6 +4980,8 @@ module TkClipboard include Tk extend Tk + TkCommandNames = ['clipboard'.freeze].freeze + def self.clear(win=nil) if win tk_call 'clipboard', 'clear', '-displayof', win diff --git a/ext/tk/lib/tkafter.rb b/ext/tk/lib/tkafter.rb index fec93a6a04..4401bce719 100644 --- a/ext/tk/lib/tkafter.rb +++ b/ext/tk/lib/tkafter.rb @@ -9,21 +9,13 @@ class TkTimer include TkCore extend TkCore - Tk_CBID = [0] - Tk_CBTBL = {} + TkCommandNames = ['after'.freeze].freeze - # this constant must be defined befor calling __add_target_for_init__ - TkINTERP_SETUP_SCRIPTS = [ - ["proc", "rb_after", "id", - "ruby [format \"#{self.name}.callback %%Q!%s!\" $id]"] - ] + Tk_CBID = ['a'.freeze, '00000'] + Tk_CBTBL = TkCore::INTERP.create_table - TkComm.__add_target_for_init__(self) - - def self.__init_tables__ - # cannot clear - # Tcl interpreter may keep callbacks - end + TkCore::INTERP.add_tk_procs('rb_after', 'id', + "ruby [format \"#{self.name}.callback %%Q!%s!\" $id]") ############################### @@ -108,8 +100,8 @@ class TkTimer end def initialize(*args) - @id = format("a%.4d", Tk_CBID[0]) - Tk_CBID[0] += 1 + @id = Tk_CBID.join + Tk_CBID[1].succ! @set_next = true diff --git a/ext/tk/lib/tkbgerror.rb b/ext/tk/lib/tkbgerror.rb index e068155b1c..760a3901b3 100644 --- a/ext/tk/lib/tkbgerror.rb +++ b/ext/tk/lib/tkbgerror.rb @@ -7,6 +7,8 @@ require 'tk' module TkBgError extend Tk + TkCommandNames = ['bgerror'.freeze].freeze + def bgerror(message) tk_call 'bgerror', message end diff --git a/ext/tk/lib/tkcanvas.rb b/ext/tk/lib/tkcanvas.rb index a98d770ccd..cbe4f89043 100644 --- a/ext/tk/lib/tkcanvas.rb +++ b/ext/tk/lib/tkcanvas.rb @@ -29,6 +29,7 @@ class TkCanvas".freeze] + TkVirtualEventTBL = TkCore::INTERP.create_table - def self.__init_tables__ - TkVirtualEventTBL.clear - TkVirtualEventID[0] = 0 - end + TkCore::INTERP.init_ip_env{ TkVirtualEventTBL.clear } class PreDefVirtEvent", TkVirtualEventID[0]) - TkVirtualEventID[0] += 1 + @path = @id = TkVirtualEventID.join + TkVirtualEventID[1].succ! add(*sequences) end diff --git a/ext/tk/lib/tkwinpkg.rb b/ext/tk/lib/tkwinpkg.rb index a5ac5c7a1b..7762b3a596 100644 --- a/ext/tk/lib/tkwinpkg.rb +++ b/ext/tk/lib/tkwinpkg.rb @@ -12,6 +12,8 @@ module TkWinDDE extend Tk extend TkWinDDE + TkCommandNames = ['dde'.freeze].freeze + tk_call('package', 'require', 'dde') def servername(topic=nil) @@ -50,6 +52,8 @@ module TkWinRegistry extend Tk extend TkWinRegistry + TkCommandNames = ['registry'.freeze].freeze + tk_call('package', 'require', 'registry') def delete(keynam, valnam=nil) diff --git a/process.c b/process.c index d80414a1f2..7e44e7a501 100644 --- a/process.c +++ b/process.c @@ -1288,128 +1288,128 @@ p_uid_change_privilege(obj, id) if (geteuid() == 0) { /* root-user */ #if defined(HAVE_SETRESUID) - if (setresuid(uid, uid, uid) < 0) rb_sys_fail(0); - SAVED_USER_ID = uid; + if (setresuid(uid, uid, uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; #elif defined(HAVE_SETUID) - if (setuid(uid) < 0) rb_sys_fail(0); - SAVED_USER_ID = uid; + if (setuid(uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; #elif defined(HAVE_SETREUID) && !defined(OBSOLETE_SETREUID) - if (getuid() == uid) { - if (SAVED_USER_ID == uid) { - if (setreuid(-1, uid) < 0) rb_sys_fail(0); + if (getuid() == uid) { + if (SAVED_USER_ID == uid) { + if (setreuid(-1, uid) < 0) rb_sys_fail(0); + } else { + if (uid == 0) { /* (r,e,s) == (root, root, x) */ + if (setreuid(-1, SAVED_USER_ID) < 0) rb_sys_fail(0); + if (setreuid(SAVED_USER_ID, 0) < 0) rb_sys_fail(0); + SAVED_USER_ID = 0; /* (r,e,s) == (x, root, root) */ + if (setreuid(uid, uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + } else { + if (setreuid(0, -1) < 0) rb_sys_fail(0); + SAVED_USER_ID = 0; + if (setreuid(uid, uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + } + } } else { - if (uid == 0) { /* (r,e,s) == (root, root, x) */ - if (setreuid(-1, SAVED_USER_ID) < 0) rb_sys_fail(0); - if (setreuid(SAVED_USER_ID, 0) < 0) rb_sys_fail(0); - SAVED_USER_ID = 0; /* (r,e,s) == (x, root, root) */ - if (setreuid(uid, uid) < 0) rb_sys_fail(0); - SAVED_USER_ID = uid; - } else { - if (setreuid(0, -1) < 0) rb_sys_fail(0); - SAVED_USER_ID = 0; if (setreuid(uid, uid) < 0) rb_sys_fail(0); SAVED_USER_ID = uid; - } } - } else { - if (setreuid(uid, uid) < 0) rb_sys_fail(0); - SAVED_USER_ID = uid; - } #elif defined(HAVE_SETRUID) && defined(HAVE_SETEUID) - if (getuid() == uid) { - if (SAVED_USER_ID == uid) { - if (seteuid(uid) < 0) rb_sys_fail(0); + if (getuid() == uid) { + if (SAVED_USER_ID == uid) { + if (seteuid(uid) < 0) rb_sys_fail(0); + } else { + if (uid == 0) { + if (setruid(SAVED_USER_ID) < 0) rb_sys_fail(0); + SAVED_USER_ID = 0; + if (setruid(0) < 0) rb_sys_fail(0); + } else { + if (setruid(0) < 0) rb_sys_fail(0); + SAVED_USER_ID = 0; + if (seteuid(uid) < 0) rb_sys_fail(0); + if (setruid(uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + } + } } else { - if (uid == 0) { - if (setruid(SAVED_USER_ID) < 0) rb_sys_fail(0); - SAVED_USER_ID = 0; - if (setruid(0) < 0) rb_sys_fail(0); - } else { - if (setruid(0) < 0) rb_sys_fail(0); - SAVED_USER_ID = 0; if (seteuid(uid) < 0) rb_sys_fail(0); if (setruid(uid) < 0) rb_sys_fail(0); SAVED_USER_ID = uid; - } } - } else { - if (seteuid(uid) < 0) rb_sys_fail(0); - if (setruid(uid) < 0) rb_sys_fail(0); - SAVED_USER_ID = uid; - } #else - rb_notimplement(); + rb_notimplement(); #endif } else { /* unprivileged user */ #if defined(HAVE_SETRESUID) - if (setresuid((getuid() == uid)? -1: uid, - (geteuid() == uid)? -1: uid, - (SAVED_USER_ID == uid)? -1: uid) < 0) rb_sys_fail(0); - SAVED_USER_ID = uid; -#elif defined(HAVE_SETREUID) && !defined(OBSOLETE_SETREUID) - if (SAVED_USER_ID == uid) { - if (setreuid((getuid() == uid)? -1: uid, - (geteuid() == uid)? -1: uid) < 0) rb_sys_fail(0); - } else if (getuid() != uid) { - if (setreuid(uid, (geteuid() == uid)? -1: uid) < 0) rb_sys_fail(0); + if (setresuid((getuid() == uid)? -1: uid, + (geteuid() == uid)? -1: uid, + (SAVED_USER_ID == uid)? -1: uid) < 0) rb_sys_fail(0); SAVED_USER_ID = uid; - } else if (/* getuid() == uid && */ geteuid() != uid) { - if (setreuid(geteuid(), uid) < 0) rb_sys_fail(0); - SAVED_USER_ID = uid; - if (setreuid(uid, -1) < 0) rb_sys_fail(0); - } else { /* getuid() == uid && geteuid() == uid */ - if (setreuid(-1, SAVED_USER_ID) < 0) rb_sys_fail(0); - if (setreuid(SAVED_USER_ID, uid) < 0) rb_sys_fail(0); - SAVED_USER_ID = uid; - if (setreuid(uid, -1) < 0) rb_sys_fail(0); - } +#elif defined(HAVE_SETREUID) && !defined(OBSOLETE_SETREUID) + if (SAVED_USER_ID == uid) { + if (setreuid((getuid() == uid)? -1: uid, + (geteuid() == uid)? -1: uid) < 0) rb_sys_fail(0); + } else if (getuid() != uid) { + if (setreuid(uid, (geteuid() == uid)? -1: uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + } else if (/* getuid() == uid && */ geteuid() != uid) { + if (setreuid(geteuid(), uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + if (setreuid(uid, -1) < 0) rb_sys_fail(0); + } else { /* getuid() == uid && geteuid() == uid */ + if (setreuid(-1, SAVED_USER_ID) < 0) rb_sys_fail(0); + if (setreuid(SAVED_USER_ID, uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + if (setreuid(uid, -1) < 0) rb_sys_fail(0); + } #elif defined(HAVE_SETRUID) && defined(HAVE_SETEUID) - if (SAVED_USER_ID == uid) { - if (geteuid() != uid && seteuid(uid) < 0) rb_sys_fail(0); - if (getuid() != uid && setruid(uid) < 0) rb_sys_fail(0); - } else if (/* SAVED_USER_ID != uid && */ geteuid() == uid) { - if (getuid() != uid) { - if (setruid(uid) < 0) rb_sys_fail(0); - SAVED_USER_ID = uid; + if (SAVED_USER_ID == uid) { + if (geteuid() != uid && seteuid(uid) < 0) rb_sys_fail(0); + if (getuid() != uid && setruid(uid) < 0) rb_sys_fail(0); + } else if (/* SAVED_USER_ID != uid && */ geteuid() == uid) { + if (getuid() != uid) { + if (setruid(uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + } else { + if (setruid(SAVED_USER_ID) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + if (setruid(uid) < 0) rb_sys_fail(0); + } + } else if (/* geteuid() != uid && */ getuid() == uid) { + if (seteuid(uid) < 0) rb_sys_fail(0); + if (setruid(SAVED_USER_ID) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + if (setruid(uid) < 0) rb_sys_fail(0); } else { - if (setruid(SAVED_USER_ID) < 0) rb_sys_fail(0); - SAVED_USER_ID = uid; - if (setruid(uid) < 0) rb_sys_fail(0); + errno = EPERM; + rb_sys_fail(0); } - } else if (/* geteuid() != uid && */ getuid() == uid) { - if (seteuid(uid) < 0) rb_sys_fail(0); - if (setruid(SAVED_USER_ID) < 0) rb_sys_fail(0); - SAVED_USER_ID = uid; - if (setruid(uid) < 0) rb_sys_fail(0); - } else { - errno = EPERM; - rb_sys_fail(0); - } #elif defined HAVE_44BSD_SETUID - if (getuid() == uid) { - /* (r,e,s)==(uid,?,?) ==> (uid,uid,uid) */ - if (setuid(uid) < 0) rb_sys_fail(0); - SAVED_USER_ID = uid; - } else { - errno = EPERM; - rb_sys_fail(0); - } + if (getuid() == uid) { + /* (r,e,s)==(uid,?,?) ==> (uid,uid,uid) */ + if (setuid(uid) < 0) rb_sys_fail(0); + SAVED_USER_ID = uid; + } else { + errno = EPERM; + rb_sys_fail(0); + } #elif defined HAVE_SETEUID - if (getuid() == uid && SAVED_USER_ID == uid) { - if (seteuid(uid) < 0) rb_sys_fail(0); - } else { - errno = EPERM; - rb_sys_fail(0); - } + if (getuid() == uid && SAVED_USER_ID == uid) { + if (seteuid(uid) < 0) rb_sys_fail(0); + } else { + errno = EPERM; + rb_sys_fail(0); + } #elif defined HAVE_SETUID - if (getuid() == uid && SAVED_USER_ID == uid) { - if (setuid(uid) < 0) rb_sys_fail(0); - } else { - errno = EPERM; - rb_sys_fail(0); - } + if (getuid() == uid && SAVED_USER_ID == uid) { + if (setuid(uid) < 0) rb_sys_fail(0); + } else { + errno = EPERM; + rb_sys_fail(0); + } #else - rb_notimplement(); + rb_notimplement(); #endif } return INT2FIX(uid); @@ -1481,9 +1481,9 @@ p_sys_issetugid(obj) { #if defined HAVE_ISSETUGID if (issetugid()) { - return Qtrue; + return Qtrue; } else { - return Qfalse; + return Qfalse; } #else rb_notimplement(); @@ -1586,7 +1586,8 @@ proc_setgroups(VALUE obj, VALUE ary) else { gr = getgrnam(RSTRING(g)->ptr); if (gr == NULL) - rb_raise(rb_eArgError, "can't find group for %s", RSTRING(g)->ptr); + rb_raise(rb_eArgError, + "can't find group for %s", RSTRING(g)->ptr); groups[i] = gr->gr_gid; } } @@ -1605,7 +1606,7 @@ proc_setgroups(VALUE obj, VALUE ary) static VALUE proc_initgroups(obj, uname, base_grp) - VALUE obj, uname, base_grp; + VALUE obj, uname, base_grp; { #ifdef HAVE_INITGROUPS if (initgroups(StringValuePtr(uname), (gid_t)NUM2INT(base_grp)) != 0) { @@ -1632,7 +1633,7 @@ proc_setmaxgroups(obj, val) size_t ngroups = FIX2INT(val); if (ngroups > 4096) - ngroups = 4096; + ngroups = 4096; maxgroups = ngroups; @@ -1652,129 +1653,129 @@ p_gid_change_privilege(obj, id) if (geteuid() == 0) { /* root-user */ #if defined(HAVE_SETRESGID) - if (setresgid(gid, gid, gid) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = gid; + if (setresgid(gid, gid, gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; #elif defined HAVE_SETGID - if (setgid(gid) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = gid; + if (setgid(gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; #elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID) - if (getgid() == gid) { - if (SAVED_GROUP_ID == gid) { - if (setregid(-1, gid) < 0) rb_sys_fail(0); + if (getgid() == gid) { + if (SAVED_GROUP_ID == gid) { + if (setregid(-1, gid) < 0) rb_sys_fail(0); + } else { + if (gid == 0) { /* (r,e,s) == (root, y, x) */ + if (setregid(-1, SAVED_GROUP_ID) < 0) rb_sys_fail(0); + if (setregid(SAVED_GROUP_ID, 0) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = 0; /* (r,e,s) == (x, root, root) */ + if (setregid(gid, gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + } else { /* (r,e,s) == (z, y, x) */ + if (setregid(0, 0) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = 0; + if (setregid(gid, gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + } + } } else { - if (gid == 0) { /* (r,e,s) == (root, y, x) */ - if (setregid(-1, SAVED_GROUP_ID) < 0) rb_sys_fail(0); - if (setregid(SAVED_GROUP_ID, 0) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = 0; /* (r,e,s) == (x, root, root) */ - if (setregid(gid, gid) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = gid; - } else { /* (r,e,s) == (z, y, x) */ - if (setregid(0, 0) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = 0; if (setregid(gid, gid) < 0) rb_sys_fail(0); SAVED_GROUP_ID = gid; - } } - } else { - if (setregid(gid, gid) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = gid; - } #elif defined(HAVE_SETRGID) && defined (HAVE_SETEGID) - if (getgid() == gid) { - if (SAVED_GROUP_ID == gid) { - if (setegid(gid) < 0) rb_sys_fail(0); + if (getgid() == gid) { + if (SAVED_GROUP_ID == gid) { + if (setegid(gid) < 0) rb_sys_fail(0); + } else { + if (gid == 0) { + if (setegid(gid) < 0) rb_sys_fail(0); + if (setrgid(SAVED_GROUP_ID) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = 0; + if (setrgid(0) < 0) rb_sys_fail(0); + } else { + if (setrgid(0) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = 0; + if (setegid(gid) < 0) rb_sys_fail(0); + if (setrgid(gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + } + } } else { - if (gid == 0) { - if (setegid(gid) < 0) rb_sys_fail(0); - if (setrgid(SAVED_GROUP_ID) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = 0; - if (setrgid(0) < 0) rb_sys_fail(0); - } else { - if (setrgid(0) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = 0; if (setegid(gid) < 0) rb_sys_fail(0); if (setrgid(gid) < 0) rb_sys_fail(0); SAVED_GROUP_ID = gid; - } } - } else { - if (setegid(gid) < 0) rb_sys_fail(0); - if (setrgid(gid) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = gid; - } #else - rb_notimplement(); + rb_notimplement(); #endif } else { /* unprivileged user */ #if defined(HAVE_SETRESGID) - if (setresgid((getgid() == gid)? -1: gid, - (getegid() == gid)? -1: gid, - (SAVED_GROUP_ID == gid)? -1: gid) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = gid; -#elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID) - if (SAVED_GROUP_ID == gid) { - if (setregid((getgid() == gid)? -1: gid, - (getegid() == gid)? -1: gid) < 0) rb_sys_fail(0); - } else if (getgid() != gid) { - if (setregid(gid, (getegid() == gid)? -1: gid) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = gid; - } else if (/* getgid() == gid && */ getegid() != gid) { - if (setregid(getegid(), gid) < 0) rb_sys_fail(0); + if (setresgid((getgid() == gid)? -1: gid, + (getegid() == gid)? -1: gid, + (SAVED_GROUP_ID == gid)? -1: gid) < 0) rb_sys_fail(0); SAVED_GROUP_ID = gid; - if (setregid(gid, -1) < 0) rb_sys_fail(0); - } else { /* getgid() == gid && getegid() == gid */ - if (setregid(-1, SAVED_GROUP_ID) < 0) rb_sys_fail(0); - if (setregid(SAVED_GROUP_ID, gid) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = gid; - if (setregid(gid, -1) < 0) rb_sys_fail(0); - } +#elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID) + if (SAVED_GROUP_ID == gid) { + if (setregid((getgid() == gid)? -1: gid, + (getegid() == gid)? -1: gid) < 0) rb_sys_fail(0); + } else if (getgid() != gid) { + if (setregid(gid, (getegid() == gid)? -1: gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + } else if (/* getgid() == gid && */ getegid() != gid) { + if (setregid(getegid(), gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + if (setregid(gid, -1) < 0) rb_sys_fail(0); + } else { /* getgid() == gid && getegid() == gid */ + if (setregid(-1, SAVED_GROUP_ID) < 0) rb_sys_fail(0); + if (setregid(SAVED_GROUP_ID, gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + if (setregid(gid, -1) < 0) rb_sys_fail(0); + } #elif defined(HAVE_SETRGID) && defined(HAVE_SETEGID) - if (SAVED_GROUP_ID == gid) { - if (getegid() != gid && setegid(gid) < 0) rb_sys_fail(0); - if (getgid() != gid && setrgid(gid) < 0) rb_sys_fail(0); - } else if (/* SAVED_GROUP_ID != gid && */ getegid() == gid) { - if (getgid() != gid) { - if (setrgid(gid) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = gid; + if (SAVED_GROUP_ID == gid) { + if (getegid() != gid && setegid(gid) < 0) rb_sys_fail(0); + if (getgid() != gid && setrgid(gid) < 0) rb_sys_fail(0); + } else if (/* SAVED_GROUP_ID != gid && */ getegid() == gid) { + if (getgid() != gid) { + if (setrgid(gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + } else { + if (setrgid(SAVED_GROUP_ID) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + if (setrgid(gid) < 0) rb_sys_fail(0); + } + } else if (/* getegid() != gid && */ getgid() == gid) { + if (setegid(gid) < 0) rb_sys_fail(0); + if (setrgid(SAVED_GROUP_ID) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + if (setrgid(gid) < 0) rb_sys_fail(0); } else { - if (setrgid(SAVED_GROUP_ID) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = gid; - if (setrgid(gid) < 0) rb_sys_fail(0); + errno = EPERM; + rb_sys_fail(0); } - } else if (/* getegid() != gid && */ getgid() == gid) { - if (setegid(gid) < 0) rb_sys_fail(0); - if (setrgid(SAVED_GROUP_ID) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = gid; - if (setrgid(gid) < 0) rb_sys_fail(0); - } else { - errno = EPERM; - rb_sys_fail(0); - } #elif defined HAVE_44BSD_SETGID - if (getgid() == gid) { - /* (r,e,s)==(gid,?,?) ==> (gid,gid,gid) */ - if (setgid(gid) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = gid; - } else { - errno = EPERM; - rb_sys_fail(0); - } + if (getgid() == gid) { + /* (r,e,s)==(gid,?,?) ==> (gid,gid,gid) */ + if (setgid(gid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = gid; + } else { + errno = EPERM; + rb_sys_fail(0); + } #elif defined HAVE_SETEGID - if (getgid() == gid && SAVED_GROUP_ID == gid) { - if (setegid(gid) < 0) rb_sys_fail(0); - } else { - errno = EPERM; - rb_sys_fail(0); - } + if (getgid() == gid && SAVED_GROUP_ID == gid) { + if (setegid(gid) < 0) rb_sys_fail(0); + } else { + errno = EPERM; + rb_sys_fail(0); + } #elif defined HAVE_SETGID - if (getgid() == gid && SAVED_GROUP_ID == gid) { - if (setgid(gid) < 0) rb_sys_fail(0); - } else { - errno = EPERM; - rb_sys_fail(0); - } + if (getgid() == gid && SAVED_GROUP_ID == gid) { + if (setgid(gid) < 0) rb_sys_fail(0); + } else { + errno = EPERM; + rb_sys_fail(0); + } #else - rb_notimplement(); + rb_notimplement(); #endif } return INT2FIX(gid); @@ -1822,17 +1823,17 @@ rb_seteuid_core(euid) #if defined(HAVE_SETRESUID) && !defined(__CHECKER__) if (uid != euid) { - if (setresuid(-1,euid,euid) < 0) rb_sys_fail(0); - SAVED_USER_ID = euid; + if (setresuid(-1,euid,euid) < 0) rb_sys_fail(0); + SAVED_USER_ID = euid; } else { - if (setresuid(-1,euid,-1) < 0) rb_sys_fail(0); + if (setresuid(-1,euid,-1) < 0) rb_sys_fail(0); } #elif defined(HAVE_SETREUID) && !defined(OBSOLETE_SETREUID) if (setreuid(-1, euid) < 0) rb_sys_fail(0); if (uid != euid) { - if (setreuid(euid,uid) < 0) rb_sys_fail(0); - if (setreuid(uid,euid) < 0) rb_sys_fail(0); - SAVED_USER_ID = euid; + if (setreuid(euid,uid) < 0) rb_sys_fail(0); + if (setreuid(uid,euid) < 0) rb_sys_fail(0); + SAVED_USER_ID = euid; } #elif defined HAVE_SETEUID if (seteuid(euid) < 0) rb_sys_fail(0); @@ -1849,7 +1850,7 @@ static VALUE p_uid_grant_privilege(obj, id) VALUE obj, id; { - return rb_seteuid_core(NUM2INT(id)); + return rb_seteuid_core(NUM2INT(id)); } static VALUE @@ -1896,17 +1897,17 @@ rb_setegid_core(egid) #if defined(HAVE_SETRESGID) && !defined(__CHECKER__) if (gid != egid) { - if (setresgid(-1,egid,egid) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = egid; + if (setresgid(-1,egid,egid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = egid; } else { - if (setresgid(-1,egid,-1) < 0) rb_sys_fail(0); + if (setresgid(-1,egid,-1) < 0) rb_sys_fail(0); } #elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID) if (setregid(-1, egid) < 0) rb_sys_fail(0); if (gid != egid) { - if (setregid(egid,gid) < 0) rb_sys_fail(0); - if (setregid(gid,egid) < 0) rb_sys_fail(0); - SAVED_GROUP_ID = egid; + if (setregid(egid,gid) < 0) rb_sys_fail(0); + if (setregid(gid,egid) < 0) rb_sys_fail(0); + SAVED_GROUP_ID = egid; } #elif defined HAVE_SETEGID if (setegid(egid) < 0) rb_sys_fail(0); @@ -1923,18 +1924,18 @@ static VALUE p_gid_grant_privilege(obj, id) VALUE obj, id; { - return rb_setegid_core(NUM2INT(id)); + return rb_setegid_core(NUM2INT(id)); } static VALUE p_uid_exchangeable() { #if defined(HAVE_SETRESUID) && !defined(__CHECKER__) - return Qtrue; + return Qtrue; #elif defined(HAVE_SETREUID) && !defined(OBSOLETE_SETREUID) - return Qtrue; + return Qtrue; #else - return Qfalse; + return Qfalse; #endif } @@ -1963,11 +1964,11 @@ static VALUE p_gid_exchangeable() { #if defined(HAVE_SETRESGID) && !defined(__CHECKER__) - return Qtrue; + return Qtrue; #elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID) - return Qtrue; + return Qtrue; #else - return Qfalse; + return Qfalse; #endif } @@ -1996,9 +1997,9 @@ static VALUE p_uid_have_saved_id() { #if defined(HAVE_SETRESUID) || defined(HAVE_SETEUID) || _POSIX_SAVED_IDS - return Qtrue; + return Qtrue; #else - return Qfalse; + return Qfalse; #endif } @@ -2014,33 +2015,33 @@ p_uid_switch(obj) #if defined(HAVE_SETRESUID) || defined(HAVE_SETEUID) || _POSIX_SAVED_IDS if (uid != euid) { - proc_seteuid(obj, INT2FIX(uid)); - if (rb_block_given_p()) { - return rb_ensure(rb_yield, Qnil, rb_seteuid_core, SAVED_USER_ID); - } else { - return INT2FIX(euid); - } + proc_seteuid(obj, INT2FIX(uid)); + if (rb_block_given_p()) { + return rb_ensure(rb_yield, Qnil, rb_seteuid_core, SAVED_USER_ID); + } else { + return INT2FIX(euid); + } } else if (euid != SAVED_USER_ID) { - proc_seteuid(obj, INT2FIX(SAVED_USER_ID)); - if (rb_block_given_p()) { - return rb_ensure(rb_yield, Qnil, rb_seteuid_core, euid); - } else { - return INT2FIX(uid); - } + proc_seteuid(obj, INT2FIX(SAVED_USER_ID)); + if (rb_block_given_p()) { + return rb_ensure(rb_yield, Qnil, rb_seteuid_core, euid); + } else { + return INT2FIX(uid); + } } else { - errno = EPERM; - rb_sys_fail(0); + errno = EPERM; + rb_sys_fail(0); } #else if (uid == euid) { - errno = EPERM; - rb_sys_fail(0); + errno = EPERM; + rb_sys_fail(0); } p_uid_switch(obj); if (rb_block_given_p()) { - return rb_ensure(rb_yield, Qnil, p_uid_switch, obj); + return rb_ensure(rb_yield, Qnil, p_uid_switch, obj); } else { - return INT2FIX(euid); + return INT2FIX(euid); } #endif } @@ -2049,9 +2050,9 @@ static VALUE p_gid_have_saved_id() { #if defined(HAVE_SETRESGID) || defined(HAVE_SETEGID) || _POSIX_SAVED_IDS - return Qtrue; + return Qtrue; #else - return Qfalse; + return Qfalse; #endif } @@ -2067,33 +2068,34 @@ p_gid_switch(obj) #if defined(HAVE_SETRESGID) || defined(HAVE_SETEGID) || _POSIX_SAVED_IDS if (gid != egid) { - proc_setegid(obj, INT2FIX(gid)); - if (rb_block_given_p()) { - return rb_ensure(rb_yield, Qnil, proc_setegid, INT2FIX(SAVED_GROUP_ID)); - } else { - return INT2FIX(egid); - } + proc_setegid(obj, INT2FIX(gid)); + if (rb_block_given_p()) { + return rb_ensure(rb_yield, Qnil, proc_setegid, + INT2FIX(SAVED_GROUP_ID)); + } else { + return INT2FIX(egid); + } } else if (egid != SAVED_GROUP_ID) { - proc_setegid(obj, INT2FIX(SAVED_GROUP_ID)); - if (rb_block_given_p()) { - return rb_ensure(rb_yield, Qnil, proc_setegid, INT2FIX(egid)); - } else { - return INT2FIX(gid); - } + proc_setegid(obj, INT2FIX(SAVED_GROUP_ID)); + if (rb_block_given_p()) { + return rb_ensure(rb_yield, Qnil, proc_setegid, INT2FIX(egid)); + } else { + return INT2FIX(gid); + } } else { - errno = EPERM; - rb_sys_fail(0); + errno = EPERM; + rb_sys_fail(0); } #else if (gid == egid) { - errno = EPERM; - rb_sys_fail(0); + errno = EPERM; + rb_sys_fail(0); } p_gid_switch(obj); if (rb_block_given_p()) { - return rb_ensure(rb_yield, Qnil, p_gid_switch, obj); + return rb_ensure(rb_yield, Qnil, p_gid_switch, obj); } else { - return INT2FIX(egid); + return INT2FIX(egid); } #endif } -- cgit v1.2.3