From: "Cs. Henk" Date: 2005-02-28T21:09:29+09:00 Subject: [PATCH] callable argument for PTY.getpty (aka PTY.spawn) --liOOAslEiF7prFVr Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi! The patch attached enables you to pass a callable object to PTY.spawn, so that if you do so, of course, the object will be called (instead of exec'ing an external program). Rationale: sometimes you want to do some initialization on the pty before starting the external program, or maybe you don't even want to call an external program... Example: this whole thing popped up when I was writing a small readline wrapper. The pty spawned for the util to be wrapped is to be put into non-echo mode prior to starting the util. With the current pty the only way to do this is as follows: inp,out,cpid = PTY.spawn(*(["ruby", "-e", 'system "stty -echo"; exec *$*'] + $*)) With this patch I can do just inp,out,cpid = PTY.spawn(proc { system "stty -echo"; exec *$*}) Csaba --liOOAslEiF7prFVr Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="pty-proc-hack.diff" diff -Naur ruby-orig/ext/pty/pty.c ruby/ext/pty/pty.c --- ruby-orig/ext/pty/pty.c 2004-12-08 06:26:27.000000000 -0700 +++ ruby/ext/pty/pty.c 2005-02-28 04:43:11.000000000 -0700 @@ -283,9 +283,14 @@ seteuid(getuid()); #endif - arg.argc = argc; - arg.argv = argv; - rb_protect(pty_exec, (VALUE)&arg, &status); + if (rb_respond_to(*argv,rb_intern("call"))) { + v = *argv++; + rb_funcall2(v,rb_intern("call"),--argc,argv); + } else { + arg.argc = argc; + arg.argv = argv; + rb_protect(pty_exec, (VALUE)&arg, &status); + } sleep(1); _exit(1); } --liOOAslEiF7prFVr--