Initial revision
[opensuse:hwinfo.git] / hw.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7
8 #include "hd.h"
9
10 static int get_probe_flags(int, char **, hd_data_t *);
11 static void progress(unsigned, unsigned, unsigned, char *);
12
13 static unsigned deb = 0;
14 static char *log_file = "";
15
16 /*
17  * Just scan the hardware and dump all info.
18  */
19 int main(int argc, char **argv)
20 {
21   hd_data_t *hd_data;
22   hd_t *hd;
23   FILE *f = NULL;
24   long l = 0;
25   int i;
26   unsigned def_probe = (1 << pr_memory) | (1 << pr_pci);
27
28   argc--; argv++;
29
30   hd_data = calloc(1, sizeof *hd_data);
31   hd_data->progress = progress;
32
33   do {
34     hd_data->probe = def_probe;
35     def_probe = 0;                      /* only for the 1st probing */
36     if((i = get_probe_flags(argc, argv, hd_data)) < 0) return 1;
37     deb = hd_data->debug;
38     argc -= i; argv += i;
39
40     hd_scan(hd_data);
41     printf("\r%64s\r", "");
42
43   } while(argc);
44
45   if(*log_file) f = fopen(log_file, "w+");
46
47   if((hd_data->debug & HD_DEB_SHOW_LOG) && hd_data->log) {
48     fprintf(f ? f : stdout,
49       "============ start debug info ============\n%s=========== end debug info ============\n",
50       hd_data->log
51     );
52   }
53
54   if(f) l = ftell(f);
55
56   if((hd = hd_data->hd))
57     while(hd_dump_entry(hd_data, hd, f ? f : stdout), (hd = hd->next));
58
59   if(f) {
60     fseek(f, l, SEEK_SET);
61     while((i = fgetc(f)) != EOF) putchar(i);
62     fclose(f);
63   }
64
65 #if 00
66   if(needs_eide_kernel() && pt.debug >= 5) {
67     printf("has special ide chipset\n");
68   }
69
70   if(has_pcmcia_support() && pt.debug >= 5) {
71     printf("has pcmcia support\n");
72   }
73 #endif
74
75   return 0;
76 }
77
78 /*
79  * Parse command line options.
80  */
81 int get_probe_flags(int argc, char **argv, hd_data_t *hd_data)
82 {
83   int i, j, k;
84   char *s, *t;
85   for(i = 0; i < argc; i++) {
86     s = argv[i];
87
88     if(!strcmp(s, ",")) {
89       return i + 1;
90     }
91
92     t = "debug=";
93     if(!strncmp(s, t, strlen(t))) {
94       hd_data->debug = strtol(s + strlen(t), NULL, 0);
95       continue;
96     }
97
98     t = "log=";
99     if(!strncmp(s, t, strlen(t))) {
100       log_file = s + strlen(t);
101       continue;
102     }
103
104     k = 1;
105     if(*s == '+')
106       s++;
107     else if(*s == '-')
108       k = 0, s++;
109
110     if((j = str2probe_flag(s))) {
111       if(k)
112         hd_data->probe |= j;
113       else
114         hd_data->probe &= ~j;
115       continue;
116     }
117
118     fprintf(stderr, "oops: don't know what to do with \"%s\"\n", s);
119     return -1;
120   }
121
122   return argc;
123 }
124
125
126 /*
127  * A simple progress function.
128  */
129 void progress(unsigned file, unsigned pos, unsigned count, char *msg)
130 {
131   char buf1[32], buf2[32], *fn;
132
133   if(!msg) msg = "";
134
135   sprintf(buf1, "%u", file);
136   sprintf(buf2, ".%u", count);
137   fn = mod_name_by_idx(file);
138
139   printf("\r%64s\r", "");
140   printf("> %s.%u%s: %s ", *fn ? fn : buf1, pos, count ? buf2 : "", msg);
141   fflush(stdout);
142 }
143