/*
 * Returns a struct of type UnameStruct that contains sysname, nodename,
 * machine, version, and release.  On Solaris, it will also include 
 * architecture and platform.  On HP-UX, it will also include id_number.
 */
static VALUE uname_uname_all()
{
   struct utsname u;
   uname(&u);

/* Extra brackets are for C89 compliance */
{
#ifdef HAVE_SYS_SYSTEMINFO_H
   char platform[BUFSIZE];
   char arch[BUFSIZE];
   sysinfo(SI_ARCHITECTURE, arch, BUFSIZE);
   sysinfo(SI_PLATFORM, platform, BUFSIZE);
#endif

#ifdef HAVE_SYSCTL
   char model[BUFSIZ];
   get_model(model, sizeof(model));
#endif

   return rb_struct_new(sUname,
      rb_str_new2(u.sysname),
      rb_str_new2(u.nodename),
      rb_str_new2(u.machine),
      rb_str_new2(u.version),
      rb_str_new2(u.release)
#ifdef HAVE_SYS_SYSTEMINFO_H
      ,rb_str_new2(arch),
      rb_str_new2(platform)
#endif

#ifdef HAVE_SYSCTL
      ,rb_str_new2(model)
#endif

#if defined(__hpux)
      ,rb_str_new2(u.__idnumber)
#endif
   );
}