diff options
author | Benoît Dejean <bdejean@src.gnome.org> | 2004-07-17 12:01:24 +0000 |
---|---|---|
committer | Benoît Dejean <bdejean@src.gnome.org> | 2004-07-17 12:01:24 +0000 |
commit | bfc14a192537818ab4bd89602a80fd22cb90d3b1 (patch) | |
tree | addb140881ba35149894adedb3dd251b158d7c35 | |
parent | b1c611c7fcc266c3efe2caa4631b5632e3a45899 (diff) | |
download | libgtop-bfc14a192537818ab4bd89602a80fd22cb90d3b1.tar.gz |
Added to repository. WIP.
* Makefile.am:
* fsusage.c: (linux_2_6_0), (linux_2_4_0),
(_glibtop_linux_get_fsusage_read_write): Added to repository. WIP.
* glibtop_server.h: LINUX_VERSION -> LINUX_VERSION_CODE
* netload.c: (glibtop_get_netload_s): Cleanups. Added support for
hardware address. s/LINUX_VERSION/LINUX_VERSION_CODE/
* open.c: (get_linux_version): s/LINUX_VERSION/LINUX_VERSION_CODE/
* procmap.c: (glibtop_get_proc_map_s): glibify: used GArray
* procuid.c: (glibtop_get_proc_uid_s): s/LINUX_VERSION/LINUX_VERSION_CODE/.
Used Linux MKDEV.
-rw-r--r-- | sysdeps/linux/ChangeLog | 19 | ||||
-rw-r--r-- | sysdeps/linux/Makefile.am | 4 | ||||
-rw-r--r-- | sysdeps/linux/fsusage.c | 101 | ||||
-rw-r--r-- | sysdeps/linux/glibtop_server.h | 2 | ||||
-rw-r--r-- | sysdeps/linux/netload.c | 63 | ||||
-rw-r--r-- | sysdeps/linux/open.c | 4 | ||||
-rw-r--r-- | sysdeps/linux/procmap.c | 70 | ||||
-rw-r--r-- | sysdeps/linux/procuid.c | 4 |
8 files changed, 192 insertions, 75 deletions
diff --git a/sysdeps/linux/ChangeLog b/sysdeps/linux/ChangeLog index f859891c..a1adc463 100644 --- a/sysdeps/linux/ChangeLog +++ b/sysdeps/linux/ChangeLog @@ -1,3 +1,22 @@ +2004-07-17 Benoît Dejean <tazforever@dlfp.org> + + * Makefile.am: + * fsusage.c: (linux_2_6_0), (linux_2_4_0), + (_glibtop_linux_get_fsusage_read_write): Added to repository. WIP. + + + * glibtop_server.h: LINUX_VERSION -> LINUX_VERSION_CODE + + * netload.c: (glibtop_get_netload_s): Cleanups. Added support for + hardware address. s/LINUX_VERSION/LINUX_VERSION_CODE/ + + * open.c: (get_linux_version): s/LINUX_VERSION/LINUX_VERSION_CODE/ + + * procmap.c: (glibtop_get_proc_map_s): glibify: used GArray + + * procuid.c: (glibtop_get_proc_uid_s): s/LINUX_VERSION/LINUX_VERSION_CODE/. + Used Linux MKDEV. + 2004-07-15 Benoît Dejean <tazforever@dlfp.org> * procstate.c: (glibtop_get_proc_state_s): Wake, we're libgtop2.7.x, diff --git a/sysdeps/linux/Makefile.am b/sysdeps/linux/Makefile.am index 9f26335e..bceb2d36 100644 --- a/sysdeps/linux/Makefile.am +++ b/sysdeps/linux/Makefile.am @@ -8,7 +8,9 @@ libgtop_sysdeps_2_0_la_SOURCES = open.c close.c cpu.c mem.c swap.c \ sem_limits.c proclist.c procstate.c procuid.c \ proctime.c procmem.c procsignal.c prockernel.c \ procsegment.c procargs.c procmap.c siglist.c \ - sysinfo.c netload.c ppp.c glibtop_server.c + sysinfo.c netload.c ppp.c glibtop_server.c \ + fsusage.c + libgtop_sysdeps_2_0_la_LIBADD = @GLIB_LIBS@ libgtop_sysdeps_2_0_la_LDFLAGS = $(LT_VERSION_INFO) diff --git a/sysdeps/linux/fsusage.c b/sysdeps/linux/fsusage.c new file mode 100644 index 00000000..c3a198b3 --- /dev/null +++ b/sysdeps/linux/fsusage.c @@ -0,0 +1,101 @@ +#include <glibtop.h> +#include <glibtop/fsusage.h> + +#include <glib.h> + +#include <mntent.h> +#include <fcntl.h> +#include <unistd.h> + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +void _glibtop_linux_get_fsusage_read_write(glibtop *server, + glibtop_fsusage *buf, + const char *path); + +/* + * Linux 2.6.x + * linux/Documentation/iostats.txt + */ + +static void linux_2_6_0(glibtop *server, glibtop_fsusage *buf, const char *path) +{ + FILE *mtab = setmntent("/etc/mtab", "r"); + + struct mntent *emnt; + + while((emnt = getmntent(mtab)) != NULL) + { + if(strcmp(emnt->mnt_dir, path) != 0) + continue; + + char filename[64]; /* magic */ + + char buffer[1024]; /* magic */ + char *p; + + char device[32]; /* magic */ + unsigned partition; + + const char *devname = emnt->mnt_fsname; + size_t offset; + + /* + we only deal with /dev block devices "/dev/<DEVICE><PARTITION>" + i don't know if other block devices such as network block + devices provide this kind of information. + */ + + if(!g_str_has_prefix(devname, "/dev/")) + break; + + /* skip the "/dev/" */ + devname += sizeof "/dev/" - 1; + + g_strlcpy(device, devname, sizeof device); + + offset = strcspn(devname, "0123456789"); + partition = strtoul(devname + offset, NULL, 0); + + device[offset] = '\0'; + + if((size_t) g_snprintf(filename, sizeof filename, + "/sys/block/%s/%s%u/stat", + device, device, partition) >= sizeof filename) + break; + + + if(try_file_to_buffer(buffer, filename) < 0) + break; + + p = buffer; + p = skip_token(p); + buf->read = strtoull(p, &p, 0); + p = skip_token(p); + buf->write = strtoull(p, &p, 0); + } + + endmntent(mtab); +} + + +static void linux_2_4_0(glibtop *server, glibtop_fsusage *buf, const char *path) +{ +} + + +void _glibtop_linux_get_fsusage_read_write(glibtop *server, + glibtop_fsusage *buf, + const char *path) +{ + if(server->os_version_code >= LINUX_VERSION_CODE(2, 6, 0)) + { + linux_2_6_0(server, buf, path); + } + else if(server->os_version_code >= LINUX_VERSION_CODE(2, 4, 0)) + { + linux_2_4_0(server, buf, path); + } +} diff --git a/sysdeps/linux/glibtop_server.h b/sysdeps/linux/glibtop_server.h index ab1d32aa..69143fe4 100644 --- a/sysdeps/linux/glibtop_server.h +++ b/sysdeps/linux/glibtop_server.h @@ -36,7 +36,7 @@ G_BEGIN_DECLS #ifdef _IN_LIBGTOP -#define LINUX_VERSION(x,y,z) (0x10000*(x) + 0x100*(y) + z) +#define LINUX_VERSION_CODE(x,y,z) (0x10000*(x) + 0x100*(y) + z) unsigned get_pageshift(); diff --git a/sysdeps/linux/netload.c b/sysdeps/linux/netload.c index d85dffea..ae7ea0c1 100644 --- a/sysdeps/linux/netload.c +++ b/sysdeps/linux/netload.c @@ -128,58 +128,53 @@ glibtop_get_netload_s (glibtop *server, glibtop_netload *buf, skfd = socket (AF_INET, SOCK_DGRAM, 0); if (skfd) { struct ifreq ifr; - unsigned long long flags; g_strlcpy (ifr.ifr_name, interface, sizeof ifr.ifr_name); if (!ioctl (skfd, SIOCGIFFLAGS, &ifr)) { + const unsigned long long flags = ifr.ifr_flags; + buf->flags |= (1L << GLIBTOP_NETLOAD_IF_FLAGS); - flags = ifr.ifr_flags; - } else - flags = 0; - if (flags & IFF_UP) - buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_UP); + if (flags & IFF_UP) + buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_UP); - if (flags & IFF_BROADCAST) - buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_BROADCAST); + if (flags & IFF_BROADCAST) + buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_BROADCAST); - if (flags & IFF_DEBUG) - buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_DEBUG); + if (flags & IFF_DEBUG) + buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_DEBUG); - if (flags & IFF_LOOPBACK) - buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_LOOPBACK); + if (flags & IFF_LOOPBACK) + buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_LOOPBACK); - if (flags & IFF_POINTOPOINT) - buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_POINTOPOINT); + if (flags & IFF_POINTOPOINT) + buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_POINTOPOINT); - if (flags & IFF_RUNNING) - buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_RUNNING); + if (flags & IFF_RUNNING) + buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_RUNNING); - if (flags & IFF_NOARP) - buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_NOARP); + if (flags & IFF_NOARP) + buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_NOARP); - if (flags & IFF_PROMISC) - buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_PROMISC); + if (flags & IFF_PROMISC) + buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_PROMISC); - if (flags & IFF_ALLMULTI) - buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_ALLMULTI); + if (flags & IFF_ALLMULTI) + buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_ALLMULTI); - if (flags & IFF_MULTICAST) - buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_MULTICAST); + if (flags & IFF_MULTICAST) + buf->if_flags |= (1L << GLIBTOP_IF_FLAGS_MULTICAST); + } g_strlcpy (ifr.ifr_name, interface, sizeof ifr.ifr_name); if (!ioctl (skfd, SIOCGIFADDR, &ifr)) { - struct sockaddr_in addr = - *(struct sockaddr_in *) &ifr.ifr_addr; - buf->address = addr.sin_addr.s_addr; + buf->address = ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr.s_addr; buf->flags |= (1L << GLIBTOP_NETLOAD_ADDRESS); } g_strlcpy (ifr.ifr_name, interface, sizeof ifr.ifr_name); if (!ioctl (skfd, SIOCGIFNETMASK, &ifr)) { - struct sockaddr_in addr = - *(struct sockaddr_in *) &ifr.ifr_addr; - buf->subnet = addr.sin_addr.s_addr; + buf->subnet = ((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr.s_addr; buf->flags |= (1L << GLIBTOP_NETLOAD_SUBNET); } @@ -189,6 +184,12 @@ glibtop_get_netload_s (glibtop *server, glibtop_netload *buf, buf->flags |= (1L << GLIBTOP_NETLOAD_MTU); } + g_strlcpy (ifr.ifr_name, interface, sizeof ifr.ifr_name); + if (!ioctl (skfd, SIOCGIFHWADDR, &ifr)) { + memcpy(buf->hwaddress, &ifr.ifr_hwaddr.sa_data, 8); + buf->flags |= (1L << GLIBTOP_NETLOAD_HWADDRESS); + } + close (skfd); } @@ -197,7 +198,7 @@ glibtop_get_netload_s (glibtop *server, glibtop_netload *buf, * need IP accounting. */ - if (server->os_version_code < 131442) { + if (server->os_version_code < LINUX_VERSION_CODE(2, 1, 14)) { /* If IP accounting is enabled in the kernel and it is * enabled for the requested interface, we use it to diff --git a/sysdeps/linux/open.c b/sysdeps/linux/open.c index b6d61f38..c75c3c2f 100644 --- a/sysdeps/linux/open.c +++ b/sysdeps/linux/open.c @@ -46,9 +46,9 @@ static unsigned get_linux_version(void) { fprintf(stderr, /* *very* unlikely to happen by accident */ "Non-standard uts for running kernel:\n" "release %s=%u.%u.%u gives version code %d\n", - uts.release, x, y, z, LINUX_VERSION(x,y,z)); + uts.release, x, y, z, LINUX_VERSION_CODE(x,y,z)); - linux_version_code = LINUX_VERSION(x, y, z); + linux_version_code = LINUX_VERSION_CODE(x, y, z); } return linux_version_code; diff --git a/sysdeps/linux/procmap.c b/sysdeps/linux/procmap.c index fbe3d0dc..e0088737 100644 --- a/sysdeps/linux/procmap.c +++ b/sysdeps/linux/procmap.c @@ -21,10 +21,14 @@ Boston, MA 02111-1307, USA. */ +#include <glib.h> + #include <glibtop.h> #include <glibtop/error.h> #include <glibtop/procmap.h> +#include <linux/kdev_t.h> + #define PROC_MAPS_FORMAT ((sizeof(void*) == 8) \ ? "%16lx-%16lx %4c %16lx %02hx:%02hx %lu%*[ ]%[^\n]\n" \ @@ -54,35 +58,34 @@ glibtop_init_proc_map_s (glibtop *server) glibtop_map_entry * glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid) { - char filename [GLIBTOP_MAP_FILENAME_LEN+1]; - glibtop_map_entry *entry_list; - gsize allocated; + char procfilename[GLIBTOP_MAP_FILENAME_LEN+1]; + GArray *entry_list = g_array_new(FALSE, FALSE, + sizeof(glibtop_map_entry)); FILE *maps; - /* fscanf args */ - unsigned short dev_major, dev_minor; - unsigned long start, end, offset, inode; - char flags[4]; - /* filename is the 8th argument */ - glibtop_init_s (&server, GLIBTOP_SYSDEPS_PROC_MAP, 0); memset (buf, 0, sizeof (glibtop_proc_map)); - sprintf (filename, "/proc/%d/maps", pid); - - maps = fopen (filename, "r"); - if (!maps) return NULL; + snprintf (procfilename, sizeof procfilename, "/proc/%d/maps", pid); - allocated = 32; /* magic */ - entry_list = g_new(glibtop_map_entry, allocated); + if((maps = fopen (procfilename, "r")) == NULL) { + return (glibtop_map_entry*) g_array_free(entry_list, TRUE); + } - for(buf->number = 0; TRUE; buf->number++) + while(TRUE) { unsigned long perm = 0; - int rv; + unsigned short dev_major, dev_minor; + unsigned long start, end, offset, inode; + char flags[4]; + char filename [GLIBTOP_MAP_FILENAME_LEN+1]; + + glibtop_map_entry entry; + + /* 8 arguments */ rv = fscanf (maps, PROC_MAPS_FORMAT, &start, &end, flags, &offset, @@ -110,34 +113,25 @@ glibtop_get_proc_map_s (glibtop *server, glibtop_proc_map *buf, pid_t pid) else if (flags [3] == 'p') perm |= GLIBTOP_MAP_PERM_PRIVATE; + entry.flags = _glibtop_sysdeps_map_entry; + entry.start = (guint64) start; + entry.end = (guint64) end; + entry.offset = (guint64) offset; + entry.perm = (guint64) perm; + entry.device = (guint64) MKDEV(dev_major, dev_minor); + entry.inode = (guint64) inode; + g_strlcpy (entry.filename, filename, sizeof entry.filename); - if(buf->number == allocated) { - /* grow by 2 and blank the newly allocated entries */ - entry_list = g_renew (glibtop_map_entry, entry_list, allocated * 2); - allocated *= 2; - } - - entry_list [buf->number].flags = _glibtop_sysdeps_map_entry; - - entry_list [buf->number].start = (guint64) start; - entry_list [buf->number].end = (guint64) end; - entry_list [buf->number].offset = (guint64) offset; - entry_list [buf->number].perm = (guint64) perm; - entry_list [buf->number].device = (guint64) (dev_major << 8) + - (guint64) dev_minor; - entry_list [buf->number].inode = (guint64) inode; - - g_strlcpy (entry_list [buf->number].filename, filename, - sizeof entry_list [buf->number].filename); + g_array_append_val(entry_list, entry); } fclose (maps); buf->flags = _glibtop_sysdeps_proc_map; + + buf->number = entry_list->len; buf->size = sizeof (glibtop_map_entry); buf->total = buf->number * buf->size; - g_renew(glibtop_map_entry, entry_list, buf->number); - - return entry_list; + return (glibtop_map_entry*) g_array_free(entry_list, FALSE); } diff --git a/sysdeps/linux/procuid.c b/sysdeps/linux/procuid.c index d4dc61b2..612d952d 100644 --- a/sysdeps/linux/procuid.c +++ b/sysdeps/linux/procuid.c @@ -112,12 +112,12 @@ glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf, pid_t pid) /* the old notty val, update elsewhere bef. moving to 0 */ buf->tty = -1; - if (server->os_version_code < LINUX_VERSION(1,3,39)) { + if (server->os_version_code < LINUX_VERSION_CODE(1,3,39)) { /* map old meanings to new */ buf->priority = 2*15 - buf->priority; buf->nice = 15 - buf->nice; } - else if (server->os_version_code < LINUX_VERSION(1,1,30) && buf->tty != -1) + else if (server->os_version_code < LINUX_VERSION_CODE(1,1,30) && buf->tty != -1) /* when tty wasn't full devno */ buf->tty = 4*0x100 + buf->tty; |