From owner-p4-projects@FreeBSD.ORG Sat Jun 13 14:13:02 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 5B4191065674; Sat, 13 Jun 2009 14:13:02 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E4FB3106566B for ; Sat, 13 Jun 2009 14:13:01 +0000 (UTC) (envelope-from pgj@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id D22B08FC12 for ; Sat, 13 Jun 2009 14:13:01 +0000 (UTC) (envelope-from pgj@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n5DED1cW064183 for ; Sat, 13 Jun 2009 14:13:01 GMT (envelope-from pgj@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n5DED1Fm064181 for perforce@freebsd.org; Sat, 13 Jun 2009 14:13:01 GMT (envelope-from pgj@FreeBSD.org) Date: Sat, 13 Jun 2009 14:13:01 GMT Message-Id: <200906131413.n5DED1Fm064181@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to pgj@FreeBSD.org using -f From: Gabor Pali To: Perforce Change Reviews Cc: Subject: PERFORCE change 164271 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 13 Jun 2009 14:13:03 -0000 http://perforce.freebsd.org/chv.cgi?CH=164271 Change 164271 by pgj@petymeg-current on 2009/06/13 14:12:39 Respect WARNS=3 Affected files ... .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/Makefile#6 edit .. //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.c#25 edit Differences ... ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/Makefile#6 (text+ko) ==== @@ -14,7 +14,7 @@ DPADD= ${LIBKVM} LDADD= -lkvm -#WARNS?= 3 +WARNS?= 3 WITHOUT_MAN= yes ==== //depot/projects/soc2009/pgj_libstat/src/lib/libnetstat/netstat.c#25 (text+ko) ==== @@ -1,4 +1,5 @@ +#include #include #include #include @@ -23,32 +24,36 @@ #include "netstat.h" #include "netstat_internal.h" -static struct nlist nl[] = { -/* UNP_###-related */ -#define X_UNP_COUNT 0 - { .n_name = "_unp_count" }, -#define X_UNP_GENCNT 1 - { .n_name = "_unp_gencnt" }, -#define X_UNP_DHEAD 2 - { .n_name = "_unp_dhead" }, -#define X_UNP_SHEAD 3 - { .n_name = "_unp_shead" }, - { .n_name = NULL }, -/* INET-related */ -#define X_TCBINFO 5 - { .n_name = "_tcbinfo" }, -#define X_UDBINFO 6 - { .n_name = "_udbinfo" }, -#define X_DIVCBINFO 7 - { .n_name = "_divcbinfo" }, -#define X_RIPCBINFO 8 - { .n_name = "_ripcbinfo" }, - { .n_name = NULL }, +/* nlist(3) indices and symbols. */ +enum nlUNP { + nlUNP_count = 0, + nlUNP_gencnt, + nlUNP_dhead, + nlUNP_shead, + nlUNP_MAX +}; + +static const char *const unp_symbol[] = + { "_unp_count", "_unp_gencnt", "_unp_dhead", "_unp_shead" }; + +enum nlINP { + nlINP_tcbinfo = 0, + nlINP_udbinfo, + nlINP_divcbinfo, + nlINP_ripcbinfo, + nlINP_MAX }; +static const char *const inp_symbol[] = + { "_tcbinfo", "_udbinfo", "_divcbinfo", "_ripcbinfo" }; + static void extract_xunpcb_data(struct xunpcb *, struct socket_type *); static void extract_inet_data(struct tcpcb *, struct inpcb *, struct xsocket *, struct socket_type *); +static int netstat_local_sockets(int, struct socket_type_list *, kvm_t *, + struct nlist *, int); +static int netstat_inet_sockets(int, int, struct socket_type_list *, + kvm_t *, struct nlist *, int); /* type names */ static const char *const socktype[] = @@ -56,7 +61,7 @@ static int net_local_pcblist_sysctl(int family, int type, struct socket_type_list *list, - int flags) + __unused int flags) { char *buf; size_t len; @@ -218,7 +223,7 @@ static int net_local_pcblist_kvm(int family, int type, struct socket_type_list *list, - kvm_t *kvm, struct nlist *nlistp, int flags) + kvm_t *kvm, struct nlist *nlistp, __unused int flags) { struct unp_head head; struct unpcb *unp, unp_conn; @@ -230,8 +235,8 @@ struct socket_type *stp; u_long count_off, gencnt_off, head_off; - count_off = nlistp[X_UNP_COUNT].n_value; - gencnt_off = nlistp[X_UNP_GENCNT].n_value; + count_off = nlistp[nlUNP_count].n_value; + gencnt_off = nlistp[nlUNP_gencnt].n_value; if (count_off == 0 || gencnt_off == 0) { list->stl_error = NETSTAT_ERROR_UNDEFINED; @@ -239,10 +244,10 @@ } switch (type) { case SOCK_STREAM: - head_off = nlistp[X_UNP_SHEAD].n_value; + head_off = nlistp[nlUNP_shead].n_value; break; case SOCK_DGRAM: - head_off = nlistp[X_UNP_DHEAD].n_value; + head_off = nlistp[nlUNP_dhead].n_value; break; default: list->stl_error = NETSTAT_ERROR_UNDEFINED; @@ -289,36 +294,35 @@ static int net_inet_pcblist_kvm(int family, int protocol, struct socket_type_list *list, - kvm_t *kvm, struct nlist *nlistp, int flags) + kvm_t *kvm, struct nlist *nlistp, __unused int flags) { struct inpcbinfo pcbinfo; struct inpcbhead listhead; struct inpcb *inp; struct xinpcb xi; - struct xinpgen xig; struct xtcpcb xt; struct tcpcb *tcb = NULL; struct socket so; - struct xsocket *xso; + struct xsocket xso; u_long off; struct socket_type *stp; switch (protocol) { case IPPROTO_TCP: - off = nlistp[X_TCBINFO].n_value; + off = nlistp[nlINP_tcbinfo].n_value; break; case IPPROTO_UDP: - off = nlistp[X_UDBINFO].n_value; + off = nlistp[nlINP_udbinfo].n_value; break; case IPPROTO_DIVERT: - off = nlistp[X_DIVCBINFO].n_value; + off = nlistp[nlINP_divcbinfo].n_value; break; case IPPROTO_RAW: case IPPROTO_ICMP: case IPPROTO_IGMP: case IPPROTO_PIM: - off = nlistp[X_RIPCBINFO].n_value; + off = nlistp[nlINP_ripcbinfo].n_value; break; default: list->stl_error = NETSTAT_ERROR_UNDEFINED; @@ -351,18 +355,18 @@ } if (inp->inp_socket) { KREAD(inp->inp_socket, &so, sizeof(so)); - if (sotoxsocket(kvm, &so, xso) != 0) { + if (sotoxsocket(kvm, &so, &xso) != 0) { list->stl_error = NETSTAT_ERROR_UNDEFINED; return (-1); } } else { - bzero(xso, sizeof(*xso)); + bzero(&xso, sizeof(xso)); if (protocol == IPPROTO_TCP) - xso->xso_protocol = protocol; + xso.xso_protocol = protocol; } stp = _netstat_st_allocate(list, family, protocol, ipproto(protocol)); - extract_inet_data(tcb, inp, xso, stp); + extract_inet_data(tcb, inp, &xso, stp); } return (0); @@ -389,7 +393,7 @@ int netstat_local_sockets(int type, struct socket_type_list *list, kvm_t *kvm, - struct nlist *nl, int flags) + struct nlist *nlp, int flags) { int use_kvm = flags & NETSTAT_SOCKET_KVM; @@ -397,7 +401,7 @@ case SOCK_STREAM: case SOCK_DGRAM: if (use_kvm) - NPCB_KVM(local, PF_LOCAL, type, list, kvm, nl, + NPCB_KVM(local, PF_LOCAL, type, list, kvm, nlp, flags); else /* Use sysctl (or something else). */ @@ -407,9 +411,9 @@ case 0: if (use_kvm) { NPCB_KVM(local, PF_LOCAL, SOCK_STREAM, list, kvm, - nl, flags); + nlp, flags); NPCB_KVM(local, PF_LOCAL, SOCK_DGRAM, list, kvm, - nl, flags); + nlp, flags); } else { NPCB_SCT(local, PF_LOCAL, SOCK_STREAM, list, flags); @@ -426,7 +430,7 @@ int netstat_inet_sockets(int domain, int protocol, struct socket_type_list *list, - kvm_t *kvm, struct nlist *nl, int flags) + kvm_t *kvm, struct nlist *nlp, int flags) { int use_kvm = flags & NETSTAT_SOCKET_KVM; @@ -440,7 +444,7 @@ case IPPROTO_PIM: case IPPROTO_ICMPV6: if (use_kvm) - NPCB_KVM(inet, domain, protocol, list, kvm, nl, + NPCB_KVM(inet, domain, protocol, list, kvm, nlp, flags); else NPCB_SCT(inet, domain, protocol, list, flags); @@ -450,13 +454,13 @@ /* Errors do not count here. */ if (use_kvm) { net_inet_pcblist_kvm(domain, IPPROTO_TCP, list, kvm, - nl, flags); + nlp, flags); net_inet_pcblist_kvm(domain, IPPROTO_UDP, list, kvm, - nl, flags); + nlp, flags); net_inet_pcblist_kvm(domain, IPPROTO_DIVERT, list, - kvm, nl, flags); + kvm, nlp, flags); net_inet_pcblist_kvm(domain, IPPROTO_RAW, list, kvm, - nl, flags); + nlp, flags); } else { net_inet_pcblist_sysctl(domain, IPPROTO_TCP, list, flags); @@ -484,56 +488,69 @@ struct socket_type_list *list, int flags, void *kvm_handle) { kvm_t *kvm; - int result; - struct nlist *nlp = NULL; + int result, i; + struct nlist nls[MAX(nlUNP_MAX, nlINP_MAX) + 1]; + nls[0].n_name = NULL; if (flags & NETSTAT_SOCKET_KVM) { /* Use KVM to retrieve data. */ + kvm = (kvm_t *)kvm_handle; switch (domain) { case PF_LOCAL: - nlp = &nl[X_UNP_COUNT]; + for (i = 0; i < nlUNP_MAX; i++) + nls[i].n_name = strdup(unp_symbol[i]); + nls[nlUNP_MAX].n_name = NULL; break; case PF_INET: case PF_INET6: - nlp = &nl[X_TCBINFO]; + for (i = 0; i < nlINP_MAX; i++) + nls[i].n_name = strdup(inp_symbol[i]); + nls[nlINP_MAX].n_name = NULL; break; default: break; } - kvm = (kvm_t *)kvm_handle; - if (kvm_nlist(kvm, nlp) < 0) { + if (kvm_nlist(kvm, nls) < 0) { list->stl_error = NETSTAT_ERROR_KVM; - return (-1); + result = -1; + goto end; } } switch (domain) { case PF_UNSPEC: /* "Everything" */ - result = netstat_local_sockets(0, list, kvm, nl, flags); + result = netstat_local_sockets(0, list, kvm, nls, flags); if (result < 0) - return (result); - result = netstat_inet_sockets(PF_INET, 0, list, kvm, nl, + goto end; + result = netstat_inet_sockets(PF_INET, 0, list, kvm, nls, flags); if (result < 0) - return (result); - result = netstat_inet_sockets(PF_INET6, 0, list, kvm, nl, + goto end; + result = netstat_inet_sockets(PF_INET6, 0, list, kvm, nls, flags); if (result < 0) - return (result); + goto end; break; case PF_LOCAL: - return (netstat_local_sockets(type, list, kvm, nl, flags)); + result = (netstat_local_sockets(type, list, kvm, nls, flags)); + goto end; break; case PF_INET: case PF_INET6: - return (netstat_inet_sockets(domain, protocol, list, kvm, nl, + result = (netstat_inet_sockets(domain, protocol, list, kvm, nls, flags)); + goto end; break; default: list->stl_error = NETSTAT_ERROR_UNSUPPORTED; - return (-1); + result = -1; + goto end; } - return (0); + +end: + for (i = 0; nls[i].n_name != NULL && i < MAX(nlUNP_MAX, nlINP_MAX); i++) + free(nls[i].n_name); + return (result); } void