/* * info_netbsd.cpp is part of the KDE program kcminfo. This displays * various information about the OpenBSD system it's running on. * * Originally written by Jaromir Dolecek <dolecek@ics.muni.cz>. CPU info * code has been imported from implementation of processor.cpp for KDE 1.0 * by David Brownlee <abs@NetBSD.org> as found in NetBSD packages collection. * Hubert Feyer <hubertf@NetBSD.org> enhanced the sound information printing * quite a lot, too. * * The code is placed into public domain. Do whatever you want with it. */ #define INFO_CPU_AVAILABLE #define INFO_IRQ_AVAILABLE #define INFO_DMA_AVAILABLE #define INFO_PCI_AVAILABLE #define INFO_IOPORTS_AVAILABLE #define INFO_SOUND_AVAILABLE #define INFO_DEVICES_AVAILABLE #define INFO_SCSI_AVAILABLE #define INFO_PARTITIONS_AVAILABLE #define INFO_XSERVER_AVAILABLE /* * all following functions should return TRUE, when the Information * was filled into the lBox-Widget. Returning FALSE indicates that * information was not available. */ #include <sys/types.h> #include <sys/param.h> #include <sys/sysctl.h> #include <stdio.h> /* for NULL */ #include <stdlib.h> /* for malloc(3) */ #include <tqfile.h> #include <tqfontmetrics.h> #include <tqstrlist.h> #include <tqtextstream.h> #include <kdebug.h> typedef struct { int string; int name; const char *title; } hw_info_mib_list_t; bool GetInfo_CPU(TQListView *lBox) { static hw_info_mib_list_t hw_info_mib_list[]= { { 1, HW_MODEL, "Model" }, { 1, HW_MACHINE, "Machine" }, { 0, HW_NCPU, "Number of CPUs" }, { 0, HW_PAGESIZE, "Pagesize" }, { 0,0,0 } }; hw_info_mib_list_t *hw_info_mib; int mib[2], num; char *buf; size_t len; TQString value; lBox->addColumn(i18n("Information")); lBox->addColumn(i18n("Value")); for ( hw_info_mib = hw_info_mib_list ; hw_info_mib->title ; ++hw_info_mib ) { mib[0] = CTL_HW; mib[1] = hw_info_mib->name; if ( hw_info_mib->string ) { sysctl(mib,2,NULL,&len,NULL,0); if ( (buf = (char*)malloc(len)) ) { sysctl(mib,2,buf,&len,NULL,0); value = TQString::fromLocal8Bit(buf); free(buf); } else { value = TQString("Unknown"); } } else { len = sizeof(num); sysctl(mib,2,&num,&len,NULL,0); value.sprintf("%d", num); } new TQListViewItem(lBox, hw_info_mib->title, value); } return true; } // this is used to find out which devices are currently // on system static bool GetDmesgInfo(TQListView *lBox, const char *filter, void func(TQListView *, TQString s, void **, bool)) { TQFile *dmesg = new TQFile("/var/run/dmesg.boot"); bool usepipe=false; FILE *pipe=NULL; TQTextStream *t; bool seencpu=false; void *opaque=NULL; TQString s; bool found=false; if (dmesg->exists() && dmesg->open(IO_ReadOnly)) { t = new TQTextStream(dmesg); } else { delete dmesg; pipe = popen("/sbin/dmesg", "r"); if (!pipe) return false; usepipe = true; t = new TQTextStream(pipe, IO_ReadOnly); } TQListViewItem *olditem = NULL; while(!(s = t->readLine()).isNull()) { if (!seencpu) { if (s.contains("cpu")) seencpu = true; else continue; } if (s.contains("boot device") || s.contains("WARNING: old BSD partition ID!")) break; if (!filter || s.contains(filter)) { if (func) { func(lBox, s, &opaque, false); } else { olditem = new TQListViewItem(lBox, olditem, s); } found = true; } } if (func) { func(lBox, s, &opaque, true); } //lBox->triggerUpdate(); delete t; if (pipe) { pclose(pipe); } else { dmesg->close(); delete dmesg; } return found; } void AddIRQLine(TQListView *lBox, TQString s, void **opaque, bool ending) { TQStrList *strlist = (TQStrList *) *opaque; const char *str; int pos, irqnum=0; const char *p; p = s.latin1(); if (!strlist) { strlist = new TQStrList(); *opaque = (void *) strlist; } if (ending) { str = strlist->first(); for(;str; str = strlist->next()) { new TQListViewItem(lBox, str); } delete strlist; return; } pos = s.find(" irq "); irqnum = (pos < 0) ? 0 : atoi(&p[pos+5]); if (irqnum) { s.sprintf("%02d%s", irqnum, p); } else { s.sprintf("??%s", p); } strlist->inSort(s.latin1()); } bool GetInfo_IRQ (TQListView *lBox) { lBox->addColumn(i18n("IRQ")); lBox->addColumn(i18n("Device")); (void) GetDmesgInfo(lBox, " irq ", AddIRQLine); return true; } bool GetInfo_DMA (TQListView *) { return false; } bool GetInfo_PCI (TQListView *lbox) { if (!GetDmesgInfo(lbox, "at pci", NULL)) new TQListViewItem(lbox, i18n("No PCI devices found.")); return true; } bool GetInfo_IO_Ports (TQListView *lbox) { if (!GetDmesgInfo(lbox, "port 0x", NULL)) new TQListViewItem(lbox, i18n("No I/O port devices found.")); return true; } bool GetInfo_Sound (TQListView *lbox) { if (!GetDmesgInfo(lbox, "audio", NULL)) new TQListViewItem(lbox, i18n("No audio devices found.")); // append information on any audio devices found TQListViewItem *lvitem = lbox->firstChild(); for(; lvitem; lvitem = lvitem->nextSibling()) { TQString s; int pos, len; const char *start, *end; char *dev; s = lvitem->text(0); if ((pos = s.find("at ")) >= 0) { pos += 3; // skip "at " start = end = s.ascii(); for(; *end && (*end!=':') && (*end!='\n'); end++); len = end - start; dev = (char *) malloc(len + 1); strncpy(dev, start, len); dev[len] = '\0'; GetDmesgInfo(lbox, dev, NULL); free(dev); } } return true; } bool GetInfo_Devices (TQListView *lBox) { (void) GetDmesgInfo(lBox, NULL, NULL); return true; } bool GetInfo_SCSI (TQListView *lbox) { if (!GetDmesgInfo(lbox, "scsibus", NULL)) new TQListViewItem(lbox, i18n("No SCSI devices found.")); return true; } bool GetInfo_Partitions (TQListView *lbox) { TQString s; char *line, *orig_line; const char *device, *mountpoint, *type, *flags; FILE *pipe = popen("/sbin/mount", "r"); TQTextStream *t; if (!pipe) { kdError(0) << i18n("Unable to run /sbin/mount.") << endl; return false; } t = new TQTextStream(pipe, IO_ReadOnly); lbox->addColumn(i18n("Device")); lbox->addColumn(i18n("Mount Point")); lbox->addColumn(i18n("FS Type")); lbox->addColumn(i18n("Mount Options")); TQListViewItem *olditem = 0; while (!(s = t->readLine()).isNull()) { orig_line = line = strdup(s.latin1()); device = strsep(&line, " "); (void) strsep(&line, " "); // consume word "on" mountpoint = strsep(&line, " "); (void) strsep(&line, " "); // consume word "type" type = strsep(&line, " "); flags = line; olditem = new TQListViewItem(lbox, olditem, device, mountpoint, type, flags); free(orig_line); } delete t; pclose(pipe); return true; } bool GetInfo_XServer_and_Video (TQListView *lBox) { return GetInfo_XServer_Generic( lBox ); }