/* * 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 . CPU info * code has been imported from implementation of processor.cpp for KDE 1.0 * by David Brownlee as found in NetBSD packages collection. * Hubert Feyer enhanced the sound information printing * quite a lot, too. * * The code is placed into public domain. Do whatever you want with it. */ /* * all following functions should return true, when the Information * was filled into the QTreeWidget. Returning false indicates that * information was not available. */ #include #include #include #include /* for NULL */ #include /* for malloc(3) */ #include #include #include #include #include #include typedef struct { int string; int name; const char *title; } hw_info_mib_list_t; // this is used to find out which devices are currently // on system static bool GetDmesgInfo(QTreeWidget* tree, const char *filter, void func(QTreeWidget *, QString s, void **, bool)) { QFile *dmesg = new QFile("/var/run/dmesg.boot"); bool usepipe=false; FILE *pipe=NULL; QTextStream *t; bool seencpu=false; void *opaque=NULL; QString s; bool found=false; if (dmesg->exists() && dmesg->open(QIODevice::ReadOnly)) { t = new QTextStream(dmesg); } else { delete dmesg; QByteArray dmesgExe = KStandardDirs::findRootExe("dmesg").toLocal8Bit(); if (dmesgExe.isEmpty()) { return false; } pipe = popen(dmesgExe.constData(), "r"); if (!pipe) { return false; } usepipe = true; t = new QTextStream(pipe, QIODevice::ReadOnly); } 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(tree, s, &opaque, false); } else { QStringList list; list << s; new QTreeWidgetItem(tree, list); } found = true; } } if (func) { func(tree, s, &opaque, true); } //tree->triggerUpdate(); delete t; if (pipe) { pclose(pipe); } else { dmesg->close(); delete dmesg; } return found; } void AddIRQLine(QTreeWidget* tree, QString s, void **opaque, bool ending) { QStringList *strlist = (QStringList *) *opaque; QString str; int pos, irqnum=0; const char *p; p = s.toLatin1(); if (!strlist) { strlist = new QStringList(); *opaque = (void *) strlist; } if (ending) { foreach(QString temp, *strlist) { QStringList tempList; tempList << temp; new QTreeWidgetItem(tree, tempList); } delete strlist; return; } pos = s.indexOf(" irq "); irqnum = (pos < 0) ? 0 : atoi(&p[pos+5]); if (irqnum) { s.sprintf("%02d%s", irqnum, p); } else { s.sprintf("??%s", p); } strlist->append(s); strlist->sort(); } bool GetInfo_IRQ(QTreeWidget* tree) { QStringList headers; headers << i18n("IRQ") << i18n("Device"); tree->setHeaderLabels(headers); (void) GetDmesgInfo(tree, " irq ", AddIRQLine); return true; } bool GetInfo_DMA(QTreeWidget *) { return false; } bool GetInfo_PCI(QTreeWidget* tree) { if (!GetDmesgInfo(tree, "at pci", NULL)) { QStringList list; list << i18n("No PCI devices found."); new QTreeWidgetItem(tree, list); } return true; } bool GetInfo_IO_Ports(QTreeWidget* tree) { if (!GetDmesgInfo(tree, "port 0x", NULL)) { QStringList list; list << i18n("No I/O port devices found."); new QTreeWidgetItem(tree, list); } return true; } bool GetInfo_SCSI(QTreeWidget* tree) { if (!GetDmesgInfo(tree, "scsibus", NULL)) { QStringList list; list << i18n("No SCSI devices found."); new QTreeWidgetItem(tree, list); } return true; } bool GetInfo_XServer_and_Video(QTreeWidget* tree) { return GetInfo_XServer_Generic(tree); }