Initial revision
[opensuse:hwinfo.git] / src / hd / net.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <fcntl.h>
6 #include <sys/stat.h>
7 #include <sys/types.h>
8
9 #include "hd.h"
10 #include "hd_int.h"
11 #include "net.h"
12
13 static void read_net_ifs(hd_data_t *hd_data);
14 static void dump_net_data(hd_data_t *hd_data);
15
16 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
17  * gather network interface info
18  *
19  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
20  */
21
22
23 /*
24  * This is independent of the other scans.
25  */
26
27 void hd_scan_net(hd_data_t *hd_data)
28 {
29   int found;
30   unsigned u;
31   hd_t *hd;
32   str_list_t *sl;
33
34   if(!(hd_data->probe & (1 << pr_net))) return;
35
36   hd_data->module = mod_net;
37
38   /* some clean-up */
39   remove_hd_entries(hd_data);
40   hd_data->net = NULL;
41
42   PROGRESS(1, 0, "get net-if data");
43
44   read_net_ifs(hd_data);
45   if((hd_data->debug & HD_DEB_NET)) dump_net_data(hd_data);
46
47   PROGRESS(2, 0, "build list");
48
49   for(sl = hd_data->net; sl; sl = sl->next) {
50     found = 0;
51     for(hd = hd_data->hd; hd; hd = hd->next) {
52       if(
53         hd->base_class == bc_network_interface &&
54         hd->unix_dev_name &&
55         !strcmp(hd->unix_dev_name, sl->str)
56       ) {
57         found = 1;
58         break;
59       }
60     }
61
62     if(!found) {
63       hd = add_hd_entry(hd_data, __LINE__, 0);
64       hd->base_class = bc_network_interface;
65       hd->unix_dev_name = new_str(sl->str);
66
67       if(!strcmp(sl->str, "lo")) {
68         hd->sub_class = sc_nif_loopback;
69       }
70       else if(sscanf(sl->str, "eth%u", &u) == 1) {
71         hd->sub_class = sc_nif_ethernet;
72         hd->slot = u;
73       }
74       else if(sscanf(sl->str, "tr%u", &u) == 1) {
75         hd->sub_class = sc_nif_tokenring;
76         hd->slot = u;
77       }
78       else if(sscanf(sl->str, "fddi%u", &u) == 1) {
79         hd->sub_class = sc_nif_fddi;
80         hd->slot = u;
81       }
82       /* ##### add more interface names here */
83       else {
84         hd->sub_class = sc_nif_other;
85       }
86
87       hd->bus = bus_none;
88     }
89   }
90 }
91
92
93 #if 0
94   char buf1[256] = "eth0", *buf = buf1;
95   struct stat sbuf;
96   struct utsname ubuf;
97
98   so = socket(PF_INET, SOCK_DGRAM, 0);
99
100   if(so >= 0) {
101     if((i = ioctl(so, SIOCGIFHWADDR, buf)) == 0) {
102       len = 6;
103       buf = buf1+18;
104     }
105     close(so);
106   }
107 #endif
108
109
110
111 /*
112  * Read the list of network interfaces. The info is taken from PROC_NET_IF_INFO.
113  */
114 void read_net_ifs(hd_data_t *hd_data)
115 {
116   char buf[16];
117   str_list_t *sl, *sl0;
118
119   if(!(sl0 = read_file(PROC_NET_IF_INFO, 2, 0))) return;
120
121   for(sl = sl0; sl; sl = sl->next) {
122     if(sscanf(sl->str, " %15[^:]:", buf) == 1) {
123       add_str_list(&hd_data->net, new_str(buf));
124     }
125   }
126
127   free_str_list(sl0);
128 }
129
130
131 /*
132  * Add some network interface data to the global log.
133  */
134 void dump_net_data(hd_data_t *hd_data)
135 {
136   str_list_t *sl;
137
138   ADD2LOG("-----  network interfaces -----\n");
139   for(sl = hd_data->net; sl; sl = sl->next) {
140     ADD2LOG("  %s\n", sl->str);
141   }
142   ADD2LOG("-----  network interfaces end -----\n");
143 }
144