Initial revision
[opensuse:hwinfo.git] / src / hd / floppy.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <fcntl.h>
6 #include <sys/types.h>
7 #include <sys/stat.h>
8
9 #include "hd.h"
10 #include "hd_int.h"
11 #include "floppy.h"
12
13 static void dump_floppy_data(hd_data_t *hd_data);
14
15 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
16  * floppy info
17  *
18  * It *requires* nvram support!
19  *
20  * This should currently be called *before* scan_misc() so we can try to get
21  * the floppy controller resources in scan_misc() by actually accessing the
22  * floppy drive. (Otherwise there would be a rather longish timeout.)
23  *
24  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
25  */
26
27
28 void hd_scan_floppy(hd_data_t *hd_data)
29 {
30   hd_t *hd;
31   char b0[10], b1[10], c;
32   unsigned u;
33   int fd, i, floppy_ctrls = 0, floppy_ctrl_idx = 0;
34   str_list_t *sl;
35   hd_res_t *res;
36
37   if(!(hd_data->probe & (1 << pr_floppy))) return;
38
39   hd_data->module = mod_floppy;
40
41    /* some clean-up */
42   remove_hd_entries(hd_data);
43   hd_data->floppy = NULL;
44
45   PROGRESS(1, 0, "get nvram");
46
47   /*
48    * Look for existing floppy controller entries (typically there will be
49    * *none*).
50    */
51   for(hd = hd_data->hd; hd; hd = hd->next) {
52     if(hd->base_class == bc_storage && hd->sub_class == sc_sto_floppy) {
53       floppy_ctrls++;
54       floppy_ctrl_idx = hd->idx;
55     }
56   }
57
58   /*
59    * Is enough to load the nvram module.
60    *
61    * Note: although you must be root to access /dev/nvram, every
62    * user can read /proc/nvram.
63    */
64   fd = open(DEV_NVRAM, O_RDONLY | O_NONBLOCK);
65   if(fd >= 0) close(fd);
66
67   if(!(hd_data->floppy = read_file(PROC_NVRAM, 0, 0))) return;
68
69   if((hd_data->debug & HD_DEB_FLOPPY)) dump_floppy_data(hd_data);
70
71   PROGRESS(2, 0, "create entry");
72
73   for(sl = hd_data->floppy; sl; sl = sl->next) {
74     if(sscanf(sl->str, " Floppy %u type : %8[0-9.]'' %8[0-9.]%c", &u, b0, b1, &c) == 4) {
75       if(!floppy_ctrls) {
76         /* create one, if missing (there's no floppy without a controller...) */
77         hd = add_hd_entry(hd_data, __LINE__, 0);
78         hd->base_class = bc_storage;
79         hd->sub_class = sc_sto_floppy;
80         floppy_ctrl_idx = hd->idx;
81         floppy_ctrls++;
82       }
83
84       hd = add_hd_entry(hd_data, __LINE__, 0);
85       hd->base_class = bc_storage_device;
86       hd->sub_class = sc_sdev_floppy;
87       hd->bus = bus_floppy;
88       hd->slot = u;
89       str_printf(&hd->unix_dev_name, 0, "/dev/fd%u", u);
90
91       res = add_res_entry(&hd->res, new_mem(sizeof *res));
92       res->size.type = res_size;
93       res->size.val1 = str2float(b0, 2);
94       res->size.unit = size_unit_cinch;
95
96       /* 'k' or 'M' */
97       i = c == 'M' ? str2float(b1, 3) : str2float(b1, 0);
98
99       res = add_res_entry(&hd->res, new_mem(sizeof *res));
100       res->size.type = res_size;
101       res->size.val1 = i;
102       res->size.unit = size_unit_kbyte;
103
104       /* the only choice... */
105       if(floppy_ctrls == 1) hd->attached_to = floppy_ctrl_idx;
106     }
107   }
108 }
109
110
111 /*
112  * Add some network interface data to the global log.
113  */
114 void dump_floppy_data(hd_data_t *hd_data)
115 {
116   str_list_t *sl;
117
118   ADD2LOG("----- /proc/nvram -----\n");
119   for(sl = hd_data->floppy; sl; sl = sl->next) {
120     ADD2LOG("  %s", sl->str);
121   }
122   ADD2LOG("----- /proc/nvram end -----\n");
123 }