Fix logical error.
[opensuse:smpppd.git] / smpppd / lists.cc
1
2
3 /*
4  *  Author: Arvin Schnell <arvin@suse.de>
5  */
6
7 #include <glob.h>
8 #include <unistd.h>
9
10 #include <cstdio>
11 #include <cstdlib>
12 #include <cerrno>
13 #include <cstring>
14
15 #include <algorithm>
16
17 #include "lists.h"
18 #include "utils.h"
19 #include "parse.h"
20 #include "defines.h"
21
22
23 void
24 InterfaceList::load ()
25 {
26     entries.clear ();
27
28     glob_t globbuf;
29     int globret = glob (IFCFG_PATH "ifcfg-{modem,ippp,dsl}*",
30             GLOB_MARK | GLOB_NOSORT | GLOB_BRACE, 0, &globbuf);
31     if (globret != 0) {
32         if (globret != GLOB_NOMATCH)
33                 fprintf (stderr, "error, glob failed: %m\n");
34         return;
35     }
36
37     for (int i = 0; ; i++)
38     {
39         const char* filename = globbuf.gl_pathv[i];
40         if (!filename)
41             break;
42
43         if (index (filename, '~') == 0 && index (filename, '.') == 0)
44             load_single (filename);
45     }
46
47     globfree (&globbuf);
48 }
49
50
51 void
52 InterfaceList::load_single (const char* filename)
53 {
54     FILE* fin = fopen (filename, "r");
55     if (!fin) {
56         fprintf (stderr, "error, can't open `%s' for reading: %m\n", filename);
57         return;
58     }
59
60     Interface tmp;
61     tmp.filename = filename;
62     tmp.filename = tmp.filename.substr (strlen (IFCFG_PATH));
63
64     string::size_type pos = tmp.filename.find ("/ifcfg-");
65     tmp.menuname = tmp.filename.substr (pos + 7, string::npos);
66
67     if (tmp.menuname.substr (0, 5) == "modem")
68         tmp.mode = Interface::MODEM;
69     else if (tmp.menuname.substr (0, 4) == "ippp")
70         tmp.mode = Interface::ISDN;
71     else if (tmp.menuname.substr (0, 3) == "dsl")
72         tmp.mode = Interface::DSL;
73
74     bool ignore = true;
75     bool ok_for_isdn = false;
76     string line, key, value;
77     while (getline (fin, &line))
78     {
79         if (parse_sh_keyvalue (line, &key, &value) != 1)
80             continue;
81
82         if (key == "PROVIDER") {
83             tmp.dfl_provider_filename = value;
84             continue;
85         }
86
87         if (key == "ENCAP") {
88             ok_for_isdn = value == "syncppp";
89             continue;
90         }
91
92         if (key == "USERCONTROL") {
93             ignore = value != "yes";
94             continue;
95         }
96     }
97
98     fclose (fin);
99
100     if (tmp.mode == Interface::ISDN && !ok_for_isdn)
101         return;
102
103     if (ignore)
104         return;
105
106     entries.push_back (tmp);
107 }
108
109
110 void
111 ProviderList::load (const Mode mode)
112 {
113     entries.clear ();
114
115     glob_t globbuf;
116     int globret = glob (PROVIDERS_PATH "*",
117             GLOB_MARK | GLOB_NOSORT, 0, &globbuf);
118     if (globret != 0) {
119         if (globret != GLOB_NOMATCH)
120                 fprintf (stderr, "error, glob failed: %m\n");
121         return;
122     }
123
124     for (int i = 0; ; i++)
125     {
126         const char* filename = globbuf.gl_pathv[i];
127         if (!filename)
128             break;
129
130         if (index (filename, '~') == 0 && index (filename, '.') == 0)
131             load_single (filename, mode);
132     }
133
134     globfree (&globbuf);
135 }
136
137
138 void
139 ProviderList::load_single (const char* filename, Mode mode)
140 {
141     FILE* fin = fopen (filename, "r");
142     if (!fin) {
143         fprintf (stderr, "error, can't open `%s' for reading: %m\n", filename);
144         return;
145     }
146
147     Provider tmp;
148     tmp.filename = filename;
149     tmp.filename = tmp.filename.substr (strlen (PROVIDERS_PATH));
150
151     tmp.menuname = tmp.filename;
152
153     bool take_it = false;
154
155     bool ok_for_isdn = false;
156     string line, key, value;
157     while (getline (fin, &line))
158     {
159         if (parse_sh_keyvalue (line, &key, &value) != 1)
160             continue;
161
162         if (key == "PROVIDER") {
163             tmp.menuname = value;
164             continue;
165         }
166
167         if (mode == Interface::MODEM && key == "MODEMSUPPORTED" && value == "yes") {
168             take_it = true;
169             continue;
170         }
171
172         if (mode == Interface::ISDN && key == "ISDNSUPPORTED" && value == "yes") {
173             take_it = true;
174             continue;
175         }
176
177         if (mode == Interface::DSL && key == "DSLSUPPORTED" && value == "yes") {
178             take_it = true;
179             continue;
180         }
181
182         if (key == "ENCAP") {
183             ok_for_isdn = value == "syncppp";
184             continue;
185         }
186     }
187
188     fclose (fin);
189
190     if (mode == Interface::ISDN && !ok_for_isdn)
191         return;
192
193     if (take_it) {
194         if (tmp.menuname.empty ())
195             fprintf (stderr, "warning, provider %s is invalid\n", filename);
196         else
197             entries.push_back (tmp);
198     }
199 }