Hi all,

Ruby 1.8.2
Solaris 9
gcc 3.4.2

I'm having a T_DATA conflict with a Solaris extension that I'm trying to
write.  The problem stems from the nfs/nfs.h, which is in turn doing an
include on tiuser.h which in turn does an include on sys/tiuser.h.  It's
this last file, sys/tiuser.h, that does a "#define T_DATA 0x004" and is
causing the problem.

I have no choice but to include nfs/nfs.h, otherwise I can't see struct
mntinfo, which I need for this particular extension that I'm writing.
Moving the '#include "ruby.h"' to the bottom of the #include's is not an
ideal solution either, since that means I'm redefining a value that
nfs.h may be using.

Below are the rkstat.c, extconf.rb and test.rb files that demonstrate
the problem.  Below I have included two sample outputs, one from test.rb
and one from the 'make' command results.

/* rkstat.c */
#include "ruby.h" /* Try putting this later, too */
#include <kstat.h>
#include <nfs/nfs.h>
#include <nfs/nfs_clnt.h>

struct kstruct{
   kstat_ctl_t* kc;
   kstat_t* ksp;
};

typedef struct kstruct KS;

static void ks_free(KS* kptr){
   if(kptr->kc != NULL){
      kstat_close(kptr->kc);
   }
   free(kptr);
}

/* Class Methods */
static VALUE ks_allocate(VALUE klass){
   KS* kptr;
   return Data_Make_Struct(klass,KS,0,ks_free,kptr);
}

/* Instance Methods */
static VALUE ks_init(int argc, VALUE* argv, VALUE self){
   KS* kptr;
   VALUE rbModule,rbInstance,rbName;

   Data_Get_Struct(self,KS,kptr);

   rb_scan_args(argc,argv,"03",&rbModule,&rbInstance,&rbName);

   return self;
}

void Init_kstat(){
   VALUE mSolaris, cKstat;

   /* Modules and Classes */
   mSolaris = rb_define_module("Solaris");
   cKstat   = rb_define_class_under(mSolaris,"Kstat",rb_cObject);

   /* Class Methods */
   rb_define_alloc_func(cKstat,ks_allocate);

   /* Instance Methods */
   rb_define_method(cKstat,"initialize",ks_init,-1);
}

# extconf.rb
require "mkmf"
have_library("kstat")
create_makefile("solaris/kstat")

# test.rb
require "solaris/kstat"
include Solaris

k = Kstat.new
p k


# Output from test.rb with ruby.h as first include
# Note that there were no warnings during 'make', even with -Wall:

'initialize': wrong argument type Solaris::Kstat (expected iClass)
(TypeError)


# Output during make phase with ruby.h as last include
# Note that test.rb will run as expected, but this warning makes me very
nervous:
djberge@sp5wd-b1-/home/djberge/local/modules/ruby/solaris-kstat-0.2.0-61
0>make
gcc -Wall -mcpu=ultrasparc -fno-strict-aliasing -fPIC -g -O2 -I.
-I/opt/lib/ruby/1.8/sparc-solaris2.9
-I/opt/lib/ruby/1.8/sparc-solaris2.9 -I. -c rkstat.c
In file included from rkstat.c:4:
/opt/lib/ruby/1.8/sparc-solaris2.9/ruby.h:198:1: warning: "T_DATA"
redefined
In file included from /usr/include/tiuser.h:17,
                 from /usr/include/rpc/rpc.h:22,
                 from /usr/include/rpc/rpc_sztypes.h:9,
                 from /usr/include/nfs/nfs.h:49,
                 from rkstat.c:2:
/usr/include/sys/tiuser.h:30:1: warning: this is the location of the
previous definition
gcc -Wall -mcpu=ultrasparc -fno-strict-aliasing -Wl,-G  -L"/opt/lib" -o
kstat.so rkstat.o  -lkstat  -ldl -lm   -lc


What is the ideal solution here?

Regards,

Dan