diff options
author | Martin Baulig <martin@home-of-linux.org> | 1998-08-09 17:08:59 +0000 |
---|---|---|
committer | Martin Baulig <martin@src.gnome.org> | 1998-08-09 17:08:59 +0000 |
commit | fd95ab60a4983c0a315a275bbfee995bcb5f2c25 (patch) | |
tree | ff8e4d452c0f36369073cf981c5cc450c6f2d6c6 | |
parent | b4038c98281da24bfd643dd978bbfe02f2f29e96 (diff) | |
download | libgtop-fd95ab60a4983c0a315a275bbfee995bcb5f2c25.tar.gz |
Changed format of this file to support multiple arguments to be passed to
1998-08-09 Martin Baulig <martin@home-of-linux.org>
* features.def: Changed format of this file to support multiple
arguments to be passed to a function.
* include/glibtop/proclist.h: `glibtop_get_proclist' now takes two
more arguments `method' and `param'.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | examples/first.c | 2 | ||||
-rw-r--r-- | examples/second.c | 2 | ||||
-rw-r--r-- | features.def | 20 | ||||
-rw-r--r-- | include/glibtop/proclist.h | 10 | ||||
-rw-r--r-- | lib/lib.awk | 92 | ||||
-rw-r--r-- | src/daemon/main.c | 16 | ||||
-rw-r--r-- | src/daemon/slave.c | 7 | ||||
-rw-r--r-- | sysdeps/freebsd/proclist.c | 3 | ||||
-rw-r--r-- | sysdeps/guile/guile.awk | 45 |
10 files changed, 126 insertions, 79 deletions
@@ -1,3 +1,11 @@ +1998-08-09 Martin Baulig <martin@home-of-linux.org> + + * features.def: Changed format of this file to support multiple + arguments to be passed to a function. + + * include/glibtop/proclist.h: `glibtop_get_proclist' now takes two + more arguments `method' and `param'. + 1998-08-07 Martin Baulig <martin@home-of-linux.org> * sysdeps/freebsd/ChangeLog: New file. diff --git a/examples/first.c b/examples/first.c index 7d541ced..abae9b3e 100644 --- a/examples/first.c +++ b/examples/first.c @@ -190,7 +190,7 @@ main (int argc, char *argv []) printf ("\n"); - ptr = glibtop_get_proclist (&data.proclist); + ptr = glibtop_get_proclist (&data.proclist, 0, 0); printf ("Proclist (0x%08lx): %lu, %lu, %lu\n", (unsigned long) data.proclist.flags, diff --git a/examples/second.c b/examples/second.c index 7c792487..b63eb341 100644 --- a/examples/second.c +++ b/examples/second.c @@ -67,7 +67,7 @@ main (int argc, char *argv []) printf ("\n"); - ptr = glibtop_get_proclist (&proclist); + ptr = glibtop_get_proclist (&proclist, 0, 0); printf ("Proclist (0x%08lx): %lu, %lu, %lu\n", (unsigned long) data.proclist.flags, diff --git a/features.def b/features.def index 574ed49d..265cdd01 100644 --- a/features.def +++ b/features.def @@ -6,13 +6,13 @@ void|loadavg|double(loadavg[0],loadavg[1],loadavg[2]) void|shm_limits|ulong(shmmax,shmmin,shmmni,shmseg,shmall) void|msg_limits|ulong(msgpool,msgmap,msgmax,msgmnb,msgmni,msgssz,msgtql) void|sem_limits|ulong(semmap,semmni,semmns,semmnu,semmsl,semopm,semume,semusz,semvmx,semaem) -unsigned *|proclist|ulong(number,size,total) -void|proc_state|str(cmd):char(state):ulong(uid,gid)|pid_t|pid -void|proc_uid|long(uid,euid,gid,egid,pid,ppid,pgrp,session,tty,tpgid,priority,nice)|pid_t|pid -void|proc_mem|long(size,vsize,resident,share,rss,rss_rlim)|pid_t|pid -void|proc_time|long(start_time,utime,stime,cutime,cstime,timeout,it_real_value)|pid_t|pid -void|proc_signal|ulong(signal,blocked,sigignore,sigcatch)|pid_t|pid -void|proc_kernel|ulong(k_flags,min_flt,maj_flt,cmin_flt,cmaj_flt,kstk_esp,kstk_eip,wchan)|pid_t|pid -void|proc_segment|long(trs,lrs,drs,dt):ulong(start_code,end_code,start_stack)|pid_t|pid -glibtop_mountentry *|@mountlist|ulong(number,size,total)|int|all_fs -void|@fsusage|ulong(blocks,bfree,bavail,files,ffree)|const char *|mount_dir|strlen (mount_dir) + 1 +unsigned *|proclist|ulong(number,size,total)|long(method,param) +void|proc_state|str(cmd):char(state):ulong(uid,gid)|pid_t(pid) +void|proc_uid|long(uid,euid,gid,egid,pid,ppid,pgrp,session,tty,tpgid,priority,nice)|pid_t(pid) +void|proc_mem|long(size,vsize,resident,share,rss,rss_rlim)|pid_t(pid) +void|proc_time|long(start_time,utime,stime,cutime,cstime,timeout,it_real_value)|pid_t(pid) +void|proc_signal|ulong(signal,blocked,sigignore,sigcatch)|pid_t(pid) +void|proc_kernel|ulong(k_flags,min_flt,maj_flt,cmin_flt,cmaj_flt,kstk_esp,kstk_eip,wchan)|pid_t(pid) +void|proc_segment|long(trs,lrs,drs,dt):ulong(start_code,end_code,start_stack)|pid_t(pid) +glibtop_mountentry *|@mountlist|ulong(number,size,total)|pid_t(all_fs) +void|@fsusage|ulong(blocks,bfree,bavail,files,ffree)|string|mount_dir diff --git a/include/glibtop/proclist.h b/include/glibtop/proclist.h index 38132eb6..f18e0937 100644 --- a/include/glibtop/proclist.h +++ b/include/glibtop/proclist.h @@ -43,7 +43,7 @@ struct _glibtop_proclist size; /* GLIBTOP_PROCLIST_SIZE */ }; -#define glibtop_get_proclist(proclist) glibtop_get_proclist_l(glibtop_global_server, proclist) +#define glibtop_get_proclist(proclist,method,param) glibtop_get_proclist_l(glibtop_global_server, proclist, method, param) #if GLIBTOP_SUID_PROCLIST #define glibtop_get_proclist_r glibtop_get_proclist_p @@ -51,21 +51,21 @@ struct _glibtop_proclist #define glibtop_get_proclist_r glibtop_get_proclist_s #endif -extern unsigned *glibtop_get_proclist_l __P((glibtop *, glibtop_proclist *)); +extern unsigned *glibtop_get_proclist_l __P((glibtop *, glibtop_proclist *, int64_t, int64_t)); #if GLIBTOP_SUID_PROCLIST extern void glibtop_init_proclist_p __P((glibtop *)); -extern unsigned *glibtop_get_proclist_p __P((glibtop *, glibtop_proclist *)); +extern unsigned *glibtop_get_proclist_p __P((glibtop *, glibtop_proclist *, int64_t, int64_t)); #else extern void glibtop_init_proclist_s __P((glibtop *)); -extern unsigned *glibtop_get_proclist_s __P((glibtop *, glibtop_proclist *)); +extern unsigned *glibtop_get_proclist_s __P((glibtop *, glibtop_proclist *, int64_t, int64_t)); #endif #ifdef GLIBTOP_GUILE /* You need to link with -lgtop_guile to get this stuff here. */ -extern SCM glibtop_guile_get_proclist __P((void)); +extern SCM glibtop_guile_get_proclist __P((SCM, SCM)); #endif diff --git a/lib/lib.awk b/lib/lib.awk index 5f5ed18d..851c280c 100644 --- a/lib/lib.awk +++ b/lib/lib.awk @@ -40,28 +40,18 @@ BEGIN { print ""; print "/* Library functions. */"; print ""; + + convert["long"] = "int64_t"; + convert["ulong"] = "u_int64_t"; + convert["pid_t"] = "pid_t"; + convert["int"] = "int"; } function output(line) { split (line, line_fields, /\|/); retval = line_fields[1]; feature = line_fields[2]; - param_typ = line_fields[4]; - param = line_fields[5]; - param_size = line_fields[6]; - - if (param_typ == "") { - param_size = "0"; - param_ptr = "NULL"; - } else { - if (param_size == "") - param_size = "sizeof ("param_typ")"; - - if (param_typ ~ /*/) - param_ptr = param; - else - param_ptr = "&"param; - } + param_def = line_fields[4]; orig = feature; sub(/^@/,"",feature); space = feature; gsub(/./," ",space); @@ -75,16 +65,54 @@ function output(line) { prefix_space = ""; } - if (param_typ != "") { - print "glibtop_get_"feature"_l (glibtop *server, glibtop_"feature" *buf,"; - print " "space" "param_typ" "param")"; + if (param_def == "string") { + call_param = ", "line_fields[5]; + param_decl = ",\n "space" const char *"line_fields[5]; + send_ptr = "\n\tvoid *send_ptr = "line_fields[5]";"; + send_size = "\n\tconst size_t send_size =\n\t\tstrlen ("line_fields[5]") + 1;"; } else { - print "glibtop_get_"feature"_l (glibtop *server, glibtop_"feature" *buf)"; + call_param = ""; + param_decl = ""; + send_size = ""; + send_ptr = ""; + nr_params = split (param_def, params, /:/); + for (param = 1; param <= nr_params; param++) { + list = params[param]; + type = params[param]; + sub(/\(.*/, "", type); + sub(/^\w+\(/, "", list); sub(/\)$/, "", list); + count = split (list, fields, /,/); + for (field = 1; field <= count; field++) { + if (param_decl == "") + param_decl = ",\n "space" "; + else + param_decl = param_decl", "; + param_decl = param_decl""convert[type]" "fields[field]; + call_param = call_param", "fields[field]; + if (send_ptr == "") + send_ptr = "\n\tvoid *send_ptr = &"fields[field]";"; + if (send_size == "") + send_size = "\n\tconst size_t send_size =\n\t\t"; + else + send_size = send_size" + "; + send_size = send_size"sizeof ("fields[field]")"; + } + } + if (send_size != "") + send_size = send_size";"; + else + send_size = "\n\tconst size_t send_size = 0;"; + if (send_ptr == "") + send_ptr = "\n\tvoid *send_ptr = NULL;"; } - print "{"; + print "glibtop_get_"feature"_l (glibtop *server, glibtop_"feature" *buf"param_decl")"; + + print "{"send_ptr""send_size; if (retval !~ /^void$/) - print "\t"retval" retval;\n"; + print "\t"retval" retval;"; + print ""; + print "\tglibtop_init_r (&server, (1 << GLIBTOP_SYSDEPS_"toupper(feature)"), 0);"; print ""; @@ -96,28 +124,16 @@ function output(line) { print "\t (server->features & (1 << GLIBTOP_SYSDEPS_"toupper(feature)")))"; print "\t{"; - if (param == "") - print "\t\t"prefix"glibtop_call_l (server, GLIBTOP_CMND_"toupper(feature)", 0, NULL,"; - else - print "\t\t"prefix"glibtop_call_l (server, GLIBTOP_CMND_"toupper(feature)","; - - if (param == "") { - print "\t\t\t\t"prefix_space"sizeof (glibtop_"feature"), buf);"; - } else { - print "\t\t\t\t"prefix_space""param_size", "param_ptr","; - print "\t\t\t\t"prefix_space"sizeof (glibtop_"feature"),"; - print "\t\t\t\t"prefix_space"buf);"; - } + print "\t\t"prefix"glibtop_call_l (server, GLIBTOP_CMND_"toupper(feature)","; + print "\t\t\t\t"prefix_space"send_size, send_ptr,"; + print "\t\t\t\t"prefix_space"sizeof (glibtop_"feature"), buf);"; print "\t} else {"; if (orig !~ /^@/) print "#if (!GLIBTOP_SUID_"toupper(feature)")"; - if (param == "") - print "\t\t"prefix"glibtop_get_"feature"_s (server, buf);"; - else - print "\t\t"prefix"glibtop_get_"feature"_s (server, buf, "param");"; + print "\t\t"prefix"glibtop_get_"feature"_s (server, buf"call_param");"; if (orig !~ /^@/) { print "#else"; diff --git a/src/daemon/main.c b/src/daemon/main.c index 7b3c4796..00e53cf7 100644 --- a/src/daemon/main.c +++ b/src/daemon/main.c @@ -29,6 +29,7 @@ handle_parent_connection (int s) glibtop_command _cmnd, *cmnd = &_cmnd; glibtop_mountentry *mount_list; char parameter [BUFSIZ]; + int64_t *param_ptr; int all_fs; pid_t pid; void *ptr; @@ -116,19 +117,26 @@ handle_parent_connection (int s) do_output (s, resp, _offset_data (loadavg), 0, NULL); break; case GLIBTOP_CMND_SHM_LIMITS: - glibtop_get_shm_limits_l (server, &resp->u.data.shm_limits); + glibtop_get_shm_limits_l + (server, &resp->u.data.shm_limits); do_output (s, resp, _offset_data (shm_limits), 0, NULL); break; case GLIBTOP_CMND_MSG_LIMITS: - glibtop_get_msg_limits_l (server, &resp->u.data.msg_limits); + glibtop_get_msg_limits_l + (server, &resp->u.data.msg_limits); do_output (s, resp, _offset_data (msg_limits), 0, NULL); break; case GLIBTOP_CMND_SEM_LIMITS: - glibtop_get_sem_limits_l (server, &resp->u.data.sem_limits); + glibtop_get_sem_limits_l + (server, &resp->u.data.sem_limits); do_output (s, resp, _offset_data (sem_limits), 0, NULL); break; case GLIBTOP_CMND_PROCLIST: - ptr = glibtop_get_proclist_l (server, &resp->u.data.proclist); + param_ptr = (int64_t *) parameter; + ptr = glibtop_get_proclist_l (server, + &resp->u.data.proclist, + param_ptr [0], + param_ptr [1]); do_output (s, resp, _offset_data (proclist), resp->u.data.proclist.total, ptr); glibtop_free_r (server, ptr); diff --git a/src/daemon/slave.c b/src/daemon/slave.c index de41bd74..33ed1e23 100644 --- a/src/daemon/slave.c +++ b/src/daemon/slave.c @@ -28,6 +28,7 @@ handle_slave_connection (int input, int output) glibtop_response _resp, *resp = &_resp; glibtop_command _cmnd, *cmnd = &_cmnd; char parameter [BUFSIZ]; + int64_t *param_ptr; void *ptr; glibtop_send_version (glibtop_global_server, output); @@ -65,8 +66,10 @@ handle_slave_connection (int input, int output) return; #if GLIBTOP_SUID_PROCLIST case GLIBTOP_CMND_PROCLIST: + param_ptr = (int64_t *) parameter; ptr = glibtop_get_proclist_p - (server, &resp->u.data.proclist); + (server, &resp->u.data.proclist, + param_ptr [0], param_ptr [1]); do_output (output, resp, _offset_data (proclist), resp->u.data.proclist.total, ptr); glibtop_free_r (server, ptr); @@ -89,8 +92,6 @@ handle_slave_command (glibtop_command *cmnd, glibtop_response *resp, switch (cmnd->command) { case GLIBTOP_CMND_SYSDEPS: - fprintf (stderr, "SYSDEPS: %p - %lx\n", - server, server->sysdeps.cpu); memcpy (&resp->u.sysdeps, &server->sysdeps, sizeof (glibtop_sysdeps)); resp->u.sysdeps.features = glibtop_server_features; diff --git a/sysdeps/freebsd/proclist.c b/sysdeps/freebsd/proclist.c index e5bea008..bb1fefda 100644 --- a/sysdeps/freebsd/proclist.c +++ b/sysdeps/freebsd/proclist.c @@ -57,7 +57,8 @@ glibtop_init_proclist_p (glibtop *server) } unsigned * -glibtop_get_proclist_p (glibtop *server, glibtop_proclist *buf) +glibtop_get_proclist_p (glibtop *server, glibtop_proclist *buf, + int64_t method, int64_t param) { struct kinfo_proc *pinfo; unsigned *pids = NULL; diff --git a/sysdeps/guile/guile.awk b/sysdeps/guile/guile.awk index 710c698f..16b1581c 100644 --- a/sysdeps/guile/guile.awk +++ b/sysdeps/guile/guile.awk @@ -20,6 +20,8 @@ BEGIN { backconv["int"] = "gh_scm2long"; backconv["pid_t"] = "gh_scm2ulong"; + backconv["long"] = "gh_scm2long"; + backconv["ulong"] = "gh_scm2ulong"; } function make_output(line) { @@ -27,17 +29,36 @@ function make_output(line) { retval = line_fields[1]; element_def = line_fields[3]; feature = line_fields[2]; - param_typ = line_fields[4]; - param = line_fields[5]; - param_size = line_fields[6]; + param_def = line_fields[4]; sub(/^@/,"",feature); features[feature] = feature; - if (param == "") - output = "SCM\nglibtop_guile_get_"feature" (void)\n{\n"; - else - output = "SCM\nglibtop_guile_get_"feature" (SCM "param")\n{\n"; + if (param_def == "string") { + call_param = ", gh_scm2newstr( "line_fields[5]", NULL)"; + param_decl = "SCM "line_fields[5]; + } else { + call_param = ""; + param_decl = ""; + nr_params = split (param_def, params, /:/); + for (param = 1; param <= nr_params; param++) { + list = params[param]; + type = params[param]; + sub(/\(.*/, "", type); + sub(/^\w+\(/, "", list); sub(/\)$/, "", list); + count = split (list, fields, /,/); + for (field = 1; field <= count; field++) { + if (param_decl != "") + param_decl = param_decl", "; + param_decl = param_decl"SCM "fields[field]; + call_param = call_param", "backconv[type]" ("fields[field]")"; + } + } + if (param_decl == "") + param_decl = "void"; + } + + output = "SCM\nglibtop_guile_get_"feature" ("param_decl")\n{\n"; output = output"\tglibtop_"feature" "feature";\n"; if (retval != "void") @@ -51,15 +72,7 @@ function make_output(line) { else prefix=""; - if (param_typ == "const char *") - param_conv = "gh_scm2newstr ("param", NULL)"; - else if (param_typ != "") - param_conv = backconv[param_typ]" ("param")"; - - if (param == "") - output = output"\t"prefix"glibtop_get_"feature" (&"feature");\n\n"; - else - output = output"\t"prefix"glibtop_get_"feature" (&"feature", "param_conv");\n\n"; + output = output"\t"prefix"glibtop_get_"feature" (&"feature""call_param");\n\n"; output = output"\tlist = gh_list (gh_ulong2scm ("feature".flags),\n\t\t\t"; |