patches/wine-06-iphlpapi.diff
author trisk
Fri, 08 Aug 2008 02:46:44 +0000
changeset 1288 887909a3c624
parent 1265 205cb8a210b5
permissions -rw-r--r--
2008-08-07 Albert Lee <[email protected]> * SFEgtetrinet.spec: *NEW* Client program for the popular Tetrinet game * SFEwine.spec: Bump to 1.1.2 * base-specs/ffmpeg.spec: Add patch6, update CFLAGS * base-specs/gst-ffmpeg.spec: Add patch3, patch4, patch5, patch6 from Debian * base-specs/gst-plugins-bad.spec: Re-enable faad, theora * base-specs/gst-plugins-ugly.spec: Add patch2 to use libdvdnav * encumbered/SFEgnome-media-extras.spec: Update dependencies * encumbered/SFEvlc.spec encumbered/SFEogle.spec encumbered/SFEdvdauthor.spec encumbered/SFEmplayer.spec: Rename SFElibdvdread dependency to SFElibdvdnav * patches/ffmpeg-03-v4l2.diff: Update for 0.4.9-p20080326 * patches/ffmpeg-06-cve-2008-3162.diff: Fix for CVE-2008-3162 * patches/gst-ffmpeg-03-new-codec-ids.diff: Support audio/x-vorbis * patches/gst-ffmpeg-04-av_picture_copy.diff: Don't need to convert * patches/gst-ffmpeg-05-disable-aac.diff: Don't use gst-ffmpeg for AAC * patches/gst-ffmpeg-06-disable-mpegts.diff: Don't use gst-ffmpeg for MPEG-TS * patches/gst-plugins-ugly-01-gettext.diff: Update for 0.10.8 * patches/gst-plugins-ugly-02-dvdnav.diff: Update libdvdnav support * patches/wine-06-iphlpapi.diff: Update for 1.1.2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
     1
diff -ur wine-0.9.59.orig/configure.ac wine-0.9.59/configure.ac
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
     2
--- wine-0.9.59.orig/configure.ac	Fri Apr  4 10:55:13 2008
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
     3
+++ wine-0.9.59/configure.ac	Thu Apr 10 12:39:48 2008
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
     4
@@ -242,9 +242,11 @@
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
     5
 	fontconfig/fontconfig.h \
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
     6
 	getopt.h \
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
     7
 	ieeefp.h \
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
     8
+	inet/ip.h \
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
     9
 	io.h \
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    10
 	jack/jack.h \
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    11
 	jpeglib.h \
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    12
+	kstat.h \
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    13
 	lber.h \
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    14
 	lcms.h \
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    15
 	lcms/lcms.h \
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    16
@@ -288,6 +290,7 @@
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    17
 	soundcard.h \
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    18
 	stdint.h \
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    19
 	strings.h \
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    20
+	stropts.h \
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    21
 	sys/asoundlib.h \
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    22
 	sys/cdio.h \
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    23
 	sys/elf32.h \
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    24
@@ -319,11 +322,14 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    25
 	sys/sockio.h \
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    26
 	sys/soundcard.h \
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    27
 	sys/statvfs.h \
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    28
+	sys/stream.h \
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    29
 	sys/strtio.h \
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    30
 	sys/syscall.h \
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    31
 	sys/sysctl.h \
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    32
+	sys/tihdr.h \
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    33
 	sys/time.h \
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    34
 	sys/times.h \
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    35
+	sys/tiuser.h \
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    36
 	sys/uio.h \
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    37
 	sys/un.h \
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    38
 	sys/vm86.h \
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    39
@@ -922,6 +928,39 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    40
          RESOLVLIBS="-lresolv"])
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    41
 fi
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    42
 
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    43
+dnl **** Check for Solaris kstat library ***
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    44
+AC_SUBST(KSTATLIBS,"")
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    45
+if test "$ac_cv_header_kstat_h" = "yes"
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    46
+then
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    47
+    AC_CHECK_LIB(kstat, kstat_open,
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    48
+        [AC_DEFINE(HAVE_KSTAT, 1, [Define if you have the Solaris kstat library and header])
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    49
+         KSTATLIBS="-lkstat"])
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    50
+fi
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    51
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    52
+dnl **** Check for STREAMS Transport Provider Interface (TPI) ***
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    53
+if test "$ac_cv_header_stropts_h" = "yes" -a "$ac_cv_header_sys_stream_h" = "yes" -a \
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    54
+    "$ac_cv_header_sys_tihdr_h" = "yes" -a "$ac_cv_header_sys_tiuser_h" = "yes" -a \
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    55
+    "$ac_cv_header_inet_ip_h" = "yes"
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    56
+then
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    57
+    AC_CACHE_CHECK([for the STREAMS Transport Provider Interface (TPI)],
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    58
+        ac_cv_c_streams_tpi,
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    59
+        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    60
+#include <stropts.h>
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    61
+#include <sys/stream.h>
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    62
+#include <sys/tihdr.h>
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    63
+#include <sys/tiuser.h>
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    64
+#include <inet/ip.h>
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    65
+struct T_optmgmt_req *tor = (struct T_optmgmt_req *)NULL;
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    66
+        ]], [[ioctl(1, I_PUSH, NULL)]])], [ac_cv_c_streams_tpi=yes],[ac_cv_c_streams_tpi=no])
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    67
+   )
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    68
+
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    69
+   if test "$ac_cv_c_streams_tpi" = "yes"
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    70
+   then
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    71
+      AC_DEFINE(HAVE_STREAMS_TPI, 1,
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    72
+                [Define if you have the STREAMS Transport Provider Interface (TPI)])
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    73
+   fi
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    74
+fi
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    75
+
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    76
 dnl **** Check for LittleCMS ***
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    77
 AC_SUBST(LCMSLIBS,"")
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    78
 if test "$ac_cv_header_lcms_h" = "yes" -o "$ac_cv_header_lcms_lcms_h" = "yes"
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    79
diff -ur wine-0.9.59.orig/dlls/iphlpapi/Makefile.in wine-0.9.59/dlls/iphlpapi/Makefile.in
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    80
--- wine-0.9.59.orig/dlls/iphlpapi/Makefile.in	Fri Apr  4 10:55:13 2008
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
    81
+++ wine-0.9.59/dlls/iphlpapi/Makefile.in	Thu Apr 10 12:39:48 2008
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    82
@@ -5,7 +5,7 @@
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    83
 MODULE    = iphlpapi.dll
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    84
 IMPORTLIB = iphlpapi
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    85
 IMPORTS   = advapi32 kernel32
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    86
-EXTRALIBS = @RESOLVLIBS@
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    87
+EXTRALIBS = @RESOLVLIBS@ @KSTATLIBS@
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    88
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    89
 C_SRCS = \
1288
887909a3c624 2008-08-07 Albert Lee <[email protected]>
trisk
parents: 1265
diff changeset
    90
 	icmp.c \
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
    91
--- wine-1.1.0.orig/dlls/iphlpapi/ipstats.c	2008-06-27 10:24:42.000000000 -0400
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
    92
+++ wine-1.1.0/dlls/iphlpapi/ipstats.c	2008-07-08 23:55:20.355580812 -0400
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
    93
@@ -1,5 +1,21 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    94
 /* Copyright (C) 2003,2006 Juan Lang
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    95
  * Copyright (C) 2007 TransGaming Technologies Inc.
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    96
+ * Copyright (c) 2008 Albert Lee <[email protected]>
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    97
+ * Portions derived from netstat.c with the following copyright:
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
    98
+ * Copyright (c) Sun Microsystems, Inc.  1994. All rights reserved.
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
    99
+ *
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   100
+ * License is granted to copy, to use, and to make and to use derivative works
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   101
+ * for research and evaluation purposes, provided that Sun Microsystems is
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   102
+ * acknowledged in all documentation pertaining to any such copy or
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   103
+ * derivative work. Sun Microsystems grants no other licenses expressed or
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   104
+ * implied. The Sun Microsystems  trade name should not be used in any
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   105
+ * advertising without its written permission.
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   106
+ *
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   107
+ * SUN MICROSYSTEMS MERCHANTABILITY OF THIS SOFTWARE OR THE SUITABILITY OF THIS
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   108
+ * SOFTWARE FOR ANY PARTICULAR PURPOSE.  The software is provided "as is"
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   109
+ * without express or implied warranty of any kind.
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   110
+ *
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   111
+ * These notices must be retained in any copies of any part of this software.
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   112
  *
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   113
  * This library is free software; you can redistribute it and/or
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   114
  * modify it under the terms of the GNU Lesser General Public
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   115
@@ -16,10 +32,11 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   116
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   117
  *
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   118
  * This file implements statistics getting using the /proc filesystem exported
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   119
- * by Linux, and maybe other OSes.
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   120
+ * by Linux, BSD sysctls, Solaris libkstat, and TPI on platforms with STREAMS.
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   121
  */
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   122
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   123
 #include "config.h"
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   124
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   125
 #include "wine/port.h"
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   126
 #include "wine/debug.h"
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   127
 
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   128
@@ -99,6 +116,32 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   129
 #include <sys/sysctl.h>
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   130
 #endif
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   131
 
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   132
+#ifdef HAVE_KSTAT_H
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   133
+#include <kstat.h>
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   134
+#endif
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   135
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   136
+#ifdef HAVE_STROPTS_H
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   137
+#include <stropts.h>
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   138
+#ifdef HAVE_SYS_STREAM_H
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   139
+#include <sys/stream.h>
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   140
+#endif
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   141
+#ifdef HAVE_SYS_TIHDR_H
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   142
+#include <sys/tihdr.h>
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   143
+#endif
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   144
+#ifdef HAVE_SYS_TIUSER_H
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   145
+#include <sys/tiuser.h>
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   146
+#endif
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   147
+#ifdef HAVE_INET_IP_H
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   148
+#include <inet/ip.h>
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   149
+#ifndef IRE_CACHETABLE
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   150
+#define IRE_CACHETABLE (IRE_CACHE|IRE_BROADCAST|IRE_LOCAL|IRE_LOOPBACK)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   151
+#endif
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   152
+/* To work around redefined ERR macro */
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   153
+#undef ERR
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   154
+#define ERR WINE_ERR
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   155
+#endif
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   156
+#endif
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   157
+
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   158
 #ifndef ROUNDUP
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   159
 #define ROUNDUP(a) \
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   160
 	((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   161
@@ -129,6 +172,180 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   162
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   163
 WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   164
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   165
+#ifdef HAVE_KSTAT
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   166
+struct kstat_mib_map {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   167
+  const char *name;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   168
+  unsigned int offset;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   169
+};
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   170
+#endif
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   171
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   172
+#ifdef HAVE_STREAMS_TPI
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   173
+typedef struct mib_item_s {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   174
+  struct mib_item_s *next_item;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   175
+  long group;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   176
+  long mib_id;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   177
+  long length;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   178
+  char *valp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   179
+} mib_item_t;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   180
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   181
+static int mibopen(void);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   182
+static mib_item_t *mibget(int sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   183
+static void mibfree(mib_item_t *);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   184
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   185
+static const char mib_dev[] = "/dev/arp";
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   186
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   187
+static int mibopen(void)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   188
+{
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   189
+   int sd;
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   190
+   if ((sd = open(mib_dev, O_RDWR)) < 0)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   191
+   {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   192
+     return -1;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   193
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   194
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   195
+   if ((ioctl(sd, I_PUSH, "tcp") < 0) ||
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   196
+       (ioctl(sd, I_PUSH, "udp") < 0) ||
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   197
+       (ioctl(sd, I_PUSH, "icmp") < 0)) {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   198
+     close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   199
+     return -1;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   200
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   201
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   202
+   return sd;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   203
+}
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   204
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   205
+static mib_item_t *
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   206
+mibget(int sd)
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   207
+{
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   208
+  char buf[512];
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   209
+  int flags;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   210
+  int j, getcode;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   211
+  struct strbuf ctlbuf, databuf;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   212
+  struct T_optmgmt_req *tor = (struct T_optmgmt_req *)buf;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   213
+  struct T_optmgmt_ack *toa = (struct T_optmgmt_ack *)buf;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   214
+  struct T_error_ack   *tea = (struct T_error_ack *)buf;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   215
+  struct opthdr *req;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   216
+  mib_item_t    *first_item = NULL;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   217
+  mib_item_t    *last_item  = NULL;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   218
+  mib_item_t    *temp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   219
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   220
+#ifdef T_SVR4_OPTMGMT_REQ
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   221
+  tor->PRIM_type = T_SVR4_OPTMGMT_REQ;
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   222
+#else
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   223
+  tor->PRIM_type = T_OPTMGMT_REQ;
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   224
+#endif
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   225
+  tor->OPT_offset = sizeof(struct T_optmgmt_req);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   226
+  tor->OPT_length = sizeof(struct opthdr);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   227
+  tor->MGMT_flags = T_CURRENT;
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   228
+
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   229
+  req = (struct opthdr *)(tor + 1);
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   230
+  req->level = MIB2_IP;
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   231
+  req->name = req->len = 0;
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   232
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   233
+  ctlbuf.buf = buf;
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   234
+  ctlbuf.maxlen = sizeof(buf);
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   235
+  ctlbuf.len = tor->OPT_length + tor->OPT_offset;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   236
+  flags = 0;
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   237
+  if (putmsg(sd, &ctlbuf, (struct strbuf *)NULL, flags) == -1)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   238
+  {
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   239
+    ERR ("mibget putmsg(ctl) failed\n");
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   240
+    goto error_exit;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   241
+  }
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   242
+
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   243
+  req = (struct opthdr *)(toa + 1);
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   244
+  for (j=1; ; j++)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   245
+  {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   246
+    flags = 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   247
+    getcode = getmsg(sd, &ctlbuf, (struct strbuf *)NULL, &flags);
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   248
+    if (getcode == -1)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   249
+    {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   250
+      ERR ("mibget getmsg(ctl) failed\n");
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   251
+      goto error_exit;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   252
+    }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   253
+    if (getcode == 0
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   254
+        && ctlbuf.len >= sizeof(struct T_optmgmt_ack)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   255
+        && toa->PRIM_type == T_OPTMGMT_ACK
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   256
+        && toa->MGMT_flags == T_SUCCESS
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   257
+        && req->len == 0) {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   258
+      return first_item;    /* this is EOD msg */
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   259
+    }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   260
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   261
+    if (ctlbuf.len >= sizeof(struct T_error_ack)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   262
+    && tea->PRIM_type == T_ERROR_ACK) {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   263
+      ERR (
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   264
+      "mibget %d gives (%d) T_ERROR_ACK: TLI_error = 0x%lx, UNIX_error = 0x%lx\n",
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   265
+        j, getcode, tea->TLI_error, tea->UNIX_error);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   266
+      goto error_exit;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   267
+    }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   268
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   269
+    if (getcode != MOREDATA
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   270
+        || ctlbuf.len < sizeof(struct T_optmgmt_ack)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   271
+        || toa->PRIM_type != T_OPTMGMT_ACK
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   272
+        || toa->MGMT_flags != T_SUCCESS)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   273
+    {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   274
+      ERR (
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   275
+      "mibget getmsg(ctl) %d returned %d, ctlbuf.len = %d, PRIM_type = %ld\n",
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   276
+         j, getcode, ctlbuf.len, toa->PRIM_type);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   277
+      if (toa->PRIM_type == T_OPTMGMT_ACK)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   278
+        ERR (
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   279
+        "T_OPTMGMT_ACK: MGMT_flags = 0x%lx, req->len = %ld\n",
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   280
+          toa->MGMT_flags, req->len);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   281
+      goto error_exit;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   282
+    }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   283
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   284
+    temp = (mib_item_t *)HeapAlloc(GetProcessHeap(), 0, sizeof(mib_item_t));
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   285
+    if (!temp)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   286
+    {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   287
+      ERR ("mibget malloc failed\n");
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   288
+      goto error_exit;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   289
+    }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   290
+    if (last_item)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   291
+      last_item->next_item = temp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   292
+    else
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   293
+      first_item = temp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   294
+    last_item = temp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   295
+    last_item->next_item = NULL;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   296
+    last_item->group = req->level;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   297
+    last_item->mib_id = req->name;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   298
+    last_item->length = req->len;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   299
+    last_item->valp = (char *)HeapAlloc(GetProcessHeap(), 0, req->len);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   300
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   301
+    databuf.maxlen = last_item->length;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   302
+    databuf.buf    = last_item->valp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   303
+    databuf.len    = 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   304
+    flags = 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   305
+    getcode = getmsg(sd, (struct strbuf *)NULL, &databuf, &flags);
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   306
+    if (getcode == -1)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   307
+    {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   308
+      ERR ("mibget getmsg(data) failed\n");
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   309
+      goto error_exit;
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   310
+    } else if (getcode != 0)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   311
+    {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   312
+      ERR (
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   313
+      "mibget getmsg(data) returned %d, databuf.maxlen = %d, databuf.len = %d\n",
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   314
+         getcode, databuf.maxlen, databuf.len);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   315
+      goto error_exit;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   316
+    }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   317
+  }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   318
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   319
+error_exit:;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   320
+  mibfree(first_item);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   321
+  return NULL;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   322
+}
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   323
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   324
+static void
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   325
+mibfree(mib_item_t * first_item)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   326
+{
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   327
+  mib_item_t *last_item;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   328
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   329
+  while (first_item) {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   330
+    last_item = first_item;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   331
+    first_item = first_item->next_item;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   332
+    if (last_item->valp)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   333
+      HeapFree(GetProcessHeap(), 0, last_item->valp);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   334
+    HeapFree(GetProcessHeap(), 0, last_item);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   335
+  }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   336
+}
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   337
+#endif
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   338
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   339
 DWORD getInterfaceStatsByName(const char *name, PMIB_IFROW entry)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   340
 {
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   341
 #if defined(HAVE_SYS_SYSCTL_H) && defined(NET_RT_IFLIST)
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   342
@@ -178,7 +395,73 @@
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   343
       }
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   344
       HeapFree (GetProcessHeap (), 0, buf);
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   345
       return ERROR_NOT_SUPPORTED;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   346
-#else
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   347
+#elif defined(HAVE_KSTAT)
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   348
+  static const struct kstat_mib_map ifrow_map[] =
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   349
+  {
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   350
+    { "rbytes", offsetof(MIB_IFROW, dwInOctets) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   351
+    { "norcvbuf", offsetof(MIB_IFROW, dwInDiscards) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   352
+    { "ierrors", offsetof(MIB_IFROW, dwInErrors) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   353
+    { "unknowns", offsetof(MIB_IFROW, dwInUnknownProtos) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   354
+    { "obytes", offsetof(MIB_IFROW, dwOutOctets) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   355
+    { "noxmtbuf", offsetof(MIB_IFROW, dwOutDiscards) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   356
+    { "oerrors", offsetof(MIB_IFROW, dwOutErrors) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   357
+    { NULL, 0 },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   358
+  };
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   359
+
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   360
+  kstat_ctl_t *kc;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   361
+  kstat_t *ksp, *mac_ksp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   362
+  kstat_named_t *knp;
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   363
+
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   364
+  if (!name || !entry)
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   365
+    return ERROR_INVALID_PARAMETER;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   366
+
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   367
+  /* get interface stats from driver or mac module
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   368
+     no outQLen */
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   369
+  kc = kstat_open();
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   370
+  ksp = kstat_lookup(kc, NULL, -1, (char *)name);
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   371
+  if (ksp)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   372
+  { /* Check if the interface has a MAC, and use that instead */
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   373
+    int i;
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   374
+    if ((mac_ksp = kstat_lookup(kc, ksp->ks_module, ksp->ks_instance, (char *)"mac")) != NULL)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   375
+      ksp = mac_ksp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   376
+    kstat_read(kc, ksp, NULL);
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   377
+    for (i = 0; ifrow_map[i].name != NULL; i++)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   378
+    {
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   379
+      if ((knp = kstat_data_lookup(ksp, (char *)ifrow_map[i].name)) != NULL)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   380
+        *(DWORD *)((char *)entry + ifrow_map[i].offset) = knp->value.ui32;
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   381
+    }
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   382
+    if ((knp = kstat_data_lookup(ksp, (char *)"ifspeed")) != NULL)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   383
+    {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   384
+      entry->dwSpeed = knp->value.ui64;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   385
+      /* Windows doesn't believe in 10G Ethernet */
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   386
+      if (knp->value.ui64 >= ((unsigned long)-1))
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   387
+         entry->dwSpeed = ((unsigned long)-1);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   388
+    }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   389
+    if ((knp = kstat_data_lookup(ksp, (char *)"link_up")) != NULL)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   390
+      entry->dwOperStatus = knp->value.ui32 ?
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   391
+        MIB_IF_OPER_STATUS_OPERATIONAL : MIB_IF_OPER_STATUS_DISCONNECTED;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   392
+    if ((knp = kstat_data_lookup(ksp, (char *)"multircv")) != NULL)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   393
+      entry->dwInNUcastPkts = knp->value.ui32;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   394
+    if ((knp = kstat_data_lookup(ksp, (char *)"brdcstrcv")) != NULL)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   395
+      entry->dwInNUcastPkts += knp->value.ui32;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   396
+    if ((knp = kstat_data_lookup(ksp, (char *)"ipackets")) != NULL)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   397
+      entry->dwInUcastPkts = knp->value.ui32 - entry->dwInNUcastPkts;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   398
+    if ((knp = kstat_data_lookup(ksp, (char *)"multixmt")) != NULL)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   399
+      entry->dwOutNUcastPkts = knp->value.ui32;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   400
+    if ((knp = kstat_data_lookup(ksp, (char *)"brdcstxmt")) != NULL)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   401
+      entry->dwOutNUcastPkts += knp->value.ui32;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   402
+    if ((knp = kstat_data_lookup(ksp, (char *)"opackets")) != NULL)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   403
+      entry->dwOutUcastPkts = knp->value.ui32 - entry->dwOutNUcastPkts;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   404
+    kstat_close(kc);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   405
+  }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   406
+  else
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   407
+  {
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   408
+    kstat_close(kc);
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   409
+    return ERROR_NOT_SUPPORTED;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   410
+  }
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   411
+
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   412
+  return NO_ERROR;
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   413
+#elif defined(__linux__)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   414
   /* get interface stats from /proc/net/dev, no error if can't
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   415
      no inUnknownProtos, outNUcastPkts, outQLen */
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   416
   FILE *fp;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   417
@@ -325,7 +608,68 @@
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   418
   stats->stats.icmpOutStats.dwAddrMaskReps = icmp_stat.icps_outhist[ICMP_MASKREPLY];
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   419
 
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   420
   return NO_ERROR;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   421
-#else
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   422
+#elif defined(HAVE_KSTAT)
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   423
+  static const struct kstat_mib_map icmp_map[] =
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   424
+  {
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   425
+    { "inMsgs", offsetof(MIB_ICMP, stats.icmpInStats.dwMsgs) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   426
+    { "inErrors", offsetof(MIB_ICMP, stats.icmpInStats.dwErrors) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   427
+    { "inDestUnreachs", offsetof(MIB_ICMP, stats.icmpInStats.dwDestUnreachs) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   428
+    { "inTimeExcds", offsetof(MIB_ICMP, stats.icmpInStats.dwTimeExcds) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   429
+    { "inParmProbs", offsetof(MIB_ICMP, stats.icmpInStats.dwParmProbs) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   430
+    { "inSrcQuenchs", offsetof(MIB_ICMP, stats.icmpInStats.dwSrcQuenchs) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   431
+    { "inRedirects", offsetof(MIB_ICMP, stats.icmpInStats.dwRedirects) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   432
+    { "inEchos", offsetof(MIB_ICMP, stats.icmpInStats.dwEchos) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   433
+    { "inEchoReps", offsetof(MIB_ICMP, stats.icmpInStats.dwEchoReps) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   434
+    { "inTimestamps", offsetof(MIB_ICMP, stats.icmpInStats.dwTimestamps) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   435
+    { "inTimestampReps", offsetof(MIB_ICMP, stats.icmpInStats.dwTimestampReps) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   436
+    { "inAddrMasks", offsetof(MIB_ICMP, stats.icmpInStats.dwAddrMasks) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   437
+    { "inAddrMaskReps", offsetof(MIB_ICMP, stats.icmpInStats.dwAddrMaskReps) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   438
+    { "outMsgs", offsetof(MIB_ICMP, stats.icmpOutStats.dwMsgs) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   439
+    { "outErrors", offsetof(MIB_ICMP, stats.icmpOutStats.dwErrors) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   440
+    { "outDestUnreachs", offsetof(MIB_ICMP, stats.icmpOutStats.dwDestUnreachs) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   441
+    { "outTimeExcds", offsetof(MIB_ICMP, stats.icmpOutStats.dwTimeExcds) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   442
+    { "outParmProbs", offsetof(MIB_ICMP, stats.icmpOutStats.dwParmProbs) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   443
+    { "outSrcQuenchs", offsetof(MIB_ICMP, stats.icmpOutStats.dwSrcQuenchs) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   444
+    { "outRedirects", offsetof(MIB_ICMP, stats.icmpOutStats.dwRedirects) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   445
+    { "outEchos", offsetof(MIB_ICMP, stats.icmpOutStats.dwEchos) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   446
+    { "outEchoReps", offsetof(MIB_ICMP, stats.icmpOutStats.dwEchoReps) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   447
+    { "outTimestamps", offsetof(MIB_ICMP, stats.icmpOutStats.dwTimestamps) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   448
+    { "outTimestampReps", offsetof(MIB_ICMP, stats.icmpOutStats.dwTimestampReps) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   449
+    { "outAddrMasks", offsetof(MIB_ICMP, stats.icmpOutStats.dwAddrMasks) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   450
+    { "outAddrMaskReps", offsetof(MIB_ICMP, stats.icmpOutStats.dwAddrMaskReps) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   451
+    { NULL, 0 }
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   452
+  };
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   453
+
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   454
+  kstat_ctl_t *kc;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   455
+  kstat_t *ksp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   456
+  kstat_named_t *knp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   457
+  int i;
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   458
+
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   459
+  if (!stats)
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   460
+    return ERROR_INVALID_PARAMETER;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   461
+  
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   462
+  memset(stats, 0, sizeof(MIB_ICMP));
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   463
+
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   464
+  kc = kstat_open();
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   465
+  ksp = kstat_lookup(kc, (char *)"ip", 0, (char *)"icmp");
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   466
+  if (ksp)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   467
+  {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   468
+    kstat_read(kc, ksp, NULL);
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   469
+    for (i = 0; icmp_map[i].name != NULL; i++)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   470
+    {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   471
+      if ((knp = kstat_data_lookup(ksp, (char *)icmp_map[i].name)) != NULL)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   472
+        *(DWORD *)((char *)stats + icmp_map[i].offset) = knp->value.ui32;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   473
+    }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   474
+    kstat_close(kc);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   475
+  }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   476
+  else
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   477
+  {
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   478
+    kstat_close(kc);
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   479
+    return ERROR_NOT_SUPPORTED;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   480
+  }
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   481
+
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   482
+  return NO_ERROR;
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   483
+#elif defined(__linux__)
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   484
   FILE *fp;
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   485
 
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   486
   if (!stats)
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   487
@@ -510,7 +854,62 @@
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   488
   stats->dwReasmReqds = ip_stat.ips_fragments;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   489
 
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   490
   return NO_ERROR;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   491
-#else
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   492
+#elif defined(HAVE_KSTAT)
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   493
+  static const struct kstat_mib_map ipstats_map[] =
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   494
+  {
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   495
+    { "forwarding", offsetof(MIB_IPSTATS, dwForwarding) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   496
+    { "defaultTTL", offsetof(MIB_IPSTATS, dwDefaultTTL) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   497
+    { "inReceives", offsetof(MIB_IPSTATS, dwInReceives) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   498
+    { "inHdrErrors", offsetof(MIB_IPSTATS, dwInHdrErrors) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   499
+    { "inAddrErrors", offsetof(MIB_IPSTATS, dwInAddrErrors) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   500
+    { "forwDatagrams", offsetof(MIB_IPSTATS, dwForwDatagrams) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   501
+    { "inUnknownProtos", offsetof(MIB_IPSTATS, dwInUnknownProtos) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   502
+    { "inDiscards", offsetof(MIB_IPSTATS, dwInDiscards) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   503
+    { "inDelivers", offsetof(MIB_IPSTATS, dwInDelivers) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   504
+    { "outRequests", offsetof(MIB_IPSTATS, dwOutRequests) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   505
+    { "routingDiscards", offsetof(MIB_IPSTATS, dwRoutingDiscards) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   506
+    { "outDiscards", offsetof(MIB_IPSTATS, dwOutDiscards) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   507
+    { "outNoRoutes", offsetof(MIB_IPSTATS, dwOutNoRoutes) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   508
+    { "reasmTimeout", offsetof(MIB_IPSTATS, dwReasmTimeout) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   509
+    { "reasmReqds", offsetof(MIB_IPSTATS, dwReasmReqds) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   510
+    { "reasmOks", offsetof(MIB_IPSTATS, dwReasmOks) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   511
+    { "reasmFails", offsetof(MIB_IPSTATS, dwReasmFails) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   512
+    { "fragOks", offsetof(MIB_IPSTATS, dwFragOks) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   513
+    { "fragFails", offsetof(MIB_IPSTATS, dwFragFails) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   514
+    { "fragCreates", offsetof(MIB_IPSTATS, dwFragCreates) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   515
+    { NULL, 0 }
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   516
+  };
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   517
+
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   518
+  kstat_ctl_t *kc;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   519
+  kstat_t *ksp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   520
+  kstat_named_t *knp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   521
+  int i;
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   522
+
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   523
+  if (!stats)
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   524
+    return ERROR_INVALID_PARAMETER;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   525
+
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   526
+  memset(stats, 0, sizeof(MIB_IPSTATS));
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   527
+
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   528
+  kc = kstat_open();
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   529
+  ksp = kstat_lookup(kc, (char *)"ip", 0, (char *)"ip");
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   530
+  if (ksp)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   531
+  {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   532
+    kstat_read(kc, ksp, NULL);
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   533
+    for (i = 0; ipstats_map[i].name != NULL; i++)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   534
+    {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   535
+      if ((knp = kstat_data_lookup(ksp, (char *)ipstats_map[i].name)) != NULL)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   536
+        *(DWORD *)((char *)stats + ipstats_map[i].offset) = knp->value.ui32;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   537
+    }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   538
+    kstat_close(kc);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   539
+  }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   540
+  else
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   541
+  {
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   542
+    kstat_close(kc);
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   543
+    return ERROR_NOT_SUPPORTED;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   544
+  }
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   545
+
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   546
+  return NO_ERROR;
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   547
+#elif defined(__linux__)
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   548
   FILE *fp;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   549
 
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   550
   if (!stats)
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   551
@@ -668,7 +1067,55 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   552
 
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   553
   return NO_ERROR;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   554
 
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   555
-#else
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   556
+#elif defined(HAVE_KSTAT)
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   557
+  static const struct kstat_mib_map tcpstats_map[] =
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   558
+  {
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   559
+    { "rtoAlgorithm", offsetof(MIB_TCPSTATS, dwRtoAlgorithm) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   560
+    { "rtoMin", offsetof(MIB_TCPSTATS, dwRtoMin) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   561
+    { "rtoMax", offsetof(MIB_TCPSTATS, dwRtoMax) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   562
+    { "maxConn", offsetof(MIB_TCPSTATS, dwMaxConn) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   563
+    { "activeOpens", offsetof(MIB_TCPSTATS, dwActiveOpens) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   564
+    { "passiveOpens", offsetof(MIB_TCPSTATS, dwPassiveOpens) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   565
+    { "attemptFails", offsetof(MIB_TCPSTATS, dwAttemptFails) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   566
+    { "estabResets", offsetof(MIB_TCPSTATS, dwEstabResets) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   567
+    { "currEstab", offsetof(MIB_TCPSTATS, dwCurrEstab) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   568
+    { "inSegs", offsetof(MIB_TCPSTATS, dwInSegs) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   569
+    { "outSegs", offsetof(MIB_TCPSTATS, dwOutSegs) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   570
+    { "retransSegs", offsetof(MIB_TCPSTATS, dwRetransSegs) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   571
+    { "inErrs", offsetof(MIB_TCPSTATS, dwInErrs) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   572
+    { "outRsts", offsetof(MIB_TCPSTATS, dwOutRsts) },
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   573
+    { NULL, 0 }
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   574
+  };
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   575
+  kstat_ctl_t *kc;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   576
+  kstat_t *ksp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   577
+  kstat_named_t *knp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   578
+  int i;
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   579
+
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   580
+  if (!stats)
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   581
+    return ERROR_INVALID_PARAMETER;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   582
+
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   583
+  memset(stats, 0, sizeof(MIB_TCPSTATS));
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   584
+
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   585
+  kc = kstat_open();
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   586
+  ksp = kstat_lookup(kc, (char *)"tcp", 0, (char *)"tcp");
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   587
+  if (ksp)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   588
+  {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   589
+    kstat_read(kc, ksp, NULL);
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   590
+    for (i = 0; tcpstats_map[i].name != NULL; i++)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   591
+    {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   592
+      if ((knp = kstat_data_lookup(ksp, (char *)tcpstats_map[i].name)) != NULL)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   593
+        *(DWORD *)((char *)stats + tcpstats_map[i].offset) = knp->value.ui32;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   594
+    }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   595
+    kstat_close(kc);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   596
+  }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   597
+  else
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   598
+  {
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   599
+    kstat_close(kc);
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   600
+    return ERROR_NOT_SUPPORTED;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   601
+  }
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   602
+
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   603
+  return NO_ERROR;
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   604
+#elif defined(__linux__)
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   605
   FILE *fp;
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   606
 
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   607
   if (!stats)
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   608
@@ -789,7 +1236,37 @@
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   609
   stats->dwNumAddrs = getNumUdpEntries();
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   610
 
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   611
   return NO_ERROR;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   612
-#else
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   613
+#elif defined(HAVE_KSTAT)
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   614
+  kstat_ctl_t *kc;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   615
+  kstat_t *ksp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   616
+  kstat_named_t *knp;
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   617
+
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   618
+  if (!stats)
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   619
+    return ERROR_INVALID_PARAMETER;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   620
+
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   621
+  memset(stats, 0, sizeof(MIB_UDPSTATS));
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   622
+
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   623
+  kc = kstat_open();
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   624
+  ksp = kstat_lookup(kc, (char *)"udp", 0, (char *)"udp");
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   625
+  if (ksp)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   626
+  {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   627
+    kstat_read(kc, ksp, NULL);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   628
+    if ((knp = kstat_data_lookup(ksp, (char *)"inDatagrams")) != NULL)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   629
+      stats->dwInDatagrams = knp->value.ui32;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   630
+    if ((knp = kstat_data_lookup(ksp, (char *)"inErrors")) != NULL)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   631
+      stats->dwInErrors = knp->value.ui32;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   632
+    if ((knp = kstat_data_lookup(ksp, (char *)"outDatagrams")) != NULL)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   633
+      stats->dwOutDatagrams = knp->value.ui32;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   634
+    kstat_close(kc);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   635
+  }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   636
+  else
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   637
+  {
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   638
+    kstat_close(kc);
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   639
+    return ERROR_NOT_SUPPORTED;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   640
+  }
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   641
+
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   642
+  return NO_ERROR;
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   643
+#elif defined(__linux__)
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   644
   FILE *fp;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   645
 
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   646
   if (!stats)
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   647
@@ -848,6 +1325,7 @@
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   648
 #endif
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   649
 }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   650
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   651
+#if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_NETINET_IN_PCB_H) || defined(__linux__)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   652
 static DWORD getNumWithOneHeader(const char *filename)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   653
 {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   654
 #if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_NETINET_IN_PCB_H)
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   655
@@ -968,6 +1446,7 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   656
   return ret;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   657
 #endif
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   658
 }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   659
+#endif
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   660
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   661
 DWORD getNumRoutes(void)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   662
 {
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   663
@@ -1016,8 +1495,46 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   664
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   665
    HeapFree (GetProcessHeap (), 0, buf);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   666
    return RouteCount;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   667
-#else
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   668
+#elif defined(HAVE_STREAMS_TPI)
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   669
+   DWORD RouteCount = 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   670
+   int sd;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   671
+   mib_item_t *head, *item;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   672
+   mib2_ipRouteEntry_t *rp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   673
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   674
+   if ((sd = mibopen()) < 0)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   675
+   {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   676
+     ERR ("Unable to open %s to count routes!\n", mib_dev);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   677
+     return 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   678
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   679
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   680
+   if ((head = mibget(sd)) == NULL)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   681
+   {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   682
+     close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   683
+     return 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   684
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   685
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   686
+   for (item = head; item; item = item->next_item)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   687
+   {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   688
+     if ((item->group != MIB2_IP) || (item->mib_id != MIB2_IP_21))
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   689
+       continue;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   690
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   691
+     for (rp = (mib2_ipRouteEntry_t *)item->valp;
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   692
+          (char *)rp < (char *)item->valp + item->length; rp++)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   693
+     {
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   694
+       if ((rp->ipRouteInfo.re_ire_type & IRE_CACHETABLE) != 0)
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   695
+         continue;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   696
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   697
+       RouteCount++;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   698
+     }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   699
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   700
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   701
+   mibfree(head);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   702
+   close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   703
+   return RouteCount;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   704
+#elif defined(__linux__)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   705
    return getNumWithOneHeader("/proc/net/route");
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   706
+#else
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   707
+   return 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   708
 #endif
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   709
 }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   710
 
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   711
@@ -1046,21 +1563,21 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   712
        if (sysctl (mib, 6, NULL, &needed, NULL, 0) < 0)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   713
        {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   714
           ERR ("sysctl 1 failed!\n");
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   715
-          HeapFree (GetProcessHeap (), 0, table);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   716
+          HeapFree (heap, 0, table);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   717
           return NO_ERROR;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   718
        }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   719
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   720
        buf = HeapAlloc (GetProcessHeap (), 0, needed);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   721
        if (!buf)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   722
        {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   723
-          HeapFree (GetProcessHeap (), 0, table);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   724
+          HeapFree (heap, 0, table);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   725
           return ERROR_OUTOFMEMORY;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   726
        }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   727
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   728
        if (sysctl (mib, 6, buf, &needed, NULL, 0) < 0)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   729
        {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   730
           ERR ("sysctl 2 failed!\n");
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   731
-          HeapFree (GetProcessHeap (), 0, table);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   732
+          HeapFree (heap, 0, table);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   733
           HeapFree (GetProcessHeap (), 0, buf);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   734
           return NO_ERROR;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   735
        }
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   736
@@ -1151,7 +1668,76 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   737
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   738
        HeapFree (GetProcessHeap (), 0, buf);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   739
        ret = NO_ERROR;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   740
-#else
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   741
+#elif defined(HAVE_STREAMS_TPI)
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   742
+       DWORD RouteCount = 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   743
+       int sd;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   744
+       mib_item_t *head, *item;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   745
+       mib2_ipRouteEntry_t *rp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   746
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   747
+       if ((sd = mibopen()) < 0)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   748
+       {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   749
+         ERR ("Unable to open %s to list routes!\n", mib_dev);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   750
+         HeapFree(heap, 0, table);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   751
+         return ERROR_NOT_SUPPORTED;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   752
+       }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   753
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   754
+       if ((head = mibget(sd)) == NULL)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   755
+       {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   756
+         HeapFree(heap, 0, table);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   757
+         close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   758
+         return ERROR_NOT_SUPPORTED;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   759
+       }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   760
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   761
+       for (item = head; item; item = item->next_item)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   762
+       {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   763
+         if ((item->group != MIB2_IP) || (item->mib_id != MIB2_IP_21))
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   764
+           continue;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   765
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   766
+         for (rp = (mib2_ipRouteEntry_t *)item->valp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   767
+              (char *)rp < (char *)item->valp + item->length; rp++) {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   768
+           char name[IF_NAMESIZE];
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   769
+           int len;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   770
+           DWORD index;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   771
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   772
+           if (RouteCount == numRoutes) /* in case of race */
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   773
+             break;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   774
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   775
+           if ((rp->ipRouteInfo.re_ire_type & IRE_CACHETABLE) != 0)
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   776
+             continue;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   777
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   778
+           memset(&table->table[RouteCount], 0, sizeof(MIB_IPFORWARDROW));
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   779
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   780
+           table->table[RouteCount].dwForwardDest = rp->ipRouteDest;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   781
+           table->table[RouteCount].dwForwardMask = rp->ipRouteMask;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   782
+           table->table[RouteCount].dwForwardNextHop = rp->ipRouteNextHop;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   783
+             
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   784
+           len = rp->ipRouteIfIndex.o_length;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   785
+           if (len > IF_NAMESIZE - 1)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   786
+             len = IF_NAMESIZE - 1;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   787
+           memcpy(name, rp->ipRouteIfIndex.o_bytes, len);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   788
+           name[len] = '\0';
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   789
+           if (getInterfaceIndexByName(name, &index) == NO_ERROR)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   790
+             table->table[RouteCount].dwForwardIfIndex = index;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   791
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   792
+           table->table[RouteCount].dwForwardType = rp->ipRouteType;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   793
+           table->table[RouteCount].dwForwardProto = rp->ipRouteProto;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   794
+           table->table[RouteCount].dwForwardAge = rp->ipRouteAge;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   795
+           table->table[RouteCount].dwForwardMetric1 = rp->ipRouteMetric1;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   796
+           table->table[RouteCount].dwForwardMetric2 = rp->ipRouteMetric2;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   797
+           table->table[RouteCount].dwForwardMetric3 = rp->ipRouteMetric3;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   798
+           table->table[RouteCount].dwForwardMetric4 = rp->ipRouteMetric4;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   799
+           table->table[RouteCount].dwForwardMetric5 = rp->ipRouteMetric5;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   800
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   801
+           RouteCount++;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   802
+         }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   803
+       }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   804
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   805
+       *ppIpForwardTable = table;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   806
+       table->dwNumEntries = RouteCount;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   807
+       ret = NO_ERROR;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   808
+       mibfree(head);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   809
+       close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   810
+#elif defined(__linux__)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   811
       FILE *fp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   812
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   813
       ret = NO_ERROR;
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   814
@@ -1236,6 +1822,9 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   815
         ERR ("unimplemented!\n");
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   816
         return ERROR_NOT_SUPPORTED;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   817
       }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   818
+#else
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   819
+      ERR ("unimplemented!\n");
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   820
+      return ERROR_NOT_SUPPORTED; 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   821
 #endif
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   822
     }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   823
     else
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   824
@@ -1285,8 +1874,42 @@
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   825
   }
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   826
   HeapFree (GetProcessHeap (), 0, buf);
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   827
   return arpEntries;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   828
-#endif
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   829
+#elif defined(HAVE_STREAMS_TPI)
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   830
+   DWORD ArpCount = 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   831
+   int sd;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   832
+   mib_item_t *head, *item;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   833
+   mib2_ipNetToMediaEntry_t *np;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   834
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   835
+   if ((sd = mibopen()) < 0)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   836
+   {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   837
+     ERR ("Unable to open %s to count ARP entries!\n", mib_dev);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   838
+     return 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   839
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   840
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   841
+   if ((head = mibget(sd)) == NULL) {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   842
+     close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   843
+     return 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   844
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   845
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   846
+   for (item = head; item; item = item->next_item)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   847
+   {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   848
+     if ((item->group != MIB2_IP) || (item->mib_id != MIB2_IP_MEDIA))
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   849
+       continue;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   850
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   851
+     for (np = (mib2_ipNetToMediaEntry_t *)item->valp;
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   852
+            (char *)np < (char *)item->valp + item->length; np++)
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   853
+       ArpCount++;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   854
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   855
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   856
+   mibfree(head);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   857
+   close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   858
+   return ArpCount;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   859
+#elif defined(__linux__)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   860
   return getNumWithOneHeader("/proc/net/arp");
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   861
+#else
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   862
+  ERR ("unimplemented!\n");
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   863
+  return ERROR_NOT_SUPPORTED;
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   864
+#endif
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   865
 }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   866
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   867
 DWORD getArpTable(PMIB_IPNETTABLE *ppIpNetTable, HANDLE heap, DWORD flags)
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   868
@@ -1368,8 +1991,76 @@
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   869
     else
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   870
         ret = ERROR_OUTOFMEMORY;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   871
   return ret;
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   872
-#endif
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   873
+#elif defined(HAVE_STREAMS_TPI)
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   874
+    if (table)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   875
+    {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   876
+      DWORD ArpCount = 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   877
+      int sd;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   878
+      mib_item_t *head, *item;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   879
+      mib2_ipNetToMediaEntry_t *np;
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   880
 
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   881
+      if ((sd = mibopen()) < 0)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   882
+      {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   883
+        ERR ("Unable to open %s to count ARP entries!\n", mib_dev);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   884
+        HeapFree(heap, 0, table);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   885
+        return ERROR_NOT_SUPPORTED;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   886
+      }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   887
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   888
+      if ((head = mibget(sd)) == NULL)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   889
+      {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   890
+        HeapFree(heap, 0, table);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   891
+        close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   892
+        return ERROR_NOT_SUPPORTED;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   893
+      }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   894
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   895
+      for (item = head; item; item = item->next_item)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   896
+      {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   897
+        if ((item->group != MIB2_IP) || (item->mib_id != MIB2_IP_MEDIA))
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   898
+          continue;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   899
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   900
+        for (np = (mib2_ipNetToMediaEntry_t *)item->valp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   901
+               (char *)np < (char *)item->valp + item->length; np++) {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   902
+          char name[IF_NAMESIZE];
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   903
+          int len;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   904
+          DWORD index;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   905
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   906
+          if (ArpCount == numEntries) /* in case of race */
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   907
+            break;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   908
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   909
+          memset(&table->table[ArpCount], 0, sizeof(MIB_IPNETROW));
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   910
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   911
+          len = np->ipNetToMediaIfIndex.o_length;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   912
+          if (len > IF_NAMESIZE - 1)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   913
+            len = IF_NAMESIZE - 1;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   914
+          memcpy(name, np->ipNetToMediaIfIndex.o_bytes, len);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   915
+          name[len] = '\0';
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   916
+          if (getInterfaceIndexByName(name, &index) == NO_ERROR)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   917
+            table->table[ArpCount].dwIndex = index;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   918
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   919
+          len = np->ipNetToMediaPhysAddress.o_length;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   920
+          if (len > MAXLEN_PHYSADDR)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   921
+             len = MAXLEN_PHYSADDR;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   922
+          table->table[ArpCount].dwPhysAddrLen = len;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   923
+          memcpy(table->table[ArpCount].bPhysAddr, np->ipNetToMediaPhysAddress.o_bytes, len);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   924
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   925
+          table->table[ArpCount].dwAddr = np->ipNetToMediaNetAddress;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   926
+          table->table[ArpCount].dwType = np->ipNetToMediaType;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   927
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   928
+          ArpCount++;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   929
+        }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   930
+      }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   931
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   932
+      *ppIpNetTable = table;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   933
+      table->dwNumEntries = ArpCount;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   934
+      ret = NO_ERROR;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   935
+      mibfree(head);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   936
+      close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   937
+    }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   938
+    else
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   939
+      ret = ERROR_OUTOFMEMORY;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   940
+  }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   941
+  return ret;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   942
+#elif defined(__linux__)
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   943
     if (table) {
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   944
       FILE *fp;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   945
       *ppIpNetTable = table;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   946
@@ -1445,14 +2136,52 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   947
       ret = ERROR_OUTOFMEMORY;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   948
   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   949
   return ret;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   950
+#else
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   951
+  ERR ("unimplemented!\n");
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   952
+  return ERROR_NOT_SUPPORTED;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   953
+#endif
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   954
 }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   955
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   956
 DWORD getNumUdpEntries(void)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   957
 {
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   958
 #if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_NETINET_IN_PCB_H)
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   959
    return getNumWithOneHeader ("net.inet.udp.pcblist");
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   960
-#else
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   961
+#elif defined(HAVE_STREAMS_TPI)
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   962
+   DWORD UdpCount = 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   963
+   int sd;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   964
+   mib_item_t *head, *item;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   965
+   mib2_udpEntry_t *ude;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   966
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   967
+   if ((sd = mibopen()) < 0)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   968
+   {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   969
+     ERR ("Unable to open %s to count UDP entries!\n", mib_dev);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   970
+     return 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   971
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   972
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   973
+   if ((head = mibget(sd)) == NULL)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   974
+   {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   975
+     close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   976
+     return 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   977
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   978
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   979
+   for (item = head; item; item = item->next_item)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
   980
+   {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   981
+     if ((item->group != MIB2_UDP) || (item->mib_id != MIB2_UDP_ENTRY))
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   982
+       continue;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   983
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   984
+     for (ude = (mib2_udpEntry_t *)item->valp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   985
+            (char *)ude < (char *)item->valp + item->length; ude++) {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   986
+       UdpCount++;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   987
+     }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   988
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   989
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   990
+   mibfree(head);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   991
+   close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   992
+   return UdpCount;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   993
+#elif defined(__linux__)
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   994
   return getNumWithOneHeader("/proc/net/udp");
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   995
+#else
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   996
+  return 0;
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
   997
 #endif
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   998
 }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
   999
 
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
  1000
@@ -1460,10 +2189,70 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1001
 {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1002
   DWORD ret;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1003
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1004
-#if defined(HAVE_SYS_SYSCTL_H) && defined(NET_RT_DUMP)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1005
-  ERR ("unimplemented!\n");
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1006
-  return ERROR_NOT_SUPPORTED;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1007
-#endif
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1008
+#ifdef HAVE_STREAMS_TPI
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1009
+  if (!ppUdpTable)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1010
+    ret = ERROR_INVALID_PARAMETER;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1011
+  else {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1012
+    DWORD numEntries = getNumUdpEntries();
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1013
+    DWORD size = sizeof(MIB_UDPTABLE);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1014
+    PMIB_UDPTABLE table;
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
  1015
+
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1016
+    if (numEntries > 1)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1017
+      size += (numEntries - 1) * sizeof(MIB_IPNETROW);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1018
+    table = HeapAlloc(heap, flags, size);
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1019
+    if (table)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1020
+    {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1021
+      DWORD UdpCount = 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1022
+      int sd;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1023
+      mib_item_t *head, *item;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1024
+      mib2_udpEntry_t *ude;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1025
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1026
+      if ((sd = mibopen()) < 0)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1027
+      {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1028
+        ERR ("Unable to open %s to list UDP entries!\n", mib_dev);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1029
+        HeapFree(heap, 0, table);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1030
+        return ERROR_NOT_SUPPORTED;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1031
+      }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1032
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1033
+      if ((head = mibget(sd)) == NULL)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1034
+      {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1035
+        HeapFree(heap, 0, table);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1036
+        close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1037
+        return ERROR_NOT_SUPPORTED;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1038
+      }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1039
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1040
+      for (item = head; item; item = item->next_item)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1041
+      {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1042
+        if ((item->group != MIB2_UDP) || (item->mib_id != MIB2_UDP_ENTRY))
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1043
+          continue;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1044
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1045
+        for (ude = (mib2_udpEntry_t *)item->valp;
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1046
+               (char *)ude < (char *)item->valp + item->length; ude++)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1047
+        {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1048
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1049
+          if (UdpCount == numEntries) /* in case of race */
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1050
+            break;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1051
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1052
+          memset(&table->table[UdpCount], 0, sizeof(MIB_UDPROW));
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1053
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1054
+          table->table[UdpCount].dwLocalAddr = ude->udpLocalAddress;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1055
+          table->table[UdpCount].dwLocalPort = ude->udpLocalPort;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1056
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1057
+          UdpCount++;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1058
+        }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1059
+      }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1060
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1061
+      *ppUdpTable = table;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1062
+      table->dwNumEntries = UdpCount;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1063
+      ret = NO_ERROR;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1064
+      mibfree(head);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1065
+      close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1066
+    }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1067
+    else
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1068
+      ret = ERROR_OUTOFMEMORY;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1069
+  }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1070
+  return ret;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1071
+#elif defined(__linux__)
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
  1072
 
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1073
   if (!ppUdpTable)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1074
     ret = ERROR_INVALID_PARAMETER;
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
  1075
@@ -1522,6 +2311,10 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1076
       ret = ERROR_OUTOFMEMORY;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1077
   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1078
   return ret;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1079
+#else
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1080
+  ERR ("unimplemented!\n");
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1081
+  return ERROR_NOT_SUPPORTED;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1082
+#endif
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1083
 }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1084
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1085
 
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
  1086
@@ -1529,14 +2322,48 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1087
 {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1088
 #if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_NETINET_IN_PCB_H)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1089
    return getNumWithOneHeader ("net.inet.tcp.pcblist");
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1090
-#else
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1091
+#elif defined(HAVE_STREAMS_TPI)
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1092
+   DWORD TcpCount = 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1093
+   int sd;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1094
+   mib_item_t *head, *item;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1095
+   mib2_tcpConnEntry_t *tp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1096
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1097
+   if ((sd = mibopen()) < 0)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1098
+   {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1099
+     ERR ("Unable to open %s to count TCP entries!\n", mib_dev);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1100
+     return 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1101
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1102
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1103
+   if ((head = mibget(sd)) == NULL)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1104
+   {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1105
+     close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1106
+     return 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1107
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1108
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1109
+   for (item = head; item; item = item->next_item)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1110
+   {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1111
+     if ((item->group != MIB2_TCP) || (item->mib_id != MIB2_TCP_CONN))
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1112
+       continue;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1113
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1114
+     for (tp = (mib2_tcpConnEntry_t *)item->valp;
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1115
+            (char *)tp < (char *)item->valp + item->length; tp++)
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1116
+       TcpCount++;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1117
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1118
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1119
+   mibfree(head);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1120
+   close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1121
+   return TcpCount;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1122
+#elif defined(__linux__)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1123
    return getNumWithOneHeader ("/proc/net/tcp");
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1124
+#else
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1125
+   return 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1126
 #endif
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1127
 }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1128
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1129
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1130
 /* Why not a lookup table? Because the TCPS_* constants are different
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1131
    on different platforms */
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1132
+#if (defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_NETINET_IN_PCB_H)) || defined(__linux__)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1133
 static DWORD TCPStateToMIBState (int state)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1134
 {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1135
    switch (state)
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
  1136
@@ -1555,6 +2382,7 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1137
       case TCPS_CLOSED: return MIB_TCP_STATE_CLOSED;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1138
    }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1139
 }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1140
+#endif
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1141
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1142
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1143
 DWORD getTcpTable(PMIB_TCPTABLE *ppTcpTable, DWORD maxEntries, HANDLE heap,
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
  1144
@@ -1566,7 +2394,12 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1145
    size_t Len = 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1146
    char *Buf;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1147
    struct xinpgen *pXIG, *pOrigXIG;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1148
-#else
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1149
+#elif defined(HAVE_STREAMS_TPI)
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1150
+   DWORD TcpCount = 0;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1151
+   int sd;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1152
+   mib_item_t *head, *item;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1153
+   mib2_tcpConnEntry_t *tp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1154
+#elif defined(__linux__)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1155
    FILE *fp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1156
    char buf[512] = { 0 }, *ptr;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1157
 #endif
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
  1158
@@ -1677,7 +2510,47 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1159
    }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1160
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1161
    HeapFree (GetProcessHeap (), 0, Buf);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1162
-#else
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1163
+#elif defined(HAVE_STREAMS_TPI)
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1164
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1165
+   if ((sd = mibopen()) < 0)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1166
+   {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1167
+     ERR ("Unable to open %s to list TCP entries!\n", mib_dev);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1168
+     return ERROR_NOT_SUPPORTED;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1169
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1170
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1171
+   if ((head = mibget(sd)) == NULL)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1172
+   {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1173
+     close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1174
+     return ERROR_NOT_SUPPORTED;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1175
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1176
+
1026
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1177
+   for (item = head; item; item = item->next_item)
179f274163dd 2008-04-10 Albert Lee <[email protected]>
trisk
parents: 991
diff changeset
  1178
+   {
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1179
+     if ((item->group != MIB2_TCP) || (item->mib_id != MIB2_TCP_CONN))
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1180
+       continue;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1181
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1182
+     for (tp = (mib2_tcpConnEntry_t *)item->valp;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1183
+         (char *)tp < (char *)item->valp + item->length; tp++) {
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1184
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1185
+       if (TcpCount == numEntries) /* in case of race */
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1186
+         break;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1187
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1188
+       memset(&table->table[TcpCount], 0, sizeof(MIB_TCPROW));
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1189
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1190
+       table->table[TcpCount].dwState = tp->tcpConnState;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1191
+       table->table[TcpCount].dwLocalAddr = tp->tcpConnLocalAddress;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1192
+       table->table[TcpCount].dwLocalPort = tp->tcpConnLocalPort;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1193
+       table->table[TcpCount].dwRemoteAddr = tp->tcpConnRemAddress;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1194
+       table->table[TcpCount].dwRemotePort = tp->tcpConnRemPort;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1195
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1196
+       TcpCount++;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1197
+     }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1198
+   }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1199
+
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1200
+   table->dwNumEntries = TcpCount;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1201
+   mibfree(head);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1202
+   close(sd);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1203
+#elif defined(__linux__)
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1204
    /* get from /proc/net/tcp, no error if can't */
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1205
    fp = fopen("/proc/net/tcp", "r");
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1206
    if (!fp)
1265
205cb8a210b5 2008-07-09 Albert Lee <[email protected]>
trisk
parents: 1026
diff changeset
  1207
@@ -1728,6 +2601,9 @@
991
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1208
       }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1209
    }
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1210
    fclose(fp);
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1211
+#else
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1212
+   ERR ("unimplemented!\n");
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1213
+   return ERROR_NOT_SUPPORTED;
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1214
 #endif
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1215
 
8567773a366e 2008-03-19 Albert Lee <[email protected]>
trisk
parents:
diff changeset
  1216
    return NO_ERROR;