diff options
Diffstat (limited to 'scsi.c')
-rw-r--r-- | scsi.c | 197 |
1 files changed, 197 insertions, 0 deletions
@@ -0,0 +1,197 @@ +/* + * Hardware Information, version 0.3 + * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br> + * + * May be modified and/or distributed under the terms of GNU GPL version 2. + * + */ + +/* + * SCSI support by Pascal F.Martin <pascalmartin@earthlink.net> + */ + +#include "hardinfo.h" +#include "scsi.h" + +SCSIDevice *hi_scan_scsi(void) +{ + FILE *proc_scsi; + gchar buffer[256], *buf; + gint n=0; + SCSIDevice *scsi_dev, *scsi; + struct stat st; + + scsi = NULL; + + if(stat("/proc/scsi/scsi", &st)) return NULL; + + proc_scsi = fopen("/proc/scsi/scsi", "r"); + while(fgets(buffer, 256, proc_scsi)) { + buf = g_strstrip(buffer); + if(!strncmp(buf, "Host: scsi", 10)) { + gint scsi_controller; + gint scsi_channel; + gint scsi_id; + gint scsi_lun; + + sscanf(buf, + "Host: scsi%d Channel: %d Id: %d Lun: %d", + &scsi_controller, + &scsi_channel, + &scsi_id, + &scsi_lun); + + buf = strstr (buffer, "Rev: "); + if (buf == NULL) { + buf = "(unknown)"; + } else { + buf += 5; + } + scsi_dev = g_new0(SCSIDevice, 1); + + scsi_dev->next = scsi; + scsi = scsi_dev; + + scsi_dev->controller = scsi_controller; + scsi_dev->channel = scsi_channel; + scsi_dev->id = scsi_id; + scsi_dev->lun = scsi_lun; + + n++; + + } else if (!strncmp(buf, "Vendor: ", 8)) { + + char *p; + char *model = strstr (buf, "Model: "); + char *rev = strstr (buf, "Rev: "); + + if (model == NULL) { + model = buf + strlen(buf); + } + p = model; + while (*(--p) == ' ') ; + *(++p) = 0; + scsi_dev->vendor = g_strdup(buf+8); + + if (rev != NULL) { + scsi_dev->revision = g_strdup(rev+5); + } else { + rev = model + strlen(model); + } + p = rev; + while (*(--p) == ' ') ; + *(++p) = 0; + scsi_dev->model = + g_strdup_printf + ("%s %s", scsi_dev->vendor, model+7); + + } else if (!strncmp(buf, "Type: ", 8)) { + char *p = strstr (buf, "ANSI SCSI revi"); + + if (p != NULL) { + while (*(--p) == ' ') ; + *(++p) = 0; + scsi_dev->type = g_strdup(buf+8); + } + } + } + fclose(proc_scsi); + + return scsi; +} + +void hi_show_scsi_info(MainWindow *mainwindow, SCSIDevice *device) +{ + static struct { + char *type; + char *label; + char *icon; + } type2icon[] = { + {"Direct-Access", "Disk", "hdd.png"}, + {"Sequential-Access", "Tape", "tape.png"}, + {"Printer", "Printer", "lpr.png"}, + {"WORM", "CD-ROM", "cd.png"}, + {"CD-ROM", "CD-ROM", "cd.png"}, + {"Scanner", "Scanner", "scan.png"}, + {NULL, "Generic", "scsi.png"} + }; + + int i; + GtkWidget *hbox, *vbox, *label; + gchar *buf; +#ifdef GTK2 + GtkWidget *pixmap; +#endif + + if(!device) return; + + for (i = 0; type2icon[i].type != NULL; ++i) { + if (!strcmp(device->type, type2icon[i].type)) break; + } + +#ifdef GTK2 + buf = g_strdup_printf("%s%s", IMG_PREFIX, type2icon[i].icon); + pixmap = gtk_image_new_from_file(buf); + gtk_widget_show(pixmap); + + g_free(buf); +#endif + hbox = gtk_hbox_new(FALSE, 2); + gtk_container_set_border_width(GTK_CONTAINER(hbox), 4); + gtk_widget_show(hbox); + + if(mainwindow->framec) + gtk_widget_destroy(mainwindow->framec); + + gtk_container_add(GTK_CONTAINER(mainwindow->frame), hbox); + mainwindow->framec = hbox; + buf = g_strdup_printf(_("SCSI %s Device"), type2icon[i].label); + gtk_frame_set_label(GTK_FRAME(mainwindow->frame), buf); + g_free(buf); + +#ifdef GTK2 + gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, FALSE, 0); +#endif + + vbox = gtk_vbox_new(FALSE, 2); + gtk_widget_show(vbox); + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); + +#ifdef GTK2 + buf = g_strdup_printf("<b>%s</b>", device->model); + + label = gtk_label_new(buf); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_label_set_selectable(GTK_LABEL(label), TRUE); + + g_free(buf); +#else + label = gtk_label_new(device->model); +#endif + + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + + buf = g_strdup_printf(_("Revision: %s"), device->revision); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + + buf = g_strdup_printf(_("Type: %s"), device->type); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); + + buf = g_strdup_printf + (_("Controller: %d, Bus: %d, ID: %d, LUN: %d"), + device->controller, + device->channel, + device->id, + device->lun); + label = gtk_label_new(buf); + gtk_widget_show(label); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + g_free(buf); +} |