aboutsummaryrefslogtreecommitdiff
path: root/src/netlib.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/netlib.h')
-rw-r--r--src/netlib.h742
1 files changed, 742 insertions, 0 deletions
diff --git a/src/netlib.h b/src/netlib.h
new file mode 100644
index 0000000..79f11c9
--- /dev/null
+++ b/src/netlib.h
@@ -0,0 +1,742 @@
+/*
+ Copyright (C) 1993-2012 Hewlett-Packard Company
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#if defined(HAVE_SYS_SOCKET_H)
+# include <sys/socket.h>
+#endif
+#if defined(HAVE_NETDB_H)
+# include <netdb.h>
+#endif
+#if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETNAMEINFO)
+# include "missing/getaddrinfo.h"
+#endif
+
+#define PAD_TIME 4
+/* library routine specifc defines */
+#define MAXSPECDATA 162 /* how many ints worth of data */
+ /* can tests send... */
+#define MAXTIMES 4 /* how many times may we loop */
+ /* to calibrate */
+#define MAXCPUS 256 /* how many CPU's can we track */
+#define MAXMESSAGESIZE 65536
+#define MAXALIGNMENT 16384
+#define MAXOFFSET 4096
+#define DATABUFFERLEN MAXMESSAGESIZE+MAXALIGNMENT+MAXOFFSET
+
+#define DEBUG_ON 1
+#define DEBUG_OFF 2
+#define DEBUG_OK 3
+#define NODE_IDENTIFY 4
+#define CPU_CALIBRATE 5
+#define PASSPHRASE 6
+
+#define DO_TCP_STREAM 10
+#define TCP_STREAM_RESPONSE 11
+#define TCP_STREAM_RESULTS 12
+
+#define DO_TCP_RR 13
+#define TCP_RR_RESPONSE 14
+#define TCP_RR_RESULTS 15
+
+#define DO_UDP_STREAM 16
+#define UDP_STREAM_RESPONSE 17
+#define UDP_STREAM_RESULTS 18
+
+#define DO_UDP_RR 19
+#define UDP_RR_RESPONSE 20
+#define UDP_RR_RESULTS 21
+
+#define DO_DLPI_CO_STREAM 22
+#define DLPI_CO_STREAM_RESPONSE 23
+#define DLPI_CO_STREAM_RESULTS 24
+
+#define DO_DLPI_CO_RR 25
+#define DLPI_CO_RR_RESPONSE 26
+#define DLPI_CO_RR_RESULTS 27
+
+#define DO_DLPI_CL_STREAM 28
+#define DLPI_CL_STREAM_RESPONSE 29
+#define DLPI_CL_STREAM_RESULTS 30
+
+#define DO_DLPI_CL_RR 31
+#define DLPI_CL_RR_RESPONSE 32
+#define DLPI_CL_RR_RESULTS 33
+
+#define DO_TCP_CRR 34
+#define TCP_CRR_RESPONSE 35
+#define TCP_CRR_RESULTS 36
+
+#define DO_STREAM_STREAM 37
+#define STREAM_STREAM_RESPONSE 38
+#define STREAM_STREAM_RESULTS 39
+
+#define DO_STREAM_RR 40
+#define STREAM_RR_RESPONSE 41
+#define STREAM_RR_RESULTS 42
+
+#define DO_DG_STREAM 43
+#define DG_STREAM_RESPONSE 44
+#define DG_STREAM_RESULTS 45
+
+#define DO_DG_RR 46
+#define DG_RR_RESPONSE 47
+#define DG_RR_RESULTS 48
+
+#define DO_FORE_STREAM 49
+#define FORE_STREAM_RESPONSE 50
+#define FORE_STREAM_RESULTS 51
+
+#define DO_FORE_RR 52
+#define FORE_RR_RESPONSE 53
+#define FORE_RR_RESULTS 54
+
+#define DO_HIPPI_STREAM 55
+#define HIPPI_STREAM_RESPONSE 56
+#define HIPPI_STREAM_RESULTS 57
+
+#define DO_HIPPI_RR 52
+#define HIPPI_RR_RESPONSE 53
+#define HIPPI_RR_RESULTS 54
+
+#define DO_XTI_TCP_STREAM 55
+#define XTI_TCP_STREAM_RESPONSE 56
+#define XTI_TCP_STREAM_RESULTS 57
+
+#define DO_XTI_TCP_RR 58
+#define XTI_TCP_RR_RESPONSE 59
+#define XTI_TCP_RR_RESULTS 60
+
+#define DO_XTI_UDP_STREAM 61
+#define XTI_UDP_STREAM_RESPONSE 62
+#define XTI_UDP_STREAM_RESULTS 63
+
+#define DO_XTI_UDP_RR 64
+#define XTI_UDP_RR_RESPONSE 65
+#define XTI_UDP_RR_RESULTS 66
+
+#define DO_XTI_TCP_CRR 67
+#define XTI_TCP_CRR_RESPONSE 68
+#define XTI_TCP_CRR_RESULTS 69
+
+#define DO_TCP_TRR 70
+#define TCP_TRR_RESPONSE 71
+#define TCP_TRR_RESULTS 72
+
+#define DO_TCP_NBRR 73
+#define TCP_NBRR_RESPONSE 74
+#define TCP_NBRR_RESULTS 75
+
+#define DO_TCPIPV6_STREAM 76
+#define TCPIPV6_STREAM_RESPONSE 77
+#define TCPIPV6_STREAM_RESULTS 78
+
+#define DO_TCPIPV6_RR 79
+#define TCPIPV6_RR_RESPONSE 80
+#define TCPIPV6_RR_RESULTS 81
+
+#define DO_UDPIPV6_STREAM 82
+#define UDPIPV6_STREAM_RESPONSE 83
+#define UDPIPV6_STREAM_RESULTS 84
+
+#define DO_UDPIPV6_RR 85
+#define UDPIPV6_RR_RESPONSE 86
+#define UDPIPV6_RR_RESULTS 87
+
+#define DO_TCPIPV6_CRR 88
+#define TCPIPV6_CRR_RESPONSE 89
+#define TCPIPV6_CRR_RESULTS 90
+
+#define DO_TCPIPV6_TRR 91
+#define TCPIPV6_TRR_RESPONSE 92
+#define TCPIPV6_TRR_RESULTS 93
+
+#define DO_TCP_MAERTS 94
+#define TCP_MAERTS_RESPONSE 95
+#define TCP_MAERTS_RESULTS 96
+
+#define DO_OMNI 97
+#define OMNI_RESPONSE 98
+#define OMNI_RESULTS 99
+
+#define DO_LWPSTR_STREAM 100
+#define LWPSTR_STREAM_RESPONSE 110
+#define LWPSTR_STREAM_RESULTS 120
+
+#define DO_LWPSTR_RR 130
+#define LWPSTR_RR_RESPONSE 140
+#define LWPSTR_RR_RESULTS 150
+
+#define DO_LWPDG_STREAM 160
+#define LWPDG_STREAM_RESPONSE 170
+#define LWPDG_STREAM_RESULTS 180
+
+#define DO_LWPDG_RR 190
+#define LWPDG_RR_RESPONSE 200
+#define LWPDG_RR_RESULTS 210
+
+#define DO_TCP_CC 300
+#define TCP_CC_RESPONSE 301
+#define TCP_CC_RESULTS 302
+
+/* The DNS_RR test has been removed from netperf but we leave these
+ here for historical purposes. Those wanting to do DNS_RR tests
+ should use netperf4 instead. */
+#define DO_DNS_RR 400
+#define DNS_RR_RESPONSE 401
+#define DNS_RR_RESULTS 402
+
+#define DO_SCTP_STREAM 500
+#define SCTP_STREAM_RESPONSE 501
+#define SCTP_STREAM_RESULT 502
+
+#define DO_SCTP_STREAM_MANY 510
+#define SCTP_STREAM_MANY_RESPONSE 511
+#define SCTP_STREAM_MANY_RESULT 512
+
+#define DO_SCTP_RR 520
+#define SCTP_RR_RESPONSE 521
+#define SCTP_RR_RESULT 502
+
+#define DO_SCTP_RR_MANY 530
+#define SCTP_RR_MANY_RESPONSE 531
+#define SCTP_RR_MANY_RESULT 532
+
+#define DO_SDP_STREAM 540
+#define SDP_STREAM_RESPONSE 541
+#define SDP_STREAM_RESULTS 542
+
+#define DO_SDP_RR 543
+#define SDP_RR_RESPONSE 544
+#define SDP_RR_RESULTS 545
+
+#define DO_SDP_MAERTS 546
+#define SDP_MAERTS_RESPONSE 547
+#define SDP_MAERTS_RESULTS 548
+
+#define DO_SDP_CRR 549
+#define SDP_CRR_RESPONSE 550
+#define SDP_CRR_RESULTS 551
+
+#define DO_SDP_CC 552
+#define SDP_CC_RESPONSE 553
+#define SDP_CC_RESULTS 554
+
+#define DO_SYSINFO 600
+#define SYSINFO_RESPONSE 601
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+#else
+# ifdef WIN32
+# include "missing\inttypes.h"
+# endif
+# endif
+#endif
+
+enum sock_buffer{
+ SEND_BUFFER,
+ RECV_BUFFER
+};
+
+enum netperf_output_modes {
+ HUMAN = 0,
+ CSV,
+ KEYVAL,
+};
+
+/* some defines for security types, perhaps these would be better
+ elsewhere but for now here they are */
+
+#define NSEC_UNKNOWN -1
+#define NSEC_DISABLED 0
+#define NSEC_PERMISSIVE 1
+#define NSEC_ENFORCING 2
+
+#define NSEC_TYPE_UNKNOWN -1
+#define NSEC_TYPE_SELINUX 1
+
+#define NETFW_UNKNOWN -1
+#define NETFW_IPTABLES 1
+
+ /* some of the fields in these structures are going to be doubles and */
+ /* such. so, we probably want to ensure that they will start on */
+ /* "double" boundaries. this will break compatability to pre-2.1 */
+ /* releases, but then, backwards compatability has never been a */
+ /* stated goal of netperf. raj 11/95 */
+
+union netperf_request_struct {
+ struct {
+ int request_type;
+ int dummy;
+ int test_specific_data[MAXSPECDATA];
+ } content;
+ double dummy;
+};
+
+union netperf_response_struct {
+ struct {
+ int response_type;
+ int serv_errno;
+ int test_specific_data[MAXSPECDATA];
+ } content;
+ double dummy;
+};
+
+struct ring_elt {
+ struct ring_elt *next; /* next element in the ring */
+ char *buffer_base; /* in case we have to free it at somepoint */
+ char *buffer_ptr; /* the aligned and offset pointer */
+ void *completion_ptr; /* a pointer to information for async completion */
+ /* these are for sendfile calls and at some point we should consider
+ using a union but it isn't really all that much extra space */
+ struct iovec *hdtrl; /* a pointer to a header/trailer
+ that we do not initially use and
+ so should be set to NULL when the
+ ring is setup. */
+ off_t offset; /* the offset from the beginning of
+ the file for this send */
+ size_t length; /* the number of bytes to send -
+ this is redundant with the
+ send_size variable but I decided
+ to include it anyway */
+ int fildes; /* the file descriptor of the source
+ file */
+ int flags; /* the flags to pass to sendfile() -
+ presently unused and should be
+ set to zero when the ring is
+ setup. */
+};
+
+/* everything in percent except otherwise stated */
+struct cpu_stats_struct {
+ float cpu_util; /* mandatory = 100% - %idle */
+
+ /* The following are optional, dependent upon netcpu implementation */
+ float cpu_user;
+ float cpu_system;
+ float cpu_iowait;
+ float cpu_irq;
+ float cpu_swintr;
+
+ /* mandatory */
+ float peak_cpu_util;
+ int peak_cpu_id; /* ID of most loaded CPU */
+};
+
+/* +*+ SAF Sorry about the hacks with errno; NT made me do it :(
+
+ WinNT does define an errno.
+ It is mostly a legacy from the XENIX days.
+
+ Depending upon the version of the C run time that is linked in, it is
+ either a simple variable (like UNIX code expects), but more likely it
+ is the address of a procedure to return the error number. So any
+ code that sets errno is likely to be overwriting the address of this
+ procedure. Worse, only a tiny fraction of NT's errors get set
+ through errno.
+
+ So I have changed the netperf code to use a define Set_errno when
+ that is it's intent. On non-windows platforms this is just an
+ assignment to errno. But on NT this calls SetLastError.
+
+ I also define errno (now only used on right side of assignments)
+ on NT to be GetLastError.
+
+ Similarly, perror is defined on NT, but it only accesses the same
+ XENIX errors that errno covers. So on NT this is redefined to be
+ Perror and it expands all GetLastError texts. */
+
+
+#ifdef WIN32
+/* INVALID_SOCKET == INVALID_HANDLE_VALUE == (unsigned int)(~0) */
+/* SOCKET_ERROR == -1 */
+#define ENOTSOCK WSAENOTSOCK
+#define EINTR WSAEINTR
+#define ENOBUFS WSAENOBUFS
+#define EWOULDBLOCK WSAEWOULDBLOCK
+#define EAFNOSUPPORT WSAEAFNOSUPPORT
+/* I don't use a C++ style of comment because it upsets some C
+ compilers, possibly even when it is inside an ifdef WIN32... */
+/* from public\sdk\inc\crt\errno.h */
+#define ENOSPC 28
+
+#ifdef errno
+/* delete the one from stdlib.h */
+/*#define errno (*_errno()) */
+#undef errno
+#endif
+#define errno GetLastError()
+#define Set_errno(num) SetLastError((num))
+
+#define perror(text) PrintWin32Error(stderr, (text))
+#define Print_errno(stream, text) PrintWin32Error((stream), (text))
+
+extern void PrintWin32Error(FILE *stream, LPSTR text);
+
+#if !defined(NT_PERF) && !defined(USE_LOOPER)
+#define NT_PERF
+#endif
+#else
+/* Really shouldn't use manifest constants! */
+/*+*+SAF There are other examples of "== -1" and "<0" that probably */
+/*+*+SAF should be cleaned up as well. */
+#define INVALID_SOCKET -1
+#define SOCKET_ERROR -1
+
+#define SOCKET int
+#define Set_errno(num) errno = (num)
+
+#define Print_errno(stream, text) fprintf((stream), "%s errno %d\n", (text), errno)
+#endif
+
+/* Robin & Rick's kludge to try to have a timer signal EINTR by closing */
+/* the socket from another thread can also return several other errors. */
+/* Let's define a macro to hide all of this. */
+
+#ifndef WIN32
+#define SOCKET_EINTR(return_value) (errno == EINTR)
+#define SOCKET_ECONNREFUSED(return_value) (errno == ECONNREFUSED)
+#define SOCKET_EADDRINUSE(return_value) (errno == EADDRINUSE)
+#define SOCKET_EADDRNOTAVAIL(return_value) (errno == EADDRNOTAVAIL)
+#define SOCKET_EAGAIN(return_value) (errno == EAGAIN)
+#define SOCKET_EWOULDBLOCK(return_value) (errno == EWOULDBLOCK)
+
+#else
+
+/* not quite sure I like the extra cases for WIN32 but that is what my
+ WIN32 expert sugested. I'm not sure what WSA's to put for
+ EADDRINUSE */
+
+#define SOCKET_EINTR(return_value) \
+ (((return_value) == SOCKET_ERROR) && \
+ ((errno == EINTR) || \
+ (errno == WSAECONNABORTED) || \
+ (errno == WSAECONNRESET) || \
+ (errno == ENOTSOCK) ))
+#define SOCKET_EADDRINUSE(return_value) \
+ (((return_value) == SOCKET_ERROR) && \
+ ((errno == WSAEADDRINUSE) ))
+#define SOCKET_EADDRNOTAVAIL(return_value) \
+ (((return_value) == SOCKET_ERROR) && \
+ ((errno == WSAEADDRNOTAVAIL) ))
+/* guessing here, and equating for one that doesn't exist */
+#define SOCKET_EAGAIN(return_value) \
+(((return_value) == SOCKET_ERROR) && (errno == WSAEWOULDBLOCK))
+#define SOCKET_EWOULDBLOCK(return_value) \
+ (((return_value) == SOCKET_ERROR) && (errno == WSAEWOULDBLOCK))
+#endif
+
+#ifdef HAVE_SENDFILE
+
+#endif /* HAVE_SENDFILE */
+
+ /* the diferent codes to denote the type of CPU utilization */
+ /* methods used */
+#define CPU_UNKNOWN 0
+#define HP_IDLE_COUNTER 1
+#define PSTAT 2
+#define TIMES 3
+#define LOOPER 4
+#define GETRUSAGE 5
+#define NT_METHOD 6
+#define KSTAT 7
+#define PROC_STAT 8
+#define SYSCTL 9
+#define PERFSTAT 10
+#define KSTAT_10 11
+#define OSX 12
+
+#define BADCH ('?')
+
+#ifndef NETLIB
+#ifdef WIN32
+#ifndef _GETOPT_
+#define _GETOPT_
+
+int getopt(int argc, char **argv, char *optstring);
+
+extern char *optarg; /* returned arg to go with this option */
+extern int optind; /* index to next argv element to process */
+extern int opterr; /* should error messages be printed? */
+extern int optopt; /* */
+
+#endif /* _GETOPT_ */
+
+extern SOCKET win_kludge_socket, win_kludge_socket2;
+#endif /* WIN32 */
+
+extern int local_proc_affinity, remote_proc_affinity;
+
+/* these are to allow netperf to be run easily through those evil,
+ end-to-end breaking things known as firewalls */
+extern char local_data_port[10];
+extern char remote_data_port[10];
+
+extern char *local_data_address;
+extern char *remote_data_address;
+
+extern char *local_sysname, *remote_sysname;
+extern char *local_release, *remote_release;
+extern char *local_version, *remote_version;
+extern char *local_machine, *remote_machine;
+
+extern int local_data_family;
+extern int remote_data_family;
+extern int control_family;
+
+extern union netperf_request_struct netperf_request;
+extern union netperf_response_struct netperf_response;
+
+extern struct cpu_stats_struct lib_local_cpu_stats;
+extern struct cpu_stats_struct lib_remote_cpu_stats;
+extern float lib_elapsed;
+extern float lib_local_maxrate;
+
+extern char libfmt;
+
+extern int cpu_method;
+extern int lib_num_loc_cpus;
+extern int lib_num_rem_cpus;
+extern SOCKET server_sock;
+extern int times_up;
+extern FILE *where;
+extern int loops_per_msec;
+extern float lib_local_per_cpu_util[];
+
+extern enum netperf_output_modes netperf_output_mode;
+
+#if defined(WANT_INTERVALS) || defined(WANT_DEMO)
+
+extern int demo_mode;
+extern double demo_interval;
+extern double demo_units;
+extern double units_this_tick;
+#if defined(WANT_DEMO)
+extern void demo_rr_interval(uint32_t units);
+extern void demo_rr_setup(uint32_t units);
+extern void demo_stream_interval(uint32_t units);
+extern void demo_interval_tick(uint32_t units);
+extern void demo_interval_final();
+#endif
+#endif
+
+extern void netlib_init();
+extern int netlib_get_page_size();
+extern void install_signal_catchers();
+extern struct addrinfo *resolve_host(char hostname[],
+ char port[],
+ int af);
+extern void establish_control(char hostname[],
+ char port[],
+ int af,
+ char local_hostname[],
+ char local_port[],
+ int local_af);
+extern void shutdown_control();
+extern void init_stat();
+extern void send_request();
+extern void recv_response();
+extern void send_response();
+extern int recv_request();
+extern int recv_request_timed_n(int n, int seconds);
+extern void send_request_n(int n); /* convert only the first N ints */
+extern void recv_response_n(int n); /* of the test-specific data via */
+extern void send_response_n(int n); /* htonl/ntonl as required */
+extern int recv_request_n(int n);
+extern void fixup_request_n(int n);
+extern void dump_request();
+extern void dump_addrinfo(FILE *dumploc, struct addrinfo *info,
+ char *host, char *port, int family);
+extern void start_timer(int time);
+extern void stop_timer();
+extern void cpu_start(int measure_cpu);
+extern void cpu_stop(int measure_cpu, float *elapsed);
+extern void calculate_confidence(int confidence_iterations,
+ float time,
+ double result,
+ float loc_cpu,
+ float rem_cpu,
+ float loc_sd,
+ float rem_sd);
+extern void retrieve_confident_values(float *elapsed_time,
+ double *thruput,
+ float *local_cpu_utilization,
+ float *remote_cpu_utilization,
+ float *local_service_demand,
+ float *remote_service_demand);
+extern double get_result_confid();
+extern double get_loc_cpu_confid();
+extern double get_rem_cpu_confid();
+extern void display_confidence();
+extern void get_sock_buffer(SOCKET sd,
+ enum sock_buffer which,
+ int *effective_sizep);
+extern void set_sock_buffer(SOCKET sd,
+ enum sock_buffer which,
+ int requested_size,
+ int *effective_sizep);
+extern char *format_units();
+
+extern void get_remote_system_info();
+
+extern char *inet_ftos(int family);
+extern char *inet_ttos(int type);
+extern char *inet_ptos(int protocol);
+extern char *nsec_enabled_to_str(int enabled);
+extern char *nsec_type_to_str(int type);
+extern double ntohd(double net_double);
+extern double htond(double host_double);
+extern int inet_nton(int af, const void *src, char *dst, int cnt);
+extern void random_ip_address(struct addrinfo *res, int mask_len);
+extern void libmain();
+extern double calc_thruput(double units_received);
+extern double calc_thruput_interval(double units_received,double elapsed);
+extern double calc_thruput_omni(double units_received);
+extern double calc_thruput_interval_omni(double units_received,double elapsed);
+extern float calibrate_local_cpu(float local_cpu_rate);
+extern float calibrate_remote_cpu();
+extern void bind_to_specific_processor(int processor_affinity,int use_cpu_map);
+extern int set_nonblock (SOCKET sock);
+extern char *find_egress_interface(struct sockaddr *source, struct sockaddr *dest);
+extern char *find_interface_slot(char *interface_name);
+extern void find_interface_ids(char *interface_name, int *vendor, int *device, int *sub_vend, int *sub_dev);
+extern void find_driver_info(char *ifname, char *driver, char *version, char *firmware, char *bus, int len);
+extern void find_system_info(char **system_model, char **cpu_model, int *cpu_frequency);
+extern int HIST_get_percentile();
+extern void HIST_get_stats();
+extern void HIST_purge();
+extern void find_security_info(int *enabled, int *type, char **specific);
+extern void demo_first_timestamp();
+extern void demo_reset();
+extern void demo_stream_setup(uint32_t a, uint32_t b);
+#ifndef WIN32
+
+/* WIN32 requires that at least one of the file sets to select be
+ non-null. Since msec_sleep routine is only called by nettest_dlpi &
+ nettest_unix, let's duck this issue. */
+
+extern int msec_sleep( int msecs );
+#endif /* WIN32 */
+extern float calc_cpu_util(float elapsed_time);
+extern float calc_service_demand(double units_sent,
+ float elapsed_time,
+ float cpu_utilization,
+ int num_cpus);
+/* this one determines the unit divisor based on libfmt */
+extern float calc_service_demand_fmt(double units_sent,
+ float elapsed_time,
+ float cpu_utilization,
+ int num_cpus);
+#if defined(__hpux)
+extern void catcher(int, siginfo_t *,void *);
+#else
+extern void catcher(int);
+#endif /* __hpux */
+extern struct ring_elt *allocate_buffer_ring();
+extern void access_buffer(char *buffer_ptr,
+ int length,
+ int dirty_count,
+ int clean_count);
+
+#ifdef HAVE_ICSC_EXS
+extern struct ring_elt *allocate_exs_buffer_ring();
+#endif /* HAVE_ICSC_EXS */
+
+#ifdef HAVE_SENDFILE
+extern struct ring_elt *alloc_sendfile_buf_ring();
+extern int netperf_sendfile(SOCKET send_socket, struct ring_elt *send_ring);
+#endif /* HAVE_SENDFILE */
+
+#ifdef WANT_DLPI
+/* it seems that AIX in its finite wisdom has some bogus define in an
+ include file which defines "rem_addr" which then screws-up this extern
+ unless we change the names to protect the guilty. reported by Eric
+ Jones */
+extern int dl_connect(int fd, unsigned char *remote_addr, int remote_addr_len);
+extern int dl_bind(int fd, int sap, int mode, char *dlsap_ptr, int *dlsap_len);
+extern int dl_open(char devfile[], int ppa);
+#endif /* WANT_DLPI */
+extern char format_cpu_method(int method);
+extern unsigned int convert(char *string);
+extern unsigned int convert_timespec(char *string);
+
+#ifdef WANT_INTERVALS
+extern void start_itimer(unsigned int interval_len_msec);
+extern void stop_itimer(void);
+#endif
+ /* these are all for the confidence interval stuff */
+extern double confidence;
+extern double result_confid;
+extern double loc_cpu_confid;
+extern double rem_cpu_confid;
+extern int lib_cpu_map[];
+#endif
+
+#ifdef WIN32
+#define close(x) closesocket(x)
+#define strcasecmp(a,b) _stricmp(a,b)
+#define getpid() ((int)GetCurrentProcessId())
+#endif
+
+#ifdef WIN32
+extern HANDLE WinTimer;
+#if 0
+/* Should really use safe string functions; but not for now... */
+#include <strsafe.h>
+/* Microsoft has deprecated _snprintf; it isn't guarenteed to null terminate the result buffer. */
+/* They want us to call StringCbPrintf instead; it always null terminates the string. */
+#endif
+
+#define snprintf _snprintf
+#define strdup _strdup
+#endif
+
+/* Define a macro to align a buffer with an offset from a power of 2
+ boundary. */
+
+#ifndef WIN32
+#define ULONG_PTR unsigned long
+#endif
+
+#define ALIGN_BUFFER(BufPtr, Align, Offset) \
+ (char *)(( (ULONG_PTR)(BufPtr) + \
+ (ULONG_PTR) (Align) -1) & \
+ ~((ULONG_PTR) (Align) - 1)) + (ULONG_PTR)(Offset)
+
+ /* if your system has bcopy and bzero, include it here, otherwise, we */
+ /* will try to use memcpy aand memset. fix from Bruce Barnett @ GE. */
+#if defined(hpux) || defined (__VMS)
+#define HAVE_BCOPY
+#define HAVE_BZERO
+#endif
+
+#ifdef WIN32
+#define HAVE_MIN
+#else
+#define _stdcall
+#define _cdecl
+#endif
+
+#ifndef HAVE_BCOPY
+#define bcopy(s,d,h) memcpy((d),(s),(h))
+#endif /* HAVE_BCOPY */
+
+#ifndef HAVE_BZERO
+#define bzero(p,h) memset((p),0,(h))
+#endif /* HAVE_BZERO */
+
+#ifndef HAVE_MIN
+#define min(a,b) ((a < b) ? a : b)
+#endif /* HAVE_MIN */
+
+#ifdef USE_PERFSTAT
+# include <libperfstat.h>
+#endif