]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blobdiff - src/hwinfo/src/hd/floppy.c
HWInfo wieder eingefuegt, da mit kudzu zu viele Segmentation Faults liefert.
[people/teissler/ipfire-2.x.git] / src / hwinfo / src / hd / floppy.c
diff --git a/src/hwinfo/src/hd/floppy.c b/src/hwinfo/src/hd/floppy.c
new file mode 100644 (file)
index 0000000..3c34feb
--- /dev/null
@@ -0,0 +1,162 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "klog.h"
+#include "floppy.h"
+
+static void dump_floppy_data(hd_data_t *hd_data);
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * floppy info
+ *
+ * This should currently be called *before* scan_misc() so we can try to get
+ * the floppy controller resources in scan_misc() by actually accessing the
+ * floppy drive. (Otherwise there would be a rather longish timeout.)
+ *
+ * This is all rather strange and should be rewritten...
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+
+void hd_scan_floppy(hd_data_t *hd_data)
+{
+  hd_t *hd;
+  char b0[10], b1[10], c;
+  unsigned u;
+  int fd, i, floppy_ctrls = 0, floppy_ctrl_idx = 0;
+  str_list_t *sl;
+  hd_res_t *res;
+  int floppy_stat[2] = { 1, 1 };
+
+  if(!hd_probe_feature(hd_data, pr_floppy)) return;
+
+  hd_data->module = mod_floppy;
+
+   /* some clean-up */
+  remove_hd_entries(hd_data);
+  hd_data->floppy = free_str_list(hd_data->floppy);
+
+  PROGRESS(1, 0, "get nvram");
+
+  /*
+   * Look for existing floppy controller entries (typically there will be
+   * *none*).
+   */
+  for(hd = hd_data->hd; hd; hd = hd->next) {
+    if(hd->base_class.id == bc_storage && hd->sub_class.id == sc_sto_floppy) {
+      floppy_ctrls++;
+      floppy_ctrl_idx = hd->idx;
+    }
+  }
+
+  /*
+   * Is enough to load the nvram module.
+   *
+   * Note: although you must be root to access /dev/nvram, every
+   * user can read /proc/nvram.
+   */
+  fd = open(DEV_NVRAM, O_RDONLY | O_NONBLOCK);
+  if(fd >= 0) close(fd);
+
+  if(
+    !(hd_data->floppy = read_file(PROC_NVRAM_24, 0, 0)) &&
+    !(hd_data->floppy = read_file(PROC_NVRAM_22, 0, 0))
+  );
+
+  if(hd_data->floppy && (hd_data->debug & HD_DEB_FLOPPY)) dump_floppy_data(hd_data);
+
+  if(!hd_data->klog) read_klog(hd_data);
+
+  for(sl = hd_data->klog; sl; sl = sl->next) {
+    if(sscanf(sl->str, "<4>floppy%u: no floppy controllers foun%c", &u, &c) == 2) {
+      if(u < sizeof floppy_stat / sizeof *floppy_stat) {
+        floppy_stat[u] = 0;
+      }
+    }
+  }
+
+  if(hd_data->floppy) {
+    PROGRESS(2, 0, "nvram info");
+    sl = hd_data->floppy;
+  }
+  else {
+    PROGRESS(2, 0, "klog info");
+    sl = hd_data->klog;
+  }
+
+  for(; sl; sl = sl->next) {
+    if(hd_data->floppy) {
+      i = sscanf(sl->str, " Floppy %u type : %8[0-9.]'' %8[0-9.]%c", &u, b0, b1, &c) == 4;
+    }
+    else {
+      i = sscanf(sl->str, "<6>Floppy drive(s): fd%u is %8[0-9.]%c", &u, b1, &c) == 3;
+      *b0 = 0;
+    }
+
+    if(i) {
+      if(
+        !floppy_ctrls &&
+        u < sizeof floppy_stat / sizeof *floppy_stat &&
+        floppy_stat[u]
+      ) {
+        /* create one, if missing (there's no floppy without a controller...) */
+        hd = add_hd_entry(hd_data, __LINE__, 0);
+        hd->base_class.id = bc_storage;
+        hd->sub_class.id = sc_sto_floppy;
+        floppy_ctrl_idx = hd->idx;
+        floppy_ctrls++;
+      }
+
+      if(floppy_ctrls) {
+        hd = add_hd_entry(hd_data, __LINE__, 0);
+        hd->base_class.id = bc_storage_device;
+        hd->sub_class.id = sc_sdev_floppy;
+        hd->bus.id = bus_floppy;
+        hd->slot = u;
+        str_printf(&hd->unix_dev_name, 0, "/dev/fd%u", u);
+
+        if(*b0) {
+          res = add_res_entry(&hd->res, new_mem(sizeof *res));
+          res->size.type = res_size;
+          res->size.val1 = str2float(b0, 2);
+          res->size.unit = size_unit_cinch;
+        }
+
+        /* 'k' or 'M' */
+        i = c == 'M' ? str2float(b1, 3) : str2float(b1, 0);
+
+        res = add_res_entry(&hd->res, new_mem(sizeof *res));
+        res->size.type = res_size;
+        res->size.val1 = i << 1;
+        res->size.val2 = 0x200;
+        res->size.unit = size_unit_sectors;
+
+        /* the only choice... */
+        if(floppy_ctrls == 1) hd->attached_to = floppy_ctrl_idx;
+      }
+    }
+  }
+}
+
+
+/*
+ * Add floppy data to the global log.
+ */
+void dump_floppy_data(hd_data_t *hd_data)
+{
+  str_list_t *sl;
+
+  ADD2LOG("----- /proc/nvram -----\n");
+  for(sl = hd_data->floppy; sl; sl = sl->next) {
+    ADD2LOG("  %s", sl->str);
+  }
+  ADD2LOG("----- /proc/nvram end -----\n");
+}