This file is indexed.

/usr/share/doc/discover/api-reference/vendor-xml_8c-source.html is in libdiscover-dev 2.1.2-5.1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>discover: /home/pere/src/debiancvs/pkg-discover/discover/trunk/lib/vendor-xml.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.2 -->
<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a></div>
<div class="nav">
<a class="el" href="dir_000002.html">lib</a></div>
<h1>vendor-xml.c</h1><a href="vendor-xml_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001 
00011 <span class="comment">/* $Progeny$</span>
00012 <span class="comment"> *</span>
00013 <span class="comment"> * AUTHOR: John R. Daily &lt;jdaily@progeny.com&gt;</span>
00014 <span class="comment"> *</span>
00015 <span class="comment"> * Copyright 2002 Progeny Linux Systems, Inc.</span>
00016 <span class="comment"> * Copyright 2002 Hewlett-Packard Company</span>
00017 <span class="comment"> *</span>
00018 <span class="comment"> * Permission is hereby granted, free of charge, to any person obtaining a</span>
00019 <span class="comment"> * copy of this software and associated documentation files (the "Software"),</span>
00020 <span class="comment"> * to deal in the Software without restriction, including without limitation</span>
00021 <span class="comment"> * the rights to use, copy, modify, merge, publish, distribute, sublicense,</span>
00022 <span class="comment"> * and/or sell copies of the Software, and to permit persons to whom the</span>
00023 <span class="comment"> * Software is furnished to do so, subject to the following conditions:</span>
00024 <span class="comment"> *</span>
00025 <span class="comment"> * The above copyright notice and this permission notice shall be included in</span>
00026 <span class="comment"> * all copies or substantial portions of the Software.</span>
00027 <span class="comment"> *</span>
00028 <span class="comment"> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
00029 <span class="comment"> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
00030 <span class="comment"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL</span>
00031 <span class="comment"> * THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
00032 <span class="comment"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING</span>
00033 <span class="comment"> * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER</span>
00034 <span class="comment"> * DEALINGS IN THE SOFTWARE.</span>
00035 <span class="comment"> */</span>
00036 
00037 <span class="preprocessor">#include "config.h"</span>
00038 
00039 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>
00040 
00041 <span class="preprocessor">#include &lt;assert.h&gt;</span>
00042 <span class="preprocessor">#include &lt;limits.h&gt;</span>
00043 <span class="preprocessor">#include &lt;stdio.h&gt;</span>
00044 <span class="preprocessor">#include &lt;string.h&gt;</span>
00045 
00046 <span class="preprocessor">#include &lt;expat.h&gt;</span>
00047 
00048 <span class="preprocessor">#include &lt;<a class="code" href="discover_8h.html">discover/discover.h</a>&gt;</span>
00049 <span class="preprocessor">#include &lt;<a class="code" href="discover-xml_8h.html">discover/discover-xml.h</a>&gt;</span>
00050 
00051 <span class="preprocessor">#include &lt;discover/load-url.h&gt;</span>
00052 <span class="preprocessor">#include &lt;discover/utils.h&gt;</span>
00053 
00055 <span class="keyword">struct </span>discover_xml_vendor {
00056     <span class="keywordtype">char</span> *id;
00057     <span class="keywordtype">char</span> *name;
00058     <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *next;
00059 };
00060 
00061 <span class="keyword">static</span> <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *vendors[<a class="code" href="group__types.html#ga14">BUS_COUNT</a>];
00062 
00064 <span class="keyword">struct </span>context {
00065     <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> **vlist;
00066 
00067     <span class="keywordtype">int</span> unknown_level; <span class="comment">/* How deep are we into unknown XML tags? */</span>
00068 };
00069 
00070 <span class="keyword">static</span> <span class="keywordtype">char</span> *known_vendor_elements[] = {
00071     <span class="stringliteral">"vendor"</span>,
00072     <span class="stringliteral">"vendor_list"</span>,
00073     NULL
00074 };
00075 
00076 
00077 <span class="keyword">static</span> <span class="keywordtype">bool</span>
00078 unknown_vendor_element(<span class="keyword">const</span> XML_Char * <span class="keyword">const</span> tag)
00079 {
00080     <span class="keywordtype">int</span> i;
00081     <span class="keywordflow">for</span> (i = 0; known_vendor_elements[i] != NULL; i++) {
00082         <span class="keywordflow">if</span> (strcmp(tag, known_vendor_elements[i]) == 0)
00083             <span class="keywordflow">return</span> <span class="keyword">false</span>;
00084     }
00085     <span class="keywordflow">return</span> <span class="keyword">true</span>;
00086 }
00087 
00088 <span class="keyword">static</span> <span class="keywordtype">void</span>
00089 start_element(<span class="keywordtype">void</span> *ctx, <span class="keyword">const</span> XML_Char *name, <span class="keyword">const</span> XML_Char *attrs[])
00090 {
00091     <span class="keyword">struct </span>context *context = ctx;
00092     <span class="keywordtype">int</span> i;
00093     <span class="keywordtype">char</span> *vid, *vname;
00094     <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *next, **vlist;
00095 
00096     assert(context != NULL);
00097     assert(name != NULL);
00098     assert(attrs != NULL);
00099 
00100     <span class="keywordflow">if</span> (unknown_vendor_element(name)) {
00101         context-&gt;unknown_level++;
00102         <span class="keywordflow">return</span>;
00103     }
00104 
00105     <span class="keywordflow">if</span> (context-&gt;unknown_level &gt; 0) {
00106         <span class="keywordflow">return</span>;
00107     }
00108 
00109     <span class="keywordflow">if</span> (strcmp(name, <span class="stringliteral">"vendor"</span>) == 0) {
00110         vid = vname = NULL;
00111         <span class="keywordflow">for</span> (i = 0; attrs[i]; i += 2) {
00112             <span class="keywordflow">if</span> (strcmp(attrs[i], <span class="stringliteral">"id"</span>) == 0) {
00113                 vid = (<span class="keywordtype">char</span> *) attrs[i + 1];
00114             } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strcmp(attrs[i], <span class="stringliteral">"name"</span>) == 0) {
00115                 vname = (<span class="keywordtype">char</span> *) attrs[i + 1];
00116             }
00117         }
00118 
00119         assert(vid != NULL);
00120         assert(vname != NULL);
00121 
00122         vlist = context-&gt;vlist;
00123         next = *vlist;
00124         *vlist = <a class="code" href="group__vendor__xml.html#ga7">discover_xml_vendor_new</a>();
00125         (*vlist)-&gt;id = _discover_xstrdup(vid);
00126         (*vlist)-&gt;name = _discover_xstrdup(vname);
00127         (*vlist)-&gt;next = next;
00128     }
00129 }
00130 
00131 <span class="keyword">static</span> <span class="keywordtype">void</span>
00132 end_element(<span class="keywordtype">void</span> *ctx, <span class="keyword">const</span> XML_Char *name)
00133 {
00134     <span class="keyword">struct </span>context *context = ctx;
00135 
00136     assert(context != NULL);
00137     assert(name != NULL);
00138 
00139     <span class="keywordflow">if</span> (unknown_vendor_element(name)) {
00140         context-&gt;unknown_level--;
00141         <span class="keywordflow">return</span>;
00142     }
00143 
00144     <span class="keywordflow">if</span> (context-&gt;unknown_level &gt; 0) {
00145         <span class="keywordflow">return</span>;
00146     }
00147 
00148     <span class="comment">/*</span>
00149 <span class="comment">     * We don't have any end tags to worry about, but if we did, they</span>
00150 <span class="comment">     * would be handled here.</span>
00151 <span class="comment">     */</span>
00152 }
00153 
00166 <span class="comment">/* Sshh!  Don't tell, but this doesn't actually do any merging at all.</span>
00167 <span class="comment"> * Instead, it simply inserts newer entries at the front of the list,</span>
00168 <span class="comment"> * meaning that vendor info found later supersedes info found earlier.</span>
00169 <span class="comment"> * This gives the illusion of merging, but potentially wastes memory</span>
00170 <span class="comment"> * with duplicates.</span>
00171 <span class="comment"> */</span>
00172 <span class="keywordtype">void</span>
<a name="l00173"></a><a class="code" href="group__vendor__xml.html#ga0">00173</a> <a class="code" href="group__vendor__xml.html#ga0">discover_xml_merge_vendor_url</a>(<a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> **vlist,
00174                               <span class="keywordtype">char</span> *url, <a class="code" href="structdiscover__error.html">discover_error_t</a> *status)
00175 {
00176     XML_Parser parser;
00177     <span class="keyword">struct </span>context context;
00178 
00179     assert(url != NULL);
00180     assert(status != NULL);
00181 
00182     status-&gt;<a class="code" href="structdiscover__error.html#o0">code</a> = 0;
00183 
00184     context.vlist = vlist;
00185     context.unknown_level = 0;
00186 
00187     parser = XML_ParserCreate(NULL);
00188     XML_SetElementHandler(parser, start_element, end_element);
00189     XML_SetUserData(parser, &amp;context);
00190 
00191     <span class="keywordflow">if</span> (!_discover_load_url(url, parser)) {
00192         XML_ParserFree(parser);
00193         status-&gt;<a class="code" href="structdiscover__error.html#o0">code</a> = <a class="code" href="group__types.html#gga15a16">DISCOVER_EIO</a>;
00194         <span class="keywordflow">return</span>;
00195     }
00196 
00197     <span class="keywordflow">if</span> (!XML_Parse(parser, <span class="stringliteral">""</span>, 0, 1)) {
00198         XML_ParserFree(parser);
00199         status-&gt;<a class="code" href="structdiscover__error.html#o0">code</a> = <a class="code" href="group__types.html#gga15a17">DISCOVER_EXML</a>;
00200         <span class="keywordflow">return</span>;
00201     }
00202 
00203     XML_ParserFree(parser);
00204 
00205     <span class="keywordflow">return</span>;
00206 }
00207 
00214 <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *
<a name="l00215"></a><a class="code" href="group__vendor__xml.html#ga1">00215</a> <a class="code" href="group__vendor__xml.html#ga1">discover_xml_get_vendors</a>(<a class="code" href="group__types.html#ga16">discover_bus_t</a> bus, <a class="code" href="structdiscover__error.html">discover_error_t</a> *status)
00216 {
00217     <a class="code" href="group__types.html#ga7">discover_xml_url_t</a> *urls, *i;
00218     <span class="keywordtype">char</span> *url;
00219 
00220     assert(status != NULL);
00221 
00222     status-&gt;<a class="code" href="structdiscover__error.html#o0">code</a> = 0;
00223 
00224     <span class="keywordflow">if</span> (!vendors[bus]) {
00225         urls = <a class="code" href="group__url__xml.html#ga2">discover_xml_get_data_urls</a>(bus, VENDOR_TYPE, status);
00226         <span class="keywordflow">if</span> (status-&gt;<a class="code" href="structdiscover__error.html#o0">code</a> != 0) {
00227             <span class="keywordflow">return</span> NULL;
00228         }
00229 
00230         <span class="keywordflow">for</span> (i = urls;
00231              i;
00232              i = <a class="code" href="group__url__xml.html#ga10">discover_xml_url_get_next</a>(i)) {
00233             url = <a class="code" href="group__url__xml.html#ga6">discover_xml_url_get_url</a>(i);
00234             <a class="code" href="group__vendor__xml.html#ga0">discover_xml_merge_vendor_url</a>(&amp;(vendors[bus]), url, status);
00235             <span class="keywordflow">if</span> (status-&gt;<a class="code" href="structdiscover__error.html#o0">code</a> != 0) {
00236                 <span class="keywordflow">return</span> NULL;
00237             }
00238         }
00239     }
00240 
00241     <span class="keywordflow">return</span> vendors[bus];
00242 }
00243 
00247 <span class="keywordtype">void</span>
<a name="l00248"></a><a class="code" href="group__vendor__xml.html#ga2">00248</a> <a class="code" href="group__vendor__xml.html#ga2">discover_xml_free_vendors</a>(<span class="keywordtype">void</span>)
00249 {
00250     <span class="keywordtype">int</span> i;
00251     <span class="keywordflow">for</span> (i = 0; i &lt; <a class="code" href="group__types.html#ga14">BUS_COUNT</a>; i++) {
00252         <a class="code" href="group__vendor__xml.html#ga8">discover_xml_vendor_free</a>(vendors[i]);
00253         vendors[i] = NULL;
00254     }
00255 }
00256 
00263 <span class="keywordtype">char</span> *
<a name="l00264"></a><a class="code" href="group__vendor__xml.html#ga3">00264</a> <a class="code" href="group__vendor__xml.html#ga3">discover_xml_vendor_id2name</a>(<a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *vendors, <span class="keywordtype">char</span> *<span class="keywordtype">id</span>)
00265 {
00266     <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *vendor;
00267     <span class="keywordtype">char</span> *name;
00268 
00269     assert(vendors != NULL);
00270     assert(<span class="keywordtype">id</span> != NULL);
00271 
00272     name = NULL;
00273 
00274     <span class="keywordflow">for</span> (vendor = vendors;
00275          vendor;
00276          vendor = vendor-&gt;next) {
00277         <span class="keywordflow">if</span> (strcmp(<span class="keywordtype">id</span>, vendor-&gt;id) == 0) {
00278             name = vendor-&gt;name;
00279             <span class="keywordflow">break</span>;
00280         }
00281     }
00282 
00283     <span class="keywordflow">return</span> name;
00284 }
00285 
00289 <span class="keywordtype">char</span> *
<a name="l00290"></a><a class="code" href="group__vendor__xml.html#ga4">00290</a> <a class="code" href="group__vendor__xml.html#ga4">discover_xml_vendor_get_id</a>(<a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *vendor)
00291 {
00292     assert(vendor != NULL);
00293 
00294     <span class="keywordflow">return</span> vendor-&gt;id;
00295 }
00296 
00300 <span class="keywordtype">char</span> *
<a name="l00301"></a><a class="code" href="group__vendor__xml.html#ga5">00301</a> <a class="code" href="group__vendor__xml.html#ga5">discover_xml_vendor_get_name</a>(<a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *vendor)
00302 {
00303     assert(vendor != NULL);
00304 
00305     <span class="keywordflow">return</span> vendor-&gt;name;
00306 }
00307 
00311 <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *
<a name="l00312"></a><a class="code" href="group__vendor__xml.html#ga6">00312</a> <a class="code" href="group__vendor__xml.html#ga6">discover_xml_vendor_get_next</a>(<a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *vendor)
00313 {
00314     assert(vendor != NULL);
00315 
00316     <span class="keywordflow">return</span> vendor-&gt;next;
00317 }
00318 
00322 <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *
<a name="l00323"></a><a class="code" href="group__vendor__xml.html#ga7">00323</a> <a class="code" href="group__vendor__xml.html#ga7">discover_xml_vendor_new</a>(<span class="keywordtype">void</span>)
00324 {
00325     <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *<span class="keyword">new</span>;
00326 
00327     <span class="keyword">new</span> = _discover_xmalloc(<span class="keyword">sizeof</span>(<a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a>));
00328 
00329     <span class="keyword">new</span>-&gt;id = NULL;
00330     <span class="keyword">new</span>-&gt;name = NULL;
00331     <span class="keyword">new</span>-&gt;next = NULL;
00332 
00333     <span class="keywordflow">return</span> <span class="keyword">new</span>;
00334 }
00335 
00341 <span class="keywordtype">void</span>
<a name="l00342"></a><a class="code" href="group__vendor__xml.html#ga8">00342</a> <a class="code" href="group__vendor__xml.html#ga8">discover_xml_vendor_free</a>(<a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *vendors)
00343 {
00344     <a class="code" href="group__types.html#ga6">discover_xml_vendor_t</a> *vendor, *last;
00345 
00346     last = NULL;
00347 
00348     <span class="keywordflow">for</span> (vendor = vendors;
00349          vendor;
00350          vendor = vendor-&gt;next) {
00351         <span class="keywordflow">if</span> (vendor-&gt;id) {
00352             free(vendor-&gt;id);
00353         }
00354 
00355         <span class="keywordflow">if</span> (vendor-&gt;name) {
00356             free(vendor-&gt;name);
00357         }
00358 
00359         <span class="keywordflow">if</span> (last) {
00360             free(last);
00361         }
00362         last = vendor;
00363     }
00364 
00365     <span class="keywordflow">if</span> (last) {
00366         free(last);
00367     }
00368 }
00369 
00372 <span class="comment">/*</span>
00373 <span class="comment"> * Local variables:</span>
00374 <span class="comment"> * c-file-style: "progeny"</span>
00375 <span class="comment"> * indent-tabs-mode: nil</span>
00376 <span class="comment"> * End:</span>
00377 <span class="comment"> */</span>
00378 <span class="comment">/* vim: set cin fo=tcroq sw=4 et sts=4 tw=75: */</span>
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu Jul 28 03:38:00 2005 for discover by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.2 </small></address>
</body>
</html>