$NetBSD: patch-an,v 1.3 2001/11/28 13:34:19 skrll Exp $ --- kcontrol/info/info_netbsd.cpp.orig Fri Sep 7 20:23:47 2001 +++ kcontrol/info/info_netbsd.cpp @@ -34,8 +34,10 @@ #include #include #include +#include #include /* for NULL */ #include /* for malloc(3) */ +#include #include #include @@ -100,15 +102,14 @@ // this is used to find out which devices are currently // on system static bool GetDmesgInfo(QListView *lBox, const char *filter, - void func(QListView *, QCString s, void **, bool)) + void func(QListView *, QString s)) { QFile *dmesg = new QFile("/var/run/dmesg.boot"); bool usepipe = false; FILE *pipe = NULL; QTextStream *t; bool seencpu = false; - void *opaque = NULL; - QCString s; + QString s; bool found = false; if (dmesg->exists() && dmesg->open(IO_ReadOnly)) { @@ -134,25 +135,20 @@ s.contains("WARNING: old BSD partition ID!")) break; - if (!filter || s.contains(filter)) { - if (func) { - func(lBox, s, &opaque, false); - } - else { + if (!filter + || (filter[0] == '^' && s.find(&filter[1]) == 0) + || (filter[0] != '^' && s.contains(filter))) { + if (func) + func(lBox, s); + else olditem = new QListViewItem(lBox, olditem, s); - } found = true; } } - if (func) { - func(lBox, s, &opaque, true); - } - //lBox->triggerUpdate(); delete t; - if (pipe) { + if (pipe) pclose(pipe); - } else { dmesg->close(); delete dmesg; @@ -162,32 +158,31 @@ } -void AddIRQLine(QListView *lBox, QCString s, void **opaque, bool final) +void +AddIRQLine(QListView *lBox, QString s) { - if (!final) { - char str[3]; - const char *p = s.data(); - int pos = s.find(" irq "); - int irq = (pos<0) ? 0 : atoi(p+pos+5); + int pos, irqnum; + char numstr[3]; - if (irq) { - sprintf(str, "%2d", irq); - } - else { - str[0] = str[1] = '?'; - str[2] = 0; - } - new QListViewItem(lBox, str, p); + pos = s.find(" irq "); + irqnum = (pos < 0) ? 0 : atoi(&s.ascii()[pos+5]); + if (irqnum) + snprintf(numstr, 3, "%02d", irqnum); + else { + // this should never happen + strcpy(numstr, "??"); } + + new QListViewItem(lBox, numstr, s); } bool GetInfo_IRQ (QListView *lBox) { lBox->addColumn(i18n("IRQ")); lBox->addColumn(i18n("Device")); + lBox->setSorting(0); + lBox->setShowSortIndicator(FALSE); (void) GetDmesgInfo(lBox, " irq ", AddIRQLine); - sorting_allowed = true; - lBox->setSorting(1); return true; } @@ -212,26 +207,27 @@ bool GetInfo_Sound (QListView *lbox) { + lbox->setSorting(false); + if (!GetDmesgInfo(lbox, "audio", NULL)) new QListViewItem(lbox, i18n("No audio devices found.")); - // append information on any audio devices found + // append information for each audio devices found QListViewItem *lvitem = lbox->firstChild(); for(; lvitem; lvitem = lvitem->nextSibling()) { QString s; int pos, len; - const char *start, *end; + const char *start; char *dev; s = lvitem->text(0); - if ((pos = s.find("at ")) >= 0) { - pos += 3; // skip "at " - start = end = s.ascii(); - for(; (*end!=':') && (*end!='\n'); end++); - len = end - start; - dev = (char *) malloc(len + 1); - strncpy(dev, start, len); - dev[len] = '\0'; + // The autoconf message is in form 'audio0 at auvia0: ...' + if (s.find("audio") == 0 && (pos = s.find(" at ")) > 0) { + pos += 4; // skip " at " + start = s.ascii() + pos; + len = (int) strcspn(start, ":\n\t "); + dev = (char *) malloc(1 + len + 1); + sprintf(dev, "^%.*s", len, start); /* safe */ GetDmesgInfo(lbox, dev, NULL); @@ -252,16 +248,32 @@ { if (!GetDmesgInfo(lbox, "scsibus", NULL)) new QListViewItem(lbox, i18n("No SCSI devices found.")); + + // remove the 'waiting %d seconds for devices to settle' message + QListViewItem *lvitem = lbox->firstChild(); + for(; lvitem; lvitem = lvitem->nextSibling()) { + QString s = lvitem->text(0); + + if (s.contains("seconds for devices to settle")) { + lbox->removeItem(lvitem); + break; + } + } + return true; } bool GetInfo_Partitions (QListView *lbox) { - QCString s; + QString s; + QString MB; char *line, *orig_line; const char *device, *mountpoint, *type, *flags; FILE *pipe = popen("/sbin/mount", "r"); QTextStream *t; + u_int64_t tsz, fsz; + struct statfs sfs; + int ok; if (!pipe) { kdError(0) << i18n("Ahh couldn't run /sbin/mount!") << endl; @@ -269,14 +281,19 @@ } t = new QTextStream(pipe, IO_ReadOnly); + MB = QString(" ") + QString(i18n("MB")); lbox->addColumn(i18n("Device")); lbox->addColumn(i18n("Mount Point")); lbox->addColumn(i18n("FS Type")); + lbox->addColumn(i18n("Total Size")); + lbox->addColumn(i18n("Free Size")); lbox->addColumn(i18n("Mount Options")); - QListViewItem *olditem = 0; while (!(s = t->readLine().latin1()).isEmpty()) { - orig_line = line = strdup(s); + orig_line = line = strdup(s.ascii()); + + // the lines returned by /sbin/mount look like: + // /dev/wd0a on / type ffs (local, soft dependencies) device = strsep(&line, " "); @@ -286,10 +303,32 @@ (void) strsep(&line, " "); // consume word "type" type = strsep(&line, " "); - flags = line; - olditem = new QListViewItem(lbox, olditem, device, mountpoint, - type, flags); + // Skip leading '(' and trailing ')' + if (line != NULL) { + line++; + flags = strsep(&line, ")"); + } else { + flags = ""; + } + + if (statfs(mountpoint, &sfs) == 0) { + tsz = ((1LL * sfs.f_blocks * sfs.f_bsize / 1024) + 513) + / 1024; + fsz = ((1LL * sfs.f_bfree * sfs.f_bsize / 1024) + 513) + / 1024; + ok = 1; + } else { + tsz = fsz = 0; + ok = 0; + } + + new QListViewItem(lbox, + QString(device) + " ", + QString(mountpoint) + " ", QString(type) + " ", + (ok) ? (Value(tsz, 6) + MB) : " ", + (ok) ? (Value(fsz, 6) + MB) : " ", + flags); free(orig_line); }