| 42 |  | #include <sys/param.h> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 43 |  | #include <sys/sysctl.h> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 44 |  | #endif | 
 
 
 
 
 
 
 
 | 45 | + | #ifdef HPUX | 
 
 
 
 
 
 
 
 | 46 | + | #include <sys/param.h> | 
 
 
 
 
 
 
 
 | 47 | + | #include <sys/pstat.h> | 
 
 
 
 
 
 
 
 | 48 | + | #endif | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 49 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 50 |  | #include "tools.h" | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 51 |  | #include "statgrab.h" | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 64 |  | #include <sys/fcntl.h> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 65 |  | #include <dirent.h> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 66 |  | #endif | 
 
 
 
 
 
 
 
 | 67 | + | #ifdef WIN32 | 
 
 
 
 
 
 
 
 | 68 | + | #include "win32.h" | 
 
 
 
 
 
 
 
 | 69 | + | #endif | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 70 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 71 |  | #if defined(SOLARIS) && defined(HAVE_LIBDEVINFO_H) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 72 |  | struct map{ | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 237 |  | if(strcmp(ksp->ks_module, "md")==0) continue; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 238 |  | if((kstat_read(kc, ksp, &kios))==-1) continue; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 239 |  | strncpy(device_name, ksp->ks_name, sizeof device_name); | 
 
 
 
 
 
 
 
 
 
 
 | 240 | < | for(x=0;x<(sizeof device_name);x++){ | 
 
 
 
 
 
 
 
 
 | 240 | > | for(x=0;x<(int)(sizeof device_name);x++){ | 
 
 
 
 
 
 
 
 
 
 
 | 241 |  | if( isdigit((int)device_name[x]) ) break; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 242 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 243 |  | if(x == sizeof device_name) x--; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 249 |  | if (x>=BIG_ENOUGH){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 250 |  | /* We've got bigger than we thought was massive */ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 251 |  | /* If we hit this.. Make big enough bigger */ | 
 
 
 
 
 
 
 
 | 252 | + | kstat_close(kc); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 253 |  | return -1; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 254 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 255 |  | if( !strncmp(driver_list[x], device_name, BIG_ENOUGH)){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 260 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 261 |  | if(!found){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 262 |  | if((get_alias(device_name)) != 0){ | 
 
 
 
 
 
 
 
 | 263 | + | kstat_close(kc); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 264 |  | return -1; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 265 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 266 |  | strncpy(driver_list[x], device_name, BIG_ENOUGH); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 269 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 270 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 271 |  |  | 
 
 
 
 
 
 
 
 | 272 | + | kstat_close(kc); | 
 
 
 
 
 
 
 
 | 273 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 274 |  | return 0; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 275 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 276 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 301 |  | return match_string; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 302 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 303 |  |  | 
 
 
 
 
 
 
 
 
 
 
 | 304 | < | long long sg_get_ll_match(char *line, regmatch_t *match){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 294 | < | char *ptr; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 295 | < | long long num; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 296 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 297 | < | ptr=line+match->rm_so; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 298 | < | num=atoll(ptr); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 299 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 300 | < | return num; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 301 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 302 | < | #endif | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 303 | < |  | 
 
 
 
 
 
 
 
 
 | 304 | > | /* Cygwin (without a recent newlib) doesn't have atoll */ | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 305 |  | #ifndef HAVE_ATOLL | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 306 |  | static long long atoll(const char *s) { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 307 |  | long long value = 0; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 322 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 323 |  | #endif | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 324 |  |  | 
 
 
 
 
 
 
 
 | 325 | + | long long sg_get_ll_match(char *line, regmatch_t *match){ | 
 
 
 
 
 
 
 
 | 326 | + | char *ptr; | 
 
 
 
 
 
 
 
 | 327 | + | long long num; | 
 
 
 
 
 
 
 
 | 328 | + |  | 
 
 
 
 
 
 
 
 | 329 | + | ptr=line+match->rm_so; | 
 
 
 
 
 
 
 
 | 330 | + | num=atoll(ptr); | 
 
 
 
 
 
 
 
 | 331 | + |  | 
 
 
 
 
 
 
 
 | 332 | + | return num; | 
 
 
 
 
 
 
 
 | 333 | + | } | 
 
 
 
 
 
 
 
 | 334 | + | #endif | 
 
 
 
 
 
 
 
 | 335 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 336 |  | /*      $OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $     */ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 337 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 338 |  | /* | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 451 |  | return 0; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 452 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 453 |  |  | 
 
 
 
 
 
 
 
 | 454 | + | /* join two strings together */ | 
 
 
 
 
 
 
 
 | 455 | + | int sg_concat_string(char **dest, const char *src) { | 
 
 
 
 
 
 
 
 | 456 | + | char *new; | 
 
 
 
 
 
 
 
 | 457 | + | int len = strlen(*dest) + strlen(src) + 1; | 
 
 
 
 
 
 
 
 | 458 | + |  | 
 
 
 
 
 
 
 
 | 459 | + | new = sg_realloc(*dest, len); | 
 
 
 
 
 
 
 
 | 460 | + | if (new == NULL) { | 
 
 
 
 
 
 
 
 | 461 | + | return -1; | 
 
 
 
 
 
 
 
 | 462 | + | } | 
 
 
 
 
 
 
 
 | 463 | + |  | 
 
 
 
 
 
 
 
 | 464 | + | *dest = new; | 
 
 
 
 
 
 
 
 | 465 | + | strcat(*dest, src); | 
 
 
 
 
 
 
 
 | 466 | + | return 0; | 
 
 
 
 
 
 
 
 | 467 | + | } | 
 
 
 
 
 
 
 
 | 468 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 469 |  | #if (defined(FREEBSD) && !defined(FREEBSD5)) || defined(DFBSD) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 470 |  | kvm_t *sg_get_kvm() { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 471 |  | static kvm_t *kvmd = NULL; | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 516 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 517 |  | #endif | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 518 |  |  | 
 
 
 
 
 
 
 
 | 519 | + | #ifdef HPUX | 
 
 
 
 
 
 
 
 | 520 | + | struct pst_static *sg_get_pstat_static() { | 
 
 
 
 
 
 
 
 | 521 | + | static int got = 0; | 
 
 
 
 
 
 
 
 | 522 | + | static struct pst_static pst; | 
 
 
 
 
 
 
 
 | 523 | + |  | 
 
 
 
 
 
 
 
 | 524 | + | if (!got) { | 
 
 
 
 
 
 
 
 | 525 | + | if (pstat_getstatic(&pst, sizeof pst, 1, 0) == -1) { | 
 
 
 
 
 
 
 
 | 526 | + | sg_set_error_with_errno(SG_ERROR_PSTAT, | 
 
 
 
 
 
 
 
 | 527 | + | "pstat_static"); | 
 
 
 
 
 
 
 
 | 528 | + | return NULL; | 
 
 
 
 
 
 
 
 | 529 | + | } | 
 
 
 
 
 
 
 
 | 530 | + | got = 1; | 
 
 
 
 
 
 
 
 | 531 | + | } | 
 
 
 
 
 
 
 
 | 532 | + | return &pst; | 
 
 
 
 
 
 
 
 | 533 | + | } | 
 
 
 
 
 
 
 
 | 534 | + | #endif | 
 
 
 
 
 
 
 
 | 535 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 536 |  | int sg_init(){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 537 |  | sg_set_error(SG_ERROR_NONE, NULL); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 538 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 553 |  | build_mapping(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 554 |  | #endif | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 555 |  | #endif | 
 
 
 
 
 
 
 
 | 556 | + | #ifdef WIN32 | 
 
 
 
 
 
 
 
 | 557 | + | return sg_win32_start_capture(); | 
 
 
 
 
 
 
 
 | 558 | + | #endif | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 559 |  | return 0; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 560 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 561 |  |  | 
 
 
 
 
 
 
 
 | 562 | + | int sg_shutdown() { | 
 
 
 
 
 
 
 
 | 563 | + | #ifdef WIN32 | 
 
 
 
 
 
 
 
 | 564 | + | sg_win32_end_capture(); | 
 
 
 
 
 
 
 
 | 565 | + | #endif | 
 
 
 
 
 
 
 
 | 566 | + | return 0; | 
 
 
 
 
 
 
 
 | 567 | + | } | 
 
 
 
 
 
 
 
 | 568 | + |  | 
 
 
 
 
 
 
 
 | 569 | + | int sg_snapshot() { | 
 
 
 
 
 
 
 
 | 570 | + | #ifdef WIN32 | 
 
 
 
 
 
 
 
 | 571 | + | return sg_win32_snapshot(); | 
 
 
 
 
 
 
 
 | 572 | + | #else | 
 
 
 
 
 
 
 
 | 573 | + | return 0; | 
 
 
 
 
 
 
 
 | 574 | + | #endif | 
 
 
 
 
 
 
 
 | 575 | + | } | 
 
 
 
 
 
 
 
 | 576 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 577 |  | int sg_drop_privileges() { | 
 
 
 
 
 
 
 
 | 578 | + | #ifndef WIN32 | 
 
 
 
 
 
 
 
 | 579 | + | #ifdef HAVE_SETEGID | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 580 |  | if (setegid(getgid()) != 0) { | 
 
 
 
 
 
 
 
 | 581 | + | #elif defined(HAVE_SETRESGID) | 
 
 
 
 
 
 
 
 | 582 | + | if (setresgid(getgid(), getgid(), getgid()) != 0) { | 
 
 
 
 
 
 
 
 | 583 | + | #else | 
 
 
 
 
 
 
 
 | 584 | + | { | 
 
 
 
 
 
 
 
 | 585 | + | #endif | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 586 |  | sg_set_error_with_errno(SG_ERROR_SETEGID, NULL); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 587 |  | return -1; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 588 |  | } | 
 
 
 
 
 
 
 
 | 589 | + | #ifdef HAVE_SETEUID | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 590 |  | if (seteuid(getuid()) != 0) { | 
 
 
 
 
 
 
 
 | 591 | + | #elif defined(HAVE_SETRESUID) | 
 
 
 
 
 
 
 
 | 592 | + | if (setresuid(getuid(), getuid(), getuid()) != 0) { | 
 
 
 
 
 
 
 
 | 593 | + | #else | 
 
 
 
 
 
 
 
 | 594 | + | { | 
 
 
 
 
 
 
 
 | 595 | + | #endif | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 596 |  | sg_set_error_with_errno(SG_ERROR_SETEUID, NULL); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 597 |  | return -1; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 598 |  | } | 
 
 
 
 
 
 
 
 | 599 | + | #endif /* WIN32 */ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 600 |  | return 0; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 601 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 602 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 608 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 609 |  | return tmp; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 610 |  | } | 
 
 
 
 
 
 
 
 
 | 535 | – |  |