Date: Wed, 3 Jun 2009 16:42:10 GMT From: Gabor Pali <pgj@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 163425 for review Message-ID: <200906031642.n53GgANE078783@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=163425 Change 163425 by pgj@petymeg-current on 2009/06/03 16:41:53 Import some utility routines and an overall skeleton from libmemstat(3) sources. This will serve as a base for further experimentations. Affected files ... .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/Makefile#2 edit .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.h#2 edit .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_all.c#1 add .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_internal.h#2 edit .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_tcp.c#1 add .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_udp.c#1 add .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_util.c#2 edit Differences ... ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/Makefile#2 (text+ko) ==== @@ -2,7 +2,8 @@ .include <bsd.own.mk> LIB= netstat -SRCS= netstat_util.c +SRCS= netstat_tcp.c netstat_udp.c \ + netstat_all.c netstat_util.c INCS= netstat.h ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.h#2 (text+ko) ==== @@ -2,6 +2,16 @@ #ifndef _NETSTAT_H_ #define _NETSTAT_H_ +#define NETSTAT_MAXCPU 32 +#define NETSTAT_MAXCALLER 16 + +#define NETSTAT_TYPE_UNKNOWN 0 +#define NETSTAT_TYPE_TCP 1 +#define NETSTAT_TYPE_UDP 2 +#define NETSTAT_TYPE_ANY 255 + +#define NETSTAT_MAXNAME 32 + #define NETSTAT_ERROR_UNDEFINED 0 #define NETSTAT_ERROR_NOMEMORY 1 #define NETSTAT_ERROR_VERSION 2 @@ -9,4 +19,28 @@ #define NETSTAT_ERROR_KVM_NOSYMBOL 4 #define NETSTAT_ERROR_KVM_SHORTREAD 5 +struct netstat; +struct netstat_list; + +__BEGIN_DECLS +const char *netstat_strerror(int); + +struct netstat_list *netstat_nsl_alloc(void); +struct netstat *netstat_nsl_first(struct netstat_list *); +struct netstat *netstat_nsl_next(struct netstat *); +struct netstat *netstat_nsl_find(struct netstat_list *, + int, const char *); + +void netstat_nsl_free(struct netstat_list *); +int netstat_nsl_geterror(struct netstat_list *); + +int netstat_sysctl_all(struct netstat_list *, int); +int netstat_sysctl_tcp(struct netstat_list *, int); +int netstat_sysctl_udp(struct netstat_list *, int); + +int netstat_kvm_all(struct netstat_list *, void *); +int netstat_kvm_tcp(struct netstat_list *, void *); +int netstat_kvm_udp(struct netstat_list *, void *); +__END_DECLS + #endif /* !_NETSTAT_H_ */ ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_internal.h#2 (text+ko) ==== @@ -2,4 +2,27 @@ #ifndef _NETSTAT_INTERNAL_H_ #define _NETSTAT_INTERNAL_H_ +#include <sys/queue.h> +#include <kvm.h> + +struct netstat { + int ns_type; + char ns_name[NETSTAT_MAXNAME]; + + LIST_ENTRY(netstat) ns_list; +}; + +struct netstat_list { + LIST_HEAD(, netstat) nsl_list; + int nsl_error; +}; + +int kread(kvm_t *, void *, void *, size_t, size_t); +int kread_string(kvm_t *, void *, char *, int); + +void _netstat_nsl_empty(struct netstat_list *); +struct netstat *_netstat_ns_allocate(struct netstat_list *, + int, const char *); +void _netstat_ns_reset_stats(struct netstat *); + #endif /* !_NETSTAT_INTERNAL_H_ */ ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat_util.c#2 (text+ko) ==== @@ -1,11 +1,14 @@ +#include <sys/queue.h> #include <sys/types.h> #include <kvm.h> +#include <stdlib.h> +#include <string.h> #include "netstat.h" #include "netstat_internal.h" -static int +int kread(kvm_t *kvm, void *kvm_pointer, void *address, size_t size, size_t offset) { @@ -20,7 +23,7 @@ return (0); } -static int +int kread_string(kvm_t *kvm, void *kvm_pointer, char *buffer, int buflen) { ssize_t ret; @@ -39,3 +42,124 @@ buffer[i - 1] = '\0'; return (0); } + +const char * +netstat_strerror(int error) +{ + switch (error) { + case NETSTAT_ERROR_NOMEMORY: + return ("Cannot allocate memory"); + case NETSTAT_ERROR_VERSION: + return ("Version mismatch"); + case NETSTAT_ERROR_KVM: + return ("KVM error"); + case NETSTAT_ERROR_KVM_NOSYMBOL: + return ("KVM unable to find symbol"); + case NETSTAT_ERROR_KVM_SHORTREAD: + return ("KVM short read"); + case NETSTAT_ERROR_UNDEFINED: + default: + return ("Unknown error"); + } +} + +struct netstat_list * +netstat_nsl_alloc(void) +{ + struct netstat_list *nslp; + + nslp = malloc(sizeof(*nslp)); + if (nslp == NULL) + return NULL; + + LIST_INIT(&nslp->nsl_list); + nslp->nsl_error = NETSTAT_ERROR_UNDEFINED; + return (nslp); +} + +struct netstat * +netstat_nsl_first(struct netstat_list *list) +{ + return (LIST_FIRST(&list->nsl_list)); +} + +struct netstat * +netstat_nsl_next(struct netstat * nsp) +{ + return (LIST_NEXT(nsp, ns_list)); +} + +void +_netstat_nsl_empty(struct netstat_list *list) +{ + struct netstat *nsp; + + while ((nsp = LIST_FIRST(&list->nsl_list))) { + LIST_REMOVE(nsp, ns_list); + free(nsp); + } +} + +void +_netstat_nsl_free(struct netstat_list *list) +{ + _netstat_nsl_empty(list); + free(list); +} + +int +netstat_nsl_geterror(struct netstat_list *list) +{ + return (list->nsl_error); +} + +struct netstat * +netstat_nsl_find(struct netstat_list *list, int ns_type, + const char *name) +{ + struct netstat *nsp; + + LIST_FOREACH(nsp, &list->nsl_list, ns_list) { + if ((nsp->ns_type == ns_type || + ns_type == NETSTAT_TYPE_ANY) && + strcmp(nsp->ns_name, name) == 0) + return (nsp); + } + return (NULL); +} + +struct netstat * +_netstat_ns_allocate(struct netstat_list *list, int ns_type, + const char *name) +{ + struct netstat *nsp; + + nsp = malloc(sizeof(*nsp)); + if (nsp == NULL) + return (NULL); + + bzero(nsp, sizeof(*nsp)); + + nsp->ns_type = ns_type; + strlcpy(nsp->ns_name, name, NETSTAT_MAXNAME); + LIST_INSERT_HEAD(&list->nsl_list, nsp, ns_list); + return (nsp); +} + +void +_netstat_ns_reset_stats(struct netstat *nsp) +{ +} + +const char * +netstat_get_name(const struct netstat *nsp) +{ + return (nsp->ns_name); +} + +int +netstat_get_type(const struct netstat *nsp) +{ + return (nsp->ns_type); +} +
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906031642.n53GgANE078783>