This commit is contained in:
parent
27aa0532c5
commit
696f62a637
|
@ -1,2 +0,0 @@
|
|||
this directory contains some experiments that are not in the codebase yet.
|
||||
may or may not move forward, but would prefer not to loose these stuffs.
|
21
exp/argv.pl
21
exp/argv.pl
|
@ -1,21 +0,0 @@
|
|||
#!/usr/bin/perl
|
||||
|
||||
#generate a process with large argv for proc_args testing
|
||||
|
||||
use strict;
|
||||
|
||||
if (@ARGV) {
|
||||
print "pid=$$\n";
|
||||
<STDIN>;
|
||||
}
|
||||
else {
|
||||
my(@argv);
|
||||
my $nargs = 26;
|
||||
my $arglen = 4256;
|
||||
my $arg = 'a';
|
||||
for (my $i=0; $i<$nargs; $i++) {
|
||||
push @argv, $arg++ x $arglen;
|
||||
}
|
||||
print "$^X $0\n";
|
||||
exec $^X, $0, @argv or die $!;
|
||||
}
|
|
@ -1,24 +0,0 @@
|
|||
#include <stdio.h>
|
||||
#include <kstat.h>
|
||||
|
||||
/* gcc -lkstat -o dump_kstats dump_kstats.c */
|
||||
|
||||
static const char *kstat_type_names[] = {
|
||||
"raw", "named", "intr", "io", "timer"
|
||||
};
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
kstat_ctl_t *kc = kstat_open();
|
||||
kstat_t *kp;
|
||||
|
||||
for (kp = kc->kc_chain; kp != 0; kp = kp->ks_next) {
|
||||
if (strncmp(kp->ks_name, "kstat_", 6) == 0) {
|
||||
continue;
|
||||
}
|
||||
fprintf(stdout, "%-5s %s::%s.%s[%d]\n",
|
||||
kstat_type_names[kp->ks_type],
|
||||
kp->ks_class, kp->ks_module, kp->ks_name, kp->ks_instance);
|
||||
}
|
||||
|
||||
kstat_close(kc);
|
||||
}
|
27
exp/fork.pl
27
exp/fork.pl
|
@ -1,27 +0,0 @@
|
|||
#!/usr/bin/perl
|
||||
|
||||
use strict;
|
||||
|
||||
#create processes to benchmark ptql stuff
|
||||
|
||||
my $num = shift || 10;
|
||||
my @kids;
|
||||
my $pid;
|
||||
|
||||
for (my $i=0; $i<$num; $i++) {
|
||||
if (!defined($pid = fork())) {
|
||||
die "cannot fork: $!";
|
||||
}
|
||||
elsif ($pid) {
|
||||
#parent
|
||||
push @kids, $pid;
|
||||
}
|
||||
else {
|
||||
#child
|
||||
sleep 10 while 1;
|
||||
}
|
||||
}
|
||||
|
||||
for $pid (@kids) {
|
||||
waitpid($pid, 0);
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
#common cpu model names
|
||||
#linux /proc/cpuinfo model name
|
||||
#win32 HKLM/HARDWARE/DESCRIPTION/System/CentralProcessor/0/ProcessorNameString
|
||||
|
||||
Intel(R) Xeon(TM) CPU 2.40GHz
|
||||
Pentium III (Cascades)
|
||||
Celeron (Mendocino)
|
||||
Pentium III (Coppermine)
|
||||
Pentium 75 - 200
|
||||
AMD-K6(tm)-III Processor
|
||||
AMD Opteron(tm) Processor 246
|
||||
Opteron MP w/ 1MB
|
||||
Intel(R) XEON(TM) CPU 1.80GHz
|
||||
Pentium II (Deschutes)
|
||||
Intel(R) Pentium(R) 4 CPU 1.80GHz
|
||||
AMD-K6(tm) 3D+ Processor
|
||||
AMD Athlon(tm) processor
|
||||
AMD Athlon(tm) XP 1900+
|
||||
Intel(R) Celeron(R) CPU 1.70GHz
|
||||
AMD Athlon(TM) XP 2400+
|
||||
AMD Athlon (TM)
|
||||
Pentium Pro
|
||||
Pentium III (Katmai)
|
||||
mobile AMD Athlon(tm) 4 Processor
|
||||
AMD Duron(tm) Processor
|
||||
AMD Athlon(TM) XP1700+
|
||||
Pentium II (Klamath)
|
||||
Pentium III (Katmai)
|
||||
AMD Athlon(tm) MP Processor 1800+
|
||||
Pentium MMX
|
||||
Intel(R) Pentium(R) 4 Mobile CPU 1.60GHz
|
||||
Intel(R) Celeron(TM) CPU 1200MHz
|
||||
Intel(R) Pentium(R) III CPU family 1400MHz
|
||||
Mobile Intel(R) Pentium(R) 4 - M CPU 2.00GHz
|
||||
Intel(R) Celeron(R) CPU 2.30GHz
|
||||
Intel(R) Pentium(R) M processor 1500MHz
|
||||
Intel(R) Xeon(TM) MP CPU 2.80GHz
|
26
exp/lspv.pl
26
exp/lspv.pl
|
@ -1,26 +0,0 @@
|
|||
#!/usr/bin/perl
|
||||
|
||||
use strict;
|
||||
|
||||
my $lspv = "/usr/sbin/lspv";
|
||||
|
||||
open LSPV, "$lspv|" or die;
|
||||
my(@lspv) = <LSPV>;
|
||||
close LSPV;
|
||||
|
||||
my $dlm = ("-" x 25) . "\n";
|
||||
|
||||
print "$lspv\n", @lspv;
|
||||
print $dlm;
|
||||
|
||||
for my $line (@lspv) {
|
||||
my $disk = (split /\s+/, $line)[0];
|
||||
next unless $disk;
|
||||
next if $line =~ / None/;
|
||||
my $cmd = "$lspv -l $disk";
|
||||
open LSPV, "$cmd|" or die;
|
||||
my(@pv) = <LSPV>;
|
||||
close LSPV;
|
||||
print "$cmd\n", @pv;
|
||||
print $dlm;
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
#!perl
|
||||
|
||||
use strict;
|
||||
|
||||
my $match = $ARGV[0];
|
||||
|
||||
my $proc = $ENV{PROC_FS} || "/proc";
|
||||
opendir DH, $proc or die;
|
||||
chdir $proc;
|
||||
local $/;
|
||||
|
||||
while (my $pid = readdir DH) {
|
||||
next unless $pid =~ /^\d+$/;
|
||||
open FH, "$pid/cmdline" or next;
|
||||
my(@cmdline) = split /\000/, <FH>;
|
||||
close FH;
|
||||
if ($match) {
|
||||
next unless grep { /$match/o } @cmdline;
|
||||
}
|
||||
|
||||
print "-------------------------------\n";
|
||||
|
||||
my $i=0;
|
||||
print "pid=$pid\n";
|
||||
for my $arg (@cmdline) {
|
||||
print "$i='$arg'\n";
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
|
||||
closedir DH;
|
|
@ -1,21 +0,0 @@
|
|||
#!perl
|
||||
|
||||
use strict;
|
||||
#examine specific field from /proc/*/stat
|
||||
my $field = shift;
|
||||
|
||||
my $proc = $ENV{PROC_FS} || "/proc";
|
||||
opendir DH, $proc or die;
|
||||
chdir $proc;
|
||||
local $/;
|
||||
|
||||
while (my $pid = readdir DH) {
|
||||
next unless $pid =~ /^\d+$/;
|
||||
open FH, "$pid/stat" or next;
|
||||
my $data = <FH>;
|
||||
close FH;
|
||||
my(@fields) = split /\s+/, $data;
|
||||
print "$pid $fields[1] -> $fields[$field]\n";
|
||||
}
|
||||
|
||||
closedir DH;
|
57
exp/ptql.c
57
exp/ptql.c
|
@ -1,57 +0,0 @@
|
|||
#include <stdio.h>
|
||||
#include "sigar.h"
|
||||
#include "sigar_ptql.h"
|
||||
|
||||
int ptql_test(sigar_t *sigar, char *ptql) {
|
||||
int status, i;
|
||||
sigar_proc_list_t proclist;
|
||||
sigar_ptql_query_t *query;
|
||||
sigar_ptql_error_t error;
|
||||
|
||||
status =
|
||||
sigar_proc_list_get(sigar, &proclist);
|
||||
|
||||
if (status != SIGAR_OK) {
|
||||
return status;
|
||||
}
|
||||
|
||||
status =
|
||||
sigar_ptql_query_create(&query, ptql, &error);
|
||||
|
||||
if (status != SIGAR_OK) {
|
||||
return status;
|
||||
}
|
||||
|
||||
for (i=0; i<proclist.number; i++) {
|
||||
sigar_pid_t pid = proclist.data[i];
|
||||
if (sigar_ptql_query_match(sigar, query, pid) == SIGAR_OK) {
|
||||
sigar_proc_state_t state;
|
||||
sigar_proc_state_get(sigar, pid, &state);
|
||||
printf("name=%s, pid=%d\n", state.name, (int)pid);
|
||||
}
|
||||
}
|
||||
|
||||
sigar_proc_list_destroy(sigar, &proclist);
|
||||
|
||||
sigar_ptql_query_destroy(query);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i;
|
||||
sigar_t *sigar;
|
||||
|
||||
if (sigar_open(&sigar) != SIGAR_OK) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i=0; i<argc; i++) {
|
||||
ptql_test(sigar, argv[i]);
|
||||
}
|
||||
|
||||
sigar_close(sigar);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
#include <sigar.h>
|
||||
#include <stdio.h>
|
||||
/*
|
||||
gcc -g -o sigar_proc_args -lsocket \
|
||||
-L ../bindings/java/sigar-bin/lib -lsigar-sparc-sun-solaris-2.x \
|
||||
-I ../include sigar_proc_args.c
|
||||
*/
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
sigar_t *sigar;
|
||||
sigar_proc_list_t procs;
|
||||
sigar_proc_args_t args;
|
||||
int n;
|
||||
|
||||
if (sigar_open(&sigar) != SIGAR_OK) {
|
||||
fprintf(stderr, "Error opening sigar!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
sigar_proc_list_get(sigar, &procs);
|
||||
|
||||
for (n=0; n<procs.number; n++) {
|
||||
pid_t pid = procs.data[n];
|
||||
int status =
|
||||
sigar_proc_args_get(sigar, pid, &args);
|
||||
|
||||
printf("-------------------------------\n");
|
||||
|
||||
if (status == SIGAR_OK) {
|
||||
int i;
|
||||
|
||||
printf("pid=%d\n", pid);
|
||||
|
||||
for (i=0; i<args.number; i++) {
|
||||
printf("%d='%s'\n", i, args.data[i]);
|
||||
}
|
||||
|
||||
sigar_proc_args_destroy(sigar, &args);
|
||||
}
|
||||
else {
|
||||
printf("pid=%d error=%d...%s\n",
|
||||
pid, status, sigar_strerror(sigar, status));
|
||||
}
|
||||
}
|
||||
|
||||
sigar_proc_list_destroy(sigar, &procs);
|
||||
sigar_close(sigar);
|
||||
|
||||
return 0;
|
||||
}
|
83
exp/sizeof.c
83
exp/sizeof.c
|
@ -1,83 +0,0 @@
|
|||
/*
|
||||
#!perl -l
|
||||
use Config;
|
||||
my $prg = "$0.out";
|
||||
my $cmd = "gcc -Wall -D$^O -o $prg $0; ./$prg; rm $prg";
|
||||
print $cmd; system $cmd;
|
||||
__END__
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
unsigned int size;
|
||||
} sizeof_info_t;
|
||||
|
||||
#define SIZEOF_INFO(v) \
|
||||
{#v, sizeof(v)}
|
||||
|
||||
#ifdef solaris
|
||||
|
||||
#include <sys/kstat.h>
|
||||
#include <sys/sysinfo.h>
|
||||
#include <procfs.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/user.h>
|
||||
|
||||
static sizeof_info_t sizeof_info[] = {
|
||||
/* kstat */
|
||||
SIZEOF_INFO(kstat_named_t),
|
||||
SIZEOF_INFO(vminfo_t),
|
||||
SIZEOF_INFO(cpu_stat_t),
|
||||
SIZEOF_INFO(cpu_vminfo_t),
|
||||
SIZEOF_INFO(cpu_sys_stats_t),
|
||||
SIZEOF_INFO(kstat_io_t),
|
||||
/* procfs */
|
||||
SIZEOF_INFO(psinfo_t),
|
||||
SIZEOF_INFO(prusage_t),
|
||||
SIZEOF_INFO(prcred_t),
|
||||
SIZEOF_INFO(pstatus_t),
|
||||
SIZEOF_INFO(struct proc),
|
||||
SIZEOF_INFO(struct user),
|
||||
{NULL, 0}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef hpux
|
||||
|
||||
#include <sys/pstat.h>
|
||||
#include <mntent.h>
|
||||
#include <sys/vfs.h>
|
||||
#include <sys/mib.h>
|
||||
|
||||
static sizeof_info_t sizeof_info[] = {
|
||||
SIZEOF_INFO(struct pst_static),
|
||||
SIZEOF_INFO(struct pst_status),
|
||||
SIZEOF_INFO(struct pst_dynamic),
|
||||
SIZEOF_INFO(struct pst_swapinfo),
|
||||
SIZEOF_INFO(struct mntent),
|
||||
SIZEOF_INFO(struct statfs),
|
||||
SIZEOF_INFO(struct nmparms),
|
||||
SIZEOF_INFO(mib_ifEntry),
|
||||
SIZEOF_INFO(mib_ipRouteEnt),
|
||||
{NULL, 0}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
static void print_sizeof_info(sizeof_info_t *info)
|
||||
{
|
||||
while (info->name) {
|
||||
printf("sizeof(%s) == %d\n", info->name, info->size);
|
||||
++info;
|
||||
}
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
system("uname -a");
|
||||
print_sizeof_info(sizeof_info);
|
||||
return 0;
|
||||
}
|
|
@ -1,137 +0,0 @@
|
|||
#include <dirent.h>
|
||||
#include <ctype.h>
|
||||
#include <assert.h>
|
||||
#include <malloc.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/processor.h>
|
||||
#include <sys/sysinfo.h>
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <kstat.h>
|
||||
#include <procfs.h>
|
||||
|
||||
#define PROC_ERRNO ((errno == ENOENT) ? ESRCH : errno)
|
||||
|
||||
#define my_pread(fd, ptr, type, offset) \
|
||||
(pread(fd, ptr, sizeof(type), offset) == sizeof(type))
|
||||
|
||||
static int proc_psinfo_get(psinfo_t *psinfo, pid_t pid)
|
||||
{
|
||||
int fd, retval = 0;
|
||||
char buffer[BUFSIZ];
|
||||
|
||||
sprintf(buffer, "/proc/%d/psinfo", pid);
|
||||
|
||||
if ((fd = open(buffer, O_RDONLY)) < 0) {
|
||||
return ESRCH;
|
||||
}
|
||||
|
||||
if (!my_pread(fd, psinfo, psinfo_t, 0)) {
|
||||
retval = errno;
|
||||
}
|
||||
|
||||
close(fd);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
DIR *dirp = opendir("/proc");
|
||||
struct dirent *ent;
|
||||
char *models[] = {
|
||||
"unknown", "32bit", "64bit"
|
||||
};
|
||||
|
||||
while ((ent = readdir(dirp))) {
|
||||
pid_t pid;
|
||||
psinfo_t psinfo;
|
||||
int retval;
|
||||
char buffer[BUFSIZ];
|
||||
char *argvb[56];
|
||||
char **argvp = argvb;
|
||||
|
||||
int n, fd;
|
||||
size_t nread = 0;
|
||||
unsigned int argv_size;
|
||||
|
||||
if (!isdigit(*ent->d_name)) {
|
||||
continue;
|
||||
}
|
||||
psinfo.pr_dmodel = 0;
|
||||
pid = strtoul(ent->d_name, NULL, 10);
|
||||
retval = proc_psinfo_get(&psinfo, pid);
|
||||
printf("---------------------------------\n");
|
||||
printf("pid=%d, status=%s, model=%s\n",
|
||||
pid, retval ? strerror(retval) : "OK",
|
||||
models[psinfo.pr_dmodel]);
|
||||
|
||||
argv_size = sizeof(*argvp) * psinfo.pr_argc;
|
||||
sprintf(buffer, "/proc/%d/as", pid);
|
||||
printf("argc=%d, argv_size=%d\n",
|
||||
psinfo.pr_argc, argv_size);
|
||||
|
||||
if ((fd = open(buffer, O_RDONLY)) < 0) {
|
||||
printf("open(%s) == %s\n",
|
||||
buffer, strerror(PROC_ERRNO));
|
||||
if (argvp != argvb) {
|
||||
free(argvp);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (argv_size > sizeof(argvb)) {
|
||||
argvp = malloc(argv_size);
|
||||
}
|
||||
|
||||
if ((nread = pread(fd, argvp, argv_size, psinfo.pr_argv)) <= 0) {
|
||||
close(fd);
|
||||
printf(" pread(%d, 0x%lx, %d, 0x%lx) == %d (%s)\n",
|
||||
fd, (unsigned long)argvp, argv_size,
|
||||
(unsigned long)psinfo.pr_argv,
|
||||
nread, strerror(errno));
|
||||
continue;
|
||||
}
|
||||
|
||||
for (n = 0; n < psinfo.pr_argc; n++) {
|
||||
int alen;
|
||||
char *arg;
|
||||
|
||||
if ((nread = pread(fd, buffer, sizeof(buffer), (off_t)argvp[n])) <= 0) {
|
||||
close(fd);
|
||||
printf(" %-2d) pread(%d, 0x%lx, %d, 0x%lx) == %d (%s)\n",
|
||||
n, fd, (unsigned long)&buffer[0], sizeof(buffer),
|
||||
(unsigned long)argvp[n],
|
||||
nread, strerror(errno));
|
||||
continue;
|
||||
}
|
||||
|
||||
printf(" %-2d) nread=%-4d, ", n, nread);
|
||||
fflush(stdout);
|
||||
alen = strlen(buffer)+1;
|
||||
printf(" alen=%-4d ", alen);
|
||||
fflush(stdout);
|
||||
arg = malloc(alen);
|
||||
memcpy(arg, buffer, alen);
|
||||
printf(" {%s}\n", arg);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
if (argvp != argvb) {
|
||||
free(argvp);
|
||||
}
|
||||
|
||||
close(fd);
|
||||
}
|
||||
|
||||
closedir(dirp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
#!perl
|
||||
|
||||
#create a .tar.gz of /proc/*/@proc_files
|
||||
|
||||
use strict;
|
||||
|
||||
my(@proc_files) = qw(cmdline stat statm status maps);
|
||||
my $cpname = "copy-proc";
|
||||
my $tmp = $ENV{TMPDIR} || "/tmp";
|
||||
my $tmpdir = "$tmp/$cpname";
|
||||
unless (-e $tmpdir) {
|
||||
mkdir $tmpdir or die "mkdir $tmpdir: $!";
|
||||
print "created $tmpdir\n";
|
||||
}
|
||||
|
||||
opendir DH, "/proc" or die;
|
||||
chdir "/proc";
|
||||
|
||||
while (my $pid = readdir DH) {
|
||||
next unless $pid =~ /^\d+$/;
|
||||
for my $name (@proc_files) {
|
||||
unless (-e "$tmpdir/$pid") {
|
||||
mkdir "$tmpdir/$pid";
|
||||
}
|
||||
local *SRC, *TARG;
|
||||
my $file = "$pid/$name";
|
||||
open SRC, $file or next;
|
||||
open TARG, ">$tmpdir/$file" or die "open $tmpdir/$file: $!";
|
||||
print TARG <SRC>;
|
||||
close TARG;
|
||||
close SRC;
|
||||
}
|
||||
}
|
||||
|
||||
chdir $tmp or die "chdir $tmp: $!";
|
||||
system "tar -cf $cpname.tar $cpname";
|
||||
system "gzip -f $cpname.tar";
|
||||
|
||||
print "files saved to $tmp/$cpname.tar.gz\n";
|
||||
print "to cleanup, run: rm -rf $tmp/$cpname\n";
|
||||
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
#include <stdio.h>
|
||||
#include <sys/utsname.h>
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
struct utsname name;
|
||||
uname(&name);
|
||||
|
||||
printf("sysname....%s\n", name.sysname);
|
||||
printf("nodename...%s\n", name.nodename);
|
||||
printf("release....%s\n", name.release);
|
||||
printf("version....%s\n", name.version);
|
||||
printf("machine....%s\n", name.machine);
|
||||
|
||||
return 0;
|
||||
}
|
219
src/sigar_main.c
219
src/sigar_main.c
|
@ -1,219 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) [2004, 2005, 2006], Hyperic, Inc.
|
||||
* This file is part of SIGAR.
|
||||
*
|
||||
* SIGAR is free software; you can redistribute it and/or modify
|
||||
* it under the terms version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation. This program is distributed
|
||||
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
|
||||
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
* PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
* details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
* USA.
|
||||
*/
|
||||
|
||||
#define WIN32
|
||||
#if defined(WIN32)
|
||||
#define WINDOWS_LEAN_AND_MEAN
|
||||
#define FILESEP '\\'
|
||||
#define LIBPRE ""
|
||||
#include "windows.h"
|
||||
#else
|
||||
#define FILESEP '/'
|
||||
#define LIBPRE "lib"
|
||||
#include <dlfcn.h>
|
||||
#include <strings.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include "sigar.h"
|
||||
#include "sigar_fileinfo.h"
|
||||
|
||||
#if defined(WIN32)
|
||||
# define LIBEXT "dll"
|
||||
#elif defined(DARWIN)
|
||||
# define LIBEXT "dylib"
|
||||
#else
|
||||
# define LIBEXT "so"
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
void *func;
|
||||
} sigar_callback_t;
|
||||
|
||||
struct {
|
||||
struct {
|
||||
const char *name;
|
||||
sigar_version_t * (*func)(void);
|
||||
} version;
|
||||
|
||||
struct {
|
||||
const char *name;
|
||||
int (*func)(sigar_t **);
|
||||
} open;
|
||||
|
||||
struct {
|
||||
const char *name;
|
||||
int (*func)(sigar_t *);
|
||||
} close;
|
||||
|
||||
struct {
|
||||
const char *name;
|
||||
int (*func)(sigar_t *, sigar_pid_t, sigar_proc_exe_t *);
|
||||
} proc_exe;
|
||||
struct {
|
||||
const char *name;
|
||||
int (*func)(sigar_t *, sigar_pid_t, sigar_proc_args_t *);
|
||||
} proc_args;
|
||||
struct {
|
||||
const char *name;
|
||||
int (*func)(sigar_t *, sigar_pid_t, sigar_proc_env_t *);
|
||||
} proc_env;
|
||||
struct {
|
||||
const char *name;
|
||||
int (*func)(sigar_t *, sigar_pid_t, sigar_proc_modules_t *);
|
||||
} proc_modules;
|
||||
struct {
|
||||
const char *name;
|
||||
int (*func)(sigar_t *, sigar_pid_t, sigar_proc_fd_t *);
|
||||
} proc_fd;
|
||||
struct {
|
||||
const char *name;
|
||||
int (*func)(sigar_t *, int, unsigned long, sigar_pid_t *);
|
||||
} proc_port;
|
||||
|
||||
struct {
|
||||
const char *name;
|
||||
int (*func)(sigar_t *, const char *dir, sigar_dir_stat_t *);
|
||||
} dir_stat;
|
||||
struct {
|
||||
const char *name;
|
||||
int (*func)(sigar_t *, const char *dir, sigar_dir_usage_t *);
|
||||
} dir_usage;
|
||||
sigar_callback_t end;
|
||||
} sigar_callbacks = {
|
||||
{ "sigar_version_get", NULL },
|
||||
{ "sigar_open", NULL },
|
||||
{ "sigar_close", NULL },
|
||||
{ "sigar_proc_exe_get", NULL },
|
||||
{ "sigar_proc_args_get", NULL },
|
||||
{ "sigar_proc_env_get", NULL },
|
||||
{ "sigar_proc_modules_get", NULL },
|
||||
{ "sigar_proc_fd_get", NULL },
|
||||
{ "sigar_proc_port_get", NULL },
|
||||
{ "sigar_dir_stat_get", NULL },
|
||||
{ "sigar_dir_usage_get", NULL },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
static int sigar_main(char *argv0)
|
||||
{
|
||||
int status;
|
||||
sigar_t *sigar;
|
||||
char *errmsg;
|
||||
char *ptr;
|
||||
char sigarlib[8096], archlib[512];
|
||||
void *handle;
|
||||
sigar_callback_t *callbacks =
|
||||
(sigar_callback_t *)&sigar_callbacks;
|
||||
|
||||
strcpy(sigarlib, argv0);
|
||||
#ifdef WIN32
|
||||
if ((ptr = strstr(sigarlib, ".exe"))) {
|
||||
*ptr = '\0';
|
||||
}
|
||||
#endif
|
||||
ptr = strrchr(sigarlib, FILESEP);
|
||||
if (ptr) {
|
||||
++ptr;
|
||||
}
|
||||
else {
|
||||
ptr = sigarlib;
|
||||
}
|
||||
|
||||
sprintf(archlib, LIBPRE "%s." LIBEXT, ptr);
|
||||
strcpy(ptr, archlib);
|
||||
|
||||
#if defined(__sun)
|
||||
dlopen("/usr/lib/libnsl.so", RTLD_NOW|RTLD_GLOBAL);
|
||||
#endif
|
||||
|
||||
#if defined(WIN32)
|
||||
if (!(handle = LoadLibrary(sigarlib))) {
|
||||
errmsg = "XXX FormatMessage";
|
||||
}
|
||||
#else
|
||||
if (!(handle = dlopen(sigarlib, RTLD_LAZY))) {
|
||||
errmsg = dlerror();
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!handle) {
|
||||
fprintf(stderr, "Error opening '%s': %s\n",
|
||||
sigarlib, errmsg);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
while (callbacks->name) {
|
||||
#if defined(WIN32)
|
||||
callbacks->func = GetProcAddress(handle, callbacks->name);
|
||||
#else
|
||||
callbacks->func = dlsym(handle, callbacks->name);
|
||||
#endif
|
||||
callbacks++;
|
||||
}
|
||||
|
||||
if (isatty(fileno(stdin))) {
|
||||
sigar_version_t *version;
|
||||
|
||||
if (!sigar_callbacks.version.func) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
version = sigar_callbacks.version.func();
|
||||
|
||||
printf("version=%s, build date=%s\n",
|
||||
version->version, version->build_date);
|
||||
#if defined(WIN32)
|
||||
FreeLibrary(handle);
|
||||
#else
|
||||
dlclose(handle);
|
||||
#endif
|
||||
exit(0);
|
||||
}
|
||||
|
||||
status = sigar_callbacks.open.func(&sigar);
|
||||
|
||||
if (status != SIGAR_OK) {
|
||||
perror("sigar_open");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* XXX pipe loop */
|
||||
|
||||
sigar_callbacks.close.func(sigar);
|
||||
#if defined(WIN32)
|
||||
FreeLibrary(handle);
|
||||
#else
|
||||
dlclose(handle);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
if (argc == 1) {
|
||||
return sigar_main(argv[0]);
|
||||
}
|
||||
else {
|
||||
return 1; /*XXX*/
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue