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.17 by pajs, Mon Jan 5 14:21:07 2004 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 186 | Line 187 | int get_alias(char *alias){
187          return 0;
188   }
189  
190 +
191 + #define BIG_ENOUGH 512
192   int build_mapping(){
193 <        char device_name[512];
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 209 | Line 216 | int build_mapping(){
216                          }
217                          if(x == sizeof device_name) x--;
218                          device_name[x] = '\0';
219 <                        if((get_alias(device_name)) != 0){
220 <                                return 1;
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  
# Line 267 | 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 333 | Line 462 | int statgrab_init(){
462          }
463   #endif
464   #ifdef SOLARIS
465 <        if((build_mapping()) != 0) return 1;
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