ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/tools.c
(Generate patch)

Comparing projects/libstatgrab/src/libstatgrab/tools.c (file contents):
Revision 1.16 by tdb, Thu Nov 20 12:13:12 2003 UTC vs.
Revision 1.22 by pajs, Thu Jan 15 22:21:37 2004 UTC

# Line 25 | Line 25
25   #include <stdio.h>
26   #include <string.h>
27   #include <stdlib.h>
28 + #include <unistd.h>
29   #include <sys/types.h>
30   #include <regex.h>
31   #ifdef ALLBSD
# Line 158 | Line 159 | int get_alias(char *alias){
159          char *value;
160          int instance;
161          if ((root_node = di_init("/", DINFOCPYALL)) == DI_NODE_NIL) {
162 <                fprintf(stderr, "di_init() failed\n");
162 <                exit(1);
162 >                return 1;
163          }
164          node = di_drv_first_node(alias, root_node);
165          while (node != DI_NODE_NIL) {
# Line 169 | Line 169 | int get_alias(char *alias){
169                          minor_name = di_minor_name(minor);
170                          strcpy(tmpnode, alias);
171                          sprintf(tmpnode, "%s%d", tmpnode, instance);
172 <                        strcpy(file, "/devices");
173 <                        strcat(file, phys_path);
174 <                        strcat(file, ":");
175 <                        strcat(file, minor_name);
172 >                        strlcpy(file, "/devices", sizeof file);
173 >                        strlcat(file, phys_path, sizeof file);
174 >                        strlcat(file, ":", sizeof file);
175 >                        strlcat(file, minor_name, sizeof file);
176                          value = read_dir(file);
177                          if (value != NULL){
178                                  add_mapping(tmpnode, value);
# Line 184 | Line 184 | int get_alias(char *alias){
184                  }
185          }
186          di_fini(root_node);
187 <        return (-1);
187 >        return 0;
188   }
189  
190 < void build_mapping(){
191 <        char device_name[512];
190 >
191 > #define BIG_ENOUGH 512
192 > int build_mapping(){
193 >        char device_name[BIG_ENOUGH];
194          int x;
195          kstat_ctl_t *kc;
196          kstat_t *ksp;
197          kstat_io_t kios;
198  
199 +        char driver_list[BIG_ENOUGH][BIG_ENOUGH];
200 +        int list_entries = 0;
201 +        int found;
202 +
203          if ((kc = kstat_open()) == NULL) {
204                  return;
205          }
# Line 210 | Line 216 | void build_mapping(){
216                          }
217                          if(x == sizeof device_name) x--;
218                          device_name[x] = '\0';
219 <                        get_alias(device_name);
219 >
220 >                        /* Check if we've not already looked it up */
221 >                        found = 0;
222 >                        for(x=0;x<list_entries;x++){
223 >                                if (x>=BIG_ENOUGH){
224 >                                        /* We've got bigger than we thought was massive */
225 >                                        /* If we hit this.. Make big enough bigger */
226 >                                        return 1;
227 >                                }
228 >                                if( !strncmp(driver_list[x], device_name, BIG_ENOUGH)){
229 >                                        found = 1;
230 >                                        break;
231 >                                }
232 >                        }
233 >
234 >                        if(!found){
235 >                                if((get_alias(device_name)) != 0){
236 >                                        return 1;
237 >                                }
238 >                                strncpy(driver_list[x], device_name, BIG_ENOUGH);
239 >                                list_entries++;
240 >                        }
241                  }
242          }
243  
244 <        return;
244 >        return 0;
245   }
246  
247   #endif
# Line 266 | Line 293 | static long long atoll(const char *s) {
293   }
294   #endif
295  
296 + #ifndef HAVE_STRLCPY
297 + /*      $OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $     */
298 +
299 + /*
300 + * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
301 + *
302 + * Permission to use, copy, modify, and distribute this software for any
303 + * purpose with or without fee is hereby granted, provided that the above
304 + * copyright notice and this permission notice appear in all copies.
305 + *
306 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
307 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
308 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
309 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
310 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
311 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
312 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
313 + */
314 +
315 + /*
316 + * Copy src to string dst of size siz.  At most siz-1 characters
317 + * will be copied.  Always NUL terminates (unless siz == 0).
318 + * Returns strlen(src); if retval >= siz, truncation occurred.
319 + */
320 + size_t strlcpy(char *dst, const char *src, size_t siz){
321 +        register char *d = dst;
322 +        register const char *s = src;
323 +        register size_t n = siz;
324 +
325 +        /* Copy as many bytes as will fit */
326 +        if (n != 0 && --n != 0) {
327 +                do {
328 +                        if ((*d++ = *s++) == 0)
329 +                                break;
330 +                } while (--n != 0);
331 +        }
332 +
333 +        /* Not enough room in dst, add NUL and traverse rest of src */
334 +        if (n == 0) {
335 +                if (siz != 0)
336 +                        *d = '\0';              /* NUL-terminate dst */
337 +                while (*s++)
338 +                        ;
339 +        }
340 +
341 +        return(s - src - 1);    /* count does not include NUL */
342 + }
343 + #endif
344 +
345 + #ifndef HAVE_STRLCAT
346 + /*      $OpenBSD: strlcat.c,v 1.11 2003/06/17 21:56:24 millert Exp $    */
347 +
348 + /*
349 + * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
350 + *
351 + * Permission to use, copy, modify, and distribute this software for any
352 + * purpose with or without fee is hereby granted, provided that the above
353 + * copyright notice and this permission notice appear in all copies.
354 + *
355 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
356 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
357 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
358 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
359 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
360 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
361 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
362 + */
363 +
364 + /*
365 + * Appends src to string dst of size siz (unlike strncat, siz is the
366 + * full size of dst, not space left).  At most siz-1 characters
367 + * will be copied.  Always NUL terminates (unless siz <= strlen(dst)).
368 + * Returns strlen(src) + MIN(siz, strlen(initial dst)).
369 + * If retval >= siz, truncation occurred.
370 + */
371 + size_t strlcat(char *dst, const char *src, size_t siz){
372 +        register char *d = dst;
373 +        register const char *s = src;
374 +        register size_t n = siz;
375 +        size_t dlen;
376 +
377 +        /* Find the end of dst and adjust bytes left but don't go past end */
378 +        while (n-- != 0 && *d != '\0')
379 +                d++;
380 +        dlen = d - dst;
381 +        n = siz - dlen;
382 +
383 +        if (n == 0)
384 +                return(dlen + strlen(s));
385 +        while (*s != '\0') {
386 +                if (n != 1) {
387 +                        *d++ = *s;
388 +                        n--;
389 +                }
390 +                s++;
391 +        }
392 +        *d = '\0';
393 +
394 +        return(dlen + (s - src));       /* count does not include NUL */
395 + }
396 +
397 + #endif
398 +
399   long long get_ll_match(char *line, regmatch_t *match){
400          char *ptr;
401          long long num;
# Line 332 | Line 462 | int statgrab_init(){
462          }
463   #endif
464   #ifdef SOLARIS
465 +        /* On solaris 7, this will fail if you are not root. But, everything
466 +         * will still work, just no disk mappings. So we will ignore the exit
467 +         * status of this, and carry on merrily.
468 +         */
469          build_mapping();
470   #endif
471          return 0;
472   }
473 +
474 + int statgrab_drop_privileges() {
475 +        if (setegid(getgid()) != 0) return -1;
476 +        if (seteuid(getuid()) != 0) return -1;
477 +        return 0;
478 + }
479 +

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines