[6960] in Athena Bugs
machtype changes
daemon@ATHENA.MIT.EDU (daemon@ATHENA.MIT.EDU)
Fri Jan 25 23:30:24 1991
To: bugs@ATHENA.MIT.EDU
Date: Fri, 25 Jan 91 23:29:42 EST
From: John Carr <jfc@ATHENA.MIT.EDU>
Changes:
AIX 1.2 support
only open memory once if several routines need it
printf with no formatting changes to puts
more descriptive names when verbose is on
if the program can read /dev/kUmem, print VAX 3100 model
don't exit if one check fails, since others may not
*** /source/athena/bin.athena/machtype.c Wed Oct 31 09:52:32 1990
--- machtype.c Fri Jan 25 23:24:35 1991
***************
*** 9,12 ****
--- 9,13 ----
#include <stdio.h>
+ #include <string.h>
#include <nlist.h>
#include <sys/param.h>
***************
*** 13,17 ****
--- 14,25 ----
#include <sys/types.h>
#include <sys/file.h>
+ #ifndef _AIX
#include <machine/cpu.h>
+ #endif
+ #ifdef vax
+ #define VAXSTAR
+ #include <machine/pte.h>
+ #include <machineio/ubareg.h> /* For VAX 3100 model */
+ #endif
#if defined(mips) && defined(ultrix)
#include <machine/hwconf.h>
***************
*** 39,43 ****
--- 47,63 ----
#endif
+
+ #if defined(i386) && defined(_AIX)
+ #include <sys/machinfo.h>
+ #define NL_NF(nl) ((nl).n_value == 0)
+ #else
+ #define NL_NF(nl) ((nl).n_type == 0)
+ #endif
+
+ #if !defined(_AIX)
#define KERNEL "/vmunix"
+ #else
+ #define KERNEL "/unix"
+ #endif
#define MEMORY "/dev/kmem"
***************
*** 76,79 ****
--- 96,101 ----
#define X_sgdinfo 14
{ "_sgdinfo" },
+ #define X_nexus 15
+ { "_nexus" },
#else
#if defined(ibm032)
***************
*** 130,133 ****
--- 152,163 ----
#endif
#endif
+ #if defined(_AIX) && defined(i386)
+ #define X_physmem 0
+ { "physmem" },
+ #define X_maxmem 1
+ { "maxmem" },
+ #define X_cpu 2
+ { "mach_info" },
+ #endif
{ "" },
};
***************
*** 176,205 ****
if (cpuflg || dpyflg || raflg || memflg)
{
if (nlist(kernel, nl) < 0) {
fprintf(stderr, "can't get namelist\n");
! exit(1);
}
if (cpuflg)
! do_cpu(kernel, memory);
if (dpyflg)
! do_dpy(kernel, memory);
if (raflg)
! do_disk(kernel, memory);
if (memflg)
! do_memory(kernel, memory);
} else {
#if defined(vax)
! printf("vax\n");
#else
#if defined(ibm032)
! printf("rt\n");
#else
#if defined(ultrix) && defined(mips)
! printf("decmips\n");
#else
! printf("???\n");
#endif
#endif
#endif
}
exit(0);
--- 206,244 ----
if (cpuflg || dpyflg || raflg || memflg)
{
+ int memfd;
if (nlist(kernel, nl) < 0) {
fprintf(stderr, "can't get namelist\n");
! exit(2);
}
+ if ((memfd = open (memory, O_RDONLY)) == -1) {
+ perror ("machtype: can't open memory");
+ exit(2);
+ }
if (cpuflg)
! do_cpu(kernel, memfd);
if (dpyflg)
! do_dpy(kernel, memfd);
if (raflg)
! do_disk(kernel, memfd);
if (memflg)
! do_memory(kernel, memfd);
} else {
#if defined(vax)
! puts("vax");
#else
#if defined(ibm032)
! puts("rt");
#else
#if defined(ultrix) && defined(mips)
! puts("decmips");
#else
! #if defined(i386) && defined(_AIX)
! puts("ps2\n");
! #else
! puts("???\n");
#endif
#endif
#endif
+ #endif
}
exit(0);
***************
*** 216,236 ****
! do_cpu(kernel, memory)
! char *kernel, *memory;
! {
int mf;
#if defined(mips) && defined(ultrix)
unsigned cpu;
#else
! int cpu, cpu_subtype;
#endif
! if (nl[X_cpu].n_type == 0) {
fprintf(stderr, "cpu not found\n");
! exit(1);
}
- if ((mf = open(memory, 0)) < 0) {
- fprintf(stderr, "can't open memory\n");
- exit(1);
- }
lseek(mf, nl[X_cpu].n_value, L_SET);
read(mf, &cpu, sizeof(cpu));
--- 255,276 ----
! do_cpu(kernel, mf)
! char *kernel;
int mf;
+ {
+ #ifdef X_cpu
#if defined(mips) && defined(ultrix)
unsigned cpu;
#else
! #if defined(i386) && defined(_AIX)
! struct mach_info cpu;
! #else
! int cpu;
#endif
! #endif
! if (NL_NF(nl[X_cpu])) {
fprintf(stderr, "cpu not found\n");
! exit(3);
}
lseek(mf, nl[X_cpu].n_value, L_SET);
read(mf, &cpu, sizeof(cpu));
***************
*** 239,273 ****
switch (cpu) {
case VAX_780:
! printf("VAX780\n");
break;
case VAX_750:
! printf("VAX750\n");
break;
case VAX_730:
! printf("VAX730\n");
break;
case VAX_8600:
! printf("VAX8600\n");
break;
case VAX_8200:
! printf("VAX8200\n");
break;
case VAX_630:
if (nl[X_cpu_subtype].n_type) {
lseek(mf, nl[X_cpu_subtype].n_value, L_SET);
read(mf, &cpu_subtype, sizeof(cpu_subtype));
if(cpu_subtype == 4) {
! printf("VAXSTAR\n");
break;
! } if(cpu_subtype != 1) {
! printf("???\n");
break;
}
}
! printf("MVAX-II\n");
break;
#ifdef VAX_650
case VAX_650:
! printf("VAX650\n");
break;
#endif
--- 279,316 ----
switch (cpu) {
case VAX_780:
! puts("VAX780");
break;
case VAX_750:
! puts("VAX750");
break;
case VAX_730:
! puts("VAX730");
break;
case VAX_8600:
! puts("VAX8600");
break;
case VAX_8200:
! puts("VAX8200");
break;
case VAX_630:
if (nl[X_cpu_subtype].n_type) {
+ int cpu_subtype;
lseek(mf, nl[X_cpu_subtype].n_value, L_SET);
read(mf, &cpu_subtype, sizeof(cpu_subtype));
if(cpu_subtype == 4) {
! puts(verbose ? "Microvax 2000" : "VAXSTAR");
break;
! } else if(cpu_subtype != 1) {
! puts(verbose ? "Unknown VAX 630" : "VAX???");
break;
}
}
! puts(verbose ? "Microvax II" : "MVAX-II");
break;
#ifdef VAX_650
case VAX_650:
! /* There are 3 subtypes of VAX 650, which this program
! does not distinguish. */
! puts(verbose ? "Microvax III" : "VAX650");
break;
#endif
***************
*** 274,282 ****
#ifdef VAX_420
case VAX_420:
! printf("CVAXSTAR\n");
break;
#endif
default:
! printf("VAX???\n");
}
#else
--- 317,346 ----
#ifdef VAX_420
case VAX_420:
! if (verbose) {
! switch (ka420model()) {
! case -1:
! puts("VAX 3100");
break;
+ case 0:
+ case 1:
+ puts("VAX 3100 model 38/48");
+ break;
+ case 2:
+ puts("VAX 3100 model 30/40");
+ break;
+ case 3:
+ puts("VAX 3100 (100 ns CPU)");
+ break;
+ }
+ } else {
+ puts("CVAXSTAR");
+ }
+ break;
#endif
default:
! if(verbose)
! printf("Unknown VAX type %d\n", cpu);
! else
! puts("VAX???");
}
#else
***************
*** 288,308 ****
switch(cpu_model) {
case CPU_SGP:
! printf("RTPC-SGP\n");
break;
case CPU_ROMPC:
! printf("RTPC-ROMPC\n");
break;
case CPU_MOD135:
! printf("RTPC-MOD135\n");
break;
default:
! printf("RTPC???\n");
}
break;
case CPU_ATR:
! printf("IBM-ATR\n");
break;
default:
! printf("IBM???\n");
}
#else
--- 352,372 ----
switch(cpu_model) {
case CPU_SGP:
! puts("RTPC-SGP");
break;
case CPU_ROMPC:
! puts("RTPC-ROMPC");
break;
case CPU_MOD135:
! puts("RTPC-MOD135");
break;
default:
! puts("RTPC???");
}
break;
case CPU_ATR:
! puts("IBM-ATR");
break;
default:
! puts("IBM???");
}
#else
***************
*** 318,322 ****
printf("KN01 rev %d\n", GETHRDREV(cpu));
else
! printf("KN01\n");
#ifdef ULTRIX_40
else if(GETSYSTYPE(cpu) == ST_DS5400)
--- 382,386 ----
printf("KN01 rev %d\n", GETHRDREV(cpu));
else
! puts("KN01");
#ifdef ULTRIX_40
else if(GETSYSTYPE(cpu) == ST_DS5400)
***************
*** 324,328 ****
printf("KN210 rev %d\n", GETHRDREV(cpu));
else
! printf("KN210\n");
else if(GETSYSTYPE(cpu) == ST_DS5000)
if(verbose)
--- 388,392 ----
printf("KN210 rev %d\n", GETHRDREV(cpu));
else
! puts("KN210");
else if(GETSYSTYPE(cpu) == ST_DS5000)
if(verbose)
***************
*** 329,333 ****
printf("KN02 rev %d\n", GETHRDREV(cpu));
else
! printf("KN02\n");
else if(GETSYSTYPE(cpu) == ST_DS5500)
if(verbose)
--- 393,397 ----
printf("KN02 rev %d\n", GETHRDREV(cpu));
else
! puts("KN02");
else if(GETSYSTYPE(cpu) == ST_DS5500)
if(verbose)
***************
*** 334,338 ****
printf("KN220 rev %d\n", GETHRDREV(cpu));
else
! printf("KN220\n");
#endif /* ULTRIX_40 */
else
--- 398,402 ----
printf("KN220 rev %d\n", GETHRDREV(cpu));
else
! puts("KN220");
#endif /* ULTRIX_40 */
else
***************
*** 340,344 ****
printf("R2000a??? type %02x.%02x\n",GETSYSTYPE(cpu),GETHRDREV(cpu));
else
! printf("R2000a???\n");
} else {
#if defined(MIPSEL)
--- 404,408 ----
printf("R2000a??? type %02x.%02x\n",GETSYSTYPE(cpu),GETHRDREV(cpu));
else
! puts("R2000a???");
} else {
#if defined(MIPSEL)
***************
*** 346,369 ****
printf("MIPSEL??? type %d\n", GETCPUTYPE(cpu));
else
! printf("MIPSEL???\n");
#else
! printf("mips???\n");
#endif
}
#else
! fprintf (stderr,
! "Don't know how to determine CPU type for this machine.\n");
! exit (1);
#endif
#endif
#endif
return;
}
!
! do_dpy(kernel, memory)
! char *kernel, *memory;
{
int mf;
#ifdef vax
caddr_t value;
--- 410,489 ----
printf("MIPSEL??? type %d\n", GETCPUTYPE(cpu));
else
! puts("MIPSEL???");
#else
! puts("mips???");
#endif
}
#else
! #if defined(i386) && defined(_AIX)
! switch(cpu.mach_type) {
! case PS2_50:
! if(verbose)
! puts("PS/2 model 50");
! else
! puts("PS2-50");
! break;
! case PS2_55:
! if(verbose)
! puts("PS/2 model 55");
! else
! puts("PS2-55");
! case PS2_60:
! if(verbose)
! puts("PS/2 model 60");
! else
! puts("PS2-60");
! break;
! case PS2_70:
! if(verbose)
! puts("PS/2 model 70");
! else
! puts("PS2-70");
! break;
! case PS2_80:
! if(verbose)
! puts("PS/2 model 80");
! else
! puts("PS2-80");
! break;
! default:
! if(verbose)
! printf("PS/2 unknown type %d\n", cpu.mach_type);
! else
! puts("PS2-???\n");
! }
#endif
#endif
#endif
+ #endif
+ #else
+ fprintf (stderr,
+ "Don't know how to determine CPU type for this machine.\n");
+ #endif
return;
}
! #ifdef vax
! int ka420model()
{
+ unsigned long cacr;
+ int kUmf;
+ if (nl[X_nexus].n_type == 0)
+ return -1;
+ kUmf = open("/dev/kUmem", O_RDONLY);
+ if (kUmf == -1)
+ return -1;
+ lseek(kUmf, nl[X_nexus].n_value + (int)&((struct nb_regs *)0)->nb_cacr, L_SET);
+ if(read(kUmf, &cacr, sizeof(cacr)) != sizeof(cacr))
+ return -1;
+ close (kUmf);
+ return (cacr >> 6) & 3;
+ }
+ #endif
+
+ do_dpy(kernel, mf)
+ char *kernel;
int mf;
+ {
#ifdef vax
caddr_t value;
***************
*** 374,378 ****
char buf[32];
struct screen_sw sw;
- char *index();
#else
#if defined(ultrix) && defined(mips)
--- 494,497 ----
***************
*** 379,394 ****
int value;
#else
fprintf (stderr,
"Don't know how to determine display type for this machine.\n");
! exit (1);
#endif
#endif
#endif
- if ((mf = open(memory, 0)) < 0) {
- fprintf(stderr, "can't open memory\n");
- exit(1);
- }
-
#if defined(vax)
if (nl[X_qvinfo].n_type != 0) {
--- 498,513 ----
int value;
#else
+ #if defined(_AIX) && defined(i386)
+ hft_dpy();
+ return;
+ #else
fprintf (stderr,
"Don't know how to determine display type for this machine.\n");
! return;
#endif
#endif
#endif
+ #endif
#if defined(vax)
if (nl[X_qvinfo].n_type != 0) {
***************
*** 396,400 ****
read(mf, &value, sizeof(value));
if (value)
! printf("QVSS\n");
}
if (nl[X_qdinfo].n_type != 0) {
--- 515,519 ----
read(mf, &value, sizeof(value));
if (value)
! puts("QVSS\n");
}
if (nl[X_qdinfo].n_type != 0) {
***************
*** 402,406 ****
read(mf, &value, sizeof(value));
if (value)
! printf("QDSS\n");
}
if (nl[X_smdinfo].n_type != 0) {
--- 521,525 ----
read(mf, &value, sizeof(value));
if (value)
! puts("QDSS\n");
}
if (nl[X_smdinfo].n_type != 0) {
***************
*** 408,412 ****
read(mf, &value, sizeof(value));
if (value)
! printf("SM\n");
}
if (nl[X_sgdinfo].n_type != 0) {
--- 527,531 ----
read(mf, &value, sizeof(value));
if (value)
! puts("SM\n");
}
if (nl[X_sgdinfo].n_type != 0) {
***************
*** 414,418 ****
read(mf, &value, sizeof(value));
if (value)
! printf("SG\n");
}
if (nl[X_vsdinfo].n_type != 0) {
--- 533,537 ----
read(mf, &value, sizeof(value));
if (value)
! puts("SG\n");
}
if (nl[X_vsdinfo].n_type != 0) {
***************
*** 420,424 ****
read(mf, &value, sizeof(value));
if (value)
! printf("VS100\n");
}
if (nl[X_plxinfo].n_type != 0) {
--- 539,543 ----
read(mf, &value, sizeof(value));
if (value)
! puts("VS100\n");
}
if (nl[X_plxinfo].n_type != 0) {
***************
*** 426,430 ****
read(mf, &value, sizeof(value));
if (value)
! printf("PLX\n");
}
#else
--- 545,552 ----
read(mf, &value, sizeof(value));
if (value)
! if (verbose)
! puts("parallax");
! else
! puts("PLX\n");
}
#else
***************
*** 432,436 ****
if (nl[X_screen_sw].n_type == 0) {
fprintf(stderr, "can't find screen info\n");
! exit(1);
}
lseek(mf, nl[X_NSCREEN].n_value, L_SET);
--- 554,558 ----
if (nl[X_screen_sw].n_type == 0) {
fprintf(stderr, "can't find screen info\n");
! return;
}
lseek(mf, nl[X_NSCREEN].n_value, L_SET);
***************
*** 448,452 ****
if (!strcmp(buf, "monochrome"))
continue;
! printf("%s\n", buf);
}
}
--- 570,574 ----
if (!strcmp(buf, "monochrome"))
continue;
! puts(buf);
}
}
***************
*** 455,459 ****
if (nl[X_pmDev].n_type == 0) {
fprintf(stderr, "can't find console device id in kernel\n");
! exit(1);
}
lseek(mf, nl[X_pmDev].n_value, L_SET);
--- 577,581 ----
if (nl[X_pmDev].n_type == 0) {
fprintf(stderr, "can't find console device id in kernel\n");
! return;
}
lseek(mf, nl[X_pmDev].n_value, L_SET);
***************
*** 463,467 ****
struct devget dev;
! printf("PM-");
/* XXX KLUDGE ALERT XXX */
/* opening /dev/xcons will get the right device on a DEVIOCGET */
--- 585,589 ----
struct devget dev;
! fputs("PM-", stdout);
/* XXX KLUDGE ALERT XXX */
/* opening /dev/xcons will get the right device on a DEVIOCGET */
***************
*** 474,480 ****
#ifdef ULTRIX_40
/* The dev.device info is only valid on units 0,1 */
! printf("%s\n",dev.dev_name);
#else
! printf("%s\n",dev.device);
#endif
} else {
--- 596,602 ----
#ifdef ULTRIX_40
/* The dev.device info is only valid on units 0,1 */
! puts(dev.dev_name);
#else
! puts(dev.device);
#endif
} else {
***************
*** 481,485 ****
if (fd != -1)
(void) close(fd);
! printf("???\n");
}
}
--- 603,607 ----
if (fd != -1)
(void) close(fd);
! puts("???");
}
}
***************
*** 487,491 ****
fprintf (stderr,
"Don't know how to determine display type for this machine.\n");
! exit (1);
#endif
#endif
--- 609,613 ----
fprintf (stderr,
"Don't know how to determine display type for this machine.\n");
! return;
#endif
#endif
***************
*** 504,519 ****
} ra_info[4];
! do_disk(kernel, memory)
char *kernel;
! char *memory;
{
! int mf, i, c;
- if ((mf = open(memory, 0)) < 0) {
- fprintf(stderr, "can't open memory\n");
- exit(1);
- }
if (nl[X_ra_info].n_type == 0)
! return(do_torek(kernel,memory,mf));
lseek(mf, (long) nl[X_ra_info].n_value, L_SET);
read(mf, ra_info, sizeof(ra_info));
--- 626,637 ----
} ra_info[4];
! do_disk(kernel, mf)
char *kernel;
! int mf;
{
! int i, c;
if (nl[X_ra_info].n_type == 0)
! return(do_torek(kernel,mf));
lseek(mf, (long) nl[X_ra_info].n_value, L_SET);
read(mf, ra_info, sizeof(ra_info));
***************
*** 600,608 ****
#include <machineio/scsireg.h>
! do_disk(kernel, memory)
! char *kernel, *memory;
{
! int mf, i, pos;
! char hdtypes[12][8]; /* 16 is arbitrary, just bigger than
the size in machineio/hd.c */
struct hdst { long _0;
--- 718,727 ----
#include <machineio/scsireg.h>
! do_disk(kernel, mf)
! char *kernel;
! int mf;
{
! int i, pos;
! char hdtypes[12][8]; /* size is arbitrary, just bigger than
the size in machineio/hd.c */
struct hdst { long _0;
***************
*** 631,638 ****
struct iocc_device scsidinfo;
#endif
- if ((mf = open(memory, 0)) < 0) {
- fprintf(stderr, "can't open memory\n");
- exit(2);
- }
if(verbose) {
if((pos = nl[X_hdst].n_value) == 0) {
--- 750,753 ----
***************
*** 731,735 ****
} else {
printf("sc%d: invalid (null) partition table. %s\n",i,
! msg == 0 ? "There might be a drive here,\nand there might not be. Check on the floor under the machine." : "");
msg = 1;
}
--- 846,850 ----
} else {
printf("sc%d: invalid (null) partition table. %s\n",i,
! msg == 0 ? "There might be a drive here,\n\tand there might not be. Check on the floor under the machine." : "");
msg = 1;
}
***************
*** 741,752 ****
#else /* not rt */
#if defined(DEC_SCSI)
! do_disk(kernel, memory)
! char *kernel, *memory;
! {
int mf;
! if ((mf = open(memory, 0)) < 0) {
! fprintf(stderr, "can't open memory\n");
! exit(2);
! }
do_scsi_disk(kernel,memory, mf);
}
--- 856,863 ----
#else /* not rt */
#if defined(DEC_SCSI)
! do_disk(kernel, mf)
! char *kernel;
int mf;
! {
do_scsi_disk(kernel,memory, mf);
}
***************
*** 753,759 ****
#else
! do_disk (kernel, memory) char *kernel, *memory; {
fprintf (stderr, "Don't know how to read disk types for this machine.\n");
! exit (1);
}
--- 864,870 ----
#else
! do_disk (kernel, mf) char *kernel; int mf; {
fprintf (stderr, "Don't know how to read disk types for this machine.\n");
! return;
}
***************
*** 763,770 ****
#ifdef DEC_SCSI
- /* This function assumes there is only 1 scsi controller. If there
- are more, then repeat. For pmax, increment the first read address
- by 4 bytes. For vax, increment the (only) read address by
- sizeof (struct sz_softc). */
#include <sys/time.h>
#ifndef ULTRIX_40
--- 874,877 ----
***************
*** 776,781 ****
#endif
! do_scsi_disk(kernel, memory, mf)
! char *kernel, *memory;
int mf;
{
--- 883,888 ----
#endif
! do_scsi_disk(kernel, mf)
! char *kernel;
int mf;
{
***************
*** 797,801 ****
for(ctl=0;ctl<=nscsi;ctl++)
{
! #if !defined(vax) && !defined(ULTRIX_40) /* mips indirects through a pointer */
pos = base + 4 * ctl;
lseek(mf, pos, L_SET);
--- 904,908 ----
for(ctl=0;ctl<=nscsi;ctl++)
{
! #if !defined(vax) && !defined(ULTRIX_40) /* mips 3.1 indirects through a pointer */
pos = base + 4 * ctl;
lseek(mf, pos, L_SET);
***************
*** 833,845 ****
#define MEG (1024*1024)
! do_memory (kernel, memory)
! char *kernel, *memory;
!
{
! int mf, pos, mem;
! if ((mf = open(memory, 0)) < 0) {
! fprintf(stderr, "can't open memory\n");
! exit(2);
! }
pos = nl[X_maxmem].n_value;
if(pos == 0) {
--- 940,948 ----
#define MEG (1024*1024)
! do_memory (kernel, mf)
! char *kernel;
! int mf;
{
! int pos, mem;
pos = nl[X_maxmem].n_value;
if(pos == 0) {
***************
*** 872,873 ****
--- 975,1046 ----
return;
}
+
+ #if defined(i386) && defined(_AIX)
+ #include <sys/hft.h>
+
+ struct _hft_map { int id; char gen[8],dpy[8]; } hft_map[] = {
+ {0x11, "VGA","8503",},
+ {0x12, "VGA","8512",},
+ {0x13, "VGA","8513",},
+ {0x14, "VGA","8514",},
+ {0x15, "VGA","8507",},
+ {0x16, "VGA","8604",},
+ {0x18, "8514a","8503"},
+ {0x19, "8514a","8512"},
+ {0x1A, "8514a","8513"},
+ {0x1B, "8514a","8514"},
+ {0x1C, "8514a","8507"},
+ {0x1D, "8514a","8604"},
+ {0,0,0}};
+
+ typedef struct hftdid {
+ char hftDevID[4];
+ char hftDevClass[4];
+ } hftDeviceID;
+
+ int hft_dpy()
+ {
+ int fd;
+ struct _hft_map *h;
+ hftDeviceID dev;
+ struct {
+ char pad;
+ char hf_esc;
+ char hf_lbr;
+ char hf_ex;
+ int hf_len;
+ char hf_typehi;
+ char hf_typelo;
+ char hf_sublen;
+ char hf_subtype;
+ short hf_numdev;
+ struct {
+ short hf_idhi,hf_idlo;
+ short hf_classhi,hf_classlo;
+ } hf_devices[4];
+ } qDevIDResponse;
+ #define HFWDCHARS(n) (n)>>8&0xff, (n)&0xff
+ #define FLWDCHARS(n) (n)>>24&0xff,(n)>>16&0xff,(n)>>8&0xff,(n)&0xff
+ #define VTD(n) HFINTROESC, HFINTROLBR, HFINTROEX, FLWDCHARS(n)
+ struct hfqdevidc qdevidcmd =
+ { VTD(sizeof(struct hfqdevidc)-3), HFQDEVIDCH, HFQDEVIDCL };
+ struct hfquery q = {qdevidcmd.hf_intro, sizeof(qdevidcmd),
+ &qDevIDResponse, sizeof(qDevIDResponse) - 1};
+ qDevIDResponse.hf_len= sizeof( qDevIDResponse ) - 4;
+ fd = open("/dev/console", O_WRONLY);
+ ioctl(fd, HFQUERY, &q);
+ for(h = hft_map;h->id;h++)
+ if(h->id == qDevIDResponse.hf_devices[0].hf_idhi && 0xff)
+ if(verbose)
+ printf("%s with %s adapter\n", h->dpy, h->gen);
+ else
+ puts(h->gen);
+ /*
+ printf("Reponse %04x.%04x, %04x.%04x\n", qDevIDResponse.hf_devices[0].hf_idhi,
+ qDevIDResponse.hf_devices[0].hf_idlo,
+ qDevIDResponse.hf_devices[0].hf_classhi,
+ qDevIDResponse.hf_devices[0].hf_classlo);
+ */
+ }
+ #endif
+