Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > ruby-termios: Patch to make it work under both 1.8 and 1.9

Reply
Thread Tools

ruby-termios: Patch to make it work under both 1.8 and 1.9

 
 
Lloyd Zusman
Guest
Posts: n/a
 
      05-27-2005
--=-=-=

I recently had problems getting ruby-termios to compile properly under
ruby 1.9. It turns out that "rubyio.h" has changed between these two
ruby versions, and therefore, I offer the following patch, which should
enable ruby-termios to compile and run under all 1.8 and 1.9 ruby
versions.


--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment; filename=ruby-termios.patch
Content-Description: Allows ruby-termios to work under 1.8.x and 1.9.x

--- termios.c.orig 2005-05-27 02:37:18.000000000 -0400
+++ termios.c 2005-05-27 02:39:20.000000000 -0400
@@ -8,6 +8,14 @@

#include "ruby.h"
#include "rubyio.h"
+#include "version.h"
+
+#if RUBY_VERSION_CODE >= 190
+# define FPTR_FILE fptr->stdio_file
+#else
+# define FPTR_FILE fptr->f
+#endif
+
#include <termios.h>
#include <unistd.h>
#include <string.h>
@@ -201,7 +209,7 @@

Check_Type(io, T_FILE);
GetOpenFile(io, fptr);
- if (tcgetattr(fileno(fptr->f), &t) < 0) {
+ if (tcgetattr(fileno(FPTR_FILE), &t) < 0) {
rb_raise(rb_eRuntimeError,
"can't get terminal parameters (%s)", strerror(errno));
}
@@ -243,7 +251,7 @@
old = termios_tcgetattr(io);
GetOpenFile(io, fptr);
Termios_to_termios(param, &t);
- if (tcsetattr(fileno(fptr->f), tcsetattr_option, &t) < 0) {
+ if (tcsetattr(fileno(FPTR_FILE), tcsetattr_option, &t) < 0) {
rb_raise(rb_eRuntimeError,
"can't set terminal parameters (%s)", strerror(errno));
}
@@ -268,7 +276,7 @@
Check_Type(duration, T_FIXNUM);

GetOpenFile(io, fptr);
- if (tcsendbreak(fileno(fptr->f), FIX2INT(duration)) < 0) {
+ if (tcsendbreak(fileno(FPTR_FILE), FIX2INT(duration)) < 0) {
rb_raise(rb_eRuntimeError,
"can't transmits break (%s)", strerror(errno));
}
@@ -292,7 +300,7 @@
Check_Type(io, T_FILE);

GetOpenFile(io, fptr);
- if (tcdrain(fileno(fptr->f)) < 0) {
+ if (tcdrain(fileno(FPTR_FILE)) < 0) {
rb_raise(rb_eRuntimeError, "can't drain (%s)", strerror(errno));
}

@@ -322,7 +330,7 @@
}

GetOpenFile(io, fptr);
- if (tcflush(fileno(fptr->f), queue_selector) < 0) {
+ if (tcflush(fileno(FPTR_FILE), queue_selector) < 0) {
rb_raise(rb_eRuntimeError, "can't flush (%s)", strerror(errno));
}

@@ -352,7 +360,7 @@
}

GetOpenFile(io, fptr);
- if (tcflow(fileno(fptr->f), action) < 0) {
+ if (tcflow(fileno(FPTR_FILE), action) < 0) {
rb_raise(rb_eRuntimeError,
"can't control transmitting data flow (%s)", strerror(errno));
}
@@ -376,7 +384,7 @@

Check_Type(io, T_FILE);
GetOpenFile(io, fptr);
- if ((pid = tcgetpgrp(fileno(fptr->f))) < 0) {
+ if ((pid = tcgetpgrp(fileno(FPTR_FILE))) < 0) {
rb_raise(rb_eRuntimeError,
"can't get process group id (%s)", strerror(errno));
}
@@ -401,7 +409,7 @@
Check_Type(pgrpid, T_FIXNUM);

GetOpenFile(io, fptr);
- if (tcsetpgrp(fileno(fptr->f), FIX2INT(pgrpid)) < 0) {
+ if (tcsetpgrp(fileno(FPTR_FILE), FIX2INT(pgrpid)) < 0) {
rb_raise(rb_eRuntimeError,
"can't set process group id (%s)", strerror(errno));
}

--=-=-=



--
Lloyd Zusman
http://www.velocityreviews.com/forums/(E-Mail Removed)
God bless you.

--=-=-=--


 
Reply With Quote
 
 
 
 
nobuyoshi nakada
Guest
Posts: n/a
 
      05-27-2005
Hi,

At Fri, 27 May 2005 15:56:27 +0900,
Lloyd Zusman wrote in [ruby-talk:143778]:
> I recently had problems getting ruby-termios to compile properly under
> ruby 1.9. It turns out that "rubyio.h" has changed between these two
> ruby versions, and therefore, I offer the following patch, which should
> enable ruby-termios to compile and run under all 1.8 and 1.9 ruby
> versions.


> +#include "version.h"
> +
> +#if RUBY_VERSION_CODE >= 190
> +# define FPTR_FILE fptr->stdio_file
> +#else
> +# define FPTR_FILE fptr->f
> +#endif


stdio_file isn't non-NULL always. Use rb_io_stdio_file() instead.

#ifdef GetReadFile
#define FPTR_FILE GetReadFile(fptr)
#else
#define FPTR_FILE rb_io_stdio_file(fptr)
#endif

--
Nobu Nakada


 
Reply With Quote
 
 
 
 
Tanaka Akira
Guest
Posts: n/a
 
      05-27-2005
In article <(E-Mail Removed)2k.ad.ge. com>,
nobuyoshi nakada <(E-Mail Removed)> writes:

> stdio_file isn't non-NULL always. Use rb_io_stdio_file() instead.


Don't use rb_io_stdio_file if possible,

rb_io_stdio_file doesn't work when fd > 255 on Solaris.
(Its FILE struct's fd member is unsigned char.)

rb_io_stdio_file is not required in this case since termios needs only
fd.

--- ruby-termios-0.9.4-/termios.c 2002-10-13 00:15:03.000000000 +0900
+++ ruby-termios-0.9.4/termios.c 2005-05-27 16:53:32.000000000 +0900
@@ -12,6 +12,12 @@
#include <unistd.h>
#include <string.h>

+#ifdef GetReadFile
+#define GetFD(fptr) fileno(GetReadFile(fptr))
+#else
+#define GetFD(fptr) (fptr->fd)
+#endif
+
static VALUE mTermios;
static VALUE cTermios;
static VALUE tcsetattr_opt, tcflush_qs, tcflow_act;
@@ -201,7 +207,7 @@

Check_Type(io, T_FILE);
GetOpenFile(io, fptr);
- if (tcgetattr(fileno(fptr->f), &t) < 0) {
+ if (tcgetattr(GetFD(fptr), &t) < 0) {
rb_raise(rb_eRuntimeError,
"can't get terminal parameters (%s)", strerror(errno));
}
@@ -243,7 +249,7 @@
old = termios_tcgetattr(io);
GetOpenFile(io, fptr);
Termios_to_termios(param, &t);
- if (tcsetattr(fileno(fptr->f), tcsetattr_option, &t) < 0) {
+ if (tcsetattr(GetFD(fptr), tcsetattr_option, &t) < 0) {
rb_raise(rb_eRuntimeError,
"can't set terminal parameters (%s)", strerror(errno));
}
@@ -268,7 +274,7 @@
Check_Type(duration, T_FIXNUM);

GetOpenFile(io, fptr);
- if (tcsendbreak(fileno(fptr->f), FIX2INT(duration)) < 0) {
+ if (tcsendbreak(GetFD(fptr), FIX2INT(duration)) < 0) {
rb_raise(rb_eRuntimeError,
"can't transmits break (%s)", strerror(errno));
}
@@ -292,7 +298,7 @@
Check_Type(io, T_FILE);

GetOpenFile(io, fptr);
- if (tcdrain(fileno(fptr->f)) < 0) {
+ if (tcdrain(GetFD(fptr)) < 0) {
rb_raise(rb_eRuntimeError, "can't drain (%s)", strerror(errno));
}

@@ -322,7 +328,7 @@
}

GetOpenFile(io, fptr);
- if (tcflush(fileno(fptr->f), queue_selector) < 0) {
+ if (tcflush(GetFD(fptr), queue_selector) < 0) {
rb_raise(rb_eRuntimeError, "can't flush (%s)", strerror(errno));
}

@@ -352,7 +358,7 @@
}

GetOpenFile(io, fptr);
- if (tcflow(fileno(fptr->f), action) < 0) {
+ if (tcflow(GetFD(fptr), action) < 0) {
rb_raise(rb_eRuntimeError,
"can't control transmitting data flow (%s)", strerror(errno));
}
@@ -376,7 +382,7 @@

Check_Type(io, T_FILE);
GetOpenFile(io, fptr);
- if ((pid = tcgetpgrp(fileno(fptr->f))) < 0) {
+ if ((pid = tcgetpgrp(GetFD(fptr))) < 0) {
rb_raise(rb_eRuntimeError,
"can't get process group id (%s)", strerror(errno));
}
@@ -401,7 +407,7 @@
Check_Type(pgrpid, T_FIXNUM);

GetOpenFile(io, fptr);
- if (tcsetpgrp(fileno(fptr->f), FIX2INT(pgrpid)) < 0) {
+ if (tcsetpgrp(GetFD(fptr), FIX2INT(pgrpid)) < 0) {
rb_raise(rb_eRuntimeError,
"can't set process group id (%s)", strerror(errno));
}
--
Tanaka Akira


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
had installed Ilfak Guilfanov's patch v. MS patch none Computer Security 5 01-09-2006 08:53 AM
In addition to MS Blaster Worm patch, 3 week old patch reissued. why? Computer Support 6 08-14-2003 07:42 PM



Advertisments