mirror of https://framagit.org/bortzmeyer/echoping
Compare commits
2 Commits
Author | SHA1 | Date |
---|---|---|
(no author) | 04b7b5f54f | 20 years ago |
(no author) | 87603802fc | 20 years ago |
@ -1,65 +0,0 @@
|
||||
echoping
|
||||
========
|
||||
|
||||
echoping **was** a small program to test (approximatively) performances of a remote host by sending it requests such as HTTP requests.
|
||||
|
||||
echoping is **no longer** maintained. This repository is for
|
||||
historical interest only.
|
||||
|
||||
To use it, simply:
|
||||
|
||||
```
|
||||
% echoping machine.somewhere.org
|
||||
```
|
||||
|
||||
or use the options before the machine name (see the man page).
|
||||
|
||||
See the DETAILS file for various traps when benchmarking networks, specially with this program.
|
||||
|
||||
In any case, be polite: don't bother the remote host with many repeated requests, especially with large size. Ask for permission if you often test hosts which aren't yours.
|
||||
|
||||
Current features:
|
||||
|
||||
* plugins, so you can extend echoping with any protocol you like and/or use,
|
||||
* Supports IPv6 as well as IPv4,
|
||||
* Supports IDN (Unicode domain names like café.gennic.net),
|
||||
* uses the protocols echo, discard, chargen or HTTP,
|
||||
* can use cryptographic connections with HTTP,
|
||||
* uses UDP instead of TCP for the protocols which accept it (like echo),
|
||||
* can repeat the test and display various measures about it,
|
||||
|
||||
Examples of output:
|
||||
|
||||
```
|
||||
(Simple test with 1000 bytes echo TCP packets)
|
||||
|
||||
% echoping -v -s 1000 mycisco
|
||||
|
||||
This is echoping, version 5.0.0.
|
||||
|
||||
Trying to connect to internet address 172.21.0.14 7 to transmit 1000 bytes...
|
||||
Connected...
|
||||
TCP Latency: 0.003165 seconds
|
||||
Sent (1000 bytes)...
|
||||
Application Latency: 0.322183 seconds
|
||||
1000 bytes read from server.
|
||||
Checked
|
||||
Elapsed time: 0.326960 seconds
|
||||
|
||||
(Repeated tests with average / mean and median displayed.)
|
||||
|
||||
% echoping -n 10 faraway-machine
|
||||
[...]
|
||||
Minimum time: 6.722336 seconds (38 bytes per sec.)
|
||||
Maximum time: 17.975060 seconds (14 bytes per sec.)
|
||||
Average time: 10.873267 seconds (24 bytes per sec.)
|
||||
Standard deviation: 3.102793
|
||||
Median time: 9.218506 seconds (28 bytes per sec.)
|
||||
|
||||
(Testing a Web server with an HTTP request for its home page.)
|
||||
|
||||
% echoping -h / mywww
|
||||
Elapsed time: 0.686792 seconds
|
||||
```
|
||||
|
||||
The exit status is set if there is any problem, so you can use echoping to test repeatedly a Web server, to be sure it runs fine (SmokePing does it).
|
@ -1,43 +0,0 @@
|
||||
Stephane Bortzmeyer <bortz@users.sourceforge.net>
|
||||
<bortzmeyer@nic.fr>
|
||||
|
||||
With help from:
|
||||
|
||||
W. Richard Stevens, author of the book "Unix network programming"
|
||||
for his book and his many examples (a lot of the code comes from
|
||||
him by copy-and-paste).
|
||||
|
||||
Pierre Beyssac <pb@fasterix.freenix.org> author of the "bing" tool for
|
||||
examples of code and beta-testing.
|
||||
|
||||
Christian Grimm <grimm@rvs.uni-hannover.de> for the ICP code.
|
||||
|
||||
Samuel Tardieu <sam@rfc1149.net> for the SMTP code.
|
||||
|
||||
Pierre-Yves Lochou <lochou@ilog.fr> for a lot of testing, debugging
|
||||
and porting.
|
||||
|
||||
Bertrand Petit <elrond@phoe.frmug.org> for a lot of testing, debugging
|
||||
and useful comments and advices.
|
||||
|
||||
Glen Turner <glen.turner@aarnet.edu.au> for the Type Of Service code.
|
||||
|
||||
Munechika Sumikawa <sumikawa@ebina.hitachi.co.jp>, from KAME, for the
|
||||
adaptation to the new API, which allows IPv6.
|
||||
|
||||
Luca Deri <deri@ntop.org> for the patch separating kernel (TCP) and
|
||||
application latency.
|
||||
|
||||
Andy Juniper <ajuniper@freeuk.com> for the patch which excludes
|
||||
outliers from averages and from bug fixes on statistical calculations.
|
||||
|
||||
SourceForge for the very good environment to work with. SourceForge
|
||||
changed the life of many free software programmers!
|
||||
|
||||
The Pasteur Institute because the initial work was done when working
|
||||
on the French national Web cache project, while being an employee of
|
||||
the Institute.
|
||||
|
||||
AFNIC, the .fr registry, because the work is now done there.
|
||||
|
||||
$Id$
|
@ -1,118 +0,0 @@
|
||||
6.1 (NOT YET)
|
||||
|
||||
DO NOT FORGET maintenance branch
|
||||
|
||||
6.0.1 (2007-04-04)
|
||||
|
||||
* Bug fixes only
|
||||
|
||||
6.0.0 (2007-03-26)
|
||||
|
||||
* Plugins: several plugins (whois, postgresql, dns) are now
|
||||
shipped with echoping and you can write your own. All new
|
||||
protocols will now be supported via plugins. Consequences:
|
||||
* you now need an Unix with a working dlopen(3)
|
||||
* echoping now requires the popt parsing library
|
||||
* popt: echoping now depends on popt. One main change: options
|
||||
parsing is lightly different so some scripts *may* break. A
|
||||
typical example is that "old-school" Unix aggreation of arguments
|
||||
("echoping -v4 localhost") is no longer accepted (use "echoping -v
|
||||
-4 localhost").
|
||||
* Many bug fixes, see the list at Sourceforge
|
||||
|
||||
5.2.0 (2004-02-29)
|
||||
|
||||
* IDN (Unicode domain names) support
|
||||
|
||||
5.1.0 (2003-11-09)
|
||||
|
||||
* GNU TLS support (alternative to OpenSSL),
|
||||
* Small licence change,
|
||||
* Portability fixes (MacOS X)
|
||||
|
||||
5.0.1 (2002-11-04)
|
||||
|
||||
* Small bug fixes,
|
||||
* Better error messages with invalid options
|
||||
|
||||
5.0.0 (2002-10-11)
|
||||
|
||||
* Now uses getnameinfo/getaddrinfo. Two consequences:
|
||||
- you can compile only on a recent Unix
|
||||
- you have IPv6 support
|
||||
* With -v, now able to separate kernel (TCP) and application latency
|
||||
* Now displays the standard deviation for repeated tests. Warning:
|
||||
this may break some scripts which parse the output of echoping.
|
||||
|
||||
4.2.0 (2001-03-16)
|
||||
|
||||
* New -a and -A options to control the proxy/cache (disable caching).
|
||||
Fixes bug/wish #232324
|
||||
* Support for microsecond wait (uses usleep)
|
||||
* New option (-p) to set socket priority (Linux only)
|
||||
* New option (-P) to set IP Type of Service octet
|
||||
* Bug fixes: #230384 (SSL records are different from text lines)
|
||||
|
||||
4.1.0 (2001-02-14)
|
||||
|
||||
* Fix several SSL bugs (#132001, #130151)
|
||||
* Now requires an ANSI C compiler
|
||||
* Now uses only stdarg.h so should really compile everywhere
|
||||
|
||||
4.0.2 (2001-01-26)
|
||||
|
||||
* Stupid bug introduced in 4.0.1 when compiling without SSL
|
||||
|
||||
4.0.1 (2001-01-26)
|
||||
|
||||
* Fix SSL bug when using -n (#130078)
|
||||
|
||||
4.0.0 (2001-01-25)
|
||||
|
||||
* SSL (Secure Sockets Layer) support
|
||||
* Now reading many bytes at a time (big performance improvment).
|
||||
Uses the standard I/O library.
|
||||
* Better detection of the HTTP port
|
||||
* Bug fixes (AI/X, Solaris)
|
||||
|
||||
3.1.0 (never released)
|
||||
|
||||
* SMTP support
|
||||
|
||||
3.0.1 (2000-07-06)
|
||||
|
||||
* configure now tries to detect the name of the HTTP port
|
||||
* Fix an AIX bug (closes #108782)
|
||||
|
||||
3.0.0 (2000-06-30)
|
||||
|
||||
* Autoconf/automake support
|
||||
* Fix a bug in ICP timeout
|
||||
|
||||
2.2.1
|
||||
* Portability fixes
|
||||
|
||||
2.2
|
||||
* Stable release, apart from ICP
|
||||
|
||||
2.1.0
|
||||
* Timeouts even on TCP connections.
|
||||
* Support of HTTP 1.1
|
||||
|
||||
2.0.1
|
||||
|
||||
* Bug with getservbyname for HTTP connections fixed.
|
||||
|
||||
2.0.0
|
||||
* HTTP support. For testing of Web servers and Web proxies.
|
||||
* Much better portability.
|
||||
|
||||
|
||||
$Id$
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,154 +0,0 @@
|
||||
Some details about echoping
|
||||
------------
|
||||
|
||||
echoping is a debugging tool. It is not a "end user" tool. For
|
||||
instance, HTTP testing takes host names, not URLs as parameters (if
|
||||
you want to test in a more HTTPish way, use wget or curl). Also, when
|
||||
connecting to a server which has both IPv4 and IPv6 addresses,
|
||||
echoping does not try every address in turn like most user-oriented
|
||||
programs do. If you want to test only the IPv4 address, use the
|
||||
address, not the host name (or use the -4 option).
|
||||
|
||||
echo service:
|
||||
|
||||
echoping by default assumes the remote host accepts such
|
||||
connections. Experience show that most Internet routers or hosts could
|
||||
do it but do not by default. Most Unices are not shipped with this
|
||||
service enabled and, anyway, the administrator is always free to close
|
||||
it (I think they shouldn't). echoping has therefore less chance to
|
||||
succeed than ping or bing. (On a typical Unix box, "echo" service is
|
||||
configured in /etc/inetd.conf but see the CERT advisory
|
||||
<http://www.cert.org/advisories/CA-96.01.UDP_service_denial.html>.)
|
||||
|
||||
What does it measure?
|
||||
|
||||
echoping simply shows the elapsed time, including the time to set up
|
||||
the TCP connection and to transfer the data (but excluding the time
|
||||
for the - possible - DNS call). Therefore, it is unsuitable to
|
||||
physical line raw throughput measures (unlike bing). On the other end,
|
||||
the action it performs are close from a HTTP request and it is
|
||||
meaningful to use it (carefully) to measure Web performances.
|
||||
|
||||
More on Linux:
|
||||
|
||||
On operating systems, like Linux, who have the TCP_INFO option (see
|
||||
http://linuxgazette.net/136/pfeiffer.html for a detailed
|
||||
presentation), echoping can also display interesting TCP information.
|
||||
|
||||
UDP and inetd:
|
||||
|
||||
With UDP servers you can have surprises: the first test is quite often
|
||||
much slower since inetd or xinetd typically has to launch the
|
||||
process. After that, the process stays a while so the next texts run
|
||||
faster.
|
||||
|
||||
A nice example:
|
||||
|
||||
There are many, many traps when measuring something on the
|
||||
Internet. Just one example: 'echoping -w 0 -n 4 a-sunOS-machine' and
|
||||
you'll see the first test succeed in a very short time (if you are
|
||||
close from the machine) and all of the others take a much longer time
|
||||
(one second). With '-w 1' (wait one second between tests, the
|
||||
default), everything works fine: it seems the sockets on SunOS need
|
||||
time to recover :-)
|
||||
|
||||
To measure performances on the Internet you can also see:
|
||||
|
||||
Unix:
|
||||
|
||||
- thrulay, measures the capacity of a network by sending a bulk TCP
|
||||
stream over it <http://shlang.com/thrulay/>
|
||||
- bing, a bandwidth measurement tool
|
||||
<http://www.freenix.fr/freenix/logiciels/bing.html>
|
||||
- patchchar or pchar <http://www.employees.org/~bmah/Software/pchar/>,
|
||||
a bandwidth measurement tool
|
||||
- ping, probably available with your system
|
||||
- traceroute, idem (otherwise, see <ftp://ftp.ee.lbl.gov/>)
|
||||
- ttcp, the best measurement tool but it needs some control over the
|
||||
two machines <ftp://ftp.arl.mil/pub/ttcp>
|
||||
- Netpipe, it needs some control over the
|
||||
two machines <ftp://ftp.scl.ameslab.gov/pub/netpipe/>
|
||||
- treno (evaluates available bandwidth for TCP)
|
||||
<http://www.psc.edu/~pscnoc/treno_info.html>
|
||||
- spray is a tool which I dont't know very well. It is available on some
|
||||
machines (Sun, OSF/1).
|
||||
I've also heard of but never tried:
|
||||
- the very good mon program <http://www.kernel.org/software/mon/> includes a
|
||||
up_rtt.monitor which has many similarities with echoping
|
||||
- NetPerf <http://www.netperf.org/netperf/NetperfPage.html>
|
||||
- a suite of Bandwidth Measuring programs from gnn@netcom.com
|
||||
<ftp://ftp.netcom.com/~ftp/gnn/bwmeas-0.3.tar.Z>. These are several
|
||||
programs that measure bandwidth and jitter over several kinds of
|
||||
IPC links, including TCP and UDP.
|
||||
|
||||
Macintosh:
|
||||
|
||||
- TCP Watcher, a very nice "swiss-army knife" tool, to test ping, DNS, echo.
|
||||
It includes an echo server. Available on Info-Mac in "comm/inet".
|
||||
|
||||
MS-Windows:
|
||||
|
||||
(I have little knowledge of that environment and I tested nothing. The
|
||||
references here are quite old and should be checked.)
|
||||
|
||||
- WSNUTIL. Seems to be an echo client and server.
|
||||
<http://www.ccs.org/winsock/xref-e.html#echo_clients>
|
||||
- echox32. An echo server.
|
||||
<http://www.winsite.com/info/pc/win95/misc/echox32.zip/>
|
||||
- cfinger. An echo client and server.
|
||||
<http://www.winsite.com/info/pc/win3/winsock/cfing13b.zip/>
|
||||
|
||||
Windows-NT :
|
||||
|
||||
echo and other services can (apparently) be provided within 'Simple
|
||||
TCP/IP Services' which can be enabled through the Network Control
|
||||
Panel
|
||||
|
||||
Web clients:
|
||||
|
||||
- You can ping or traceroute on the Web. See
|
||||
<http://www.traceroute.org/>.
|
||||
|
||||
Use all of them with care, the result is not obvious to interpret.
|
||||
|
||||
If you are interested in Internet measurements, there is an Internet
|
||||
Engineering Task Force Working Group, IPPM (IP Performance Metrics)
|
||||
which produces many fine RFC that are really good to read. See
|
||||
<http://www.ietf.org/html.charters/ippm-charter.html> for a full
|
||||
list. I appreciate RFC 2330 and 3148.
|
||||
|
||||
And don't forget to read RFC 1470 ("Tools for Monitoring and Debugging
|
||||
TCP/IP Internets and Interconnected Devices"), specially its
|
||||
"Benchmark" section and the W. Richard Stevens' books (all of them),
|
||||
published by Addison-Wesley.
|
||||
|
||||
If you want to modify echoping and test it against slow or lossy
|
||||
connections, it is good to be able to reporudce these bad conditions
|
||||
at will. To do so, you can use:
|
||||
|
||||
On Linux, Netem :
|
||||
|
||||
tc qdisc add dev eth0 root netem delay 50ms loss 10%
|
||||
tc qdisc add dev eth1 root netem delay 50ms loss 10%
|
||||
|
||||
It depends on Netem (network emulation)
|
||||
|
||||
Networking -->
|
||||
Networking Options -->
|
||||
QoS and/or fair queuing -->
|
||||
Network emulator
|
||||
|
||||
[If it has been compiled as a module, then do a "modprobe sch_netem".]
|
||||
|
||||
On FreeBSD, dummynet (<http://info.iet.unipi.it/~luigi/ip_dummynet>):
|
||||
|
||||
ipfw add 1000 pipe 1 tcp from judith to kiwi echo
|
||||
ipfw pipe 1 config plr 0.5
|
||||
|
||||
It works fine to test echoping with 50 % of loss.
|
||||
|
||||
(In French, see
|
||||
http://www.bortzmeyer.org/tester-protocoles-reseaux-avec-pertes.html)
|
||||
|
||||
|
||||
$Id$
|
@ -1,20 +0,0 @@
|
||||
This file stores a few small tips for developers.
|
||||
|
||||
=== Starting from a fresh copy ===
|
||||
|
||||
When you have just retrieved echoping via Subversion (this does not
|
||||
apply to regular tarballs), you must first create all the files
|
||||
required by the autotools. You need these autotools (autoconf,
|
||||
automake and libtool) and then:
|
||||
|
||||
./recreate-autofiles
|
||||
|
||||
=== Merging from a maintenance branch back into the trunk ===
|
||||
|
||||
If you have fixed bugs in a branch and want to merge them into the
|
||||
trunk as well:
|
||||
|
||||
cd /where/is/the/trunk
|
||||
svn merge -r N:M ../branches/MAINT_X_Y
|
||||
|
||||
$Id$
|
@ -1,622 +0,0 @@
|
||||
/* Parse HyperText Document Address HTParse.c
|
||||
** ================================
|
||||
*/
|
||||
|
||||
#include "HTParse.h"
|
||||
#define TRACE 0
|
||||
|
||||
#define FREE(x) if (x) {free(x); x = NULL;}
|
||||
|
||||
struct struct_parts {
|
||||
char *access;
|
||||
char *host;
|
||||
char *absolute;
|
||||
char *relative;
|
||||
/* char * search; no - treated as part of path */
|
||||
char *anchor;
|
||||
};
|
||||
|
||||
/* Strings of any length
|
||||
** ---------------------
|
||||
*/
|
||||
PUBLIC int strcasecomp
|
||||
ARGS2(CONST char *, a, CONST char *, b)
|
||||
{
|
||||
CONST char *p = a;
|
||||
CONST char *q = b;
|
||||
|
||||
for (p = a, q = b; *p && *q; p++, q++) {
|
||||
int diff = TOLOWER(*p) - TOLOWER(*q);
|
||||
if (diff)
|
||||
return diff;
|
||||
}
|
||||
if (*p)
|
||||
return 1; /* p was longer than q */
|
||||
if (*q)
|
||||
return -1; /* p was shorter than q */
|
||||
return 0; /* Exact match */
|
||||
}
|
||||
|
||||
/* With count limit
|
||||
** ----------------
|
||||
*/
|
||||
PUBLIC int strncasecomp
|
||||
ARGS3(CONST char *, a, CONST char *, b, int, n)
|
||||
{
|
||||
CONST char *p = a;
|
||||
CONST char *q = b;
|
||||
|
||||
for (p = a, q = b;; p++, q++) {
|
||||
int diff;
|
||||
if (p == (a + n))
|
||||
return 0; /* Match up to n characters */
|
||||
if (!(*p && *q))
|
||||
return (*p - *q);
|
||||
diff = TOLOWER(*p) - TOLOWER(*q);
|
||||
if (diff)
|
||||
return diff;
|
||||
}
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
/* Allocate a new copy of a string, and returns it
|
||||
*/
|
||||
PUBLIC char *HTSACopy
|
||||
ARGS2(char **, dest, CONST char *, src)
|
||||
{
|
||||
FREE(*dest);
|
||||
if (src) {
|
||||
*dest = (char *) malloc(strlen(src) + 1);
|
||||
if (*dest == NULL)
|
||||
outofmem(__FILE__, "HTSACopy");
|
||||
strcpy(*dest, src);
|
||||
}
|
||||
return *dest;
|
||||
}
|
||||
/* String Allocate and Concatenate
|
||||
*/
|
||||
PUBLIC char *HTSACat
|
||||
ARGS2(char **, dest, CONST char *, src)
|
||||
{
|
||||
if (src && *src) {
|
||||
if (*dest) {
|
||||
int length = strlen(*dest);
|
||||
*dest = (char *) realloc(*dest, length + strlen(src) + 1);
|
||||
if (*dest == NULL)
|
||||
outofmem(__FILE__, "HTSACat");
|
||||
strcpy(*dest + length, src);
|
||||
} else {
|
||||
*dest = (char *) malloc(strlen(src) + 1);
|
||||
if (*dest == NULL)
|
||||
outofmem(__FILE__, "HTSACat");
|
||||
strcpy(*dest, src);
|
||||
}
|
||||
}
|
||||
return *dest;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Strip white space off a string. HTStrip()
|
||||
** -------------------------------
|
||||
**
|
||||
** On exit,
|
||||
** Return value points to first non-white character, or to 0 if none.
|
||||
** All trailing white space is OVERWRITTEN with zero.
|
||||
*/
|
||||
PUBLIC char *HTStrip
|
||||
ARGS1(char *, s)
|
||||
{
|
||||
#define SPACE(c) ((c == ' ') || (c == '\t') || (c == '\n'))
|
||||
char *p = s;
|
||||
for (p = s; *p; p++); /* Find end of string */
|
||||
for (p--; p >= s; p--) {
|
||||
if (SPACE(*p))
|
||||
*p = '\0'; /* Zap trailing blanks */
|
||||
else
|
||||
break;
|
||||
}
|
||||
while (SPACE(*s))
|
||||
s++; /* Strip leading blanks */
|
||||
return s;
|
||||
}
|
||||
|
||||
/* Scan a filename for its consituents. scan()
|
||||
** ------------------------------------
|
||||
**
|
||||
** On entry,
|
||||
** name points to a document name which may be incomplete.
|
||||
** On exit,
|
||||
** absolute or relative may be nonzero (but not both).
|
||||
** host, anchor and access may be nonzero if they were specified.
|
||||
** Any which are nonzero point to zero terminated strings.
|
||||
*/
|
||||
PRIVATE void scan
|
||||
ARGS2(char *, name, struct struct_parts *, parts)
|
||||
{
|
||||
char *after_access;
|
||||
char *p;
|
||||
/* int length = strlen (name); */
|
||||
|
||||
parts->access = NULL;
|
||||
parts->host = NULL;
|
||||
parts->absolute = NULL;
|
||||
parts->relative = NULL;
|
||||
parts->anchor = NULL;
|
||||
|
||||
/*
|
||||
** Scan left-to-right for a scheme (access).
|
||||
*/
|
||||
after_access = name;
|
||||
for (p = name; *p; p++) {
|
||||
if (*p == ':') {
|
||||
*p = '\0';
|
||||
parts->access = name; /* Access name has been specified */
|
||||
after_access = (p + 1);
|
||||
break;
|
||||
}
|
||||
if (*p == '/' || *p == '#' || *p == ';' || *p == '?')
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef NOTDEFINED
|
||||
for (p = (name + length - 1); p >= name; p--) {
|
||||
#endif /* NOTDEFINED */
|
||||
/*
|
||||
** Scan left-to-right for a fragment (anchor).
|
||||
*/
|
||||
for (p = after_access; *p; p++) {
|
||||
if (*p == '#') {
|
||||
parts->anchor = (p + 1);
|
||||
*p = '\0'; /* terminate the rest */
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** Scan left-to-right for a host or absolute path.
|
||||
*/
|
||||
p = after_access;
|
||||
if (*p == '/') {
|
||||
if (p[1] == '/') {
|
||||
parts->host = (p + 2); /* host has been specified */
|
||||
*p = '\0'; /* Terminate access */
|
||||
p = strchr(parts->host, '/'); /* look for end of host name if any */
|
||||
if (p != NULL) {
|
||||
*p = '\0'; /* Terminate host */
|
||||
parts->absolute = (p + 1); /* Root has been found */
|
||||
}
|
||||
} else {
|
||||
parts->absolute = (p + 1); /* Root found but no host */
|
||||
}
|
||||
} else {
|
||||
parts->relative = (*after_access) ? after_access : NULL; /* NULL for
|
||||
* "" */
|
||||
}
|
||||
|
||||
/*
|
||||
** Check schemes that commonly have unescaped hashes.
|
||||
*/
|
||||
if (parts->access && parts->anchor) {
|
||||
if ((!parts->host && strcasecomp(parts->access, "lynxcgi")) ||
|
||||
!strcasecomp(parts->access, "nntp") ||
|
||||
!strcasecomp(parts->access, "snews") ||
|
||||
!strcasecomp(parts->access, "news") ||
|
||||
!strcasecomp(parts->access, "data")) {
|
||||
/*
|
||||
* Access specified but no host and not a lynxcgi URL, so the
|
||||
* anchor may not really be one, e.g., news:j462#36487@foo.bar,
|
||||
* or it's an nntp or snews URL, or news URL with a host.
|
||||
* Restore the '#' in the address.
|
||||
*/
|
||||
*(parts->anchor - 1) = '#';
|
||||
parts->anchor = NULL;
|
||||
}
|
||||
}
|
||||
#ifdef NOT_DEFINED /* search is just treated as part of path */
|
||||
{
|
||||
char *p = (relative ? relative : absolute);
|
||||
if (p != NULL) {
|
||||
char *q = strchr(p, '?'); /* Any search string? */
|
||||
if (q != NULL) {
|
||||
*q = '\0'; /* If so, chop that off. */
|
||||
parts->search = (q + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* NOT_DEFINED */
|
||||
} /* scan */
|
||||
|
||||
|
||||
/* Parse a Name relative to another name. HTParse()
|
||||
** --------------------------------------
|
||||
**
|
||||
** This returns those parts of a name which are given (and requested)
|
||||
** substituting bits from the related name where necessary.
|
||||
**
|
||||
** On entry,
|
||||
** aName A filename given
|
||||
** relatedName A name relative to which aName is to be parsed
|
||||
** wanted A mask for the bits which are wanted.
|
||||
**
|
||||
** On exit,
|
||||
** returns A pointer to a malloc'd string which MUST BE FREED
|
||||
*/
|
||||
PUBLIC char *HTParse ARGS3(CONST char *, aName,
|
||||
CONST char *, relatedName, int, wanted) {
|
||||
char *result = NULL;
|
||||
char *return_value = NULL;
|
||||
int len;
|
||||
char *name = NULL;
|
||||
char *rel = NULL;
|
||||
char *p;
|
||||
char *access;
|
||||
struct struct_parts given, related;
|
||||
|
||||
if (TRACE)
|
||||
fprintf(stderr,
|
||||
"HTParse: aName:%s relatedName:%s\n", aName, relatedName);
|
||||
|
||||
/*
|
||||
** Allocate the output string.
|
||||
*/
|
||||
len = strlen(aName) + strlen(relatedName) + 10;
|
||||
result = (char *) malloc(len); /* Lots of space: more than enough */
|
||||
if (result == NULL)
|
||||
outofmem(__FILE__, "HTParse");
|
||||
result[0] = '\0'; /* Clear string */
|
||||
|
||||
/*
|
||||
** Make working copies of the input strings to cut up.
|
||||
*/
|
||||
StrAllocCopy(name, aName);
|
||||
StrAllocCopy(rel, relatedName);
|
||||
|
||||
/*
|
||||
** Cut up the strings into URL fields.
|
||||
*/
|
||||
scan(name, &given);
|
||||
scan(rel, &related);
|
||||
|
||||
/*
|
||||
** Handle the scheme (access) field.
|
||||
*/
|
||||
if (given.access && given.host && !given.relative && !given.absolute) {
|
||||
if (!strcmp(given.access, "http") ||
|
||||
!strcmp(given.access, "https") || !strcmp(given.access, "ftp"))
|
||||
/*
|
||||
** Assume root.
|
||||
*/
|
||||
given.absolute = "";
|
||||
}
|
||||
access = given.access ? given.access : related.access;
|
||||
if (wanted & PARSE_ACCESS) {
|
||||
if (access) {
|
||||
strcat(result, access);
|
||||
if (wanted & PARSE_PUNCTUATION)
|
||||
strcat(result, ":");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** If different schemes, inherit nothing.
|
||||
**
|
||||
** We'll try complying with RFC 1808 and
|
||||
** the Fielding draft, and inherit nothing
|
||||
** if both schemes are given, rather than
|
||||
** only when they differ, except for
|
||||
** file URLs - FM
|
||||
**
|
||||
** After trying it for a while, it's still
|
||||
** premature, IHMO, to go along with it, so
|
||||
** this is back to inheriting for identical
|
||||
** schemes whether or not they are "file".
|
||||
** If you want to try it again yourself,
|
||||
** uncomment the strncasecomp() below. - FM
|
||||
*/
|
||||
if ((given.access && related.access) && ( /* strcasecomp(given.access,
|
||||
* "file") || */
|
||||
strcmp(given.access,
|
||||
related.access))) {
|
||||
related.host = NULL;
|
||||
related.absolute = NULL;
|
||||
related.relative = NULL;
|
||||
related.anchor = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
** Handle the host field.
|
||||
*/
|
||||
if (wanted & PARSE_HOST)
|
||||
if (given.host || related.host) {
|
||||
char *tail = result + strlen(result);
|
||||
if (wanted & PARSE_PUNCTUATION)
|
||||
strcat(result, "//");
|
||||
strcat(result, given.host ? given.host : related.host);
|
||||
#define CLEAN_URLS
|
||||
#ifdef CLEAN_URLS
|
||||
/*
|
||||
** Ignore default port numbers, and trailing dots on FQDNs,
|
||||
** which will only cause identical addresses to look different.
|
||||
*/
|
||||
{
|
||||
char *p, *h;
|
||||
p = strchr(tail, ':');
|
||||
if (p != NULL && !isdigit((unsigned char) p[1]))
|
||||
/*
|
||||
** Colon not followed by a port number.
|
||||
*/
|
||||
*p = '\0';
|
||||
if (p != NULL && p != '\0' && access != NULL) {
|
||||
/*
|
||||
** Port specified.
|
||||
*/
|
||||
if ((!strcmp(access, "http") && !strcmp(p, ":80")) ||
|
||||
(!strcmp(access, "gopher") && !strcmp(p, ":70")) ||
|
||||
(!strcmp(access, "ftp") && !strcmp(p, ":21")) ||
|
||||
(!strcmp(access, "wais") && !strcmp(p, ":210")) ||
|
||||
(!strcmp(access, "nntp") && !strcmp(p, ":119")) ||
|
||||
(!strcmp(access, "news") && !strcmp(p, ":119")) ||
|
||||
(!strcmp(access, "snews") && !strcmp(p, ":563")) ||
|
||||
(!strcmp(access, "finger") && !strcmp(p, ":79")) ||
|
||||
(!strcmp(access, "cso") && !strcmp(p, ":105")))
|
||||
*p = '\0'; /* It is the default: ignore it */
|
||||
}
|
||||
if (p == NULL) {
|
||||
int len = strlen(tail);
|
||||
|
||||
if (len > 0) {
|
||||
h = tail + len - 1; /* last char of hostname */
|
||||
if (*h == '.')
|
||||
*h = '\0'; /* chop final . */
|
||||
}
|
||||
} else {
|
||||
h = p;
|
||||
h--; /* End of hostname */
|
||||
if (*h == '.') {
|
||||
/*
|
||||
** Slide p over h.
|
||||
*/
|
||||
while (*p != '\0')
|
||||
*h++ = *p++;
|
||||
*h = '\0'; /* terminate */
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* CLEAN_URLS */
|
||||
}
|
||||
|
||||
/*
|
||||
** If different hosts, inherit no path.
|
||||
*/
|
||||
if (given.host && related.host)
|
||||
if (strcmp(given.host, related.host) != 0) {
|
||||
related.absolute = NULL;
|
||||
related.relative = NULL;
|
||||
related.anchor = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
** Handle the path.
|
||||
*/
|
||||
if (wanted & PARSE_PATH) {
|
||||
if (access && !given.absolute && given.relative) {
|
||||
if (!strcasecomp(access, "nntp") ||
|
||||
!strcasecomp(access, "snews") ||
|
||||
(!strcasecomp(access, "news") &&
|
||||
!strncasecomp(result, "news://", 7))) {
|
||||
/*
|
||||
* Treat all given nntp or snews paths,
|
||||
* or given paths for news URLs with a host,
|
||||
* as absolute.
|
||||
*/
|
||||
given.absolute = given.relative;
|
||||
given.relative = NULL;
|
||||
}
|
||||
}
|
||||
if (given.absolute) { /* All is given */
|
||||
if (wanted & PARSE_PUNCTUATION)
|
||||
strcat(result, "/");
|
||||
strcat(result, given.absolute);
|
||||
if (TRACE)
|
||||
fprintf(stderr, "1\n");
|
||||
} else if (related.absolute) { /* Adopt path not name */
|
||||
strcat(result, "/");
|
||||
strcat(result, related.absolute);
|
||||
if (given.relative) {
|
||||
p = strchr(result, '?'); /* Search part? */
|
||||
if (p == NULL)
|
||||
p = (result + strlen(result) - 1);
|
||||
for (; *p != '/'; p--); /* last / */
|
||||
p[1] = '\0'; /* Remove filename */
|
||||
strcat(result, given.relative); /* Add given one */
|
||||
HTSimplify(result);
|
||||
}
|
||||
if (TRACE)
|
||||
fprintf(stderr, "2\n");
|
||||
} else if (given.relative) {
|
||||
strcat(result, given.relative); /* what we've got */
|
||||
if (TRACE)
|
||||
fprintf(stderr, "3\n");
|
||||
} else if (related.relative) {
|
||||
strcat(result, related.relative);
|
||||
if (TRACE)
|
||||
fprintf(stderr, "4\n");
|
||||
} else { /* No inheritance */
|
||||
if (strncasecomp(aName, "lynxcgi:", 8) &&
|
||||
strncasecomp(aName, "lynxexec:", 9) &&
|
||||
strncasecomp(aName, "lynxprog:", 9)) {
|
||||
strcat(result, "/");
|
||||
}
|
||||
if (!strcmp(result, "news:/"))
|
||||
result[5] = '*';
|
||||
if (TRACE)
|
||||
fprintf(stderr, "5\n");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** Handle the fragment (anchor).
|
||||
*/
|
||||
if (wanted & PARSE_ANCHOR)
|
||||
if ((given.anchor && *given.anchor) || (!given.anchor && related.anchor)) {
|
||||
if (wanted & PARSE_PUNCTUATION)
|
||||
strcat(result, "#");
|
||||
strcat(result, (given.anchor) ? given.anchor : related.anchor);
|
||||
}
|
||||
if (TRACE)
|
||||
fprintf(stderr, "HTParse: result:%s\n", result);
|
||||
FREE(rel);
|
||||
FREE(name);
|
||||
|
||||
StrAllocCopy(return_value, result);
|
||||
FREE(result);
|
||||
|
||||
return return_value; /* exactly the right length */
|
||||
}
|
||||
|
||||
/* Simplify a filename. HTSimplify()
|
||||
** --------------------
|
||||
**
|
||||
** A unix-style file is allowed to contain the seqeunce xxx/../ which may
|
||||
** be replaced by "" , and the seqeunce "/./" which may be replaced by "/".
|
||||
** Simplification helps us recognize duplicate filenames.
|
||||
**
|
||||
** Thus, /etc/junk/../fred becomes /etc/fred
|
||||
** /etc/junk/./fred becomes /etc/junk/fred
|
||||
**
|
||||
** but we should NOT change
|
||||
** http://fred.xxx.edu/../..
|
||||
**
|
||||
** or ../../albert.html
|
||||
*/
|
||||
PUBLIC void HTSimplify ARGS1(char *, filename) {
|
||||
char *p;
|
||||
char *q, *q1;
|
||||
|
||||
if (filename == NULL)
|
||||
return;
|
||||
|
||||
if ((filename[0] && filename[1]) && strchr(filename, '/') != NULL) {
|
||||
for (p = (filename + 2); *p; p++) {
|
||||
if (*p == '/') {
|
||||
if ((p[1] == '.') && (p[2] == '.') &&
|
||||
(p[3] == '/' || p[3] == '\0')) {
|
||||
/*
|
||||
** Handle "/../" or "/..".
|
||||
*/
|
||||
for (q = (p - 1); (q >= filename) && (*q != '/'); q--)
|
||||
/*
|
||||
** Back up to previous slash or beginning of string.
|
||||
*/
|
||||
;
|
||||
if ((q[0] == '/') && strncmp(q, "/../", 4) &&
|
||||
!((q - 1) > filename && q[-1] == '/')) {
|
||||
/*
|
||||
** Not at beginning of string or in a
|
||||
** host field, so remove the "/xxx/..".
|
||||
*/
|
||||
q1 = (p + 3);
|
||||
p = q;
|
||||
while (*q1 != '\0')
|
||||
*p++ = *q1++;
|
||||
*p = '\0'; /* terminate */
|
||||
#ifdef NOTDEFINED
|
||||
/*
|
||||
** Make sure filename has at least one slash.
|
||||
*/
|
||||
if (*filename == '\0') {
|
||||
*filename = '/';
|
||||
*(filename + 1) = '\0';
|
||||
}
|
||||
#endif /* NOTDEFINED */
|
||||
/*
|
||||
** Start again with previous slash.
|
||||
*/
|
||||
p = (q - 1);
|
||||
}
|
||||
} else if (p[1] == '.' && p[2] == '/') {
|
||||
/*
|
||||
** Handle "./" by removing the characters.
|
||||
*/
|
||||
q = p;
|
||||
q1 = (p + 2);
|
||||
while (*q1 != '\0')
|
||||
*q++ = *q1++;
|
||||
*q = '\0'; /* terminate */
|
||||
p--;
|
||||
} else if (p[1] == '.' && p[2] == '\0') {
|
||||
/*
|
||||
** Handle terminal "." by removing the character.
|
||||
*/
|
||||
p[1] = '\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Make Relative Name. HTRelative()
|
||||
** -------------------
|
||||
**
|
||||
** This function creates and returns a string which gives an expression of
|
||||
** one address as related to another. Where there is no relation, an absolute
|
||||
** address is retured.
|
||||
**
|
||||
** On entry,
|
||||
** Both names must be absolute, fully qualified names of nodes
|
||||
** (no anchor bits)
|
||||
**
|
||||
** On exit,
|
||||
** The return result points to a newly allocated name which, if
|
||||
** parsed by HTParse relative to relatedName, will yield aName.
|
||||
** The caller is responsible for freeing the resulting name later.
|
||||
**
|
||||
*/
|
||||
PUBLIC char *HTRelative ARGS2(CONST char *, aName, CONST char *, relatedName) {
|
||||
char *result = NULL;
|
||||
CONST char *p = aName;
|
||||
CONST char *q = relatedName;
|
||||
CONST char *after_access = NULL;
|
||||
CONST char *path = NULL;
|
||||
CONST char *last_slash = NULL;
|
||||
int slashes = 0;
|
||||
|
||||
for (; *p; p++, q++) { /* Find extent of match */
|
||||
if (*p != *q)
|
||||
break;
|
||||
if (*p == ':')
|
||||
after_access = p + 1;
|
||||
if (*p == '/') {
|
||||
last_slash = p;
|
||||
slashes++;
|
||||
if (slashes == 3)
|
||||
path = p;
|
||||
}
|
||||
}
|
||||
|
||||
/* q, p point to the first non-matching character or zero */
|
||||
|
||||
if (!after_access) { /* Different access */
|
||||
StrAllocCopy(result, aName);
|
||||
} else if (slashes < 3) { /* Different nodes */
|
||||
StrAllocCopy(result, after_access);
|
||||
} else if (slashes == 3) { /* Same node, different path */
|
||||
StrAllocCopy(result, path);
|
||||
} else { /* Some path in common */
|
||||
int levels = 0;
|
||||
for (; *q && (*q != '#'); q++)
|
||||
if (*q == '/')
|
||||
levels++;
|
||||
result = (char *) malloc(3 * levels + strlen(last_slash) + 1);
|
||||
if (result == NULL)
|
||||
outofmem(__FILE__, "HTRelative");
|
||||
result[0] = '\0';
|
||||
for (; levels; levels--)
|
||||
strcat(result, "../");
|
||||
strcat(result, last_slash + 1);
|
||||
}
|
||||
if (TRACE)
|
||||
fprintf(stderr, "HT: `%s' expressed relative to\n `%s' is\n `%s'.",
|
||||
aName, relatedName, result);
|
||||
return result;
|
||||
}
|
@ -1,98 +0,0 @@
|
||||
/* HTParse: URL parsing in the WWW Library
|
||||
** HTPARSE
|
||||
**
|
||||
** This module of the WWW library contains code to parse URLs and various
|
||||
** related things.
|
||||
** Implemented by HTParse.c .
|
||||
*/
|
||||
|
||||
#include "echoping.h"
|
||||
#include <ctype.h>
|
||||
|
||||
#ifndef HTPARSE_H
|
||||
#define HTPARSE_H
|
||||
|
||||
/*
|
||||
** The following are flag bits which may be ORed together to form
|
||||
** a number to give the 'wanted' argument to HTParse.
|
||||
*/
|
||||
#define PARSE_ACCESS 16
|
||||
#define PARSE_HOST 8
|
||||
#define PARSE_PATH 4
|
||||
#define PARSE_ANCHOR 2
|
||||
#define PARSE_PUNCTUATION 1
|
||||
#define PARSE_ALL 31
|
||||
|
||||
/*
|
||||
** The following are valid mask values. The terms are the BNF names
|
||||
** in the URL document.
|
||||
*/
|
||||
#define URL_XALPHAS (unsigned char) 1
|
||||
#define URL_XPALPHAS (unsigned char) 2
|
||||
#define URL_PATH (unsigned char) 4
|
||||
|
||||
/*
|
||||
|
||||
Macros for declarations
|
||||
|
||||
*/
|
||||
#define PUBLIC /* Accessible outside this module */
|
||||
#define PRIVATE static /* Accessible only within this module */
|
||||
|
||||
#ifdef __STDC__
|
||||
#define CONST const /* "const" only exists in STDC */
|
||||
#else
|
||||
#define CONST
|
||||
#endif
|
||||
#define NOPARAMS (void)
|
||||
#define PARAMS(parameter_list) parameter_list
|
||||
#define NOARGS (void)
|
||||
#define ARGS1(t,a) \
|
||||
(t a)
|
||||
#define ARGS2(t,a,u,b) \
|
||||
(t a, u b)
|
||||
#define ARGS3(t,a,u,b,v,c) \
|
||||
(t a, u b, v c)
|
||||
|
||||
|
||||
/* Parse a Name relative to another name. HTParse()
|
||||
** --------------------------------------
|
||||
**
|
||||
** This returns those parts of a name which are given (and requested)
|
||||
** substituting bits from the related name where necessary.
|
||||
**
|
||||
** On entry,
|
||||
** aName A filename given
|
||||
** relatedName A name relative to which aName is to be parsed
|
||||
** wanted A mask for the bits which are wanted.
|
||||
**
|
||||
** On exit,
|
||||
** returns A pointer to a malloc'd string which MUST BE FREED
|
||||
*/
|
||||
extern char *HTParse PARAMS((
|
||||
CONST char *aName,
|
||||
CONST char *relatedName,
|
||||
int wanted));
|
||||
|
||||
#ifndef TOLOWER
|
||||
/* Pyramid and Mips can't uppercase non-alpha */
|
||||
#define TOLOWER(c) (isupper((unsigned char)c) ? tolower((unsigned char)c) : (c))
|
||||
#define TOUPPER(c) (islower((unsigned char)c) ? toupper((unsigned char)c) : (c))
|
||||
#endif /* ndef TOLOWER */
|
||||
|
||||
#define outofmem(file, func)\
|
||||
{ fprintf(stderr,\
|
||||
"\r\n\r\n\r\n%s %s: out of memory. Aborting...\r\n", file, func);\
|
||||
exit(-1);}
|
||||
|
||||
#define StrAllocCopy(dest, src) HTSACopy (&(dest), src)
|
||||
#define StrAllocCat(dest, src) HTSACat (&(dest), src)
|
||||
|
||||
PUBLIC void HTSimplify ARGS1 (
|
||||
char *, filename);
|
||||
|
||||
#endif /* HTPARSE_H */
|
||||
|
||||
/*
|
||||
end of HTParse
|
||||
*/
|
@ -1,124 +0,0 @@
|
||||
echoping appears to compile and run at least on Linux, FreeBSD,
|
||||
NetBSD, MacOS X, Solaris (gcc only) and Tru64. On Mac OS X, you'll
|
||||
probably need a version >= 10.2. Some versions of RedHat 7 ship with a
|
||||
completely broken C compiler (echoping displays negative times).
|
||||
|
||||
You do not have to be root to install it.
|
||||
|
||||
Just type "./configure", then "make", "make test" if you wish (some
|
||||
tests depend on local servers and/or Internet access, interpret with
|
||||
care) and then (as root if necessary), "make install". Since
|
||||
echoping's configure script is quite slow, it is highly recommended to
|
||||
use --config-cache or to have a config.site where it is the default
|
||||
(see autoconf documentation).
|
||||
|
||||
There is also a 'make fulltest' if you want to test more things (which
|
||||
may not be available on your platform).
|
||||
|
||||
"configure" has some options:
|
||||
--disable-http (suppress the HTTP support)
|
||||
--disable-smtp (suppress the SMTP support)
|
||||
--enable-icp (add the ICP support, to monitor Web proxies like Squid)
|
||||
--without-libidn (suppress the IDN support, the handling of Unicode - multi-script - domain names, see RFC 3490)
|
||||
--with-libidn[=/where/is/libidn] (tell the system where to find the GNU libidn library <http://www.josefsson.org/libidn/>)
|
||||
--with-gnutls[=/where/is/gnutls] (add the SSL/TLS support, you will need
|
||||
the GNU TLS library <http://www.gnutls.org/>)
|
||||
--with-ssl[=/where/is/ssl] (add the SSL/TLS support, you will need
|
||||
the OpenSSL library <http://www.openssl.org/>)
|
||||
--enable-max-iterations=MAX (limit the number of iterations (-n option for
|
||||
repeated tests) to MAX)
|
||||
--enable-max-request-size=MAX (limit the size of the request (-s option) to MAX)
|
||||
--enable-plugin=LIST (list of plugins to build)
|
||||
|
||||
There is no option to disable IPv6. echoping now uses the new (RFC
|
||||
3493, but first specified in RFC 2133 in september 1997) socket
|
||||
interface, with getnameinfo/getaddrinfo. If your system does not
|
||||
support it (Mac OS X <= 10.1), you have no other choices than using
|
||||
echoping 4.
|
||||
|
||||
There is no option to disable the use of dlopen() or the popt
|
||||
library. dlopen() is necessary for the plugins (and, in the future,
|
||||
all protocol code will be in plugins). The popt library provides a
|
||||
better and easier parsing of options and, more important, is necessary
|
||||
for resuming parsing, something that the plugins rely heavily on. If
|
||||
your system does not support dlopen() or if you do not want to install
|
||||
the popt library (which is free and runs on every Unix), you have no
|
||||
other choices than using echoping 5. popt can be retrieved from, for
|
||||
instance, ftp://ftp.rpm.org/pub/rpm/dist/rpm-4.1.x/popt-1.7.tar.gz or
|
||||
ask Freshmeat at http://freshmeat.net/projects/popt/.
|
||||
|
||||
If, on a 64bits machine such as one using AMD Opteron, compilation
|
||||
stops with something like:
|
||||
|
||||
/usr/lib/libpopt.so: could not read symbols: File in wrong format
|
||||
|
||||
it could mean that popt was compiled only in 32bits. Recompile popt
|
||||
(warning: other applications may use it) or compile and keep two popt
|
||||
(practical details on how to keep two versions are welcome) or compile
|
||||
echoping in 32bits. With gcc:
|
||||
|
||||
CFLAGS=-m32 ./configure --config-cache
|
||||
make
|
||||
|
||||
If your make program is not in the PATH (for instance, on Solaris, it
|
||||
is typically installed in /usr/ccs/bin/make), the simplest trick is:
|
||||
|
||||
./configure --config-cache MAKE=/your/path/to/make
|
||||
|
||||
Standard "autoconf/configure" options are supported such as --prefix
|
||||
to set the installation root directory.
|
||||
|
||||
If 'echoping -h' replies with a "404" error while the file really exists,
|
||||
check first that you use the FQDN of the server on the command line
|
||||
(this is a consequence of the HTTP 1.1 protocol, not a bug in echoping
|
||||
and this will show only if the HTTP server uses "virtual hosting").
|
||||
|
||||
The SSL support (with OpenSSL *or* GNU TLS) is not established by
|
||||
default, mostly because cryptography software's status is still
|
||||
unclear in some countries. You have to use --with-ssl (which should be
|
||||
--with--openssl, I know, there are two libraries, with incompatible
|
||||
APIs) or --with-gnutls
|
||||
|
||||
************* Bug reports ***********************
|
||||
|
||||
To report a bug, email Stephane Bortzmeyer
|
||||
<bortz@users.sourceforge.net> (if you have an account at SourceForge,
|
||||
you can use their bug reporting tool, too, at
|
||||
http://sourceforge.net/tracker/?group_id=4581&atid=104581).
|
||||
|
||||
If the problem is at the "./configure" step, do not forget to send
|
||||
configure's output *and* the config.log.
|
||||
|
||||
If the problem is at run-time, please send the output of "echoping -V"
|
||||
(capital V).
|
||||
|
||||
If echoping segfaults, please send me debugging info. To do so:
|
||||
make clean
|
||||
make debug
|
||||
gdb ./echoping
|
||||
run the-options-that-exhibits-the-problem
|
||||
where
|
||||
list
|
||||
print the-variables-displayed
|
||||
|
||||
********** System-specific notes **************
|
||||
|
||||
HP-UX: echoping probably cannot run because it depends on a feature
|
||||
called "back-linking" (the main program must be able to export its
|
||||
symbols to the plugins, and not only the other way around). HP-UX is
|
||||
apparently the only Unix without it (see libtool documentation). No
|
||||
solution yet.
|
||||
|
||||
FreeBSD: popt is a port, so "pkg_add -r popt" will work (or
|
||||
"portinstall popt").
|
||||
|
||||
NetBSD: popt is a port, so "pkg_add popt" will work.
|
||||
|
||||
Debian: echoping is a Debian package so you typically do not need to
|
||||
compile it. If you want to do it, do not forget to install the
|
||||
development versions of the libraries ("apt-get install libpopt-dev").
|
||||
|
||||
$Id$
|
||||
|
||||
|
||||
|
@ -1,5 +0,0 @@
|
||||
www.obspm.fr
|
||||
www.u-tokyo.ac.jp
|
||||
www.fuw.edu.pl
|
||||
www.fuw.edu.pl
|
||||
www.kaist.ac.kr
|
@ -1,82 +0,0 @@
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
# $Id$
|
||||
|
||||
bin_PROGRAMS = echoping
|
||||
man_MANS = echoping.1
|
||||
echoping_SOURCES = echoping.c error.c readline.c writen.c util.c http.c icp.c HTParse.c echoping.h icp.h HTParse.h smtp.c
|
||||
pkginclude_HEADERS = echoping.h compilation.h
|
||||
echoping_LDADD =
|
||||
echoping_LDFLAGS = -export-dynamic
|
||||
DOCS=DETAILS PLUGINS
|
||||
SUBDIRS=plugins
|
||||
SVN_REPO=http://echoping.svn.sourceforge.net/svnroot/echoping
|
||||
|
||||
TESTS=test-echoping-local test-echoping-remote
|
||||
MORE_TESTS=test-echoping-proxy test-echoping-icp test-echoping-crypto test-echoping-tos test-echoping-ipv6 test-echoping-idn test-echoping-plugins
|
||||
|
||||
test: tests
|
||||
tests: check
|
||||
|
||||
# TODO: raise a warning at install-time when the prefix changes (just
|
||||
# a warning because we do not want to prevent Debian packages for
|
||||
# being built), otherwise, the plugins will not be found.
|
||||
|
||||
fulltest: test moretest
|
||||
|
||||
moretests: moretest
|
||||
moretest: $(MORE_TESTS)
|
||||
@failed=0; all=0; \
|
||||
srcdir=$(srcdir); export srcdir; \
|
||||
for tst in $(MORE_TESTS); do \
|
||||
if test -f $$tst; then dir=.; \
|
||||
else dir="$(srcdir)"; fi; \
|
||||
if $(TESTS_ENVIRONMENT) $$dir/$$tst; then \
|
||||
all=`expr $$all + 1`; \
|
||||
echo "PASS: $$tst"; \
|
||||
elif test $$? -ne 77; then \
|
||||
all=`expr $$all + 1`; \
|
||||
failed=`expr $$failed + 1`; \
|
||||
echo "FAIL: $$tst"; \
|
||||
fi; \
|
||||
done; \
|
||||
if test "$$failed" -eq 0; then \
|
||||
banner="All $$all tests passed"; \
|
||||
else \
|
||||
banner="$$failed of $$all tests failed"; \
|
||||
fi; \
|
||||
dashes=`echo "$$banner" | sed s/./=/g`; \
|
||||
echo "$$dashes"; \
|
||||
echo "$$banner"; \
|
||||
echo "$$dashes"; \
|
||||
test "$$failed" -eq 0
|
||||
|
||||
internal_test: internal_tests
|
||||
internal_tests: internal_tests.o $(echoping_OBJECTS)
|
||||
$(CC) $(LDFLAGS) -o $@ $< util.o
|
||||
./internal_tests
|
||||
|
||||
debug:
|
||||
$(MAKE) DEBUG=1 CFLAGS='-g -O0'
|
||||
|
||||
upload:
|
||||
@echo "Have you updated configure-common.ac and ChangeLog and committed?"
|
||||
@echo "Then, have you ran \"make distcheck\" and tagged everything?"
|
||||
@echo "[Tag is 'svn copy -m \"TAG Release x.y.z\" ${SVN_REPO}/trunk ${SVN_REPO}/tags/RELEASE_x_y_z']"
|
||||
@echo "If so, make upload-force"
|
||||
|
||||
upload-force: dist
|
||||
rm -f upload.log
|
||||
ncftpput -d upload.log upload.sourceforge.net /incoming $(distdir).tar.gz
|
||||
|
||||
realclean: distclean
|
||||
rm -rf *~ autom4te.cache
|
||||
|
||||
EXTRA_DIST = $(man_MANS) $(TESTS) $(DOCS) $(MORE_TESTS)
|
||||
|
||||
## Otherwise, we depend on GNUmake, but for Subversion users, not for regular
|
||||
## tarball users
|
||||
##AUTOMAKE_OPTIONS = no-dependencies
|
||||
|
||||
|
||||
|
@ -1,63 +0,0 @@
|
||||
If you want to write your own plugins, you will first have to decide
|
||||
wether your plugin uses a "cooked" hostname or a "raw" one.
|
||||
|
||||
In the first case, the cooked hostname, your plugin will receive from
|
||||
echoping a struct addrinfo. All the DNS stuff, including IDN, is
|
||||
performed by echoping. You can immediately start using the struct
|
||||
addrinfo.
|
||||
|
||||
But some libraries (typically, the one used by the DBMSs) do not work
|
||||
on struct addrinfo but on strings such as "dbname=test
|
||||
hostname=foo.bar". Plugins using these libraries will have to use the
|
||||
raw interface. The host name given as argument is ignored.
|
||||
|
||||
[Do note there is *no* interface where the TCP connection and shutdown
|
||||
are done by echoping. (See bug #1694510) They are always performed by
|
||||
the plugin.]
|
||||
|
||||
You indicate to echoping wether you use the raw interface or the
|
||||
cooked one by returning a port name or NULL from the init() function.
|
||||
|
||||
You will have to provide three functions:
|
||||
|
||||
char * init (const int argc, const char **argv, const echoping_options options))
|
||||
Accepts remaining arguments (you have to use popt to parse them, or do
|
||||
it by hand, getopt does not allow you to resume the parsing) and
|
||||
returns a string identifying the port name (cooked interface) or NULL
|
||||
(raw interface). The options struct will give you the global options
|
||||
(see echoping.h).
|
||||
|
||||
For the cooked interface:
|
||||
|
||||
void start (struct addrinfo *res)
|
||||
Typically just stores the res structure for later use.
|
||||
|
||||
For the raw interface:
|
||||
|
||||
void start_raw ()
|
||||
Typically connects to the server.
|
||||
|
||||
int execute ()
|
||||
Connects and do whatever the protocol requires. It is called once
|
||||
per iteration. It returns >=0 if it succeeds, -1 if it failed
|
||||
temporarily (so echoping will continue its loop) and -2 if it failed
|
||||
permanently (so echoping will stop the iteration).
|
||||
|
||||
void terminate ()
|
||||
Cleans everything. It is called after all iterations.
|
||||
|
||||
Start your plugin source code with:
|
||||
|
||||
#define IN_PLUGIN
|
||||
#include <echoping/echoping.h>
|
||||
|
||||
You can look at random.c, the simplest plugin, and whois.c, the
|
||||
simplest which still does something useful.
|
||||
|
||||
The documentation of the plugin should be in a manual page named
|
||||
echoping_PLUGINNAME. See the above plugins for examples.
|
||||
|
||||
You can write a shell script named test.sh in the plugin directory to
|
||||
test the plugin. test-echoping-plugins will execute it.
|
||||
|
||||
$Id$
|
@ -1,93 +0,0 @@
|
||||
"echoping" is a small program to test (approximatively) performances
|
||||
of a remote host by sending it TCP "echo" (or other protocol, like
|
||||
HTTP) packets.
|
||||
|
||||
To install it, see the INSTALL file. Or type "./configure; make" if
|
||||
you're in a hurry :-)
|
||||
|
||||
To use it, simply:
|
||||
|
||||
% echoping machine.somewhere.org
|
||||
|
||||
or use the options before the machine name (see the man page).
|
||||
|
||||
See the DETAILS file for various traps when benchmarking networks,
|
||||
specially with this program
|
||||
|
||||
In any case, be polite: don't bother the remote host with many repeated
|
||||
requests, especially with large size. Ask for permission if you often
|
||||
test hosts which aren't yours.
|
||||
|
||||
Current features:
|
||||
|
||||
- uses the protocols echo, discard, chargen, HTTP (with SSL/TLS if you
|
||||
wish), ICP or SMTP,
|
||||
- uses UDP instead of TCP for the protocols which accept it (like echo),
|
||||
- can repeat the test and display various measures about it,
|
||||
- supports IPv6 as well as IPv4,
|
||||
- supports IDN (Unicode domain names),
|
||||
- supports plugins written by you, to test even more protocols (see PLUGINS),
|
||||
|
||||
Examples of output:
|
||||
|
||||
(Simple test with 1000 bytes echo TCP packets)
|
||||
% echoping -v -s 1000 mycisco
|
||||
This is echoping, version 2.0.
|
||||
Trying to connect to internet address 10.99.64.1 to transmit 256 bytes...
|
||||
Connected...
|
||||
Sent (1000 bytes)...
|
||||
Checked
|
||||
Elapsed time: 0.059597 seconds
|
||||
%
|
||||
|
||||
(Repeated tests with average and median displayed.)
|
||||
% echoping -n 10 mymachine
|
||||
[...]
|
||||
Minimum time: 0.170719 seconds (1500 bytes per sec.)
|
||||
Maximum time: 0.211176 seconds (1212 bytes per sec.)
|
||||
Average time: 0.184577 seconds (1387 bytes per sec.)
|
||||
Median time: 0.181332 seconds (1412 bytes per sec.)
|
||||
|
||||
(Testing a Web server with an HTTP request for its home page.)
|
||||
% echoping -h / mywww
|
||||
Elapsed time: 0.686792 seconds
|
||||
|
||||
(The exit status is set if there is any problem, so you can use echoping
|
||||
to test repeatedly a Web server, to be sure it runs fine.)
|
||||
|
||||
|
||||
|
||||
-------------
|
||||
The reference site for echoping is:
|
||||
|
||||
http://echoping.sourceforge.net/
|
||||
|
||||
The distribution is from:
|
||||
|
||||
http://sourceforge.net/project/showfiles.php?group_id=4581
|
||||
|
||||
Stephane Bortzmeyer <bortz@users.sourceforge.net>. October 1995 for the
|
||||
first version.
|
||||
|
||||
---------------------
|
||||
If you want to help and/or motivate echoping and its developer, you
|
||||
can (but are not forced to do so, echoping is free software):
|
||||
|
||||
* Give money through Sourceforge's donation system
|
||||
(http://sourceforge.net/project/project_donations.php?group_id=4581)
|
||||
|
||||
* Use my Amazon's wish list
|
||||
(http://www.amazon.com/gp/registry/23ELBV1YZ93SC)
|
||||
|
||||
* Send me a postcard. I love postcards:
|
||||
Stephane Bortzmeyer
|
||||
127, rue Brancion
|
||||
75015 Paris
|
||||
France
|
||||
|
||||
|
||||
|
||||
$Id$
|
||||
|
||||
|
||||
|
@ -1,34 +0,0 @@
|
||||
Actual bugs are registered at SourceForge:
|
||||
|
||||
http://sourceforge.net/tracker/?group_id=4581&atid=104581
|
||||
|
||||
To see a given bug (say #132001):
|
||||
|
||||
http://sourceforge.net/tracker/index.php?func=detail&aid=132001&group_id=4581&atid=104581
|
||||
|
||||
-------------------------------------
|
||||
|
||||
grep -i TODO *.{c,h}
|
||||
|
||||
is interesting, too.
|
||||
|
||||
------------------------------------
|
||||
|
||||
Wishes:
|
||||
|
||||
See them at Sourceforge :
|
||||
|
||||
http://sourceforge.net/tracker/?group_id=4581&atid=354581
|
||||
|
||||
|
||||
|
||||
$Id$
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,270 +0,0 @@
|
||||
dnl $Id$
|
||||
|
||||
dnl Macros beginning with CF_ (mostly) stolen from Lynx
|
||||
dnl Thanks to "T.E.Dickey" <dickey@clark.net>
|
||||
|
||||
dnl ---------------------------------------------------------------------------
|
||||
dnl Make an uppercase version of a variable
|
||||
dnl $1=uppercase($2)
|
||||
AC_DEFUN([CF_UPPER],
|
||||
[
|
||||
changequote(,)dnl
|
||||
$1=`echo $2 | tr '[a-z]' '[A-Z]'`
|
||||
changequote([,])dnl
|
||||
])dnl
|
||||
|
||||
dnl ---------------------------------------------------------------------------
|
||||
dnl Check for existence of external data in the current set of libraries. If
|
||||
dnl we can modify it, it's real enough.
|
||||
dnl $1 = the name to check
|
||||
dnl $2 = its type
|
||||
AC_DEFUN([CF_CHECK_EXTERN_DATA],
|
||||
[
|
||||
AC_MSG_CHECKING(if external $1 exists)
|
||||
AC_CACHE_VAL(cf_cv_have_$1,[
|
||||
AC_TRY_LINK([
|
||||
#undef $1
|
||||
extern $2 $1;
|
||||
],
|
||||
[$1 = 2],
|
||||
[eval 'cf_cv_have_'$1'=yes'],
|
||||
[eval 'cf_cv_have_'$1'=no'])])
|
||||
|
||||
eval 'cf_result=$cf_cv_have_'$1
|
||||
AC_MSG_RESULT($cf_result)
|
||||
|
||||
if test "$cf_result" = yes ; then
|
||||
eval 'cf_result=HAVE_'$1
|
||||
CF_UPPER(cf_result,$cf_result)
|
||||
AC_DEFINE_UNQUOTED($cf_result)
|
||||
fi
|
||||
|
||||
])dnl
|
||||
|
||||
dnl ---------------------------------------------------------------------------
|
||||
dnl Check for data that is usually declared in <stdio.h> or <errno.h>, e.g.,
|
||||
dnl the 'errno' variable. Define a DECL_xxx symbol if we must declare it
|
||||
dnl ourselves.
|
||||
dnl
|
||||
dnl (I would use AC_CACHE_CHECK here, but it will not work when called in a
|
||||
dnl loop from CF_SYS_ERRLIST).
|
||||
dnl
|
||||
dnl $1 = the name to check
|
||||
AC_DEFUN([CF_CHECK_ERRNO],
|
||||
[
|
||||
AC_MSG_CHECKING(if external $1 is declared)
|
||||
AC_CACHE_VAL(cf_cv_dcl_$1,[
|
||||
AC_TRY_COMPILE([
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <errno.h> ],
|
||||
[long x = (long) $1],
|
||||
[eval 'cf_cv_dcl_'$1'=yes'],
|
||||
[eval 'cf_cv_dcl_'$1'=no]')
|
||||
])
|
||||
eval 'cf_result=$cf_cv_dcl_'$1
|
||||
AC_MSG_RESULT($cf_result)
|
||||
|
||||
if test "$cf_result" = no ; then
|
||||
eval 'cf_result=DECL_'$1
|
||||
CF_UPPER(cf_result,$cf_result)
|
||||
AC_DEFINE_UNQUOTED($cf_result)
|
||||
fi
|
||||
|
||||
# It's possible (for near-UNIX clones) that the data doesn't exist
|
||||
CF_CHECK_EXTERN_DATA($1,int)
|
||||
])dnl
|
||||
|
||||
dnl Useful macros to check libraries which are not implicit
|
||||
dnl in Solaris, for instance.
|
||||
AC_DEFUN([CF_LIB_NSL],
|
||||
[
|
||||
AC_CHECK_LIB(nsl,gethostbyname,
|
||||
[
|
||||
AC_MSG_CHECKING(if libnsl is mandatory)
|
||||
AC_TRY_LINK([#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
char *domain; ],
|
||||
[gethostbyname(domain)], dnl
|
||||
[AC_MSG_RESULT(no)], dnl
|
||||
[AC_MSG_RESULT(yes); LIBS="${LIBS} -lnsl"])
|
||||
])
|
||||
])
|
||||
AC_DEFUN([CF_LIB_SOCKET],
|
||||
[
|
||||
AC_CHECK_LIB(socket,socket,
|
||||
[
|
||||
AC_MSG_CHECKING(if libsocket is mandatory)
|
||||
AC_TRY_LINK([#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
union
|
||||
{
|
||||
HEADER hdr;
|
||||
u_char buf[512];
|
||||
}
|
||||
response;
|
||||
char *domain;
|
||||
int requested_type; ],
|
||||
[socket (AF_INET, SOCK_STREAM, 0) ], dnl
|
||||
[AC_MSG_RESULT(no)], dnl
|
||||
[AC_MSG_RESULT(yes); LIBS="${LIBS} -lsocket"])
|
||||
])
|
||||
])
|
||||
AC_DEFUN([CF_LIB_MATH],
|
||||
[
|
||||
AC_CHECK_LIB(m,pow,
|
||||
[
|
||||
AC_MSG_CHECKING(if libmath is mandatory)
|
||||
AC_TRY_LINK([#include <math.h>
|
||||
double a,b; ],
|
||||
[pow(a,b)], dnl
|
||||
[AC_MSG_RESULT(no)], dnl
|
||||
[AC_MSG_RESULT(yes); LIBS="${LIBS} -lm"])
|
||||
])
|
||||
])
|
||||
|
||||
dnl Check the port name for HTTP. Everyone should declare "http" but
|
||||
dnl not everyone does. This test is BUGgy, we should use a program
|
||||
dnl which calls getservbyname() otherwise we miss NIS tables, for
|
||||
dnl instance.
|
||||
AC_DEFUN([CF_CHECK_SERVICES],
|
||||
[
|
||||
AC_MSG_CHECKING(what is the name of the HTTP port in your services database)
|
||||
dnl BUG: We should test it is really the good port and not any mention of "http"
|
||||
if grep http /etc/services > /dev/null; then
|
||||
AC_DEFINE(HTTP_TCP_PORT,"http")
|
||||
AC_MSG_RESULT(http)
|
||||
else
|
||||
dnl BUG: Trap on Solaris with a port whose name begins with "www"...
|
||||
if grep www /etc/services > /dev/null; then
|
||||
AC_DEFINE(HTTP_TCP_PORT,"www")
|
||||
AC_MSG_RESULT(www)
|
||||
else
|
||||
AC_DEFINE(HTTP_TCP_PORT,"undefined:use_:80")
|
||||
AC_MSG_RESULT([undefined, you should add it in your database])
|
||||
fi
|
||||
fi
|
||||
AC_MSG_CHECKING(what is the name of the ICP port in your services database)
|
||||
if grep icp /etc/services > /dev/null; then
|
||||
AC_DEFINE(ICP_UDP_PORT,"icp")
|
||||
AC_MSG_RESULT(icp)
|
||||
else
|
||||
AC_DEFINE(ICP_UDP_PORT,"undefined:use_:3130")
|
||||
AC_MSG_RESULT([undefined, you should add it in your database])
|
||||
fi
|
||||
])
|
||||
|
||||
# Check GNU libidn
|
||||
# TODO: check the patched libc with AI_IDN. See libidn, in libc/getaddrinfo-idn.txt.
|
||||
AC_DEFUN([CF_LIB_LIBIDN],
|
||||
[
|
||||
AC_CHECK_LIB(idn,idna_to_ascii_8z,
|
||||
[LIBS="${LIBS} -lidn"],
|
||||
[AC_ERROR([Get the GNU libidn library (http://www.josefsson.org/libidn/) in order to use Unicode - multi-script - domain names or use --without-libidn to disable it])], dnl
|
||||
)])
|
||||
|
||||
# Check OpenSSL
|
||||
AC_DEFUN([CF_LIB_OPENSSL],
|
||||
[
|
||||
AC_CHECK_LIB(ssl,SSL_CTX_new,
|
||||
[LIBS="${LIBS} -lssl -lcrypto"],
|
||||
[AC_ERROR([Get the OpenSSL library (http://www.openssl.org/)])], dnl
|
||||
-lcrypto
|
||||
)])
|
||||
|
||||
# Check GNU TLS
|
||||
AC_DEFUN([CF_LIB_GNUTLS],
|
||||
[
|
||||
AC_CHECK_LIB(gnutls,gnutls_global_init,
|
||||
[LIBS="${LIBS} `libgnutls-config --libs`"],
|
||||
[AC_ERROR([Get the GNU TLS library (http://www.gnutls.org/)])], dnl
|
||||
)])
|
||||
|
||||
dnl experimental
|
||||
AC_DEFUN([CF_CHECK_TCP_SERVICE],
|
||||
[
|
||||
AC_TRY_RUN([
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <netdb.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <unistd.h>
|
||||
int
|
||||
main (argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
struct servent *sp;
|
||||
if ((sp = getservbyname ("$1", "tcp")) == 0)
|
||||
exit (1);
|
||||
else
|
||||
exit (0);
|
||||
}
|
||||
],
|
||||
ac_last_port=$1
|
||||
,
|
||||
ac_last_port=
|
||||
)])
|
||||
|
||||
dnl Our (W. Richard Stevens') macro to check for a function prototype in
|
||||
dnl a given header.
|
||||
AC_DEFUN([AC_CHECK_FUNC_PROTO],
|
||||
[AC_CACHE_CHECK(for $1 function prototype in $2, ac_cv_have_$1_proto,
|
||||
AC_EGREP_HEADER($1, $2,
|
||||
ac_cv_have_$1_proto=yes,
|
||||
ac_cv_have_$1_proto=no))
|
||||
if test $ac_cv_have_$1_proto = yes ; then
|
||||
ac_tr_func=HAVE_`echo $1 | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`_PROTO
|
||||
AC_DEFINE_UNQUOTED($ac_tr_func)
|
||||
fi
|
||||
])
|
||||
|
||||
dnl BROKEN: do not use
|
||||
dnl Copied from autoconf and edited to add an argument: an include file
|
||||
dnl AC_CHECK_FUNC_WITH_HEADER(FUNCTION, HEADER, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
|
||||
AC_DEFUN([AC_CHECK_FUNC_WITH_HEADER],
|
||||
[AC_MSG_CHECKING([for $1])
|
||||
AC_CACHE_VAL(ac_cv_func_$1,
|
||||
[AC_TRY_LINK(
|
||||
dnl Don't include <ctype.h> because on OSF/1 3.0 it includes <sys/types.h>
|
||||
dnl which includes <sys/select.h> which contains a prototype for
|
||||
dnl select. Similarly for bzero.
|
||||
[/* System header to define __stub macros and hopefully few prototypes,
|
||||
which can conflict with char $1(); below. */
|
||||
#include <assert.h>
|
||||
/* Override any gcc2 internal prototype to avoid an error. */
|
||||
]ifelse(AC_LANG, CPLUSPLUS, [#ifdef __cplusplus
|
||||
extern "C"
|
||||
#endif
|
||||
])dnl
|
||||
[/* We use char because int might match the return type of a gcc2
|
||||
builtin and then its argument prototype would still apply. */
|
||||
char $1();
|
||||
#include <$2>
|
||||
], [
|
||||
/* The GNU C library defines this for functions which it implements
|
||||
to always fail with ENOSYS. Some functions are actually named
|
||||
something starting with __ and the normal name is an alias. */
|
||||
#if defined (__stub_$1) || defined (__stub___$1)
|
||||
choke me
|
||||
#else
|
||||
$1();
|
||||
#endif
|
||||
], eval "ac_cv_func_$1=yes", eval "ac_cv_func_$1=no")])
|
||||
if eval "test \"`echo '$ac_cv_func_'$1`\" = yes"; then
|
||||
AC_MSG_RESULT(yes)
|
||||
ifelse([$3], , :, [$3])
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
ifelse([$4], , , [$4
|
||||
])dnl
|
||||
fi
|
||||
])
|
||||
|
||||
|
@ -1,3 +0,0 @@
|
||||
#define COMPILATION_OPTIONS "@PACKAGE_NAME@ @PACKAGE_VERSION@ compiled with @CC@ on @hostname@ (@host@)\n at @compil_date@ with options:\nCFLAGS= @CFLAGS@\nLDFLAGS= @LDFLAGS@\n@compil_options@\n\nPlugins are searched in @plugins_dir@."
|
||||
|
||||
/* $Id$ */
|
@ -1,8 +0,0 @@
|
||||
dnl $Id$
|
||||
AC_INIT(echoping, 6.1-BETA, bortz@users.sourceforge.net)
|
||||
AC_CANONICAL_HOST
|
||||
AC_PROG_CC(cc gcc)
|
||||
AC_LIBTOOL_DLOPEN
|
||||
AC_PROG_LIBTOOL
|
||||
|
||||
|
@ -1,383 +0,0 @@
|
||||
dnl $Id$
|
||||
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
m4_include(configure-common.ac)
|
||||
AM_INIT_AUTOMAKE
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
|
||||
dnl Checking size of ints, we often need it for binary protocols like ICP
|
||||
AC_CHECK_SIZEOF(int)
|
||||
AC_CHECK_SIZEOF(long)
|
||||
|
||||
dnl User options
|
||||
dnl http://sources.redhat.com/ml/automake-prs/2001-q3/msg00033.html
|
||||
max_iterations_specified=0
|
||||
AC_ARG_ENABLE(max-iterations,
|
||||
[ --enable-max-iterations=MAX limit the number of iterations (-n option) to MAX],
|
||||
[if test "$enableval" != "no"; then
|
||||
max_iterations_specified=1
|
||||
fi])
|
||||
if test "$max_iterations_specified" = 0; then
|
||||
AC_DEFINE(MAX_ITERATIONS, 20, Maximum number of iterations)
|
||||
else
|
||||
AC_DEFINE_UNQUOTED(MAX_ITERATIONS, $enableval, Maximum number of iterations)
|
||||
fi
|
||||
max_line_specified=0
|
||||
AC_ARG_ENABLE(max-request-size,
|
||||
[ --enable-max-request-size=MAX limit the size of a request to MAX],
|
||||
[if test "$enableval" != "no"; then
|
||||
max_line_specified=1
|
||||
fi])
|
||||
if test "$max_line_specified" = 0; then
|
||||
AC_DEFINE(MAX_LINE, 65535, Maximum size of a request)
|
||||
else
|
||||
AC_DEFINE_UNQUOTED(MAX_LINE, $enableval, Maximum size of a request)
|
||||
fi
|
||||
AC_ARG_ENABLE(http,
|
||||
[ --enable-http HTTP (Web's main protocol) support],dnl
|
||||
[if test "$enableval" = "yes"; then
|
||||
AC_DEFINE(HTTP,,[HTTP support])
|
||||
HTTP=1
|
||||
fi],
|
||||
dnl Default: enable it
|
||||
[AC_DEFINE(HTTP,,[HTTP support])
|
||||
HTTP=1])
|
||||
AC_ARG_ENABLE(icp,
|
||||
[ --enable-icp ICP (for testing Web proxies/caches) support],dnl
|
||||
[if test "$enableval" = "yes"; then
|
||||
AC_DEFINE(ICP,,[ICP support])
|
||||
ICP=1
|
||||
fi])
|
||||
AC_ARG_ENABLE(smtp,
|
||||
[ --enable-smtp SMTP (Mail's main protocol) support],dnl
|
||||
[if test "$enableval" = "yes"; then
|
||||
AC_DEFINE(SMTP,,[SMTP support])
|
||||
SMTP=1
|
||||
fi],
|
||||
dnl Default: enable it
|
||||
[AC_DEFINE(SMTP,,[SMTP support])
|
||||
SMTP=1])
|
||||
dnl IDN
|
||||
dnl Default: enable it
|
||||
LIBIDN=1
|
||||
AC_ARG_WITH(libidn,
|
||||
[ --with-libidn[=DIR] Internationalized Domain Names support (needs GNU libidn)],dnl
|
||||
[if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
IDNROOT=$withval
|
||||
LDFLAGS="${LDFLAGS} -L$IDNROOT/lib"
|
||||
CPPFLAGS="${CPPFLAGS} -I$IDNROOT/include"
|
||||
fi
|
||||
else
|
||||
LIBIDN=0
|
||||
fi],
|
||||
)
|
||||
if test "$LIBIDN" = "1"; then
|
||||
AC_DEFINE(LIBIDN,,[Internationalized Domain Names support])
|
||||
fi
|
||||
AC_ARG_WITH(ssl,
|
||||
[ --with-ssl[=DIR] SSL crypt support (needs OpenSSL)],dnl
|
||||
[if test "$withval" != "no"; then
|
||||
AC_DEFINE(OPENSSL,,[Crypto (SSL) support])
|
||||
OPENSSL=1
|
||||
if test "$withval" != "yes"; then
|
||||
SSLROOT=$withval
|
||||
LDFLAGS="${LDFLAGS} -L$SSLROOT/lib"
|
||||
CPPFLAGS="${CPPFLAGS} -I$SSLROOT/include"
|
||||
fi
|
||||
fi],
|
||||
dnl Default: disable it
|
||||
)
|
||||
AC_ARG_WITH(gnutls,
|
||||
[ --with-gnutls[=DIR] SSL/TLS crypt support (needs GNU TLS), the argument DIR should not be necessary],dnl
|
||||
[if test "$withval" != "no"; then
|
||||
if test "$withval" = "yes"; then
|
||||
PKG_CHECK_MODULES([LIBGNUTLS], [gnutls >= 1.0.0],
|
||||
[
|
||||
echo "GnuTLS found"
|
||||
AC_DEFINE(GNUTLS,,[Crypto (TLS) support])
|
||||
GNUTLS=1
|
||||
CFLAGS="$CFLAGS $LIBGNUTLS_CFLAGS"
|
||||
LIBS="$LIBS $LIBGNUTLS_LIBS"
|
||||
],)
|
||||
else
|
||||
AC_DEFINE(GNUTLS,,[Crypto (TLS) support])
|
||||
GNUTLS=1
|
||||
GNUTLSROOT=$withval
|
||||
LDFLAGS="${LDFLAGS} -L$GNUTLSROOT/lib -lgnutls"
|
||||
CPPFLAGS="${CPPFLAGS} -I$GNUTLSROOT/include"
|
||||
fi
|
||||
fi],
|
||||
dnl Default: disable it
|
||||
)
|
||||
dnl TODO: test if the getopt variable optreset exists and, if it
|
||||
dnl does, we can use getopt (Free BSDs and MacOS X). This implies to
|
||||
dnl maintain the two versions, popt and getopt, while echoping has
|
||||
dnl many options. It probably means a high-level language to describe
|
||||
dnl the options and to produce the two versions. gengetopt is an obvious
|
||||
dnl candidate.
|
||||
AC_ARG_WITH(popt,
|
||||
[ --with-popt[=DIR] popt command-line parsing library],dnl
|
||||
[if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
POPTROOT=$withval
|
||||
LDFLAGS="${LDFLAGS} -L$POPTROOT/lib"
|
||||
CPPFLAGS="${CPPFLAGS} -I$POPTROOT/include"
|
||||
fi
|
||||
else
|
||||
AC_MSG_ERROR([The popt command-line parsing library is mandatory for echoping])
|
||||
fi],
|
||||
dnl Default: disable it
|
||||
)
|
||||
|
||||
dnl Checks for programs.
|
||||
AC_PROG_CC
|
||||
AC_PROG_INSTALL
|
||||
|
||||
dnl Checks for libraries.
|
||||
|
||||
dnl Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
AC_CHECK_HEADERS(sys/time.h unistd.h)
|
||||
|
||||
case $host_os in
|
||||
osf*)
|
||||
# Stupid bug appeared in Tru64-OSF1 v5. socklen_t is undefined without
|
||||
# the following workaround.
|
||||
CPPFLAGS="$CPPFLAGS -D_POSIX_PII_SOCKET"
|
||||
;;
|
||||
*darwin*)
|
||||
# See bug #748145 and #765777
|
||||
CPPFLAGS="$CPPFLAGS -D_BSD_SOCKLEN_T_=int -no-cpp-precomp"
|
||||
;;
|
||||
esac
|
||||
|
||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
AC_HEADER_TIME
|
||||
|
||||
dnl Checks for library functions.
|
||||
CF_LIB_SOCKET
|
||||
CF_LIB_NSL
|
||||
CF_LIB_MATH
|
||||
AC_TYPE_SIGNAL
|
||||
AC_FUNC_VPRINTF
|
||||
dnl Some Unices like Tru64 or Mac OS X has getaddrinfo() or
|
||||
dnl getnameinfo() but has it renamed in libc as something else so we
|
||||
dnl must include <netdb.h> to get the redefinition. (Stolen from rsync)
|
||||
dnl autoconf AC_CHECK_FUNCS does not allow headers to be easily included :-(
|
||||
AC_CHECK_FUNCS(getaddrinfo getnameinfo inet_ntop, ,
|
||||
[AC_MSG_CHECKING([$ac_func again by including <netdb.h>])
|
||||
AC_TRY_LINK([#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>],[$ac_func(NULL, NULL, NULL, NULL);],
|
||||
[AC_MSG_RESULT([yes])],
|
||||
[AC_MSG_ERROR([Missing mandatory function - echoping now uses the new network functions (RFC 2133) which are mandatory for IPv6])]
|
||||
)])
|
||||
|
||||
AC_CHECK_FUNCS(gettimeofday socket sigaction strerror, , AC_MSG_ERROR(Missing mandatory function))
|
||||
AC_CHECK_FUNCS(poptGetContext, ,
|
||||
[AC_CHECK_LIB(popt,poptGetContext, ,
|
||||
[AC_MSG_ERROR([Missing popt library, get it from ftp://ftp.rpm.org/pub/rpm/dist/rpm-x.y.z])])])
|
||||
AC_CHECK_FUNCS(usleep) dnl TODO: use the Autoconf macro http://www.gnu.org/software/ac-archive/htmldoc/etr_short_sleep.html
|
||||
AC_CHECK_FUNCS(dlopen, ,
|
||||
[AC_CHECK_LIB(dl,dlopen, ,
|
||||
[AC_MSG_ERROR([echoping requires dlopen (dynamic loading of libraries) for plugins])])])
|
||||
|
||||
if test "$LIBIDN" = "1"; then
|
||||
CF_LIB_LIBIDN
|
||||
fi
|
||||
if test "$OPENSSL" = "1" && test "$GNUTLS" = "1"; then
|
||||
AC_MSG_ERROR([Choose OpenSSL or GNU TLS but not both])
|
||||
fi
|
||||
if test "$OPENSSL" = "1"; then
|
||||
CF_LIB_OPENSSL
|
||||
fi
|
||||
if test "$GNUTLS" = "1"; then
|
||||
CF_LIB_GNUTLS
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING([TCP info from socket])
|
||||
AC_TRY_COMPILE(
|
||||
[#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
/* TODO: including tcp.h may not be necessary */
|
||||
#include <netinet/tcp.h>
|
||||
],
|
||||
[int foobar = SOL_TCP;],
|
||||
[AC_DEFINE(HAVE_TCP_INFO,,[TCP info from socket])
|
||||
ac_have_tcp_info="yes"],
|
||||
ac_have_tcp_info=no)
|
||||
AC_MSG_RESULT($ac_have_tcp_info)
|
||||
AC_ARG_ENABLE(tcp_info,
|
||||
[ --enable-tcp-info TCP info from socket],
|
||||
[if test "$enableval" = "yes"; then
|
||||
if test $ac_have_tcp_info = "yes"; then
|
||||
AC_DEFINE(HAVE_TCP_INFO,,[TCP info from socket])
|
||||
TCP_INFO=1
|
||||
else
|
||||
AC_MSG_WARN([No TCP info support on this system, request ignored])
|
||||
fi
|
||||
fi],
|
||||
dnl Default: enable it if supported
|
||||
if test $ac_have_tcp_info = "yes"; then
|
||||
AC_DEFINE(HAVE_TCP_INFO,,[TCP info])
|
||||
TCP_INFO=1
|
||||
fi)
|
||||
|
||||
dnl Type Of Service
|
||||
AC_MSG_CHECKING([Type Of Service])
|
||||
AC_TRY_COMPILE(
|
||||
[#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
],
|
||||
[int foobar = IP_TOS;],
|
||||
[AC_DEFINE(HAVE_TOS,,[Type Of Service support])
|
||||
ac_have_tos="yes"],
|
||||
ac_have_tos="no")
|
||||
AC_MSG_RESULT($ac_have_tos)
|
||||
AC_ARG_ENABLE(tos,
|
||||
[ --enable-tos TOS (Type Of Service) support],
|
||||
[if test "$enableval" = "yes"; then
|
||||
if test $ac_have_tos = "yes"; then
|
||||
AC_DEFINE(HAVE_TOS,,[Type Of Service support])
|
||||
TOS=1
|
||||
else
|
||||
AC_MSG_WARN([No TOS support on this system, request ignored])
|
||||
fi
|
||||
fi],
|
||||
dnl Default: enable it if supported
|
||||
if test $ac_have_tos = "yes"; then
|
||||
AC_DEFINE(HAVE_TOS,,[Type Of Service support])
|
||||
TOS=1
|
||||
fi)
|
||||
|
||||
dnl Socket priority
|
||||
dnl Linux only, it seems. Anyone knows a standard way to do so?
|
||||
AC_MSG_CHECKING([Socket priority])
|
||||
AC_TRY_COMPILE(
|
||||
[#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
],
|
||||
[int foobar = SO_PRIORITY;],
|
||||
[AC_DEFINE(HAVE_SOCKET_PRIORITY)
|
||||
ac_have_priority="yes"],
|
||||
ac_have_priority="no")
|
||||
AC_MSG_RESULT($ac_have_priority)
|
||||
AC_ARG_ENABLE(priority,
|
||||
[ --enable-priority PRIORITY (socket priority) support],
|
||||
[if test "$enableval" = "yes"; then
|
||||
if test $ac_have_priority = "yes"; then
|
||||
AC_DEFINE(HAVE_SOCKET_PRIORITY,,[Socket priority support])
|
||||
PRIORITY=1
|
||||
else
|
||||
AC_MSG_WARN([No socket priority support on this system, request ignored])
|
||||
fi
|
||||
fi],
|
||||
dnl Default: enable it if supported
|
||||
if test $ac_have_priority = "yes"; then
|
||||
AC_DEFINE(HAVE_SOCKET_PRIORITY,,[Socket priority support])
|
||||
PRIORITY=1
|
||||
fi)
|
||||
|
||||
dnl SCTP, RFC 4960, feature request #1676608
|
||||
AC_MSG_CHECKING([SCTP])
|
||||
AC_TRY_COMPILE(
|
||||
[#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
],
|
||||
[int foobar = IPPROTO_SCTP;],
|
||||
[AC_DEFINE(HAVE_SCTP,,[SCTP support])
|
||||
ac_have_sctp="yes"],
|
||||
ac_have_sctp="no")
|
||||
AC_MSG_RESULT($ac_have_sctp)
|
||||
AC_ARG_ENABLE(sctp,
|
||||
[ --enable-sctp SCTP (Stream Control Transmission Protocol) support],
|
||||
[if test "$enableval" = "yes"; then
|
||||
if test $ac_have_sctp = "yes"; then
|
||||
AC_DEFINE(HAVE_SCTP,,[Stream Control Transmission Protocol support])
|
||||
SCTP=1
|
||||
else
|
||||
AC_MSG_WARN([No SCTP support on this system, request ignored])
|
||||
fi
|
||||
fi],
|
||||
dnl Default: enable it if supported
|
||||
if test $ac_have_sctp = "yes"; then
|
||||
AC_DEFINE(HAVE_SCTP,,[Stream Control Transmission Protocol support])
|
||||
SCTP=1
|
||||
fi)
|
||||
|
||||
if test "$GCC" = yes; then
|
||||
CFLAGS="$CFLAGS -Wall"
|
||||
fi
|
||||
|
||||
interpolate() {
|
||||
old=$1
|
||||
eval new=$old
|
||||
if test "$new" != "$old" ; then
|
||||
interpolate $new
|
||||
else
|
||||
echo $new
|
||||
fi
|
||||
}
|
||||
dnl TODO: the following is broken because installation prefix can be changed at instal-time,
|
||||
dnl not compilation time.
|
||||
if test "x$libdir" = 'x${exec_prefix}/lib' ; then # Default value
|
||||
if test "x$exec_prefix" = "xNONE" ; then # Default value
|
||||
if test "x$prefix" = "xNONE" ; then # Default value
|
||||
plugins_dir=`interpolate '$ac_default_prefix/lib/echoping'`
|
||||
else
|
||||
exec_prefix='${prefix}'
|
||||
plugins_dir=`interpolate '$libdir/echoping'`
|
||||
fi
|
||||
else
|
||||
plugins_dir=`interpolate '$libdir/echoping'`
|
||||
fi
|
||||
else
|
||||
plugins_dir=`interpolate '$libdir/echoping'`
|
||||
fi
|
||||
AC_DEFINE_UNQUOTED(PLUGINS_DIR, "$plugins_dir", [Directory where the plugins will be installed])
|
||||
AC_SUBST(plugins_dir)
|
||||
# TODO: make distcheck complains here that "plugins" does not exist???
|
||||
echo $plugins_dir > plugins/dir
|
||||
AC_CONFIG_SUBDIRS(plugins)
|
||||
|
||||
compil_options=""
|
||||
AC_DEFUN([DISPLAY_SETTING],
|
||||
[
|
||||
echo $ECHO_N $1 ": "
|
||||
compil_options="$compil_options\n$1:"
|
||||
if [ eval 'test "$$1" = "1"' > /dev/null]; then
|
||||
AC_MSG_RESULT( enabled)
|
||||
compil_options="$compil_options enabled"
|
||||
else
|
||||
AC_MSG_RESULT( disabled)
|
||||
compil_options="$compil_options disabled "
|
||||
fi
|
||||
])dnl
|
||||
echo ""
|
||||
echo "Configuration of echoping:"
|
||||
|
||||
DISPLAY_SETTING(HTTP)
|
||||
DISPLAY_SETTING(ICP)
|
||||
DISPLAY_SETTING(OPENSSL)
|
||||
DISPLAY_SETTING(GNUTLS)
|
||||
DISPLAY_SETTING(SMTP)
|
||||
DISPLAY_SETTING(LIBIDN)
|
||||
DISPLAY_SETTING(TOS)
|
||||
DISPLAY_SETTING(SCTP)
|
||||
DISPLAY_SETTING(PRIORITY)
|
||||
|
||||
compil_date=`date +%Y-%m-%d`
|
||||
hostname=$ac_hostname
|
||||
AC_SUBST(hostname)
|
||||
AC_SUBST(compil_options)
|
||||
AC_SUBST(compil_date)
|
||||
AC_OUTPUT(Makefile echoping.1 compilation.h)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,3 +0,0 @@
|
||||
Various echoping goodies, plugins, etc. No warranty at all, no
|
||||
support.
|
||||
|
@ -1,9 +0,0 @@
|
||||
if ADAMSNAMESBUILD
|
||||
bin_PROGRAMS = test-domquery
|
||||
test_domquery_SOURCES = test-domquery.c
|
||||
pkglib_LTLIBRARIES = domquery.la
|
||||
domquery_la_SOURCES = domquery.c util.c
|
||||
domquery_la_LDFLAGS = -module
|
||||
endif
|
||||
|
||||
|
@ -1,10 +0,0 @@
|
||||
#define CLIENT_NAME "XML-RPC Adams Names plugin for echoping"
|
||||
#define CLIENT_VERSION "0.0"
|
||||
|
||||
#define ENDPOINT "http://www.adamsnames.tc/api/xmlrpc"
|
||||
|
||||
poptContext poptcon;
|
||||
xmlrpc_env env;
|
||||
char *domain;
|
||||
|
||||
/* $Id$ */
|
@ -1,17 +0,0 @@
|
||||
dnl $Id$
|
||||
|
||||
AC_INIT(adamsnames, 0.0-BETA)
|
||||
AC_PROG_CC(cc gcc)
|
||||
AC_PROG_LIBTOOL
|
||||
AM_INIT_AUTOMAKE(foreign)
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
AC_CHECK_PROG(ADAMSNAMES_BUILD, xmlrpc-c-config, 1, 0)
|
||||
if test "$ADAMSNAMES_BUILD" = 1; then
|
||||
LIBS="${LIBS} `xmlrpc-c-config libwww-client --libs`"
|
||||
CCFLAGS="${CCFLAGS} `xmlrpc-c-config libwww-client --cflags`"
|
||||
else
|
||||
AC_ERROR([No XML-RPC C developement environment found, get it from http://xmlrpc-c.sourceforge.net/])
|
||||
fi
|
||||
AM_CONDITIONAL(ADAMSNAMESBUILD, test "$ADAMSNAMES_BUILD" = 1)
|
||||
AC_OUTPUT(Makefile)
|
@ -1,111 +0,0 @@
|
||||
/* echoping plugin to query (with XML-RPC) Adam's Names, the DNS registry.
|
||||
See http://www.adamsnames.tc/api/xmlrpc.html.
|
||||
$Id$
|
||||
*/
|
||||
|
||||
#define IN_PLUGIN
|
||||
#include "../../echoping.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* http://xmlrpc-c.sourceforge.net/ */
|
||||
#include <xmlrpc.h>
|
||||
#include <xmlrpc_client.h>
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "common.h"
|
||||
|
||||
void
|
||||
domquery_usage(char *msg)
|
||||
{
|
||||
fprintf(stderr, "%s\n", msg);
|
||||
poptPrintUsage(poptcon, stderr, 0);
|
||||
err_quit(" domain");
|
||||
}
|
||||
|
||||
char *
|
||||
init(int argc, char **argv)
|
||||
{
|
||||
int value;
|
||||
xmlrpc_value *result;
|
||||
xmlrpc_bool free, read_contacts;
|
||||
xmlrpc_int32 reason;
|
||||
char *msg, *hostname;
|
||||
|
||||
struct poptOption options[] = {
|
||||
{"read-contacts", 'c', POPT_ARG_NONE, &read_contacts, 0,
|
||||
"Read also the contacts of the domain [NOT IMPLEMENTED]",
|
||||
""},
|
||||
POPT_AUTOHELP POPT_TABLEEND
|
||||
};
|
||||
poptcon = poptGetContext(NULL, argc, argv, options, POPT_CONTEXT_KEEP_FIRST);
|
||||
while ((value = poptGetNextOpt(poptcon)) > 0) {
|
||||
if (value < -1) {
|
||||
sprintf(msg, "%s: %s",
|
||||
poptBadOption(poptcon, POPT_BADOPTION_NOALIAS),
|
||||
poptStrerror(value));
|
||||
domquery_usage(msg);
|
||||
}
|
||||
}
|
||||
hostname = (char *) poptGetArg(poptcon); /* Not used */
|
||||
domain = (char *) poptGetArg(poptcon);
|
||||
if (domain == NULL || !strcmp(domain, ""))
|
||||
domquery_usage("Mandatory request missing");
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
start_raw()
|
||||
{
|
||||
|
||||
/* Start up our XML-RPC client library. */
|
||||
xmlrpc_client_init(XMLRPC_CLIENT_NO_FLAGS, CLIENT_NAME, CLIENT_VERSION);
|
||||
|
||||
/* Initialize our error-handling environment. */
|
||||
xmlrpc_env_init(&env);
|
||||
|
||||
printf("env initialized\n");
|
||||
|
||||
}
|
||||
|
||||
int
|
||||
execute()
|
||||
{
|
||||
xmlrpc_value *result;
|
||||
xmlrpc_value *domain_h;
|
||||
xmlrpc_int32 found;
|
||||
xmlrpc_value *error;
|
||||
/* char *dst; dst = HTAnchor_findAddress(ENDPOINT); */
|
||||
printf("Ready to call\n");
|
||||
/* Call the server */
|
||||
result = xmlrpc_client_call(&env, ENDPOINT, "domquery", "(s)", domain);
|
||||
die_if_fault_occurred(&env);
|
||||
printf("Call done, now parsing\n");
|
||||
|
||||
xmlrpc_parse_value(&env, result, "{s:i,*}", "found", &found);
|
||||
die_if_fault_occurred(&env);
|
||||
if (found) {
|
||||
printf("%s is there\n", domain);
|
||||
xmlrpc_parse_value(&env, result, "{s:S,i,s:A,*}", "domain",
|
||||
&domain_h, "found", &found, "error", &error);
|
||||
die_if_fault_occurred(&env);
|
||||
}
|
||||
/* Dispose of our result value. */
|
||||
xmlrpc_DECREF(result);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
terminate()
|
||||
{
|
||||
/* Clean up our error-handling environment. */
|
||||
xmlrpc_env_clean(&env);
|
||||
|
||||
/* Shutdown our XML-RPC client library. */
|
||||
xmlrpc_client_cleanup();
|
||||
|
||||
}
|
@ -1,80 +0,0 @@
|
||||
#include <stdio.h>
|
||||
|
||||
/* http://xmlrpc-c.sourceforge.net/ */
|
||||
#include <xmlrpc.h>
|
||||
#include <xmlrpc_client.h>
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#define CLIENT_NAME "XML-RPC Adams Names plugin for echoping"
|
||||
#define CLIENT_VERSION "0.0"
|
||||
|
||||
#define ENDPOINT "http://www.adamsnames.tc/api/xmlrpc"
|
||||
|
||||
void
|
||||
die_if_fault_occurred(xmlrpc_env * env)
|
||||
{
|
||||
if (env->fault_occurred) {
|
||||
fprintf(stderr, "XML-RPC Fault: %s (%d)\n",
|
||||
env->fault_string, env->fault_code);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
int value;
|
||||
xmlrpc_value *result;
|
||||
xmlrpc_bool free, read_contacts;
|
||||
xmlrpc_int32 reason;
|
||||
xmlrpc_value *domain_h;
|
||||
xmlrpc_int32 found;
|
||||
xmlrpc_value *error;
|
||||
xmlrpc_env env;
|
||||
char *domain;
|
||||
char *date, *holder;
|
||||
|
||||
if (argc != 2) {
|
||||
fprintf(stderr, "Usage: %s domain\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
domain = argv[1];
|
||||
|
||||
/* Start up our XML-RPC client library. */
|
||||
xmlrpc_client_init(XMLRPC_CLIENT_NO_FLAGS, CLIENT_NAME, CLIENT_VERSION);
|
||||
|
||||
/* Initialize our error-handling environment. */
|
||||
xmlrpc_env_init(&env);
|
||||
|
||||
/* Call the server */
|
||||
result = xmlrpc_client_call(&env, ENDPOINT, "domquery", "(s)", domain);
|
||||
die_if_fault_occurred(&env);
|
||||
|
||||
xmlrpc_parse_value(&env, result, "{s:i,*}", "found", &found);
|
||||
die_if_fault_occurred(&env);
|
||||
if (found) {
|
||||
printf("%s is there\n", domain);
|
||||
xmlrpc_parse_value(&env, result, "{s:S,s:i,s:A,*}", "domain",
|
||||
&domain_h, "found", &found, "error", &error);
|
||||
die_if_fault_occurred(&env);
|
||||
/* printf ("Type of domain: %d\n", xmlrpc_value_type(domain_h)); */
|
||||
xmlrpc_parse_value(&env, domain_h, "{s:s,s:s,*}", "registered",
|
||||
&date, "org", &holder);
|
||||
die_if_fault_occurred(&env);
|
||||
printf("Registered on %s by %s\n", date, holder);
|
||||
} else {
|
||||
printf("Unknown domain %s\n", domain);
|
||||
}
|
||||
/* Dispose of our result value. */
|
||||
xmlrpc_DECREF(result);
|
||||
/* Clean up our error-handling environment. */
|
||||
xmlrpc_env_clean(&env);
|
||||
|
||||
/* Shutdown our XML-RPC client library. */
|
||||
xmlrpc_client_cleanup();
|
||||
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
/* $Id$ */
|
||||
|
||||
#include <xmlrpc.h>
|
||||
#include <xmlrpc_client.h>
|
||||
|
||||
void
|
||||
die_if_fault_occurred(xmlrpc_env * env)
|
||||
{
|
||||
if (env->fault_occurred) {
|
||||
err_quit("XML-RPC Fault: %s (%d)\n", env->fault_string, env->fault_code);
|
||||
}
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
XCFLAGS=-Wall -O0 -g -fPIC ${CFLAGS}
|
||||
LDFLAGS=-shared
|
||||
|
||||
OBJECTS=daytime.o
|
||||
|
||||
all: daytime.so
|
||||
|
||||
%.o: %.c
|
||||
${CC} ${XCFLAGS} -c -o $@ $<
|
||||
|
||||
%.so: %.o
|
||||
${CC} ${LDFLAGS} -o $@ $<
|
||||
|
||||
clean:
|
||||
-rm -f *.o *.so
|
||||
|
||||
.SECONDARY: ${OBJECTS}
|
@ -1,54 +0,0 @@
|
||||
/*
|
||||
* Daytime (RFC 867) plugin.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#define IN_PLUGIN
|
||||
#include <echoping/echoping.h>
|
||||
|
||||
struct addrinfo daytime_server;
|
||||
int sockfd;
|
||||
echoping_options options;
|
||||
|
||||
char *
|
||||
init(const int argc, const char **argv, echoping_options global_options)
|
||||
{
|
||||
if (global_options.udp)
|
||||
err_quit("Sorry, UDP is not yet compatible with this daytime plugin");
|
||||
options = global_options;
|
||||
return "daytime";
|
||||
}
|
||||
|
||||
void
|
||||
start(struct addrinfo *res)
|
||||
{
|
||||
daytime_server = *res;
|
||||
}
|
||||
|
||||
int
|
||||
execute()
|
||||
{
|
||||
int nr;
|
||||
FILE *file;
|
||||
#define MAX 256
|
||||
char recvline[MAX];
|
||||
if ((sockfd =
|
||||
socket(daytime_server.ai_family, daytime_server.ai_socktype,
|
||||
daytime_server.ai_protocol)) < 0)
|
||||
err_sys("Can't open socket");
|
||||
if (connect(sockfd, daytime_server.ai_addr, daytime_server.ai_addrlen) < 0)
|
||||
err_sys("Can't connect to server");
|
||||
if ((file = fdopen(sockfd, "r")) == NULL)
|
||||
err_sys("Cannot fdopen");
|
||||
nr = readline(file, recvline, MAX, 1);
|
||||
if (options.verbose)
|
||||
printf("%s", recvline);
|
||||
close(sockfd);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
terminate()
|
||||
{
|
||||
}
|
@ -1,58 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Dangerous. Use only if you know what you do.
|
||||
|
||||
# Linux-only
|
||||
|
||||
# Configure the Linux traffic control to lose packets, in order to test
|
||||
# echoping.
|
||||
|
||||
# http://linux-net.osdl.org/index.php/Netem
|
||||
|
||||
DEVICE="tap0"
|
||||
PROTOCOL="udp"
|
||||
DEST_PORTS="7 53"
|
||||
# In percent
|
||||
LOSS=20
|
||||
# In milli-seconds
|
||||
DELAY=40
|
||||
CLEAN_FIRST="YES"
|
||||
USE_IPTABLES="YES"
|
||||
|
||||
# Do not touch afterwards
|
||||
INTERESTING="4"
|
||||
PLAIN="0"
|
||||
|
||||
if [ ! -z "$CLEAN_FIRST" ]; then
|
||||
tc qdisc del dev ${DEVICE} root
|
||||
iptables -t mangle -F INPUT
|
||||
iptables -t mangle -F OUTPUT
|
||||
fi
|
||||
|
||||
tc qdisc add dev ${DEVICE} root handle 1: prio
|
||||
|
||||
tc qdisc add dev ${DEVICE} parent 1:2 handle ${INTERESTING}: \
|
||||
netem delay ${DELAY}ms loss ${LOSS}%
|
||||
|
||||
#tc qdisc add dev ${DEVICE} parent ${INTERESTING}:1 \
|
||||
# tbf rate 20kbit buffer 1600 limit 3000
|
||||
|
||||
if [ -z "$USE_IPTABLES" ] || [ "$USE_IPTABLES" = "NO" ]; then
|
||||
for port in ${DEST_PORTS}; do
|
||||
# Note: $PROTOCOL is ignored...
|
||||
tc filter add dev ${DEVICE} protocol ip parent 1:0 prio 2 u32 \
|
||||
match ip dport ${port} 0xffff flowid 10:5
|
||||
done
|
||||
else
|
||||
tc filter add dev ${DEVICE} protocol ip parent 1:0 prio 2 \
|
||||
handle ${INTERESTING} fw flowid 10:5
|
||||
# Not perfect: it seems all ports are affected :-(
|
||||
for port in ${DEST_PORTS}; do
|
||||
# Ingress
|
||||
iptables -t mangle -A INPUT -i ${DEVICE} -p ${PROTOCOL} --sport ${port} \
|
||||
-j MARK --set-mark ${INTERESTING}
|
||||
# Egress
|
||||
iptables -t mangle -A OUTPUT -o ${DEVICE} -p ${PROTOCOL} --dport ${port} \
|
||||
-j MARK --set-mark ${INTERESTING}
|
||||
done
|
||||
fi
|
@ -1,5 +0,0 @@
|
||||
pkglib_LTLIBRARIES = smallservices.la
|
||||
smallservices_la_SOURCES = small-services.c
|
||||
smallservices_la_LDFLAGS = -module
|
||||
|
||||
|
@ -1,10 +0,0 @@
|
||||
small-services is an echoping plugin which implements the following
|
||||
network services:
|
||||
|
||||
* echo (RFC 862)
|
||||
* discard (RFC 863)
|
||||
* chargen (RFC 864)
|
||||
|
||||
As of today (2007-12-21), these services are in the main echoping tree
|
||||
but the idea is to move them to this plugin in the future. See
|
||||
echoping Feature Request #1694557 at Sourceforge.
|
@ -1,9 +0,0 @@
|
||||
dnl $Id: configure.ac 377 2007-03-12 20:48:05Z bortz $
|
||||
|
||||
AC_INIT(small-services, 0.0-BETA)
|
||||
AC_PROG_CC(cc gcc)
|
||||
AC_PROG_LIBTOOL
|
||||
AM_INIT_AUTOMAKE(foreign)
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
AC_OUTPUT(Makefile)
|
@ -1,58 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* $Id: daytime.c 395 2007-04-04 19:26:19Z bortz $
|
||||
*/
|
||||
|
||||
#define IN_PLUGIN
|
||||
#include <echoping/echoping.h>
|
||||
|
||||
struct addrinfo smallservices_server;
|
||||
int sockfd;
|
||||
echoping_options options;
|
||||
|
||||
char *
|
||||
init(const int argc, const char **argv, echoping_options global_options)
|
||||
{
|
||||
options = global_options;
|
||||
/* TODO: the service returned must depend on the options */
|
||||
return "echo";
|
||||
}
|
||||
|
||||
void
|
||||
start(struct addrinfo *res)
|
||||
{
|
||||
smallservices_server = *res;
|
||||
}
|
||||
|
||||
int
|
||||
execute()
|
||||
{
|
||||
int nr;
|
||||
#define MAX 256
|
||||
#define TEST_STRING "test"
|
||||
char result[MAX];
|
||||
if ((sockfd =
|
||||
socket(smallservices_server.ai_family, smallservices_server.ai_socktype,
|
||||
smallservices_server.ai_protocol)) < 0)
|
||||
err_sys("Can't open socket");
|
||||
if (connect
|
||||
(sockfd, smallservices_server.ai_addr, smallservices_server.ai_addrlen) < 0)
|
||||
err_sys("Can't connect to server");
|
||||
if (write(sockfd, TEST_STRING, strlen(TEST_STRING)) != strlen(TEST_STRING))
|
||||
err_sys("Cannot write");
|
||||
nr = read(sockfd, result, strlen(TEST_STRING));
|
||||
if (nr != strlen(TEST_STRING))
|
||||
err_sys("Cannot read (only %i bytes)", nr); /* TODO: the server may send
|
||||
* the result in chunks, we
|
||||
* should loop */
|
||||
if (strcmp(result, TEST_STRING) != 0)
|
||||
err_sys("Result \"%s\" is different from test string \"%s\"",
|
||||
result, TEST_STRING);
|
||||
close(sockfd);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
terminate()
|
||||
{
|
||||
}
|
@ -1,239 +0,0 @@
|
||||
.\" $Id$
|
||||
.TH echoping 1 "November 22, 1996" "ECHOPING" "echoping"
|
||||
.SH NAME
|
||||
echoping \- tests a remote host with TCP or UDP
|
||||
|
||||
.SH SYNOPSIS
|
||||
.B echoping
|
||||
.RI [-4]
|
||||
.RI [-6]
|
||||
.RI [-v]
|
||||
.RI [-V]
|
||||
.RI [-f fill]
|
||||
.RI [-t timeout]
|
||||
.RI [-c]
|
||||
.RI [-d]
|
||||
.RI [-u]
|
||||
.RI [-T]
|
||||
.RI [-s size]
|
||||
.RI [-n number]
|
||||
.RI [-w delay]
|
||||
.RI [-h url-or-path]
|
||||
.RI [-R]
|
||||
.RI [-i url]
|
||||
.RI [-p priority]
|
||||
.RI [-P tos]
|
||||
.RI [-C]
|
||||
.RI [-S]
|
||||
.RI [-A]
|
||||
.RI [-a]
|
||||
.RI [-m plugin]
|
||||
.B hostname
|
||||
[:port]
|
||||
[plugin options...]
|
||||
|
||||
.SH DESCRIPTION
|
||||
.LP
|
||||
.B echoping
|
||||
is a small program to test (approximatively) performances
|
||||
of a remote Internet host by sending it TCP "echo" packets. It can use other
|
||||
protocols as well (HTTP - which makes it a good tool to test Web servers, UDP "echo", etc).
|
||||
.LP
|
||||
.B echoping
|
||||
simply shows the elapsed time, including the time to set up the TCP
|
||||
connection and to transfer the data. Therefore, it is unsuitable to physical
|
||||
line raw throughput measures (unlike bing or treno). On the other end, the
|
||||
action it performs are close from, for instance, a HTTP request and it is meaningful
|
||||
to use it (carefully) to measure Web performances.
|
||||
|
||||
.SH ARGUMENT
|
||||
.IP hostname[:port]
|
||||
Name (or address) of the server to test. For HTTP, you can specify a
|
||||
port number. For HTTP and IPv6, you can use RFC 3986 syntax (you will
|
||||
probably need to escape the brackets from the shell). The name can be
|
||||
an IDN (Unicode domain name).
|
||||
|
||||
.SH OPTIONS
|
||||
.IP -v
|
||||
Verbose
|
||||
.IP -V
|
||||
Displays the compiled-in configuration of echoping. Useful for bug reports.
|
||||
.IP -s\ nnn
|
||||
Size of the data to send. Large values can produce strange results with
|
||||
some echo servers.
|
||||
.IP -n\ nnn
|
||||
Numbers of repeated tests. With this option, you have also the
|
||||
minimum, maximum, average and median time, as well as the standard
|
||||
deviation. The median is the value such that half of the measures are
|
||||
under it and the other half is above. When you measure highly
|
||||
variables values, like it is often the case on the whole Internet,
|
||||
median is better than average to avoid "extreme" values. You can check
|
||||
the "value" of the average by looking at the standard deviation: very
|
||||
roughly, if the standard deviation is more than the half of the
|
||||
average, the average does not mean anything. (See a book about
|
||||
statistics for the details: the reality is far more complicated.)
|
||||
.IP -w\ nnn
|
||||
Number of seconds to wait between two tests (default is one). On
|
||||
systems which have usleep(), you can write it as a fractional number,
|
||||
such as 3.14. Otherwise, use integers.
|
||||
.IP -t\ nnn
|
||||
Number of seconds to wait a reply before giving up. For TCP, this is the
|
||||
maximum number of seconds for the whole connection (setup and data exchange).
|
||||
.IP -u
|
||||
Use UDP instead of TCP
|
||||
.IP -T
|
||||
Use SCTP instead of TCP
|
||||
.IP -d
|
||||
Use the "discard" service instead of echo
|
||||
.IP -c
|
||||
Use the "chargen" service instead of echo
|
||||
.IP -h\ url-or-path
|
||||
Use the HTTP protocol (instead of echo) for the given URL. If the
|
||||
hostname is the Web server, the argument has to
|
||||
be a path, a relative URL (for instance '/' or '/pics/foobar.gif'). If the
|
||||
hostname is a proxy/cache like Squid, the argument has to
|
||||
be an absolute URL.
|
||||
.IP -R
|
||||
Accept HTTP status codes 3xx (redirections) as normal responses (the
|
||||
default is to regard them as errors)
|
||||
.IP -i\ url
|
||||
Use the ICP protocol (instead of echo) for the given URL. The URL has to
|
||||
be an absolute one. This is mostly for testing Squid Web proxy/caches.
|
||||
.IP -A
|
||||
Force the proxy (if you use one) to ignore the cache
|
||||
.IP -a
|
||||
Force the proxy (if you use one) to revalidate data with the original server
|
||||
.IP -C
|
||||
Use the SSL/TLS (cryptography) protocol. For HTTP tests only.
|
||||
.IP -S
|
||||
Use the SMTP protocol (instead of echo) for the given server.
|
||||
.IP -4
|
||||
Use only IPv4 (even if the target machine has an IPv6 address)
|
||||
.IP -6
|
||||
Use only IPv6 (even if the target machine has an IPv4 address)
|
||||
.IP -f\ character
|
||||
Fill the packet with this character (default is random filling)
|
||||
.IP -D
|
||||
Tries to display actual data transfer duration only, not total time
|
||||
.IP -N\ n
|
||||
Displays an average which excludes values ("outliers") which are
|
||||
further than +/- N*standard deviation
|
||||
.IP -p\ n
|
||||
Send packets with the socket priority to the integer
|
||||
.IR n .
|
||||
The mapping of the socket priority into a network layer or a link
|
||||
layer priority depends upon the network protocol and link protocol
|
||||
in use. For more details see
|
||||
.B SO_PRIORITY
|
||||
in
|
||||
.BR socket(7).
|
||||
.IP -P\ n
|
||||
Set the IP type of service octet in the transmitted packets to the
|
||||
least significant eight bits of the integer
|
||||
.IR n .
|
||||
See
|
||||
.BR ip(7)
|
||||
or
|
||||
.BR ip(4)
|
||||
(depending on your Unix). /usr/include/netinet/ip.h may contain
|
||||
interesting constants for setting Type Of Service.
|
||||
.IP -m\ plugin
|
||||
Load the given plugin. The plugin is first
|
||||
searched in the normal library directories (see
|
||||
.BR ld.so(8)
|
||||
) then in @plugins_dir@. You can type
|
||||
.BR ls
|
||||
in @plugins_dir@ to get an idea of the available plugins. The documentation for a
|
||||
given plugin is in
|
||||
.BR echoping_PLUGINNAME(1)
|
||||
The plugin-specific options appear
|
||||
.B after
|
||||
the hostname.
|
||||
.SH EXAMPLES
|
||||
.IP echoping\ \-v\ foobar.example.com
|
||||
Tests the remote machine with TCP echo (one test).
|
||||
.IP echoping\ \-n\ 5\ \-w\ 10\ foobar.example.com
|
||||
Tests the remote machine with TCP echo (five tests, every ten seconds).
|
||||
.IP echoping\ \-h\ /\ foobar.example.com
|
||||
Tests the remote Web server and asks its home page. Note you don't
|
||||
indicate the whole URL.
|
||||
.IP echoping\ \-h\ http://www.example.com/\ cache.example.com:3128
|
||||
Tests the remote Web proxy-cache and asks a Web page. Note that you must
|
||||
indicate the whole URL.
|
||||
.IP echoping\ -n\ 3\ -m\ whois\ foobar.example.com\ -d\ tao.example.org
|
||||
Loads the whois plugin and query the host foobar.example.com. "-d
|
||||
tao.example.org" are options specific to the whois plugin.
|
||||
.IP echoping\ -u\ \-P\ 0xa0\ foobar.example.com
|
||||
Sends several UDP Echo packets with an IP Precedence of 5.
|
||||
.SH IP TYPE OF SERVICE OCTET
|
||||
The IP packet header contains 8 bits named the "type of service octet".
|
||||
The value of the octet is set with the
|
||||
.B \-P
|
||||
option. The effects of the octet are defined differently in RFC791
|
||||
.I "Internet Protocol"
|
||||
and RFC2474
|
||||
.IR "Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers".
|
||||
|
||||
RFC791 defines
|
||||
.I Precedence
|
||||
which has ascending priorities 0 through to 7, and the bits
|
||||
.IR Delay ,
|
||||
.IR Throughput ,
|
||||
.IR Reliability ,
|
||||
and
|
||||
.I Cost
|
||||
which indicates the application's preference for the properties of
|
||||
the packet's path through the network.
|
||||
.I Precedence
|
||||
is in the most significant three bits of the type of service octet,
|
||||
followed in decending significance order by the
|
||||
.IR D ,
|
||||
.IR T ,
|
||||
.I R
|
||||
and
|
||||
.I C
|
||||
bits. The least significant bit must be zero. Only one of the
|
||||
.IR D ,
|
||||
.IR T ,
|
||||
.I R
|
||||
or
|
||||
.I C
|
||||
bits may be set.
|
||||
|
||||
RFC2474 defines the Distributed Services Code Point, or
|
||||
DSCP.
|
||||
This acts as a selector between 64 possible behaviours that the
|
||||
network can apply to the packet. The
|
||||
.I DSCP
|
||||
is in the most significant six bits of the type of service octet.
|
||||
The remaining least significant two bits of the octet must be
|
||||
zero.
|
||||
|
||||
The numeric arguments to
|
||||
.B -p
|
||||
and
|
||||
.B -P
|
||||
can be in decimal (such as 11), octal (such as 013) or hexadecimal
|
||||
(such as 0x0b). So padding decimal arguments with leading zeros will
|
||||
change the value read.
|
||||
|
||||
You may need to be superuser to set some
|
||||
.B -p
|
||||
or
|
||||
.B -P
|
||||
values (precedence on Linux, for instance).
|
||||
|
||||
.SH BUGS
|
||||
|
||||
See SourceForge bug tracking system at
|
||||
<http://sourceforge.net/tracker/?group_id=4581&atid=104581>.
|
||||
|
||||
.SH SEE ALSO
|
||||
See the README for information about other network measurements programs.
|
||||
|
||||
.SH FILES
|
||||
.IP "\fB@plugins_dir@ \fR" 4
|
||||
Plugins directory
|
||||
|
||||
.SH AUTHOR
|
||||
Stephane Bortzmeyer <bortz@users.sourceforge.net>
|
File diff suppressed because it is too large
Load Diff
@ -1,240 +0,0 @@
|
||||
/* $Id$ */
|
||||
|
||||
/* Settings you should not change -- see below for changeable ones */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
/* Settings you can change */
|
||||
|
||||
#define DEFLINE 256
|
||||
#define UDPMAX 65535
|
||||
/* Mostly for HTTP */
|
||||
#define MAXTOREAD 150000
|
||||
#ifdef SMTP
|
||||
#define MAXSMTP 1024
|
||||
#define MAXSMTPLINES 30
|
||||
#endif
|
||||
|
||||
/* Probably too many inclusions but this is to keep 'gcc -Wall' happy... */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <netdb.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <stdarg.h>
|
||||
#include <sys/time.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
#include <math.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
/* popt library */
|
||||
#include <popt.h>
|
||||
|
||||
#ifdef OPENSSL
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/pem.h>
|
||||
#include <openssl/ssl.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/rand.h>
|
||||
#endif /* OpenSSL */
|
||||
|
||||
#ifdef GNUTLS
|
||||
#include <gnutls/gnutls.h>
|
||||
#endif
|
||||
|
||||
#ifdef LIBIDN
|
||||
#include <stringprep.h> /* stringprep_locale_to_utf8() */
|
||||
#include <idna.h> /* idna_to_ascii_from_utf8() */
|
||||
#endif
|
||||
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
|
||||
#ifndef SIGALRM /* Linux... */
|
||||
#define SIGALRM 14 /* alarm clock timeout */
|
||||
#endif
|
||||
#ifndef SIGINT /* Linux... */
|
||||
#define SIGINT 2 /* interrupt, generated from terminal special char */
|
||||
#endif
|
||||
|
||||
#ifndef INADDR_NONE /* SunOS */
|
||||
#define INADDR_NONE (-1)
|
||||
#endif
|
||||
|
||||
#ifndef SOL_IP
|
||||
#define SOL_IP (getprotobyname("ip")->p_proto)
|
||||
#endif
|
||||
|
||||
/* These entities should be in errno.h but some systems do not define
|
||||
them. */
|
||||
#ifdef DECL_SYS_NERR
|
||||
extern int sys_nerr;
|
||||
#endif
|
||||
|
||||
/* If we have it, use it */
|
||||
#ifdef HAVE_SIGACTION
|
||||
#define USE_SIGACTION 1
|
||||
#endif
|
||||
#ifdef HAVE_TOS
|
||||
#define USE_TOS 1
|
||||
#endif
|
||||
#ifdef HAVE_SOCKET_PRIORITY
|
||||
#define USE_PRIORITY 1
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef HEADER_INCLUDED
|
||||
typedef union _CHANNEL
|
||||
{
|
||||
FILE *fs;
|
||||
#ifdef OPENSSL
|
||||
SSL *ssl;
|
||||
#endif
|
||||
#ifdef GNUTLS
|
||||
gnutls_session tls;
|
||||
#endif
|
||||
}
|
||||
CHANNEL;
|
||||
|
||||
/* Do not use "short" for "boolean" because popt does not know this
|
||||
type. On a little-endian machine without alignment issues, it may
|
||||
work but not, for instance, on UltraSparc platforms. See for
|
||||
instance Debian bug #254322. */
|
||||
typedef unsigned int boolean;
|
||||
|
||||
struct result
|
||||
{
|
||||
boolean valid;
|
||||
struct timeval timevalue;
|
||||
};
|
||||
|
||||
boolean timeout_flag;
|
||||
struct echoping_struct
|
||||
{
|
||||
boolean udp; /* Use the UDP protocol (TCP is the default) */
|
||||
boolean ttcp;
|
||||
boolean only_ipv4;
|
||||
boolean only_ipv6;
|
||||
boolean verbose;
|
||||
};
|
||||
typedef struct echoping_struct echoping_options;
|
||||
#ifndef IN_PLUGIN
|
||||
/* The functions we will find in the plugin */
|
||||
/* Initializes the plugin with its arguments. Returns the port name or number or NULL if the plugin wants to use the raw interface. */
|
||||
typedef char *(*init_f) (const int argc, const char **argv,
|
||||
const echoping_options global_options);
|
||||
init_f plugin_init;
|
||||
typedef void (*start_f) (struct addrinfo *);
|
||||
start_f plugin_start;
|
||||
typedef void (*start_raw_f) ();
|
||||
start_raw_f plugin_raw_start;
|
||||
typedef int (*execute_f) ();
|
||||
execute_f plugin_execute;
|
||||
typedef void (*terminate_f) ();
|
||||
terminate_f plugin_terminate;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
struct timeval null_timeval;
|
||||
struct timeval max_timeval;
|
||||
|
||||
#define ECHO_TCP_PORT "echo"
|
||||
#define DISCARD_TCP_PORT "discard"
|
||||
#define CHARACTER_GENERATOR_TCP_PORT "chargen"
|
||||
#define DEFAULT_HTTP_TCP_PORT "http"
|
||||
#define DEFAULT_HTTPS_TCP_PORT "https"
|
||||
#define DEFAULT_ICP_UDP_PORT "icp"
|
||||
|
||||
#ifdef HTTP
|
||||
/* Use the old HTTP 1.0 protocol? If yes, set HTTP10 to 1*/
|
||||
#undef HTTP10
|
||||
#endif
|
||||
|
||||
#define USE_ECHO 1
|
||||
#define USE_DISCARD 2
|
||||
#define USE_CHARGEN 3
|
||||
#define USE_HTTP 4
|
||||
#define USE_ICP 5
|
||||
#define USE_SMTP 6
|
||||
|
||||
#define CHARGENERATED " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefg";
|
||||
|
||||
char *server;
|
||||
#ifdef LIBIDN
|
||||
char *locale_server, *ace_server, *utf8_server;
|
||||
#endif
|
||||
|
||||
/* My functions */
|
||||
|
||||
/* error.c */
|
||||
void usage ();
|
||||
void err_sys (char *str, ...);
|
||||
void err_ret (char *str, ...);
|
||||
void err_quit (char *str, ...);
|
||||
char *sys_err_str ();
|
||||
/* writen.c */
|
||||
int writen ();
|
||||
/* readline.c */
|
||||
int readline ();
|
||||
#ifdef OPENSSL
|
||||
int SSL_readline ();
|
||||
#endif
|
||||
#ifdef GNUTLS
|
||||
int TLS_readline ();
|
||||
#endif
|
||||
/* util.c */
|
||||
char *random_string ();
|
||||
void tvsub ();
|
||||
void tvadd ();
|
||||
void tvavg ();
|
||||
void tvmin ();
|
||||
void tvmax ();
|
||||
int tvcmp ();
|
||||
void tvstddev ();
|
||||
void tvstddevavg ();
|
||||
double tv2double ();
|
||||
struct timeval double2tv ();
|
||||
/* http.c */
|
||||
#ifdef HTTP
|
||||
char *make_http_sendline ();
|
||||
void find_server_and_port ();
|
||||
/* This one has prototypes, for a very subtile compiler issue. */
|
||||
int read_from_server (CHANNEL fs, short ssl, boolean accept_redirects);
|
||||
#endif
|
||||
|
||||
#ifdef ICP
|
||||
#include "icp.h"
|
||||
void *make_icp_sendline ();
|
||||
int recv_icp ();
|
||||
#ifndef HTTP
|
||||
int read_from_server ();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef SMTP
|
||||
int smtp_read_response_from_server ();
|
||||
#endif
|
||||
|
||||
extern char *progname;
|
||||
|
||||
extern boolean timeout_flag;
|
||||
|
||||
#include "compilation.h"
|
||||
|
||||
#ifndef HEADER_INCLUDED
|
||||
#define HEADER_INCLUDED
|
||||
#endif
|
@ -1,52 +0,0 @@
|
||||
# $Id$
|
||||
|
||||
Summary: Program to test network services
|
||||
Name: echoping
|
||||
Version: 6.0.0
|
||||
Release: 1
|
||||
Copyright: GNU
|
||||
Group: Utilities/Network
|
||||
Packager: Stephane Bortzmeyer <bortz@users.sourceforge.net>
|
||||
Source: https://github.com/bortzmeyer/echoping/archive/master.zip
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||
Url: http://bortzmeyer.github.io/echoping/
|
||||
Prefix: /usr/local
|
||||
# Requires: openssl
|
||||
# BuildRequires: openssl-devel openssl
|
||||
|
||||
%description
|
||||
|
||||
"echoping" is a small program to test (approximatively) performances
|
||||
of a remote host by sending it TCP "echo" (or other protocol, like
|
||||
HTTP) packets.
|
||||
|
||||
%prep
|
||||
|
||||
%setup -q # -n %{name}-%{version}
|
||||
|
||||
%build
|
||||
./configure --prefix=$RPM_BUILD_ROOT/usr/local --enable-http --enable-icp --enable-smtp
|
||||
make
|
||||
|
||||
|
||||
%clean
|
||||
rm -rf $RPM_BUILD_ROOT
|
||||
|
||||
%install
|
||||
make DESTDIR=$RPM_BUILD_ROOT install
|
||||
|
||||
|
||||
%files
|
||||
/
|
||||
%defattr(-,root,root)
|
||||
%doc AUTHORS COPYING ChangeLog DETAILS NEWS README TODO
|
||||
%doc %{_mandir}/man1/echoping.1*
|
||||
%doc test-echoping-crypto test-echoping-icp test-echoping-local test-echoping-remote
|
||||
|
||||
%changelog
|
||||
* Wed Jun 30 2004 - cougar@random.ee
|
||||
- Merge
|
||||
* Thu Feb 20 2001 Paco <francisco.monserrat@rediris.es>
|
||||
- RPM package
|
||||
|
||||
|
@ -1,116 +0,0 @@
|
||||
#include "echoping.h"
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
/* Most of error-handling routines stolen from Stevens' books */
|
||||
|
||||
void
|
||||
my_perror()
|
||||
{
|
||||
fprintf(stderr, " %s\n", sys_err_str());
|
||||
}
|
||||
|
||||
/*
|
||||
* Recoverable error. Print a message, and return to caller.
|
||||
*
|
||||
* err_ret(str, arg1, arg2, ...)
|
||||
*
|
||||
* The string "str" must specify the conversion specification for any args.
|
||||
*/
|
||||
|
||||
/* VARARGS1 */
|
||||
void
|
||||
err_ret(char *str, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
va_start(args, str);
|
||||
vfprintf(stderr, str, args);
|
||||
va_end(args);
|
||||
|
||||
my_perror();
|
||||
|
||||
fflush(stdout);
|
||||
fflush(stderr);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fatal error. Print a message and terminate. Don't dump core and don't
|
||||
* print the system's errno value.
|
||||
*
|
||||
* err_quit(str, arg1, arg2, ...)
|
||||
*
|
||||
* The string "str" must specify the conversion specification for any args.
|
||||
*/
|
||||
|
||||
/* VARARGS1 */
|
||||
void
|
||||
err_quit(char *str, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
va_start(args, str);
|
||||
vfprintf(stderr, str, args);
|
||||
fputc('\n', stderr);
|
||||
va_end(args);
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Fatal error related to a system call. Print a message and terminate.
|
||||
* Don't dump core, but do print the system's errno value and its associated
|
||||
* message.
|
||||
*
|
||||
* err_sys(str, arg1, arg2, ...)
|
||||
*
|
||||
* The string "str" must specify the conversion specification for any args.
|
||||
*/
|
||||
|
||||
/* VARARGS1 */
|
||||
void
|
||||
err_sys(char *str, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
va_start(args, str);
|
||||
vfprintf(stderr, str, args);
|
||||
va_end(args);
|
||||
|
||||
my_perror();
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void
|
||||
usage(poptContext context)
|
||||
{
|
||||
poptPrintUsage(context, stderr, 0);
|
||||
fprintf(stderr, " hostname [plugin-options...]\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return a string containing some additional operating-system dependent
|
||||
* information. Note that different versions of UNIX assign different
|
||||
* meanings to the same value of "errno" (compare errno's starting with 35
|
||||
* between System V and BSD, for example). This means that if an error
|
||||
* condition is being sent to another UNIX system, we must interpret the
|
||||
* errno value on the system that generated the error, and not just send the
|
||||
* decimal value of errno to the other system.
|
||||
*/
|
||||
|
||||
char *
|
||||
sys_err_str()
|
||||
{
|
||||
static char msgstr[200];
|
||||
|
||||
if (errno != 0) {
|
||||
sprintf(msgstr, "(%s)", strerror(errno));
|
||||
} else {
|
||||
msgstr[0] = '\0';
|
||||
}
|
||||
return (msgstr);
|
||||
}
|
@ -1,153 +0,0 @@
|
||||
/* $Id$ */
|
||||
|
||||
#include "echoping.h"
|
||||
|
||||
#ifdef HTTP
|
||||
#include "HTParse.h"
|
||||
|
||||
|
||||
char big_recvline[MAXTOREAD];
|
||||
|
||||
char *
|
||||
make_http_sendline(char *url, char *host, int port, int nocache)
|
||||
{
|
||||
short sport = (short) port;
|
||||
int size = 350; /* Enough? RFC 2616, section 3.2.1 says 255 should
|
||||
* be enough, although there is no hard limit. We
|
||||
* reserve more because there * are the protocol
|
||||
* elements, the HTTP headers, etc */
|
||||
char *sendline = (char *) malloc(size);
|
||||
char *hostname = (char *) malloc(size);
|
||||
char *cache_directive = "";
|
||||
int result;
|
||||
#ifdef HTTP10
|
||||
if (nocache)
|
||||
cache_directive = "Pragma: no-cache\r\n"; /* RFC 1945, "Hypertext
|
||||
* Transfer Protocol * --
|
||||
* HTTP/1.0" */
|
||||
result = snprintf(sendline, size,
|
||||
"GET %s HTTP/1.0\r\nUser-Agent: Echoping/%s\r\n%s\r\n",
|
||||
url, VERSION, cache_directive);
|
||||
#else
|
||||
if (nocache) {
|
||||
if (nocache == 1)
|
||||
cache_directive = "Cache-control: max-age=0\r\n"; /* Simply force a
|
||||
* recheck with
|
||||
* the server */
|
||||
else
|
||||
cache_directive = "Cache-control: no-cache\r\n"; /* RFC 2616
|
||||
* "Hypertext
|
||||
* Transfer Protocol
|
||||
* -- HTTP/1.1" */
|
||||
}
|
||||
strncpy(hostname, HTParse(url, "", PARSE_HOST), size); /* See bug #1688940
|
||||
* to see why we use
|
||||
* * * strNcpy. */
|
||||
hostname[size] = '\0'; /* Not added automatically */
|
||||
if (!strcmp(hostname, ""))
|
||||
snprintf(hostname, size, "%s:%d", host, sport);
|
||||
result = snprintf(sendline, size,
|
||||
"GET %s HTTP/1.1\r\nUser-Agent: Echoping/%s\r\nHost: %s\r\nConnection: close\r\n%s\r\n",
|
||||
url, VERSION, hostname, cache_directive);
|
||||
free(hostname);
|
||||
#endif
|
||||
if (result >= size)
|
||||
err_quit("URL and/or hostname too long(s)");
|
||||
return sendline;
|
||||
}
|
||||
|
||||
int
|
||||
read_from_server(CHANNEL fs, short ssl, boolean accept_redirects)
|
||||
{
|
||||
int nr = 0;
|
||||
int total = 0;
|
||||
int reply_code;
|
||||
int first_line = TRUE;
|
||||
short body = FALSE;
|
||||
#ifdef OPENSSL
|
||||
int sslcode;
|
||||
#endif
|
||||
while (!body && !timeout_flag) {
|
||||
if (!ssl)
|
||||
nr = readline(fs.fs, big_recvline, MAXTOREAD, TRUE);
|
||||
#ifdef OPENSSL
|
||||
else {
|
||||
nr = SSL_readline(fs.ssl, big_recvline, MAXTOREAD, TRUE);
|
||||
if (nr == -1) {
|
||||
sslcode = ERR_get_error();
|
||||
err_ret("SSL_readline error: %s", ERR_error_string(sslcode, NULL));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef GNUTLS
|
||||
else
|
||||
{
|
||||
nr = TLS_readline(fs.tls, big_recvline, MAXTOREAD, TRUE);
|
||||
if (nr == -1) {
|
||||
err_ret("TLS_readline error: %s", gnutls_strerror(nr));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* printf ("DEBUG: reading \"%s\"\n (%d chars)\n",
|
||||
* big_recvline, nr);
|
||||
*/
|
||||
/*
|
||||
* HTTP replies should be separated by CR-LF. Unfortunately,
|
||||
* some servers send only CR :-(
|
||||
*/
|
||||
body = ((nr == 2) || (nr == 1)); /* Empty line CR-LF seen */
|
||||
if ((nr < 1) && (timeout_flag)) /* Probably a timeout */
|
||||
return -1;
|
||||
if (nr < 1)
|
||||
/* SourceForge bug #109385 */
|
||||
/* err_sys ("Error reading HTTP header"); */
|
||||
return -1;
|
||||
/*
|
||||
* if ((int) big_recvline[nr-1] == 10) nr--;
|
||||
*/
|
||||
if (first_line) {
|
||||
/* sscanf parse "HTTP/1.x 200" */
|
||||
sscanf(big_recvline,"%*s %d", &reply_code);
|
||||
|
||||
/* 204 No Content is not an error, message body is empty by definition, see RFC 2616 */
|
||||
if (reply_code == 204)
|
||||
return 0; /* zero bytes is correct */
|
||||
|
||||
if (! (reply_code >= 200 && reply_code < 300) &&
|
||||
! ((reply_code >= 300 && reply_code < 400) && accept_redirects))
|
||||
/*
|
||||
* Status codes beginning with 3 are not
|
||||
* errors See bug #850674 and RFC 2616,
|
||||
* section 10.3
|
||||
*/
|
||||
err_quit("HTTP error \"%s\"", big_recvline);
|
||||
}
|
||||
total = total + nr;
|
||||
first_line = FALSE;
|
||||
}
|
||||
/* Read the body */
|
||||
if (!ssl)
|
||||
nr = readline(fs.fs, big_recvline, MAXTOREAD, FALSE);
|
||||
#ifdef OPENSSL
|
||||
else
|
||||
nr = SSL_readline(fs.ssl, big_recvline, MAXTOREAD, FALSE);
|
||||
#endif
|
||||
#ifdef GNUTLS
|
||||
else
|
||||
nr = TLS_readline(fs.tls, big_recvline, MAXTOREAD, FALSE);
|
||||
#endif
|
||||
/*
|
||||
* printf ("DEBUG: reading body \"%s\"\n (%d chars)\n", big_recvline,
|
||||
* nr);
|
||||
*/
|
||||
if ((nr < 2) && (timeout_flag)) /* Probably a timeout */
|
||||
return -1;
|
||||
if (nr < 2) /* Hmm, if the body is empty, we'll get a * * * * *
|
||||
* * * meaningless error message */
|
||||
err_sys("Error reading HTTP body");
|
||||
total = total + nr;
|
||||
return total; /* How to do if we want only the body's size? */
|
||||
}
|
||||
|
||||
#endif /* HTTP */
|
@ -1,106 +0,0 @@
|
||||
/*
|
||||
* Code contributed by Christian Grimm <grimm@rvs.uni-hannover.de>
|
||||
* and patched by Stephane Bortzmeyer.
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
#include "echoping.h"
|
||||
|
||||
#ifdef ICP
|
||||
|
||||
|
||||
void *
|
||||
make_icp_sendline(url, shost, opcode, length)
|
||||
const char *url;
|
||||
u_num32 *shost;
|
||||
icp_opcode opcode;
|
||||
int *length;
|
||||
|
||||
{
|
||||
icp_common_t *headerp = NULL;
|
||||
char *buf = NULL;
|
||||
char *urloffset = NULL;
|
||||
u_num32 flags = ICP_FLAG_SRC_RTT;
|
||||
u_num32 pad = 0;
|
||||
u_num32 reqnum = 4711;
|
||||
unsigned short buf_len;
|
||||
|
||||
buf_len = sizeof(icp_common_t) + strlen(url) + 1;
|
||||
if (opcode == ICP_OP_QUERY)
|
||||
buf_len += sizeof(u_num32);
|
||||
buf = calloc(buf_len, 1);
|
||||
headerp = (icp_common_t *) buf;
|
||||
headerp->opcode = opcode;
|
||||
headerp->version = ICP_VERSION_CURRENT;
|
||||
headerp->length = htons(buf_len);
|
||||
headerp->reqnum = htonl(reqnum);
|
||||
headerp->flags = htonl(flags);
|
||||
headerp->pad = pad;
|
||||
if (shost)
|
||||
headerp->shostid = htonl(*shost);
|
||||
/* urloffset = (char *) ((int) buf + sizeof(icp_common_t)); */
|
||||
urloffset = (char *) (buf + sizeof(icp_common_t));
|
||||
if (opcode == ICP_OP_QUERY)
|
||||
urloffset += sizeof(u_num32);
|
||||
memcpy(urloffset, url, strlen(url));
|
||||
*length = buf_len;
|
||||
return buf;
|
||||
}
|
||||
|
||||
int
|
||||
recv_icp(sockfd, buf, retcode)
|
||||
int sockfd;
|
||||
char *buf;
|
||||
char *retcode;
|
||||
|
||||
{ /*
|
||||
* based on draft-wessels-icp-v2-02.txt
|
||||
*/
|
||||
icp_common_t *headerp = (icp_common_t *) buf;
|
||||
int nr, length;
|
||||
unsigned char opcode;
|
||||
static char *icp_op_code[] = {
|
||||
/* 0 */ "ICP_OP_INVALID",
|
||||
/* 1 */ "ICP_OP_QUERY",
|
||||
/* 2 */ "ICP_OP_HIT",
|
||||
/* 3 */ "ICP_OP_MISS",
|
||||
/* 4 */ "ICP_OP_ERR",
|
||||
/* 5 */ "",
|
||||
/* 6 */ "",
|
||||
/* 7 */ "",
|
||||
/* 8 */ "",
|
||||
/* 9 */ "",
|
||||
/* 10 */ "ICP_OP_SECHO",
|
||||
/* 11 */ "ICP_OP_DECHO",
|
||||
/* 12 */ "",
|
||||
/* 13 */ "",
|
||||
/* 14 */ "",
|
||||
/* 15 */ "",
|
||||
/* 16 */ "",
|
||||
/* 17 */ "",
|
||||
/* 18 */ "",
|
||||
/* 19 */ "",
|
||||
/* 20 */ "",
|
||||
/* 21 */ "ICP_OP_MISS_NOFETCH",
|
||||
/* 22 */ "ICP_OP_DENIED",
|
||||
/* 23 */ "ICP_OP_HIT_OBJ"
|
||||
};
|
||||
|
||||
|
||||
nr = recvfrom(sockfd, buf, DEFLINE, 0, (struct sockaddr *) 0, (int *) 0);
|
||||
if (nr < 0) {
|
||||
if (timeout_flag)
|
||||
err_quit("Timeout while reading");
|
||||
else
|
||||
err_sys("No reply from ICP proxy server");
|
||||
}
|
||||
opcode = headerp->opcode;
|
||||
length = ntohs(headerp->length);
|
||||
sprintf(retcode, "ICP reply: \42%s\42", icp_op_code[opcode]);
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
#endif /* ICP */
|
@ -1,62 +0,0 @@
|
||||
#ifndef ICP_HEADER
|
||||
|
||||
#define ICP_HEADER
|
||||
|
||||
/* Version */
|
||||
#define ICP_VERSION_1 1
|
||||
#define ICP_VERSION_2 2
|
||||
#define ICP_VERSION_3 3
|
||||
#define ICP_VERSION_CURRENT ICP_VERSION_2
|
||||
|
||||
#define ICP_FLAG_HIT_OBJ 0x80000000ul
|
||||
#define ICP_FLAG_SRC_RTT 0x40000000ul
|
||||
|
||||
#if SIZEOF_INT == 4
|
||||
typedef unsigned int u_num32;
|
||||
#elif SIZEOF_LONG == 4
|
||||
typedef unsigned long u_num32;
|
||||
#else
|
||||
#error "No suitable type for representing a 32-bits value"
|
||||
#endif
|
||||
|
||||
struct icp_common_s {
|
||||
unsigned char opcode; /* opcode */
|
||||
unsigned char version; /* version number */
|
||||
unsigned short length; /* total length (bytes) */
|
||||
u_num32 reqnum; /* req number (req'd for UDP) */
|
||||
u_num32 flags;
|
||||
u_num32 pad;
|
||||
u_num32 shostid; /* sender host id */
|
||||
};
|
||||
typedef struct icp_common_s icp_common_t;
|
||||
|
||||
typedef enum {
|
||||
ICP_OP_INVALID, /* 00 to insure 0 doesn't get accidently interpreted. */
|
||||
ICP_OP_QUERY, /* 01 query opcode (cl->sv) */
|
||||
ICP_OP_HIT, /* 02 hit (cl<-sv) */
|
||||
ICP_OP_MISS, /* 03 miss (cl<-sv) */
|
||||
ICP_OP_ERR, /* 04 error (cl<-sv) */
|
||||
ICP_OP_SEND, /* 05 send object non-auth (cl->sv) */
|
||||
ICP_OP_SENDA, /* 06 send object authoritative (cl->sv) */
|
||||
ICP_OP_DATABEG, /* 07 first data, but not last (sv<-cl) */
|
||||
ICP_OP_DATA, /* 08 data middle of stream (sv<-cl) */
|
||||
ICP_OP_DATAEND, /* 09 last data (sv<-cl) */
|
||||
ICP_OP_SECHO, /* 10 echo from source (sv<-os) */
|
||||
ICP_OP_DECHO, /* 11 echo from dumb cache (sv<-dc) */
|
||||
ICP_OP_UNUSED0, /* 12 */
|
||||
ICP_OP_UNUSED1, /* 13 */
|
||||
ICP_OP_UNUSED2, /* 14 */
|
||||
ICP_OP_UNUSED3, /* 15 */
|
||||
ICP_OP_UNUSED4, /* 16 */
|
||||
ICP_OP_UNUSED5, /* 17 */
|
||||
ICP_OP_UNUSED6, /* 18 */
|
||||
ICP_OP_UNUSED7, /* 19 */
|
||||
ICP_OP_UNUSED8, /* 20 */
|
||||
ICP_OP_MISS_NOFETCH, /* 21 access denied while reloading */
|
||||
ICP_OP_DENIED, /* 22 access denied (cl<-sv) */
|
||||
ICP_OP_HIT_OBJ, /* 23 hit with object data (cl<-sv) */
|
||||
ICP_OP_END /* 24 marks end of opcodes */
|
||||
} icp_opcode;
|
||||
|
||||
|
||||
#endif /* ICP_HEADER */
|
@ -1,251 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# install - install a program, script, or datafile
|
||||
# This comes from X11R5 (mit/util/scripts/install.sh).
|
||||
#
|
||||
# Copyright 1991 by the Massachusetts Institute of Technology
|
||||
#
|
||||
# Permission to use, copy, modify, distribute, and sell this software and its
|
||||
# documentation for any purpose is hereby granted without fee, provided that
|
||||
# the above copyright notice appear in all copies and that both that
|
||||
# copyright notice and this permission notice appear in supporting
|
||||
# documentation, and that the name of M.I.T. not be used in advertising or
|
||||
# publicity pertaining to distribution of the software without specific,
|
||||
# written prior permission. M.I.T. makes no representations about the
|
||||
# suitability of this software for any purpose. It is provided "as is"
|
||||
# without express or implied warranty.
|
||||
#
|
||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||
# `make' implicit rules from creating a file called install from it
|
||||
# when there is no Makefile.
|
||||
#
|
||||
# This script is compatible with the BSD install script, but was written
|
||||
# from scratch. It can only install one file at a time, a restriction
|
||||
# shared with many OS's install programs.
|
||||
|
||||
|
||||
# set DOITPROG to echo to test this script
|
||||
|
||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||
doit="${DOITPROG-}"
|
||||
|
||||
|
||||
# put in absolute paths if you don't have them in your path; or use env. vars.
|
||||
|
||||
mvprog="${MVPROG-mv}"
|
||||
cpprog="${CPPROG-cp}"
|
||||
chmodprog="${CHMODPROG-chmod}"
|
||||
chownprog="${CHOWNPROG-chown}"
|
||||
chgrpprog="${CHGRPPROG-chgrp}"
|
||||
stripprog="${STRIPPROG-strip}"
|
||||
rmprog="${RMPROG-rm}"
|
||||
mkdirprog="${MKDIRPROG-mkdir}"
|
||||
|
||||
transformbasename=""
|
||||
transform_arg=""
|
||||
instcmd="$mvprog"
|
||||
chmodcmd="$chmodprog 0755"
|
||||
chowncmd=""
|
||||
chgrpcmd=""
|
||||
stripcmd=""
|
||||
rmcmd="$rmprog -f"
|
||||
mvcmd="$mvprog"
|
||||
src=""
|
||||
dst=""
|
||||
dir_arg=""
|
||||
|
||||
while [ x"$1" != x ]; do
|
||||
case $1 in
|
||||
-c) instcmd="$cpprog"
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-d) dir_arg=true
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-m) chmodcmd="$chmodprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-o) chowncmd="$chownprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-g) chgrpcmd="$chgrpprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-s) stripcmd="$stripprog"
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-t=*) transformarg=`echo $1 | sed 's/-t=//'`
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
|
||||
shift
|
||||
continue;;
|
||||
|
||||
*) if [ x"$src" = x ]
|
||||
then
|
||||
src=$1
|
||||
else
|
||||
# this colon is to work around a 386BSD /bin/sh bug
|
||||
:
|
||||
dst=$1
|
||||
fi
|
||||
shift
|
||||
continue;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ x"$src" = x ]
|
||||
then
|
||||
echo "install: no input file specified"
|
||||
exit 1
|
||||
else
|
||||
true
|
||||
fi
|
||||
|
||||
if [ x"$dir_arg" != x ]; then
|
||||
dst=$src
|
||||
src=""
|
||||
|
||||
if [ -d $dst ]; then
|
||||
instcmd=:
|
||||
chmodcmd=""
|
||||
else
|
||||
instcmd=mkdir
|
||||
fi
|
||||
else
|
||||
|
||||
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
|
||||
# might cause directories to be created, which would be especially bad
|
||||
# if $src (and thus $dsttmp) contains '*'.
|
||||
|
||||
if [ -f $src -o -d $src ]
|
||||
then
|
||||
true
|
||||
else
|
||||
echo "install: $src does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ x"$dst" = x ]
|
||||
then
|
||||
echo "install: no destination specified"
|
||||
exit 1
|
||||
else
|
||||
true
|
||||
fi
|
||||
|
||||
# If destination is a directory, append the input filename; if your system
|
||||
# does not like double slashes in filenames, you may need to add some logic
|
||||
|
||||
if [ -d $dst ]
|
||||
then
|
||||
dst="$dst"/`basename $src`
|
||||
else
|
||||
true
|
||||
fi
|
||||
fi
|
||||
|
||||
## this sed command emulates the dirname command
|
||||
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
|
||||
|
||||
# Make sure that the destination directory exists.
|
||||
# this part is taken from Noah Friedman's mkinstalldirs script
|
||||
|
||||
# Skip lots of stat calls in the usual case.
|
||||
if [ ! -d "$dstdir" ]; then
|
||||
defaultIFS='
|
||||
'
|
||||
IFS="${IFS-${defaultIFS}}"
|
||||
|
||||
oIFS="${IFS}"
|
||||
# Some sh's can't handle IFS=/ for some reason.
|
||||
IFS='%'
|
||||
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
|
||||
IFS="${oIFS}"
|
||||
|
||||
pathcomp=''
|
||||
|
||||
while [ $# -ne 0 ] ; do
|
||||
pathcomp="${pathcomp}${1}"
|
||||
shift
|
||||
|
||||
if [ ! -d "${pathcomp}" ] ;
|
||||
then
|
||||
$mkdirprog "${pathcomp}"
|
||||
else
|
||||
true
|
||||
fi
|
||||
|
||||
pathcomp="${pathcomp}/"
|
||||
done
|
||||
fi
|
||||
|
||||
if [ x"$dir_arg" != x ]
|
||||
then
|
||||
$doit $instcmd $dst &&
|
||||
|
||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
|
||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
|
||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
|
||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
|
||||
else
|
||||
|
||||
# If we're going to rename the final executable, determine the name now.
|
||||
|
||||
if [ x"$transformarg" = x ]
|
||||
then
|
||||
dstfile=`basename $dst`
|
||||
else
|
||||
dstfile=`basename $dst $transformbasename |
|
||||
sed $transformarg`$transformbasename
|
||||
fi
|
||||
|
||||
# don't allow the sed command to completely eliminate the filename
|
||||
|
||||
if [ x"$dstfile" = x ]
|
||||
then
|
||||
dstfile=`basename $dst`
|
||||
else
|
||||
true
|
||||
fi
|
||||
|
||||
# Make a temp file name in the proper directory.
|
||||
|
||||
dsttmp=$dstdir/#inst.$$#
|
||||
|
||||
# Move or copy the file name to the temp name
|
||||
|
||||
$doit $instcmd $src $dsttmp &&
|
||||
|
||||
trap "rm -f ${dsttmp}" 0 &&
|
||||
|
||||
# and set any options; do chmod last to preserve setuid bits
|
||||
|
||||
# If any of these fail, we abort the whole thing. If we want to
|
||||
# ignore errors from any of these, just make sure not to ignore
|
||||
# errors from the above "$doit $instcmd $src $dsttmp" command.
|
||||
|
||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
|
||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
|
||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
|
||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
|
||||
$doit $rmcmd -f $dstdir/$dstfile &&
|
||||
$doit $mvcmd $dsttmp $dstdir/$dstfile
|
||||
|
||||
fi &&
|
||||
|
||||
|
||||
exit 0
|
@ -1,11 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Bug 1688940
|
||||
|
||||
# OK
|
||||
./echoping -v -h "/?query=0123456789656565864854129568977808708770878781672766762766742213542786502345617812784576590234567890123456784455644855856556697867566473432623422345678901234567890123478901234567565719787867155665376556472234516542568425446852434177664277876766" www.james.rcpt.to
|
||||
|
||||
echo ""
|
||||
|
||||
# Too long
|
||||
./echoping -v -h "/?query=01234567896565658648541295689778087087708787816727667627667422135427865023456178127845765901234567890123456784455644855856556697867566473432623422345678901234567890123478901234567565719787867155665376556472234516542568425446852434177664277876766" www.james.rcpt.to
|
@ -1,12 +0,0 @@
|
||||
SUBDIRS=@subdirs@
|
||||
CONFIGURE_DEPENDENCIES=list-of-dirs.m4 ../configure-common.ac configure-plugins.ac
|
||||
|
||||
list-of-dirs.m4:
|
||||
@echo "dnl Created automatically on `date`" > $@
|
||||
for file in `ls | grep -v CVS | grep -v autom4te`; do \
|
||||
if test -d $$file; then \
|
||||
echo "if test \"\$$$${file}_BUILD\" = 1; then" >> $@ ; \
|
||||
echo " AC_CONFIG_SUBDIRS($$file)" >> $@ ; \
|
||||
echo "fi" >> $@ ; \
|
||||
fi \
|
||||
done
|
@ -1,31 +0,0 @@
|
||||
LIBIDN=1
|
||||
AC_ARG_WITH(libidn,
|
||||
[ --with-libidn[=DIR] Internationalized Domain Names support (needs GNU libidn)],dnl
|
||||
[if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
IDNROOT=$withval
|
||||
LDFLAGS="${LDFLAGS} -L$IDNROOT/lib"
|
||||
CPPFLAGS="${CPPFLAGS} -I$IDNROOT/include"
|
||||
fi
|
||||
else
|
||||
LIBIDN=0
|
||||
fi],
|
||||
)
|
||||
if test "$LIBIDN" = "1"; then
|
||||
AC_DEFINE(LIBIDN,,[Internationalized Domain Names support])
|
||||
fi
|
||||
|
||||
AC_ARG_WITH(popt,
|
||||
[ --with-popt[=DIR] popt command-line parsing library],dnl
|
||||
[if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
POPTROOT=$withval
|
||||
LDFLAGS="${LDFLAGS} -L$POPTROOT/lib"
|
||||
CPPFLAGS="${CPPFLAGS} -I$POPTROOT/include"
|
||||
fi
|
||||
else
|
||||
AC_MSG_ERROR([The popt command-line parsing library is mandatory for this plugin])
|
||||
fi],
|
||||
)
|
||||
|
||||
dnl $Id$
|
@ -1,29 +0,0 @@
|
||||
dnl $Id$
|
||||
|
||||
m4_include(../configure-common.ac)
|
||||
AM_INIT_AUTOMAKE(foreign)
|
||||
dnl TODO: write a XML-RPC plugin for Adamsnames' interface. See a first version in contrib/
|
||||
AC_ARG_ENABLE(plugin,
|
||||
[ --enable-plugin=LIST Build only the following plugins],
|
||||
[if test "$enableval" = "no"; then
|
||||
AC_MSG_ERROR([You cannot disable plugin support])
|
||||
else
|
||||
if test "$enableval" = "yes"; then
|
||||
AC_MSG_ERROR([You must indicate a list of plugins with this option])
|
||||
else
|
||||
plugins=$enableval
|
||||
fi
|
||||
fi],
|
||||
plugins="random whois dns postgresql ldap")
|
||||
for plugin in $plugins; do
|
||||
if test ! -d $srcdir/$plugin ; then
|
||||
AC_MSG_ERROR([No such plugin $plugin])
|
||||
fi
|
||||
eval ${plugin}_BUILD=1
|
||||
done
|
||||
m4_include(list-of-dirs.m4)
|
||||
plugins_dir=`cat dir`
|
||||
AC_SUBST(plugins_dir)
|
||||
AC_OUTPUT(Makefile)
|
||||
echo ""
|
||||
echo Plugins to build: $plugins
|
@ -1,9 +0,0 @@
|
||||
if DNSBUILD
|
||||
pkglib_LTLIBRARIES = dns.la
|
||||
dns_la_SOURCES = dns.c
|
||||
dns_la_LDFLAGS = -module
|
||||
endif
|
||||
|
||||
man_MANS = echoping_dns.1
|
||||
|
||||
EXTRA_DIST = $(man_MANS)
|
@ -1,56 +0,0 @@
|
||||
dnl $Id$
|
||||
|
||||
m4_include([../../configure-common.ac])
|
||||
AM_INIT_AUTOMAKE(foreign)
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
m4_include([../configure-plugins.ac])
|
||||
|
||||
DNS_BUILD=1
|
||||
AC_CHECK_FUNCS(poptGetContext,,
|
||||
[AC_CHECK_LIB(popt,poptGetContext,,[AC_MSG_WARN([No popt development environment found, not building this plugin]) && DNS_BUILD=0])])
|
||||
if test "$DNS_BUILD" != "0"; then
|
||||
|
||||
AC_CHECK_FUNC(res_mkquery, ,
|
||||
[AC_CHECK_LIB(bind, res_mkquery, ,
|
||||
[AC_CHECK_LIB(resolv, res_mkquery, ,
|
||||
dnl http://bugs.debian.org/254089
|
||||
[ saved_LIBS="$LIBS"
|
||||
LIBS="$LIBS -lresolv"
|
||||
AC_MSG_CHECKING(for res_mkquery in -lresolv again)
|
||||
AC_LINK_IFELSE([[
|
||||
#include <resolv.h>
|
||||
int main()
|
||||
{
|
||||
res_mkquery (0, 0, 0, 0, 0, 0, 0, 0, 0);
|
||||
return 0;
|
||||
}]],
|
||||
LIBS="$saved_LIBS -lresolv"; AC_MSG_RESULT(yes),
|
||||
LIBS="$saved_LIBS"; AC_MSG_RESULT(no)
|
||||
[AC_MSG_WARN([No DNS resolver development environment found, not building this plugin]) && DNS_BUILD=0])])])])
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING([_res ])
|
||||
AC_TRY_LINK([#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/nameser.h>
|
||||
#include <resolv.h>],
|
||||
[_res.options = RES_INIT;],
|
||||
AC_DEFINE(HAVE_RES, , [Define if you have the _res variable])
|
||||
AC_MSG_RESULT(yes),
|
||||
AC_MSG_RESULT(no));
|
||||
AC_MSG_CHECKING([_res_ext ])
|
||||
AC_TRY_LINK([#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/nameser.h>
|
||||
#include <resolv.h>],
|
||||
[_res_ext.nsaddr_list[0].ss_family = AF_INET6;],
|
||||
AC_DEFINE(HAVE_RES_EXT, , [Define if you have the _res_ext variable (for IPv6)])
|
||||
AC_MSG_RESULT(yes),
|
||||
AC_MSG_RESULT(no));
|
||||
|
||||
AM_CONDITIONAL(DNSBUILD, test "$DNS_BUILD" = 1)
|
||||
AC_OUTPUT(Makefile)
|
||||
|
@ -1,215 +0,0 @@
|
||||
/*
|
||||
* DNS plugin. $Id$
|
||||
*/
|
||||
|
||||
#define IN_PLUGIN
|
||||
#include "../../echoping.h"
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/nameser.h>
|
||||
#include <resolv.h>
|
||||
|
||||
struct addrinfo name_server;
|
||||
poptContext dns_poptcon;
|
||||
char *request;
|
||||
int type;
|
||||
char *type_name = NULL;
|
||||
boolean use_tcp = FALSE;
|
||||
boolean no_recurse = FALSE;
|
||||
|
||||
/* nsError stolen from Liu & Albitz check_soa (in their book "DNS and BIND") */
|
||||
|
||||
/****************************************************************
|
||||
* nsError -- Print an error message from h_errno for a failure *
|
||||
* looking up NS records. res_query() converts the DNS *
|
||||
* packet return code to a smaller list of errors and *
|
||||
* places the error value in h_errno. There is a routine *
|
||||
* called herror() for printing out strings from h_errno *
|
||||
* like perror() does for errno. Unfortunately, the *
|
||||
* herror() messages assume you are looking up address *
|
||||
* records for hosts. In this program, we are looking up *
|
||||
* NS records for domains, so we need our own list of error *
|
||||
* strings. *
|
||||
****************************************************************/
|
||||
int
|
||||
nsError(error, domain)
|
||||
int error;
|
||||
char *domain;
|
||||
{
|
||||
switch (error) {
|
||||
case HOST_NOT_FOUND:
|
||||
err_ret("Unknown domain: %s\n", domain);
|
||||
return -1;
|
||||
case NO_DATA:
|
||||
err_ret("No records of type %s for %s in the Answer section\n",
|
||||
to_upper(type_name), domain);
|
||||
return -1;
|
||||
case TRY_AGAIN:
|
||||
err_ret("No response for query\n");
|
||||
return -2;
|
||||
default:
|
||||
err_ret("Unexpected error\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
dns_usage(const char *msg)
|
||||
{
|
||||
if (msg) {
|
||||
fprintf(stderr, "Error: %s\n", msg);
|
||||
}
|
||||
poptPrintUsage(dns_poptcon, stderr, 0);
|
||||
fprintf(stderr, " request\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
char *
|
||||
init(const int argc, const char **argv)
|
||||
{
|
||||
int value;
|
||||
char *hostname;
|
||||
char *msg = malloc(256);
|
||||
char *upper_type_name = NULL;
|
||||
/* popt variables */
|
||||
struct poptOption options[] = {
|
||||
{"type", 't', POPT_ARG_STRING, &type_name, 0,
|
||||
"Type of resources queried (A, MX, SOA, etc)",
|
||||
"type"},
|
||||
{"tcp", (char) NULL, POPT_ARG_NONE, &use_tcp, 0,
|
||||
"Use TCP for the request (virtual circuit)",
|
||||
"tcp"},
|
||||
{"no-recurse", (char) NULL, POPT_ARG_NONE, &no_recurse, 0,
|
||||
"Do not ask recursion",
|
||||
"no-recurse"},
|
||||
POPT_AUTOHELP POPT_TABLEEND
|
||||
};
|
||||
dns_poptcon = poptGetContext(NULL, argc, argv, options, POPT_CONTEXT_KEEP_FIRST);
|
||||
while ((value = poptGetNextOpt(dns_poptcon)) > 0) {
|
||||
}
|
||||
if (value < -1) {
|
||||
sprintf(msg, "%s: %s",
|
||||
poptBadOption(dns_poptcon, POPT_BADOPTION_NOALIAS),
|
||||
poptStrerror(value));
|
||||
dns_usage(msg);
|
||||
}
|
||||
hostname = (char *) poptGetArg(dns_poptcon); /* Not used */
|
||||
request = (char *) poptGetArg(dns_poptcon);
|
||||
if (request == NULL)
|
||||
dns_usage("Mandatory request missing");
|
||||
if ((type_name == NULL) || !strcmp(type_name, "")) {
|
||||
type = T_A;
|
||||
type_name = "A";
|
||||
} else {
|
||||
upper_type_name = (char *) to_upper(type_name);
|
||||
/*
|
||||
* TODO: a better algorithm. Use dns_rdatatype_fromtext in
|
||||
* BIND ?
|
||||
*/
|
||||
if (!strcmp(upper_type_name, "A"))
|
||||
type = T_A;
|
||||
else if (!strcmp(upper_type_name, "AAAA"))
|
||||
type = T_AAAA;
|
||||
else if (!strcmp(upper_type_name, "NS"))
|
||||
type = T_NS;
|
||||
else if (!strcmp(upper_type_name, "SOA"))
|
||||
type = T_SOA;
|
||||
else if (!strcmp(upper_type_name, "MX"))
|
||||
type = T_MX;
|
||||
else if (!strcmp(upper_type_name, "SRV"))
|
||||
type = T_SRV;
|
||||
else if (!strcmp(upper_type_name, "CNAME"))
|
||||
type = T_CNAME;
|
||||
else if (!strcmp(upper_type_name, "PTR"))
|
||||
type = T_PTR;
|
||||
else if (!strcmp(upper_type_name, "TXT"))
|
||||
type = T_TXT;
|
||||
else if (!strcmp(upper_type_name, "ANY"))
|
||||
type = T_ANY;
|
||||
else
|
||||
dns_usage("Unknown type");
|
||||
}
|
||||
return "domain";
|
||||
}
|
||||
|
||||
void
|
||||
start(struct addrinfo *res)
|
||||
{
|
||||
struct sockaddr name_server_sockaddr;
|
||||
struct sockaddr_in name_server_sockaddr_in;
|
||||
struct sockaddr_in6 name_server_sockaddr_in6;
|
||||
name_server = *res;
|
||||
name_server_sockaddr = *name_server.ai_addr;
|
||||
if (name_server_sockaddr.sa_family == AF_INET) {
|
||||
/* Converts a generic sockaddr to an IPv4 sockaddr_in */
|
||||
(void) memcpy((void *) &name_server_sockaddr_in,
|
||||
&name_server_sockaddr, sizeof(struct sockaddr));
|
||||
} else if (name_server_sockaddr.sa_family == AF_INET6) {
|
||||
#ifdef HAVE_RES_EXT
|
||||
/* TODO: the code for IPv6 servers is hopelessly broken. Start again */
|
||||
fprintf(stderr,
|
||||
"WARNING: IPv6 nameservers not really supported yet (experts may apply). Falling back to IPv4 and the default server. You may use -4, too\n");
|
||||
/* Converts a generic sockaddr to an IPv6 sockaddr_in6 */
|
||||
(void) memcpy((void *) &name_server_sockaddr_in6,
|
||||
&name_server_sockaddr, sizeof(struct sockaddr));
|
||||
#else
|
||||
err_quit
|
||||
("IPv6 name servers not supported on this platform, may be you should use the -4 option");
|
||||
#endif
|
||||
} else {
|
||||
err_quit("Unknown family for address of the server");
|
||||
}
|
||||
if (res_init() < 0)
|
||||
err_sys("res_init");
|
||||
if (name_server_sockaddr.sa_family == AF_INET) {
|
||||
_res.nsaddr_list[0] = name_server_sockaddr_in;
|
||||
} else if (name_server_sockaddr.sa_family == AF_INET6) {
|
||||
#ifdef HAVE_RES_EXT
|
||||
/* TODO: completely broken, dioes not work. Check in Stevens */
|
||||
(void) memcpy(_res_ext.nsaddr_list, &name_server_sockaddr_in6,
|
||||
sizeof(struct sockaddr_in6));
|
||||
#endif
|
||||
}
|
||||
_res.nscount = 1;
|
||||
_res.options &= ~(RES_DNSRCH | RES_DEFNAMES | RES_NOALIASES);
|
||||
if (use_tcp) {
|
||||
_res.options |= RES_USEVC;
|
||||
}
|
||||
if (no_recurse) {
|
||||
_res.options &= ~RES_RECURSE;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
execute()
|
||||
{
|
||||
union {
|
||||
HEADER hdr; /* defined in resolv.h */
|
||||
u_char buf[PACKETSZ]; /* defined in arpa/nameser.h */
|
||||
} response; /* response buffers */
|
||||
int response_length; /* buffer length */
|
||||
if ((response_length = res_query(request, /* the domain we care about */
|
||||
C_IN, /* Internet class records */
|
||||
type, (u_char *) & response, /* response
|
||||
* buffer */
|
||||
sizeof(response))) /* buffer size */
|
||||
<0) { /* If negative */
|
||||
nsError(h_errno, request); /* report the error */
|
||||
if (h_errno == TRY_AGAIN)
|
||||
return -1; /* More luck next time? */
|
||||
else
|
||||
return -2; /* Give in */
|
||||
}
|
||||
/*
|
||||
* TODO: better analysis of the replies. For instance, replies can be
|
||||
* in the authority section (delegation info)
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
terminate()
|
||||
{
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
.\" Hey, EMACS: -*- nroff -*-
|
||||
.\" $Id$
|
||||
.\" First parameter, NAME, should be all caps
|
||||
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||
.\" other parameters are allowed: see man(7), man(1)
|
||||
.TH ECHOPING_DNS 1 "May 26, 2004"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.\" Some roff macros, for reference:
|
||||
.\" .nh disable hyphenation
|
||||
.\" .hy enable hyphenation
|
||||
.\" .ad l left justify
|
||||
.\" .ad b justify to both left and right margins
|
||||
.\" .nf disable filling
|
||||
.\" .fi enable filling
|
||||
.\" .br insert line break
|
||||
.\" .sp <n> insert n+1 empty lines
|
||||
.\" for manpage-specific macros, see man(7)
|
||||
.SH NAME
|
||||
echoping_dns \- echoping plugin which queries a DNS server
|
||||
.SH SYNOPSIS
|
||||
.B echoping
|
||||
.RI [echoping\ options]
|
||||
.RI -m\ dns
|
||||
.B hostname
|
||||
.B request
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
|
||||
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
|
||||
.\" respectively.
|
||||
dns is an echoping plugin, fo testing the performances of DNS (RFC
|
||||
1034 and 1035) servers.
|
||||
.SH ARGUMENTS
|
||||
.TP
|
||||
.B request
|
||||
A domain name
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \-t, \-\-type
|
||||
The type of data requested (NS, A, SOA, etc)
|
||||
.TP
|
||||
.B \-\-no-recurse
|
||||
Do not request recursive queries
|
||||
.TP
|
||||
.B \-\-tcp
|
||||
Use only TCP ("virtual circuit")
|
||||
.SH SEE ALSO
|
||||
.BR echoping (1),
|
||||
.SH AUTHOR
|
||||
Stephane Bortzmeyer <bortz@users.sourceforge.net>
|
@ -1,10 +0,0 @@
|
||||
if LDAPBUILD
|
||||
pkglib_LTLIBRARIES = ldap.la
|
||||
ldap_la_SOURCES = ldap.c
|
||||
ldap_la_LDFLAGS = -module
|
||||
endif
|
||||
man_MANS = echoping_ldap.1
|
||||
|
||||
EXTRA_DIST = $(man_MANS) test.sh
|
||||
|
||||
# $Id$
|
@ -1,19 +0,0 @@
|
||||
dnl $Id$
|
||||
|
||||
m4_include([../../configure-common.ac])
|
||||
AM_INIT_AUTOMAKE(foreign)
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
m4_include([../configure-plugins.ac])
|
||||
|
||||
LDAP_BUILD=1
|
||||
AC_CHECK_FUNCS(poptGetContext,,
|
||||
[AC_CHECK_LIB(popt,poptGetContext,,[AC_MSG_WARN([No popt development environment found, not building this plugin]) && LDAP_BUILD=0])])
|
||||
if test "$LDAP_BUILD" != "0"; then
|
||||
AC_CHECK_FUNCS(ldap_open, ,
|
||||
[AC_CHECK_LIB(ldap,ldap_open,,
|
||||
[AC_MSG_WARN([No LDAP development environment found, not building this plugin]) && LDAP_BUILD=0])])
|
||||
fi
|
||||
AM_CONDITIONAL(LDAPBUILD, test "$LDAP_BUILD" = 1)
|
||||
AC_OUTPUT(Makefile)
|
||||
|
@ -1,52 +0,0 @@
|
||||
.\" $Id$
|
||||
.\" Hey, EMACS: -*- nroff -*-
|
||||
.\" First parameter, NAME, should be all caps
|
||||
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||
.\" other parameters are allowed: see man(7), man(1)
|
||||
.TH ECHOPING_LDAP 1 "May 26, 2004"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.\" Some roff macros, for reference:
|
||||
.\" .nh disable hyphenation
|
||||
.\" .hy enable hyphenation
|
||||
.\" .ad l left justify
|
||||
.\" .ad b justify to both left and right margins
|
||||
.\" .nf disable filling
|
||||
.\" .fi enable filling
|
||||
.\" .br insert line break
|
||||
.\" .sp <n> insert n+1 empty lines
|
||||
.\" for manpage-specific macros, see man(7)
|
||||
.SH NAME
|
||||
echoping_ldap \- echoping plugin which connects to a LDAP server
|
||||
.SH SYNOPSIS
|
||||
.B echoping
|
||||
.RI [echoping\ options]
|
||||
.RI -m\ ldap
|
||||
.B hostname
|
||||
.RI [-b base]
|
||||
.RI [-r request]
|
||||
.RI [-s scope]
|
||||
.RI [-p port]
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
|
||||
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
|
||||
.\" respectively.
|
||||
ldap is an echoping plugin to connect to LDAP servers.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \-r request
|
||||
The request to the LDAP server, in LDAP filter language. By default (objectclass=*).
|
||||
.TP
|
||||
.B \-b base
|
||||
Base of the search, for instance "dc=current,dc=bugs,dc=debian,dc=org"
|
||||
.TP
|
||||
.B \-s scope
|
||||
Scope of the search, "sub", "one" or "base"
|
||||
.TP
|
||||
.B \-p port
|
||||
TCP port to use
|
||||
.SH SEE ALSO
|
||||
.BR echoping (1),
|
||||
.SH AUTHOR
|
||||
Stephane Bortzmeyer <bortz@users.sourceforge.net>
|
@ -1,163 +0,0 @@
|
||||
/*
|
||||
* LDAP plugin. TODO: loops with and without opening the connection each
|
||||
* time? $Id$
|
||||
*/
|
||||
|
||||
#define IN_PLUGIN
|
||||
#include "../../echoping.h"
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../../config.h"
|
||||
#include "config.h"
|
||||
#endif
|
||||
#include <ldap.h>
|
||||
|
||||
const char *request = NULL;
|
||||
const char *base = NULL;
|
||||
int scope = LDAP_SCOPE_BASE;
|
||||
const char *hostname;
|
||||
int port = 0;
|
||||
LDAP *session;
|
||||
poptContext ldap_poptcon;
|
||||
echoping_options global_options;
|
||||
|
||||
void
|
||||
ldap_usage(const char *msg)
|
||||
{
|
||||
if (msg) {
|
||||
printf("LDAP plugin error: %s\n", msg);
|
||||
}
|
||||
poptPrintUsage(ldap_poptcon, stdout, 0);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
char *
|
||||
init(const int argc, const char **argv,
|
||||
const echoping_options global_external_options)
|
||||
{
|
||||
int value;
|
||||
char *msg = malloc(MAX_LINE);
|
||||
char *rest, *port_text;
|
||||
char *scope_string = NULL;
|
||||
/* popt variables */
|
||||
struct poptOption options[] = {
|
||||
{"request", 'r', POPT_ARG_STRING, &request, 0,
|
||||
"Request (filter) to send to the LDAP server", "r"},
|
||||
{"base", 'b', POPT_ARG_STRING, &base, 0,
|
||||
"Base of the LDAP tree", "b"},
|
||||
{"scope", 's', POPT_ARG_STRING, &scope_string, 0,
|
||||
"Scope of the search in the LDAP tree (sub, one or base)", "s"},
|
||||
{"port", 'p', POPT_ARG_INT, &port, 0,
|
||||
"TCP port to connect to the LDAP server", "p"},
|
||||
POPT_AUTOHELP POPT_TABLEEND
|
||||
};
|
||||
global_options = global_external_options;
|
||||
if (global_options.udp)
|
||||
err_quit("UDP makes no sense for a LDAP connection");
|
||||
ldap_poptcon = poptGetContext(NULL, argc,
|
||||
argv, options, POPT_CONTEXT_KEEP_FIRST);
|
||||
while ((value = poptGetNextOpt(ldap_poptcon)) > 0) {
|
||||
}
|
||||
if (value < -1) {
|
||||
sprintf(msg, "%s: %s",
|
||||
poptBadOption(ldap_poptcon, POPT_BADOPTION_NOALIAS),
|
||||
poptStrerror(value));
|
||||
ldap_usage(msg);
|
||||
}
|
||||
if (port == 0)
|
||||
port = LDAP_PORT;
|
||||
hostname = poptGetArg(ldap_poptcon);
|
||||
rest = poptGetArg(ldap_poptcon);
|
||||
if (rest != NULL) {
|
||||
fprintf(stderr, "%s: ", rest);
|
||||
ldap_usage("Additional arguments");
|
||||
}
|
||||
if (base == NULL)
|
||||
base = "";
|
||||
if (request == NULL || !strcmp(request, ""))
|
||||
request = "(objectclass=*)"; /* Default mentioned in OpenLDAP
|
||||
* documentation. Joerg Roth fears that it
|
||||
* may trigger "Size limit exceeded" if
|
||||
* there are many objects at this node. RFC
|
||||
* 4515 seems silent here. */
|
||||
if (scope_string != NULL) {
|
||||
scope_string = (char *) to_upper(scope_string);
|
||||
if (!strcmp(scope_string, "BASE"))
|
||||
scope = LDAP_SCOPE_BASE;
|
||||
else if (!strcmp(scope_string, "SUB"))
|
||||
scope = LDAP_SCOPE_SUBTREE;
|
||||
else if (!strcmp(scope_string, "ONE"))
|
||||
scope = LDAP_SCOPE_ONELEVEL;
|
||||
else
|
||||
err_quit("Invalid scope \"%s\"", scope_string);
|
||||
}
|
||||
if (port == LDAP_PORT) {
|
||||
return "ldap";
|
||||
} else {
|
||||
port_text = malloc(99);
|
||||
sprintf(port_text, "%d", port);
|
||||
return port_text;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
start()
|
||||
{
|
||||
int result;
|
||||
LDAPMessage *response;
|
||||
|
||||
session = ldap_init(hostname, port);
|
||||
if (session == NULL)
|
||||
err_sys("Cannot initialize LDAP");
|
||||
/* TODO: allow non-anonymous connections, with ldap_bind_simple_s */
|
||||
/*
|
||||
* Unfortunately, ldap_init does not connect to the LDAP server. So
|
||||
* connection errors (e.g. firewall), will not be detected here and
|
||||
* loop will go on.
|
||||
*
|
||||
* To quote the man page: ldap_init() acts just like ldap_open(), but
|
||||
* does not open a connection to the LDAP server. The actual
|
||||
* connection open will occur when the first operation is attempted.
|
||||
* At this time, ldap_init() is preferred. ldap_open() will be
|
||||
* depreciated in a later release.
|
||||
*
|
||||
* So, we perform a dummy search immediately.
|
||||
*
|
||||
* See #1879652 for why we use "dummystuff" and not "*"
|
||||
*
|
||||
*/
|
||||
result = ldap_search_s(session, base, LDAP_SCOPE_ONELEVEL, "(objectClass=dummystuff)", NULL, /* Return
|
||||
* * all *
|
||||
* * *
|
||||
* attributes
|
||||
*/
|
||||
1, &response);
|
||||
if (result != 0) {
|
||||
err_quit
|
||||
("Cannot connect to %s (no LDAP server or wrong base, probably): %s",
|
||||
hostname, ldap_err2string(result));
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
execute()
|
||||
{
|
||||
int result;
|
||||
LDAPMessage *response;
|
||||
result = ldap_search_s(session, base, scope, request, NULL, /* Return all
|
||||
* attributes */
|
||||
0, /* Return attribute types *and* values */
|
||||
&response);
|
||||
if (result != 0) {
|
||||
err_ret("Cannot search \"%s\": %s", request, ldap_err2string(result));
|
||||
return -1;
|
||||
}
|
||||
if (global_options.verbose)
|
||||
printf("Retrieved: %d entries\n", ldap_count_entries(session, response));
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
terminate()
|
||||
{
|
||||
ldap_unbind_s(session);
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# $Id$
|
||||
|
||||
../../echoping -m ldap -v db.debian.org --base=dc=debian,dc=org --scope=sub
|
||||
# TODO: ldapsearch works with the bts2ldap gateway but gq and echoping fail
|
||||
#../../echoping -m ldap -v master.debian.org --port=10101 --scope=sub --base='dc=current,dc=bugs,dc=debian,dc=org' '(debbugsPackage=ldap-utils)'
|
@ -1,16 +0,0 @@
|
||||
dnl Created automatically on Tue Jul 27 14:46:36 CEST 2004
|
||||
if test "$dns_BUILD" = 1; then
|
||||
AC_CONFIG_SUBDIRS(dns)
|
||||
fi
|
||||
if test "$ldap_BUILD" = 1; then
|
||||
AC_CONFIG_SUBDIRS(ldap)
|
||||
fi
|
||||
if test "$postgresql_BUILD" = 1; then
|
||||
AC_CONFIG_SUBDIRS(postgresql)
|
||||
fi
|
||||
if test "$random_BUILD" = 1; then
|
||||
AC_CONFIG_SUBDIRS(random)
|
||||
fi
|
||||
if test "$whois_BUILD" = 1; then
|
||||
AC_CONFIG_SUBDIRS(whois)
|
||||
fi
|
@ -1,10 +0,0 @@
|
||||
if PGSQLBUILD
|
||||
pkglib_LTLIBRARIES = postgresql.la
|
||||
postgresql_la_SOURCES = postgresql.c
|
||||
postgresql_la_LDFLAGS = -module
|
||||
endif
|
||||
man_MANS = echoping_postgresql.1
|
||||
|
||||
EXTRA_DIST = $(man_MANS)
|
||||
|
||||
# $Id$
|
@ -1,34 +0,0 @@
|
||||
dnl $Id$
|
||||
|
||||
m4_include([../../configure-common.ac])
|
||||
AM_INIT_AUTOMAKE(foreign)
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
m4_include([../configure-plugins.ac])
|
||||
|
||||
PGSQL_BUILD=1
|
||||
AC_ARG_WITH(pgsql,
|
||||
[ --with-pgsql[=DIR] PostgreSQL development library],dnl
|
||||
[if test "$withval" != "no"; then
|
||||
if test "$withval" != "yes"; then
|
||||
PGSQLROOT=$withval
|
||||
LDFLAGS="${LDFLAGS} -L$PGSQLROOT/lib"
|
||||
CPPFLAGS="${CPPFLAGS} -I$PGSQLROOT/include"
|
||||
fi
|
||||
else
|
||||
PGSQL_BUILD=0
|
||||
fi],
|
||||
)
|
||||
AC_CHECK_FUNCS(poptGetContext,,
|
||||
[AC_CHECK_LIB(popt,poptGetContext,,[AC_MSG_WARN([No popt development environment found, not building this plugin]) && PGSQL_BUILD=0])])
|
||||
if test "$PGSQL_BUILD" != "0"; then
|
||||
AC_CHECK_FUNCS(PQconnectdb, ,
|
||||
[AC_CHECK_LIB(pq,PQconnectdb,,
|
||||
[AC_MSG_WARN([No PostgreSQL development environment found, not building this plugin]) && PGSQL_BUILD=0])])
|
||||
fi
|
||||
AC_CHECK_HEADER([libpq-fe.h],,
|
||||
[AC_CHECK_HEADER([postgresql/libpq-fe.h],AC_DEFINE(POSTGRESQL_PREFIX,1,[Define if you need to include postgresql/libpq-fe.h, not just libpq-fe.h]),
|
||||
[AC_MSG_WARN([No PostgreSQL header found, not building this plugin]) && PGSQL_BUILD=0])])
|
||||
AM_CONDITIONAL(PGSQLBUILD, test "$PGSQL_BUILD" = 1)
|
||||
AC_OUTPUT(Makefile)
|
||||
|
@ -1,53 +0,0 @@
|
||||
.\" Hey, EMACS: -*- nroff -*-
|
||||
.\" First parameter, NAME, should be all caps
|
||||
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||
.\" other parameters are allowed: see man(7), man(1)
|
||||
.TH ECHOPING_POSTGRESQL 1 "May 26, 2004"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.\" Some roff macros, for reference:
|
||||
.\" .nh disable hyphenation
|
||||
.\" .hy enable hyphenation
|
||||
.\" .ad l left justify
|
||||
.\" .ad b justify to both left and right margins
|
||||
.\" .nf disable filling
|
||||
.\" .fi enable filling
|
||||
.\" .br insert line break
|
||||
.\" .sp <n> insert n+1 empty lines
|
||||
.\" for manpage-specific macros, see man(7)
|
||||
.SH NAME
|
||||
echoping_postgresql \- echoping plugin which connects to a PostgreSQL RDBMS server
|
||||
.SH SYNOPSIS
|
||||
.B echoping
|
||||
.RI [echoping\ options]
|
||||
.RI -m\ postgresql
|
||||
.B hostname
|
||||
.RI [-c conninfo]
|
||||
.RI [-e]
|
||||
.RI [-r]
|
||||
.RI [SQL-request]
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
|
||||
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
|
||||
.\" respectively.
|
||||
postgresql is an echoping plugin to connect to PostgreSQL RDBMS servers.
|
||||
.SH ARGUMENTS
|
||||
.B [SQL-request]
|
||||
The request to the PostgreSQL server (in SQL). Only SELECT are
|
||||
supported. The default is 'SELECT now()'.
|
||||
.TP
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \-c, \-\-conninfo
|
||||
Connection information for the Postgresql server. Something like 'dbname=bar'
|
||||
.TP
|
||||
.B \-r, \-\-readall
|
||||
Read all the data sent by the Postgresql server
|
||||
.TP
|
||||
.B \-e, \-\-connect-each-time
|
||||
(Re)connect to the Postgresql server at each iteration
|
||||
.SH SEE ALSO
|
||||
.BR echoping (1),
|
||||
.SH AUTHOR
|
||||
Stephane Bortzmeyer <bortz@users.sourceforge.net>
|
@ -1,143 +0,0 @@
|
||||
/*
|
||||
* PostgreSQL plugin.
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#define IN_PLUGIN
|
||||
#include "../../echoping.h"
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#ifdef POSTGRESQL_PREFIX
|
||||
#include <postgresql/libpq-fe.h>
|
||||
#else
|
||||
#include <libpq-fe.h>
|
||||
#endif
|
||||
|
||||
const char *request = NULL;
|
||||
int readall = FALSE;
|
||||
int connect_each_time = FALSE;
|
||||
poptContext postgresql_poptcon;
|
||||
PGconn *conn;
|
||||
PGresult *res;
|
||||
char *conninfo;
|
||||
echoping_options global_options;
|
||||
|
||||
void
|
||||
postgresql_usage(const char *msg)
|
||||
{
|
||||
if (msg) {
|
||||
printf("PostgreSQL plugin error: %s\n", msg);
|
||||
}
|
||||
poptPrintUsage(postgresql_poptcon, stdout, 0);
|
||||
fprintf(stderr, " [SQL-request]\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
char *
|
||||
init(const int argc, const char **argv,
|
||||
const echoping_options global_external_options)
|
||||
{
|
||||
int value;
|
||||
char *msg = malloc(256);
|
||||
char *rest;
|
||||
/* popt variables */
|
||||
struct poptOption options[] = {
|
||||
{"conninfo", 'c', POPT_ARG_STRING, &conninfo, 0,
|
||||
"Connection information for the Postgresql server. Something like 'host=foo dbname=bar''",
|
||||
""},
|
||||
{"readall", 'a', POPT_ARG_NONE, &readall, 0,
|
||||
"Read all the data sent by the Postgresql server",
|
||||
""},
|
||||
{"connect-each-time", 'e', POPT_ARG_NONE, &connect_each_time, 0,
|
||||
"(Re)Connect to the Postgresql server at each iteration",
|
||||
""},
|
||||
POPT_AUTOHELP POPT_TABLEEND
|
||||
};
|
||||
global_options = global_external_options;
|
||||
if (global_options.udp)
|
||||
err_quit("UDP makes no sense for a PostgreSQL connection");
|
||||
postgresql_poptcon = poptGetContext(NULL, argc,
|
||||
argv, options, POPT_CONTEXT_POSIXMEHARDER);
|
||||
while ((value = poptGetNextOpt(postgresql_poptcon)) > 0) {
|
||||
}
|
||||
if (value < -1) {
|
||||
sprintf(msg, "%s: %s",
|
||||
poptBadOption(postgresql_poptcon, POPT_BADOPTION_NOALIAS),
|
||||
poptStrerror(value));
|
||||
postgresql_usage(msg);
|
||||
}
|
||||
request = poptGetArg(postgresql_poptcon);
|
||||
if (request == NULL)
|
||||
request = "SELECT now()";
|
||||
rest = poptGetArg(postgresql_poptcon);
|
||||
if (rest != NULL)
|
||||
postgresql_usage("Erroneous additional arguments");
|
||||
if (conninfo == NULL)
|
||||
conninfo = "";
|
||||
return NULL; /* We only use the conninfo, echoping does not see
|
||||
* our hostname or port */
|
||||
}
|
||||
|
||||
void
|
||||
start_raw()
|
||||
{
|
||||
if (!connect_each_time) {
|
||||
conn = PQconnectdb(conninfo);
|
||||
if (conn == NULL) {
|
||||
err_quit("Cannot create connection\n");
|
||||
}
|
||||
if (PQstatus(conn) == CONNECTION_BAD) {
|
||||
err_quit("Connection failed: %s\n", PQerrorMessage(conn));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
execute()
|
||||
{
|
||||
unsigned int row, column;
|
||||
char *result;
|
||||
if (connect_each_time) {
|
||||
conn = PQconnectdb(conninfo);
|
||||
if (conn == NULL) {
|
||||
err_ret("Cannot create connection\n");
|
||||
return -1;
|
||||
}
|
||||
if (PQstatus(conn) == CONNECTION_BAD) {
|
||||
err_ret("Connection failed: %s\n", PQerrorMessage(conn));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
res = PQexec(conn, request);
|
||||
if (PQresultStatus(res) != PGRES_TUPLES_OK) {
|
||||
err_ret("Cannot run \"%s\": %s\n", request, PQresultErrorMessage(res));
|
||||
return -1;
|
||||
}
|
||||
if (global_options.verbose)
|
||||
printf("%d tuples returned\n", PQntuples(res));
|
||||
if (readall) {
|
||||
for (row = 0; row < PQntuples(res); row++) {
|
||||
for (column = 0; column < PQnfields(res); column++) {
|
||||
result = PQgetvalue(res, row, column);
|
||||
if (result == NULL) {
|
||||
err_ret("Cannot retrieve value [%d,%d]\n", row, column);
|
||||
return -1;
|
||||
}
|
||||
/* else { printf ("DEBUG: [%d,%d] %s\n", row, column, result); } */
|
||||
}
|
||||
}
|
||||
}
|
||||
if (connect_each_time)
|
||||
PQfinish(conn);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
terminate()
|
||||
{
|
||||
if (!connect_each_time)
|
||||
PQfinish(conn);
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
pkglib_LTLIBRARIES = random.la
|
||||
random_la_SOURCES = random.c
|
||||
random_la_LDFLAGS = -module
|
||||
man_MANS = echoping_random.1
|
||||
|
||||
EXTRA_DIST = $(man_MANS)
|
@ -1,12 +0,0 @@
|
||||
dnl $Id$
|
||||
|
||||
m4_include(../../configure-common.ac)
|
||||
AM_INIT_AUTOMAKE(foreign)
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
RANDOM_BUILD=1
|
||||
|
||||
AC_CHECK_FUNCS(usleep,, [AC_MSG_WARN([No usleep() found, not building this plugin]) && RANDOM_BUILD=0])
|
||||
AC_SUBST(RANDOM_BUILD,$RANDOM_BUILD)
|
||||
AC_OUTPUT(Makefile)
|
||||
|
@ -1,36 +0,0 @@
|
||||
.\" Hey, EMACS: -*- nroff -*-
|
||||
.\" First parameter, NAME, should be all caps
|
||||
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||
.\" other parameters are allowed: see man(7), man(1)
|
||||
.TH ECHOPING_RANDOM 1 "May 26, 2004"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.\" Some roff macros, for reference:
|
||||
.\" .nh disable hyphenation
|
||||
.\" .hy enable hyphenation
|
||||
.\" .ad l left justify
|
||||
.\" .ad b justify to both left and right margins
|
||||
.\" .nf disable filling
|
||||
.\" .fi enable filling
|
||||
.\" .br insert line break
|
||||
.\" .sp <n> insert n+1 empty lines
|
||||
.\" for manpage-specific macros, see man(7)
|
||||
.SH NAME
|
||||
echoping_random \- echoping plugin which just sleeps a random time
|
||||
.SH SYNOPSIS
|
||||
.B echoping
|
||||
.RI [echoping\ options]
|
||||
.RI -m\ random
|
||||
.B hostname
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
|
||||
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
|
||||
.\" respectively.
|
||||
random is a dummy echoping plugin, made only for demo purposes.
|
||||
.SH OPTIONS
|
||||
No options
|
||||
.SH SEE ALSO
|
||||
.BR echoping (1),
|
||||
.SH AUTHOR
|
||||
Stephane Bortzmeyer <bortz@users.sourceforge.net>
|
@ -1,37 +0,0 @@
|
||||
/*
|
||||
* Pseudo-random plugin. Just an example.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
char *
|
||||
init(const int argc, const char *argv[])
|
||||
{
|
||||
struct timeval tv;
|
||||
(void) gettimeofday(&tv, (struct timezone *) NULL);
|
||||
srand(tv.tv_usec);
|
||||
return "7"; /* Not used, just to say we use the cooked interface
|
||||
*/
|
||||
}
|
||||
|
||||
void
|
||||
start()
|
||||
{
|
||||
}
|
||||
|
||||
int
|
||||
execute()
|
||||
{
|
||||
usleep(rand() % 1000000);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
terminate()
|
||||
{
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
CONFIGURE_DEPENDENCIES=../../configure-common.ac ../configure-plugins.ac
|
||||
|
||||
pkglib_LTLIBRARIES = whois.la
|
||||
whois_la_SOURCES = whois.c
|
||||
whois_la_LDFLAGS = -module
|
||||
man_MANS = echoping_whois.1
|
||||
|
||||
EXTRA_DIST = $(man_MANS) test.sh
|
@ -1,14 +0,0 @@
|
||||
dnl $Id$
|
||||
|
||||
m4_include([../../configure-common.ac])
|
||||
AM_INIT_AUTOMAKE(foreign)
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
m4_include([../configure-plugins.ac])
|
||||
|
||||
WHOIS_BUILD=1
|
||||
AC_CHECK_FUNCS(poptGetContext,,
|
||||
[AC_CHECK_LIB(popt,poptGetContext,,[AC_MSG_WARN([No popt development environment found, not building this plugin]) && WHOIS_BUILD=0])])
|
||||
AC_SUBST(WHOIS_BUILD,$WHOIS_BUILD)
|
||||
AC_OUTPUT(Makefile)
|
||||
|
@ -1,45 +0,0 @@
|
||||
.\" Hey, EMACS: -*- nroff -*-
|
||||
.\" First parameter, NAME, should be all caps
|
||||
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||
.\" other parameters are allowed: see man(7), man(1)
|
||||
.TH ECHOPING_WHOIS 1 "May 26, 2004"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.\" Some roff macros, for reference:
|
||||
.\" .nh disable hyphenation
|
||||
.\" .hy enable hyphenation
|
||||
.\" .ad l left justify
|
||||
.\" .ad b justify to both left and right margins
|
||||
.\" .nf disable filling
|
||||
.\" .fi enable filling
|
||||
.\" .br insert line break
|
||||
.\" .sp <n> insert n+1 empty lines
|
||||
.\" for manpage-specific macros, see man(7)
|
||||
.SH NAME
|
||||
echoping_whois \- echoping plugin which connects to a whois server
|
||||
.SH SYNOPSIS
|
||||
.B echoping
|
||||
.RI [echoping\ options]
|
||||
.RI -m\ whois
|
||||
.B hostname
|
||||
.RI [-d]
|
||||
.RI request
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
|
||||
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
|
||||
.\" respectively.
|
||||
whois is an echoping plugin to connect to whois/nicname servers (see
|
||||
RFC 3912).
|
||||
.SH ARGUMENTS
|
||||
.TP
|
||||
.B request
|
||||
The request to the whois server (typically a domain name)
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \-d, \-\-dump
|
||||
Dumps the result of the request
|
||||
.SH SEE ALSO
|
||||
.BR echoping (1),
|
||||
.SH AUTHOR
|
||||
Stephane Bortzmeyer <bortz@users.sourceforge.net>
|
@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# $Id$
|
||||
|
||||
../../echoping -m whois -v whois.nic.fr --dump echoping.fr # Does not exist
|
||||
../../echoping -m whois -v whois.nic.fr --dump nic.fr # Exists
|
@ -1,132 +0,0 @@
|
||||
/*
|
||||
* Whois (RFC 3912) plugin.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#define IN_PLUGIN
|
||||
#include "../../echoping.h"
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "../../config.h"
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#define MAX_REQUEST 256
|
||||
|
||||
struct addrinfo whois_server;
|
||||
char *hostname;
|
||||
const char *request = NULL;
|
||||
int dump = FALSE;
|
||||
int n;
|
||||
int sockfd;
|
||||
FILE *files = NULL;
|
||||
poptContext whois_poptcon;
|
||||
echoping_options general_options;
|
||||
|
||||
void
|
||||
whois_usage(const char *msg)
|
||||
{
|
||||
if (msg) {
|
||||
printf("Error: %s\n", msg);
|
||||
}
|
||||
poptPrintUsage(whois_poptcon, stdout, 0);
|
||||
fprintf(stderr, " request\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
char *
|
||||
init(const int argc, const char **argv, echoping_options global_options)
|
||||
{
|
||||
int value;
|
||||
char *msg = malloc(256);
|
||||
char *rest;
|
||||
/* popt variables */
|
||||
struct poptOption options[] = {
|
||||
{"dump", 'd', POPT_ARG_NONE, &dump, 'd',
|
||||
"Dumps the reply from the whois server",
|
||||
""},
|
||||
POPT_AUTOHELP POPT_TABLEEND
|
||||
};
|
||||
general_options = global_options;
|
||||
if (global_options.udp)
|
||||
err_quit("UDP is incompatible with this whois plugin");
|
||||
/* Will probably be catched before because /etc/services have no entry for UDP
|
||||
* port 43 */
|
||||
whois_poptcon = poptGetContext(NULL, argc,
|
||||
argv, options, POPT_CONTEXT_POSIXMEHARDER);
|
||||
while ((value = poptGetNextOpt(whois_poptcon)) > 0) {
|
||||
switch ((char) value) {
|
||||
case 'd':
|
||||
break;
|
||||
default:
|
||||
sprintf(msg, "Wrong option %d (%c)", value, (char) value);
|
||||
whois_usage(msg);
|
||||
}
|
||||
}
|
||||
if (value < -1) {
|
||||
sprintf(msg, "%s: %s",
|
||||
poptBadOption(whois_poptcon, POPT_BADOPTION_NOALIAS),
|
||||
poptStrerror(value));
|
||||
whois_usage(msg);
|
||||
}
|
||||
request = (char *) poptGetArg(whois_poptcon);
|
||||
if (request == NULL)
|
||||
whois_usage("Mandatory request missing");
|
||||
rest = (char *) poptGetArg(whois_poptcon);
|
||||
if (rest != NULL && strcmp(rest, ""))
|
||||
whois_usage("Extraneous arguments ignored");
|
||||
return "nicname";
|
||||
}
|
||||
|
||||
void
|
||||
start(struct addrinfo *res)
|
||||
{
|
||||
whois_server = *res;
|
||||
}
|
||||
|
||||
int
|
||||
execute()
|
||||
{
|
||||
int nr = 0;
|
||||
char recvline[MAX_LINE + 1];
|
||||
char complete_request[MAX_REQUEST];
|
||||
#ifdef HAVE_TCP_INFO
|
||||
struct tcp_info tcpinfo;
|
||||
socklen_t socket_length = sizeof(tcpinfo);
|
||||
#endif
|
||||
if ((sockfd =
|
||||
socket(whois_server.ai_family, whois_server.ai_socktype,
|
||||
whois_server.ai_protocol)) < 0)
|
||||
err_sys("Can't open socket");
|
||||
if (connect(sockfd, whois_server.ai_addr, whois_server.ai_addrlen) < 0)
|
||||
err_sys("Can't connect to server");
|
||||
if ((files = fdopen(sockfd, "r")) == NULL)
|
||||
err_sys("Cannot fdopen");
|
||||
sprintf(complete_request, "%s\r\n", request);
|
||||
n = strlen(complete_request);
|
||||
if (writen(sockfd, complete_request, n) != n)
|
||||
err_sys("writen error on socket");
|
||||
/* Read from the server */
|
||||
while ((nr = readline(files, recvline, MAX_LINE, 0)) > 0)
|
||||
if (dump)
|
||||
printf("%s", recvline);
|
||||
if (dump)
|
||||
printf("\n");
|
||||
#ifdef HAVE_TCP_INFO
|
||||
/* Thanks to Perry Lorier <perry@coders.net> for the tip */
|
||||
if (general_options.verbose) {
|
||||
if (getsockopt(sockfd, SOL_TCP, TCP_INFO, &tcpinfo, &socket_length)
|
||||
!= -1) {
|
||||
printf("Estimated TCP RTT: %.04f seconds\n",
|
||||
tcpinfo.tcpi_rtt / 1000000.0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
close(sockfd);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
terminate()
|
||||
{
|
||||
}
|
@ -1,190 +0,0 @@
|
||||
/*
|
||||
* Read a line from a descriptor with fgets
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
#include "echoping.h"
|
||||
|
||||
int
|
||||
readline(fs, ptr, maxlen, ln)
|
||||
FILE *fs;
|
||||
char *ptr;
|
||||
int maxlen;
|
||||
unsigned short ln;
|
||||
{
|
||||
int n = 1;
|
||||
char *rc;
|
||||
int r;
|
||||
|
||||
/* Reading with fgets or fread instead of read one-character-at-a-time is more
|
||||
* than ten times faster, on a local server. */
|
||||
if (ln) {
|
||||
rc = fgets(ptr, maxlen + 1, fs);
|
||||
if (rc == NULL) {
|
||||
if (timeout_flag)
|
||||
return n;
|
||||
return (-1);
|
||||
}
|
||||
n = strlen(rc);
|
||||
return n;
|
||||
} else {
|
||||
while (n < maxlen) {
|
||||
r = fread(ptr, 1, maxlen, fs);
|
||||
if (timeout_flag)
|
||||
return r;
|
||||
if (r == 0) {
|
||||
if (n == 1)
|
||||
return (0); /* EOF, no data read */
|
||||
else
|
||||
break; /* EOF, some data was read */
|
||||
}
|
||||
n = n + r;
|
||||
}
|
||||
}
|
||||
return (n);
|
||||
}
|
||||
|
||||
#ifdef OPENSSL
|
||||
|
||||
char SSL_buffer[MAXTOREAD];
|
||||
int buf_ptr;
|
||||
int buf_end;
|
||||
|
||||
int
|
||||
SSL_readline(sslh, ptr, maxlen, ln)
|
||||
SSL *sslh;
|
||||
char *ptr;
|
||||
int maxlen;
|
||||
unsigned short ln;
|
||||
{
|
||||
int rc = 0;
|
||||
int n = 0;
|
||||
int i, oi;
|
||||
if (ln) {
|
||||
/* Empty buffer */
|
||||
if (buf_end == 0) {
|
||||
rc = SSL_read(sslh, SSL_buffer, maxlen);
|
||||
if (rc == -1)
|
||||
return rc;
|
||||
buf_end = rc;
|
||||
buf_ptr = 0;
|
||||
}
|
||||
/* No more data in the buffer */
|
||||
else if (buf_ptr == buf_end) {
|
||||
buf_ptr = 0;
|
||||
rc = SSL_read(sslh, SSL_buffer, maxlen);
|
||||
if (rc == -1)
|
||||
return rc;
|
||||
buf_end = rc;
|
||||
} else if (SSL_buffer[buf_end] != '\n') {
|
||||
/* We have a probleme here is the first SSL_read sent back a text not
|
||||
* finished by a \n. See www.SSL.de for an example. We get more data.
|
||||
* See bug #230384 */
|
||||
rc = SSL_read(sslh, SSL_buffer + buf_end, maxlen);
|
||||
if (rc == -1)
|
||||
return rc;
|
||||
buf_end = buf_end + rc;
|
||||
}
|
||||
for (oi = buf_ptr, i = buf_ptr; i <= buf_end && SSL_buffer[i] != '\n'; i++) {
|
||||
*ptr++ = SSL_buffer[i];
|
||||
buf_ptr++;
|
||||
}
|
||||
if (SSL_buffer[i] == '\n')
|
||||
buf_ptr++;
|
||||
*ptr = '\0';
|
||||
/* if (ln) printf ("SSL_readline returns %d (%s)\n", i - oi, SSL_buffer); */
|
||||
return (i - oi);
|
||||
} else {
|
||||
/* OpenSSL reads at most 4096 characters */
|
||||
rc = 1; /* Just to avoid exiting too soon */
|
||||
while (n < maxlen && rc != 0) {
|
||||
if ((buf_end == 0) || (buf_ptr > buf_end)) {
|
||||
rc = SSL_read(sslh, ptr, maxlen);
|
||||
buf_end = 0;
|
||||
buf_ptr = 0;
|
||||
} else {
|
||||
for (i = buf_ptr; i < maxlen && i <= buf_end; i++) {
|
||||
*ptr++ = SSL_buffer[i];
|
||||
rc++;
|
||||
}
|
||||
buf_ptr = i;
|
||||
}
|
||||
n = n + rc;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef GNUTLS
|
||||
|
||||
char TLS_buffer[MAXTOREAD];
|
||||
int buf_ptr;
|
||||
int buf_end;
|
||||
|
||||
int
|
||||
TLS_readline(session, ptr, maxlen, ln)
|
||||
gnutls_session session;
|
||||
char *ptr;
|
||||
int maxlen;
|
||||
unsigned short ln;
|
||||
{
|
||||
int rc = 0;
|
||||
int n = 0;
|
||||
int i, oi;
|
||||
if (ln) {
|
||||
/* Empty buffer */
|
||||
if (buf_end == 0) {
|
||||
rc = gnutls_record_recv(session, TLS_buffer, maxlen);
|
||||
if (rc == -1)
|
||||
return rc;
|
||||
buf_end = rc;
|
||||
buf_ptr = 0;
|
||||
}
|
||||
/* No more data in the buffer */
|
||||
else if (buf_ptr == buf_end) {
|
||||
buf_ptr = 0;
|
||||
rc = gnutls_record_recv(session, TLS_buffer, maxlen);
|
||||
if (rc == -1)
|
||||
return rc;
|
||||
buf_end = rc;
|
||||
} else if (TLS_buffer[buf_end] != '\n') {
|
||||
rc = gnutls_record_recv(session, TLS_buffer + buf_end, maxlen);
|
||||
if (rc == -1)
|
||||
return rc;
|
||||
buf_end = buf_end + rc;
|
||||
}
|
||||
for (oi = buf_ptr, i = buf_ptr; i <= buf_end && TLS_buffer[i] != '\n'; i++) {
|
||||
*ptr++ = TLS_buffer[i];
|
||||
buf_ptr++;
|
||||
}
|
||||
if (TLS_buffer[i] == '\n')
|
||||
buf_ptr++;
|
||||
*ptr = '\0';
|
||||
/* printf ("DEBUG: TLS_readline returns %d (%s)\n", i - oi, TLS_buffer); */
|
||||
return (i - oi);
|
||||
} else {
|
||||
rc = 1; /* Just to avoid exiting too soon */
|
||||
while (n < maxlen && rc > 0) {
|
||||
if ((buf_end == 0) || (buf_ptr > buf_end)) {
|
||||
rc = gnutls_record_recv(session, ptr, maxlen);
|
||||
buf_end = 0;
|
||||
buf_ptr = 0;
|
||||
} else {
|
||||
for (i = buf_ptr; i < maxlen && i <= buf_end; i++) {
|
||||
*ptr++ = TLS_buffer[i];
|
||||
rc++;
|
||||
/* printf ("DEBUG: Now %d chars read\n", rc); */
|
||||
}
|
||||
buf_ptr = i;
|
||||
}
|
||||
if (rc > 0)
|
||||
n = n + rc;
|
||||
/* printf ("DEBUG: Now %d chars to send\n", n); */
|
||||
}
|
||||
return n;
|
||||
}
|
||||
}
|
||||
#endif
|
@ -1,25 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# For developers only: use it only if you know about autotools.
|
||||
|
||||
set -e
|
||||
|
||||
# Does *not* work with automake 1.4!
|
||||
aclocal
|
||||
autoheader
|
||||
libtoolize --force
|
||||
automake --add-missing
|
||||
autoconf
|
||||
cd plugins
|
||||
aclocal
|
||||
automake --foreign --add-missing
|
||||
autoconf
|
||||
for dir in dns random whois ldap postgresql; do
|
||||
cd $dir
|
||||
aclocal
|
||||
autoheader
|
||||
automake --foreign --add-missing
|
||||
autoconf
|
||||
cd ..
|
||||
done
|
||||
cd ..
|
@ -1,34 +0,0 @@
|
||||
/* Code contributed by Samuel Tardieu <sam@inf.enst.fr>
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
#include "echoping.h"
|
||||
|
||||
#ifdef SMTP
|
||||
|
||||
char big_recvline[MAXTOREAD];
|
||||
|
||||
int
|
||||
smtp_read_response_from_server(FILE * fs)
|
||||
{
|
||||
int nr;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAXSMTPLINES; i++) {
|
||||
nr = readline(fs, big_recvline, MAXTOREAD, TRUE);
|
||||
if (nr <= 4) {
|
||||
return -1;
|
||||
}
|
||||
if (big_recvline[3] == ' ') {
|
||||
return nr;
|
||||
}
|
||||
if (big_recvline[3] != '-') {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
#endif /* SMTP */
|
@ -1,22 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# $Id$
|
||||
|
||||
echo ""
|
||||
echo "Since this tests tries remote servers, a failure is not always "
|
||||
echo " echoping's fault: it may be a network problem."
|
||||
|
||||
./echoping -C -h / www.gandi.net
|
||||
|
||||
echo ""
|
||||
|
||||
# We need to iterate to catch some SSL programming errors. See bug #130151
|
||||
#./echoping -C -h / -n 2 www.modssl.org
|
||||
./echoping -C -h / -n 2 www.verisign.com
|
||||
|
||||
echo ""
|
||||
|
||||
# bug #230384
|
||||
./echoping -C -h / -n 2 www.ssl.de
|
||||
|
||||
|
@ -1,14 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# $Id$
|
||||
|
||||
echo ""
|
||||
echo "Since this tests tries remote servers, a failure is not always "
|
||||
echo " echoping's fault: it may be a network problem. Also, it depends on"
|
||||
echo " a local ICP cache named 'cache'."
|
||||
|
||||
./echoping -i http://www.pasteur.fr/ cache
|
||||
|
||||
./echoping -i http://www.freenix.org/ cache
|
||||
|
||||
|
@ -1,16 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# $Id$
|
||||
|
||||
echo ""
|
||||
echo "Since this tests tries remote servers, a failure is not always "
|
||||
echo " echoping's fault: it may be a network problem."
|
||||
echo ""
|
||||
echo "For this specific test, you *must* set the locale to UTF-8. It is system-"
|
||||
echo "dependent but you typically 'export LC_CTYPE=xx_XX.utf8' or "
|
||||
echo "'export CHARSET=utf8', depending on your system. 'locale -a' to get"
|
||||
echo "possible values."
|
||||
|
||||
./echoping -h / -v café.gennic.net
|
||||
./echoping -h / -v www.trườngđạihọcbáchkhoahànội.edu.vn
|
||||
./echoping -h / -v www.müller.ch
|
@ -1,18 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# $Id$
|
||||
|
||||
echo ""
|
||||
echo "Since this tests tries remote servers, a failure is not always "
|
||||
echo " echoping's fault: it may be a network problem."
|
||||
|
||||
./echoping -6 -h / -v www.ripe.net
|
||||
|
||||
./echoping -6 -h / -v www.afnic.fr
|
||||
|
||||
./echoping -6 -v -R -h / "[2001:4f8:0:2::d]:80" # RFC 3986, section 3.2.2
|
||||
|
||||
# We force the use of IPv6 with -6 because some libc (Solaris) are
|
||||
# smart enough to send only the IPv4 adresses to the application if
|
||||
# the machine has no IPv6 connectivity.
|
||||
|
@ -1,18 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# $Id$
|
||||
|
||||
echo ""
|
||||
echo "A message such as 'connection refused' is not always an error"
|
||||
echo " you may not have an appropriate server."
|
||||
echo " UDP tests can also fail with a timeout if you do not have the server."
|
||||
|
||||
# Some operating systems, like Solaris or Tru64, uses a file "ipnodes",
|
||||
# somewhere under /etc, in which "localhost" resolves to an IPv6
|
||||
# address (::1), even if the machine has no IPv6 at all. Hence the -4.
|
||||
./echoping -4 localhost
|
||||
./echoping -4 -u localhost
|
||||
./echoping -4 -d localhost
|
||||
./echoping -4 -d -u localhost
|
||||
#./echoping -4 -c localhost # chargen is too often unavailable
|
||||
./echoping -4 -h / localhost
|
@ -1,20 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# $Id$
|
||||
|
||||
echo ""
|
||||
echo "Since this tests tries remote servers, a failure is not always "
|
||||
echo " echoping's fault: it may be a network problem."
|
||||
echo ""
|
||||
|
||||
for plugin in `ls plugins`; do
|
||||
if [ -d plugins/$plugin ]; then
|
||||
cd plugins/$plugin
|
||||
if [ -x ./test.sh ]; then
|
||||
echo "Testing $plugin..."
|
||||
sh ./test.sh
|
||||
echo ""
|
||||
fi
|
||||
cd ../..
|
||||
fi
|
||||
done
|
@ -1,23 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# $Id$
|
||||
|
||||
echo ""
|
||||
echo "Since this tests tries remote servers, a failure is not always "
|
||||
echo " echoping's fault: it may be a network problem. Also, it depends on"
|
||||
echo " a local proxy cache named 'cache'."
|
||||
|
||||
if [ "x$PROXY_PORT" = "x" ]; then
|
||||
PROXY_PORT=3128
|
||||
fi
|
||||
|
||||
./echoping -h http://www.netaktiv.com/ cache:$PROXY_PORT
|
||||
|
||||
./echoping -h http://www.debian.org/ cache:$PROXY_PORT
|
||||
|
||||
./echoping -a -h http://www.debian.org/ cache:$PROXY_PORT
|
||||
|
||||
./echoping -A -h http://www.debian.org/ cache:$PROXY_PORT
|
||||
|
||||
|
||||
|
@ -1,16 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# $Id$
|
||||
|
||||
echo ""
|
||||
echo "Since this tests tries remote servers, a failure is not always "
|
||||
echo " echoping's fault: it may be a network problem."
|
||||
|
||||
# There are no more public echo servers :-(
|
||||
#./echoping echo.example.org
|
||||
|
||||
./echoping -h / www.debian.org
|
||||
|
||||
./echoping -h / www.afnic.fr
|
||||
|
||||
./echoping -S mx3.hotmail.com
|
@ -1,17 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# $Id$
|
||||
|
||||
echo ""
|
||||
echo "Since this tests tries remote servers, a failure is not always "
|
||||
echo " echoping's fault: it may be a network problem."
|
||||
echo "On some systems, you may NEED to be root."
|
||||
|
||||
# Raise the precedence to "critic" (RFC 791, section 3.1)
|
||||
./echoping -P 0xa0 -h / www.gullitv.fr
|
||||
|
||||
# IPTOS_THROUGHPUT
|
||||
./echoping -P 0x08 -h / www.gullitv.fr
|
||||
|
||||
|
||||
|
@ -1,261 +0,0 @@
|
||||
/* Most of it stolen from Pierre Beyssac's bing */
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
#include "echoping.h"
|
||||
|
||||
#define STATES 32
|
||||
|
||||
#include <time.h>
|
||||
#include <ctype.h>
|
||||
|
||||
char *
|
||||
random_string(unsigned length)
|
||||
{
|
||||
|
||||
char *state = (char *) malloc(sizeof(char) * STATES);
|
||||
char *result = (char *) malloc(length + 1);
|
||||
int i, number;
|
||||
unsigned seed = (unsigned) time((time_t *) NULL);
|
||||
|
||||
/* printf ("Seed is %u\n", seed); */
|
||||
|
||||
/* Initialize random generator */
|
||||
(void) initstate(seed, state, STATES);
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
number = (random() % 94) + 33;
|
||||
/* printf ("Number for %d is %d\n", i, number); */
|
||||
result[i] = (char) number;
|
||||
}
|
||||
result[length] = '\0';
|
||||
|
||||
/* printf ("Result is %s\n", result); */
|
||||
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
char *
|
||||
to_upper(char *input)
|
||||
{
|
||||
int c;
|
||||
char *result;
|
||||
result = (char *) malloc(strlen(input));
|
||||
for (c = 0; c < strlen(input); c++)
|
||||
result[c] = toupper((int) input[c]);
|
||||
result[strlen(input)] = '\0';
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* tvsub -- Subtract 2 timeval structs: out = out - in. Out is assumed to be
|
||||
* >= in. Comes from the bing program.
|
||||
*/
|
||||
void
|
||||
tvsub(out, in)
|
||||
struct timeval *out, *in;
|
||||
{
|
||||
if ((out->tv_usec -= in->tv_usec) < 0) {
|
||||
--out->tv_sec;
|
||||
out->tv_usec += 1000000;
|
||||
}
|
||||
out->tv_sec -= in->tv_sec;
|
||||
}
|
||||
|
||||
/* tvadd -- Adds 2 timeval structs: out = out + in. */
|
||||
void
|
||||
tvadd(out, in)
|
||||
struct timeval *out, *in;
|
||||
{
|
||||
if ((out->tv_usec += in->tv_usec) >= 1000000) {
|
||||
++out->tv_sec;
|
||||
out->tv_usec -= 1000000;
|
||||
}
|
||||
out->tv_sec += in->tv_sec;
|
||||
}
|
||||
|
||||
/* tvavg -- Averages a timeval struct */
|
||||
void
|
||||
tvavg(out, number)
|
||||
struct timeval *out;
|
||||
int number;
|
||||
{
|
||||
double result;
|
||||
/*
|
||||
* out->tv_sec = out->tv_sec/number; out->tv_usec =
|
||||
* out->tv_usec/number;
|
||||
*/
|
||||
result = (1000000 * out->tv_sec + out->tv_usec) / number;
|
||||
/* printf ("Result of average is %f\n", result) */ ;
|
||||
out->tv_sec = (long) (result / 1000000);
|
||||
out->tv_usec = (long) (result - (out->tv_sec * 1000000));
|
||||
}
|
||||
|
||||
/* tvstddev -- Computes the standard deviation of a set of results */
|
||||
void
|
||||
tvstddev(out, number, average, results)
|
||||
struct timeval *out;
|
||||
int number;
|
||||
struct timeval average;
|
||||
struct result *results;
|
||||
{
|
||||
int i;
|
||||
struct timeval result = null_timeval;
|
||||
struct timeval avg = null_timeval;
|
||||
#ifdef DEBUG
|
||||
struct timeval var = null_timeval;
|
||||
#endif
|
||||
struct timeval large, small;
|
||||
double d_offset, d_square, d_variance = 0;
|
||||
*out = null_timeval;
|
||||
for (i = 0; i < number; i++) {
|
||||
if (results[i].valid == 1) {
|
||||
result = results[i].timevalue;
|
||||
#ifdef DEBUG
|
||||
printf("DEBUG: Value is %f (average is %f)\n", tv2double
|
||||
(result), tv2double(average));
|
||||
#endif
|
||||
avg = average;
|
||||
if (tvcmp(&result, &avg) == -1) {
|
||||
small = result;
|
||||
large = avg;
|
||||
} else {
|
||||
large = result;
|
||||
small = avg;
|
||||
}
|
||||
tvsub(&large, &small);
|
||||
#ifdef DEBUG
|
||||
printf("abs offset is %f\n", tv2double(large));
|
||||
#endif
|
||||
d_offset = tv2double(large);
|
||||
d_square = d_offset * d_offset;
|
||||
d_variance += d_square;
|
||||
#ifdef DEBUG
|
||||
printf("variance is now %f\n", tv2double(var));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
result = double2tv(sqrt(d_variance / (double) number));
|
||||
out->tv_sec = result.tv_sec;
|
||||
out->tv_usec = result.tv_usec;
|
||||
}
|
||||
|
||||
|
||||
/* tvstddevavg -- Computes the average of values within a set of results where the
|
||||
* sample is within the given number of standard deviations from the average */
|
||||
/* TODO: IWBN to return the number of excluded outliers */
|
||||
void
|
||||
tvstddevavg(out, number, average, results, n_stddev)
|
||||
struct timeval *out; /* contains std dev on entry */
|
||||
int number;
|
||||
struct timeval average;
|
||||
struct result *results;
|
||||
double n_stddev;
|
||||
{
|
||||
int i, valid = 0;
|
||||
struct timeval result; /* working value */
|
||||
struct timeval var = null_timeval; /* result accumulator */
|
||||
double x;
|
||||
double maxdev = tv2double(*out) * n_stddev;
|
||||
|
||||
if (tvcmp(out, &null_timeval) == 0) {
|
||||
/* if the SD is 0 then we just return the average */
|
||||
*out = average;
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < number; i++) {
|
||||
if (results[i].valid == 1) {
|
||||
result = results[i].timevalue;
|
||||
tvsub(&result, &average);
|
||||
/* printf ("value is %f (stddev is %f)\n", tv2double (result), tv2double
|
||||
* (stddev)); */
|
||||
/* ensure that result (difference to average) is absolute value */
|
||||
if (tvcmp(&result, &null_timeval) == -1) {
|
||||
result = average;
|
||||
tvsub(&result, &results[i].timevalue);
|
||||
}
|
||||
x = tv2double(result);
|
||||
/* printf("value is %g maxdev %g\n",x,maxdev); */
|
||||
if (x <= maxdev) {
|
||||
/* deviation is less than stddev */
|
||||
tvadd(&var, &results[i].timevalue);
|
||||
valid++;
|
||||
} else {
|
||||
/* printf("dropped\n"); */
|
||||
}
|
||||
}
|
||||
}
|
||||
/* printf ("total is %f in %d samples\n", tv2double (var), valid); */
|
||||
if (valid > 0) {
|
||||
*out = double2tv(tv2double(var) / valid);
|
||||
} else {
|
||||
*out = null_timeval;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* tvcmp -- Compares two timeval structs */
|
||||
int
|
||||
tvcmp(left, right)
|
||||
struct timeval *left, *right;
|
||||
{
|
||||
if (left->tv_sec < right->tv_sec) {
|
||||
return -1;
|
||||
}
|
||||
if (left->tv_sec > right->tv_sec) {
|
||||
return 1;
|
||||
}
|
||||
if (left->tv_usec < right->tv_usec) {
|
||||
return -1;
|
||||
}
|
||||
if (left->tv_usec > right->tv_usec) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
/* tvmin */
|
||||
void
|
||||
tvmin(champion, challenger)
|
||||
struct timeval *champion, *challenger;
|
||||
{
|
||||
if (tvcmp(champion, challenger) == 1) {
|
||||
champion->tv_sec = challenger->tv_sec;
|
||||
champion->tv_usec = challenger->tv_usec;
|
||||
}
|
||||
}
|
||||
|
||||
/* tvmax */
|
||||
void
|
||||
tvmax(champion, challenger)
|
||||
struct timeval *champion, *challenger;
|
||||
{
|
||||
if (tvcmp(champion, challenger) == -1) {
|
||||
champion->tv_sec = challenger->tv_sec;
|
||||
champion->tv_usec = challenger->tv_usec;
|
||||
}
|
||||
}
|
||||
|
||||
double
|
||||
tv2double(tv)
|
||||
struct timeval tv;
|
||||
{
|
||||
double result;
|
||||
result =
|
||||
(((((double) tv.tv_sec) * 1000000.0) + (double) tv.tv_usec) / 1000000.0);
|
||||
/* printf ("Double is %9.3f\n", result); */
|
||||
return result;
|
||||
}
|
||||
|
||||
struct timeval
|
||||
double2tv(x)
|
||||
double x;
|
||||
{
|
||||
struct timeval result;
|
||||
result.tv_sec = (int) (x);
|
||||
result.tv_usec = (int) ((x - result.tv_sec) * 1000000);
|
||||
return result;
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
/*
|
||||
* Write "n" bytes to a descriptor. Use in place of write() when fd is a
|
||||
* stream socket.
|
||||
*/
|
||||
|
||||
/* Stolen from Stevens' book */
|
||||
|
||||
#include "echoping.h"
|
||||
|
||||
int
|
||||
writen(fd, ptr, nbytes)
|
||||
register int fd;
|
||||
register char *ptr;
|
||||
register int nbytes;
|
||||
{
|
||||
int nleft, nwritten;
|
||||
|
||||
nleft = nbytes;
|
||||
while (nleft > 0) {
|
||||
nwritten = write(fd, ptr, nleft);
|
||||
if (nwritten <= 0)
|
||||
return (nwritten); /* error */
|
||||
/* Some systems, such as Digital's OSF1 (Digital Unix) doesn't set the
|
||||
* returned value to -1, even when interrupted by an alarm, whatever says
|
||||
* the documentation. errno is not set. */
|
||||
if ((nwritten < nleft) && timeout_flag)
|
||||
return nwritten;
|
||||
nleft -= nwritten;
|
||||
ptr += nwritten;
|
||||
}
|
||||
return (nbytes - nleft);
|
||||
}
|
@ -1 +0,0 @@
|
||||
-I .
|
@ -1,27 +0,0 @@
|
||||
PAGESHTML=$(shell ls *.wml | grep -v template | sed 's/.wml/.html/' )
|
||||
OTHERPAGES=$(shell ls *.sh)
|
||||
DEST=bortz@echoping.sourceforge.net:/home/groups/e/ec/echoping/htdocs
|
||||
URL=http://echoping.sourceforge.net/
|
||||
|
||||
all: test
|
||||
|
||||
%.html: %.wml template.wml
|
||||
wml -o $@ ${DEBUG} $<
|
||||
|
||||
test: ${PAGESHTML}
|
||||
@for page in ${PAGESHTML}; do \
|
||||
(nsgmls -s $$page) \
|
||||
done
|
||||
|
||||
install: ${PAGESHTML}
|
||||
svn commit
|
||||
scp -v ${PAGESHTML} ${OTHERPAGES} ${DEST}
|
||||
|
||||
checkbot:
|
||||
checkbot --url ${URL} --match ${URL} \
|
||||
--verbose
|
||||
|
||||
clean:
|
||||
rm -f ${PAGESHTML}
|
||||
|
||||
# $Id$
|
@ -1,134 +0,0 @@
|
||||
#use wml::template Title="echoping details"
|
||||
|
||||
<!-- $Id$ -->
|
||||
|
||||
|
||||
<H2>echo service</H2>
|
||||
|
||||
<P>echoping, with its default setting, assumes the remote host accepts
|
||||
such connections. Experience show that most Internet routers or hosts
|
||||
do not. Some Unices are not shipped with this service enabled and,
|
||||
anyway, the administrator is always free to close it (I think they
|
||||
shouldn't). echoping has therefore less chance to succeed than ping or
|
||||
bing. (On a typical Unix box, "echo" service is configured in
|
||||
/etc/inetd.conf but see the <A
|
||||
HREF="http://www.cert.org/advisories/CA-1996-01.html">CERT
|
||||
advisory</A>.)
|
||||
|
||||
<H2>What does it measure?</H2>
|
||||
|
||||
<P>echoping simply shows the elapsed time, including the time to set up the TCP
|
||||
connection and to transfer the data (but excluding the time for the
|
||||
- possible - DNS call). Therefore, it is unsuitable to physical
|
||||
line raw throughput measures (unlike bing). On the other end, the action it
|
||||
performs are close from a HTTP request and it is meaningful to use it
|
||||
(carefully) to measure Web performances.
|
||||
|
||||
<H3>More on Linux</H3>
|
||||
|
||||
<P>On operating systems, like Linux, who have the TCP_INFO option (see
|
||||
<A HREF="http://linuxgazette.net/136/pfeiffer.html">a detailed
|
||||
presentation</A>), echoping can also display interesting TCP information.
|
||||
|
||||
<H2>UDP and inetd</H2>
|
||||
|
||||
<P>With UDP servers you can have surprises: the first test is quite often
|
||||
much slower since inetd has to launch the process. After that, the process
|
||||
stays a while so the next texts run faster.
|
||||
|
||||
<H2>A nice example</H2>
|
||||
|
||||
<P>There are many, many traps when measuring something on the Internet. Just one
|
||||
example: 'echoping -w 0 -n 4 a-sunOS-machine' and you'll see the first test
|
||||
succeed in a very short time (if you are close from the machine) and all of
|
||||
the others take a much longer time (one second). With '-w 1' (wait one second
|
||||
between tests, the default), everything works fine: it seems the sockets on
|
||||
SunOS need time to recover :-)
|
||||
|
||||
<H2>To measure performances on the Internet you can also see</H2>
|
||||
|
||||
<H3>Unix</H3>
|
||||
|
||||
<UL>
|
||||
<LI><A HREF="http://www.internet2.edu/~shalunov/thrulay/">thrulay</A>,
|
||||
measures the capacity of a network by sending a bulk TCP stream over it
|
||||
<LI><A
|
||||
HREF="http://www.freenix.fr/freenix/logiciels/bing.html">bing</A>, a
|
||||
bandwidth measurement tool
|
||||
<LI>pathchar or <A
|
||||
HREF="http://www.employees.org/~bmah/Software/pchar/">pchar</A>, a bandwidth measurement tool
|
||||
<LI>ping, probably available with your system
|
||||
<LI>traceroute, idem (otherwise, see <A HREF="ftp://ftp.ee.lbl.gov/">LBL</A>)
|
||||
<LI><A HREF="ftp://ftp.arl.mil/pub/ttcp/">ttcp</A>, the best measurement tool but it needs some control over the
|
||||
two machines
|
||||
<LI><A HREF="ftp://ftp.scl.ameslab.gov/pub/netpipe/">Netpipe</A>, it needs some control over the two machines
|
||||
<LI><A HREF="http://www.psc.edu/~pscnoc/treno_info.html">treno</A> (evaluates available bandwidth for TCP)
|
||||
<LI>spray is a tool which I dont't know very well. It is available on some
|
||||
machines (Sun, OSF/1).
|
||||
<LI>I've also heard of but never tried:
|
||||
<UL>
|
||||
<LI><A
|
||||
HREF="http://www.netperf.org/netperf/NetperfPage.html">Netperf</A>, a suite of Bandwidth Measuring programs from gnn@netcom.com
|
||||
These are <A HREF="ftp://ftp.netcom.com/~ftp/gnn/bwmeas-0.3.tar.Z">several
|
||||
programs</A> that measure bandwidth and jitter over several kinds of
|
||||
IPC links, including TCP and UDP.
|
||||
</UL>
|
||||
</UL>
|
||||
|
||||
<H3>MacOS</H3>
|
||||
|
||||
<UL>
|
||||
<LI>TCP Watcher, a very nice "swiss-army knife" tool, to test ping, DNS, echo.
|
||||
It includes an echo server. Available on <A
|
||||
HREF="http://www.info-mac.org/">Info-Mac</A> in "comm/inet".
|
||||
</UL>
|
||||
|
||||
<H3>MS-Windows</H3>
|
||||
|
||||
(I have little knowledge of that environment and I tested nothing.)
|
||||
|
||||
<UL>
|
||||
<LI><A
|
||||
HREF="http://www.ccs.org/winsock/xref-e.html#echo_clients">WSNUTIL</A>.
|
||||
Seems to be an echo client and server.
|
||||
<LI><A
|
||||
HREF="http://www.winsite.com/info/pc/win95/misc/echox32.zip/">echox32</A>,
|
||||
an echo server
|
||||
<LI><A
|
||||
HREF="http://www.winsite.com/info/pc/win3/winsock/cfing13b.zip/">cfinger</A>,
|
||||
an
|
||||
echo client and server
|
||||
</UL>
|
||||
|
||||
<H3>Windows-NT</H3>
|
||||
|
||||
echo and other services can (apparently) be provided within
|
||||
'Simple TCP/IP Services' which
|
||||
can be enabled through the Network Control Panel
|
||||
|
||||
<H3>Web clients</H3>
|
||||
|
||||
You can ping or traceroute on the Web. See <A
|
||||
HREF="http://www.traceroute.org/">traceroute.org</A>.
|
||||
|
||||
<P>Use all of them with care, the result is not obvious to interpret.
|
||||
|
||||
<P>If you are interested in Internet measurements, there is an <A
|
||||
HREF="http://www.ietf.org/">Internet Engineering Task Force</A>
|
||||
Working Group, <A
|
||||
HREF="http://www.ietf.org/html.charters/ippm-charter.html">IPPM (IP
|
||||
Performance Metrics)</A> which produces many fine RFC that are really
|
||||
good to read. I appreciate RFC 2330 and 3148.
|
||||
|
||||
<P>And don't forget to read RFC 1470 ("Tools for Monitoring and Debugging
|
||||
TCP/IP Internets and Interconnected Devices"), specially its "Benchmark"
|
||||
section and the Richard Stevens' books (all of them), published by
|
||||
Addison-Wesley.
|
||||
|
||||
<P>Last, but not least, since statistics is typically a very neglected
|
||||
area in computer networks, <A
|
||||
HREF="http://www.statsoft.com/textbook/stbasic.html">Basic
|
||||
Statistics</A> is a fery useful resource. For the reasons why echoping
|
||||
displays median as well as average, see <A
|
||||
HREF="http://shlang.com/writing/mean-delay-considered-harmful.html">Mean
|
||||
Delay Considered Harmful</A>.
|
@ -1,7 +0,0 @@
|
||||
#use wml::template Title="echoping donations"
|
||||
|
||||
<P>If you want to help and/or motivate echoping and its developer, you <em>can</em>
|
||||
(but are not forced to do so, echoping is free software):
|
||||
|
||||
<P>Give money to a worthy cause :-)
|
||||
|
@ -1,17 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
PATH=/bin:/usr/bin:/usr/local/bin
|
||||
|
||||
DELAY=`echoping -n 3 -h /tests/bidon www.netaktiv.com | \
|
||||
grep Median | \
|
||||
awk '{print int ($3 * 1000)}' `
|
||||
echo $DELAY
|
||||
echo $DELAY
|
||||
|
||||
UPTIME=`wget -O - -q http://www.netaktiv.com/server-status | \
|
||||
grep uptime | \
|
||||
awk -F: '{print $2}' | sed 's/<br>//' `
|
||||
|
||||
echo $UPTIME
|
||||
echo Web server
|
||||
|
@ -1,107 +0,0 @@
|
||||
#use wml::template Title="echoping Home Page"
|
||||
|
||||
<!-- $Id$ -->
|
||||
|
||||
<P>"echoping" is a small program to test (approximatively) performances of a
|
||||
remote host by sending it requests such as HTTP requests.
|
||||
|
||||
<P>To install it, see the INSTALL file. Or type "<code>./configure
|
||||
--config-cache&& make && sudo make install</code>" if you're in a
|
||||
hurry :-) Several operating systems have echoping already packaged
|
||||
(Debian, Gentoo, FreeBSD, NetBSD). <A
|
||||
HREF="http://sourceforge.net/project/showfiles.php?group_id=4581&package_id=4579">Download</A>, if you
|
||||
wish. You may be interested also in <A
|
||||
HREF="http://sourceforge.net/project/?group_id=4581">SourceForge's
|
||||
page about echoping</A>, with the bug reports, etc.
|
||||
|
||||
You may prefer access the latest developments <A
|
||||
HREF="http://sourceforge.net/svn/?group_id=4581">via Subversion</A>:
|
||||
the module is named "SRC"; but <EM>be careful</EM>, this is not for the faint
|
||||
of heart and you need to master GNU auto* tools.
|
||||
|
||||
<P>To use it, simply:
|
||||
|
||||
<PRE>
|
||||
% echoping machine.somewhere.org
|
||||
</PRE>
|
||||
|
||||
<P>or use the options before the machine name (see the man page).
|
||||
|
||||
<P>See the <A HREF="details.html">DETAILS</A> file for various traps when benchmarking networks,
|
||||
specially with this program.
|
||||
|
||||
<P>In any case, be polite: don't bother the remote host with many repeated
|
||||
requests, especially with large size. Ask for permission if you often
|
||||
test hosts which aren't yours.
|
||||
|
||||
<P>Current features:
|
||||
|
||||
<UL>
|
||||
<LI>plugins, so you can extend
|
||||
echoping with any protocol you like and/or use,
|
||||
<LI>Supports IPv6 as well as IPv4,
|
||||
<LI>Supports IDN (Unicode domain names like <CODE>café.gennic.net</CODE>),
|
||||
<LI>uses the protocols echo, discard, chargen or HTTP,
|
||||
<LI>can use cryptographic connections with HTTP,
|
||||
<LI>uses UDP instead of TCP for the protocols which accept it (like echo),
|
||||
<LI>can repeat the test and display various measures about it,
|
||||
</UL>
|
||||
|
||||
<P><A HREF="http://sourceforge.net/bugs/?func=browse&group_id=4581&set=open">Known bugs</A>
|
||||
|
||||
<P>Examples of output:
|
||||
|
||||
<OL>
|
||||
|
||||
<LI>(Simple test with 1000 bytes echo TCP packets)
|
||||
<PRE>
|
||||
% echoping -v -s 1000 mycisco
|
||||
|
||||
This is echoping, version 5.0.0.
|
||||
|
||||
Trying to connect to internet address 172.21.0.14 7 to transmit 1000 bytes...
|
||||
Connected...
|
||||
TCP Latency: 0.003165 seconds
|
||||
Sent (1000 bytes)...
|
||||
Application Latency: 0.322183 seconds
|
||||
1000 bytes read from server.
|
||||
Checked
|
||||
Elapsed time: 0.326960 seconds
|
||||
</PRE>
|
||||
|
||||
<LI>(Repeated tests with average / mean and <A
|
||||
HREF="http://www.internet2.edu/~shalunov/writing/mean-delay-considered-harmful.html">median</A>
|
||||
displayed.)
|
||||
|
||||
<PRE>
|
||||
% echoping -n 10 faraway-machine
|
||||
[...]
|
||||
Minimum time: 6.722336 seconds (38 bytes per sec.)
|
||||
Maximum time: 17.975060 seconds (14 bytes per sec.)
|
||||
Average time: 10.873267 seconds (24 bytes per sec.)
|
||||
Standard deviation: 3.102793
|
||||
Median time: 9.218506 seconds (28 bytes per sec.)
|
||||
</PRE>
|
||||
|
||||
<LI>(Testing a Web server with an HTTP request for its home page.)
|
||||
<PRE>
|
||||
% echoping -h / mywww
|
||||
Elapsed time: 0.686792 seconds
|
||||
</PRE>
|
||||
|
||||
</OL>
|
||||
|
||||
<P>The exit status is set if there is any problem, so you can use
|
||||
echoping to test repeatedly a Web server, to be sure it runs fine (<A
|
||||
HREF="http://people.ee.ethz.ch/~oetiker/webtools/smokeping/">SmokePing</A>
|
||||
does it). Or you can display statistics with <A
|
||||
HREF="http://people.ee.ethz.ch/~oetiker/webtools/mrtg/">MRTG</A>. (see
|
||||
an example of a <A HREF="echoping-web.sh">shell script</A> which runs echoping
|
||||
from MRTG).
|
||||
|
||||
<P>To do for a future version: see the TODO file.
|
||||
|
||||
<H3>Helping and motivating the greedy and selfish developer</H3>
|
||||
|
||||
You can <A HREF="donations.html">send money, books or postcards</A>.
|
||||
|
@ -1,82 +0,0 @@
|
||||
#use wml::std::info
|
||||
|
||||
<define-tag warningwml>
|
||||
<!-- MADE BY A PROGRAM (WML $(WML_VERSION))!
|
||||
And maintained by CVS.
|
||||
DO NOT EDIT!
|
||||
The reference file is $(WML_SRC_DIRNAME)/$(WML_SRC_FILENAME)
|
||||
-->
|
||||
</define-tag>
|
||||
|
||||
<define-tag miscmeta>
|
||||
<LINK REV="made" HREF="mailto:bortz@users.sourceforge.net">
|
||||
<info style=meta>
|
||||
</define-tag>
|
||||
|
||||
<define-tag lastmodif>
|
||||
Last update done on
|
||||
<:
|
||||
($device, $inode, $mode, $nlink, $uid, $gid, $rdev,
|
||||
$size,
|
||||
$access_time, $modif_time, $creat_time,
|
||||
$block_size, $blocks)
|
||||
= stat ($WML_SRC_FILENAME);
|
||||
print &time2string($modif_time, 1);
|
||||
:>
|
||||
<FONT SIZE=-1>(last regeneration by
|
||||
<A HREF="http://www.engelschall.com/sw/wml/">WML</A> $(WML_VERSION) on <:
|
||||
print &time2string(time(), 1);
|
||||
:>)</FONT>.
|
||||
</define-tag>
|
||||
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
<warningwml>
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>$(Title)</TITLE>
|
||||
<miscmeta>
|
||||
</HEAD>
|
||||
|
||||
<BODY BGCOLOR="#ffffff" VLINK="#003399" LINK="#0033ff" TEXT="#000000">
|
||||
<H1>$(Title)</H1>
|
||||
|
||||
<<Body>>
|
||||
|
||||
|
||||
|
||||
<HR>
|
||||
<A href="http://sourceforge.net">
|
||||
<IMG src="http://sourceforge.net/sflogo.php?group_id=4581&type=1"
|
||||
width="88" height="31" border="0" alt="SourceForge Logo"></A><BR>
|
||||
<SMALL>
|
||||
<STRONG>echoping</STRONG> is managed by Stéphane Bortzmeyer
|
||||
<code><bortz@users.sourceforge.net></code>. <lastmodif>
|
||||
</SMALL>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
||||
..Body>>
|
||||
|
||||
<:
|
||||
sub time2string {
|
||||
my ($time, $display_day) = @_;
|
||||
my ($result);
|
||||
my ($week_day_text);
|
||||
my ($seconds, $minutes, $hours, $days, $month, $year, $week_day, $year_day, $is_dst) =
|
||||
gmtime ($time);
|
||||
$month_text = (January, February, March, April, May, June, July,
|
||||
August, September, October, November, December)
|
||||
[$month];
|
||||
if ($display_day) {
|
||||
$week_day_text = (Sunday, Monday, Tuesday, Wednesday, Thursday,
|
||||
Friday, Saturday) [$week_day];
|
||||
}
|
||||
$year = $year + 1900;
|
||||
|
||||
$result = "$week_day_text $days $month_text $year";
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
:>
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,755 +0,0 @@
|
||||
{"tickets": [{
|
||||
"status": "open-fixed",
|
||||
"reported_by_id": "4f74b61d71b75b397a006f01",
|
||||
"related_artifacts": [],
|
||||
"attachments": [],
|
||||
"reported_by": "zcougar",
|
||||
"assigned_to": "bortz",
|
||||
"labels": [],
|
||||
"discussion_disabled": false,
|
||||
"assigned_to_id": "4f3540db0594ca2bc0000b32",
|
||||
"private": false,
|
||||
"summary": "RPM spec file",
|
||||
"description": "I made RPM spec file for echoping. It would be nice if\r\nyou can put this file into the package. Then it will be\r\nvery easy to make RPM from source \\(rpm -ta\r\nechoping-x.x.x.tar.gz\\).\r\n\r\nBoth SRPM and RPM built on SuSE 9.0 are available also:\r\n\r\nhttp://www.version6.net/rpm/ecmh-20040110-1.src.rpm\r\nhttp://www.version6.net/rpm/ecmh-20040110-1.i586.rpm\r\n\r\n\\-- \r\nCougar\r\n",
|
||||
"discussion_thread": {
|
||||
"_id": "7bc6a80d",
|
||||
"posts": [
|
||||
{
|
||||
"text": "echoping RPM spec file",
|
||||
"attachments": [
|
||||
{
|
||||
"url": "http://sourceforge.net/p/echoping/patches/_discuss/thread/7bc6a80d/fac2/attachment/echoping.spec",
|
||||
"bytes": 1116
|
||||
}
|
||||
],
|
||||
"author": "zcougar",
|
||||
"timestamp": "2004-06-30 17:52:52",
|
||||
"last_edited": null,
|
||||
"slug": "fac2",
|
||||
"subject": "#1 RPM spec file"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: NO\n\nOK, downloaded the right :-\\) \".src.rpm\" from rhttp://www.version6.net/rpm, \"rpm2cpio echoping.src.rpm | cpio -idv\"\r\n\r\nBut the echoping.spec is not much better than the one already in echoping distribution. I merged the two files, committed in Subversion \\(r. 358\\) testing on a RPM-enabled machine is now needed.\r\n",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 21:37:47",
|
||||
"last_edited": null,
|
||||
"slug": "0956",
|
||||
"subject": "#1 RPM spec file"
|
||||
},
|
||||
{
|
||||
"text": "- **assigned_to**: nobody --> bortz\n- **status**: open --> open-fixed",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 21:37:47",
|
||||
"last_edited": null,
|
||||
"slug": "b62c",
|
||||
"subject": "#1 RPM spec file"
|
||||
}
|
||||
],
|
||||
"discussion_id": "518aabb45fcbc979b923a2dd",
|
||||
"subject": ""
|
||||
},
|
||||
"mod_date": "2007-03-07 21:37:47",
|
||||
"votes_down": 0,
|
||||
"votes_up": 0,
|
||||
"_id": "518aabb45fcbc979b923a2e8",
|
||||
"discussion_thread_url": "http://sourceforge.net/rest/p/echoping/patches/_discuss/thread/7bc6a80d/",
|
||||
"ticket_num": 1,
|
||||
"custom_fields": {
|
||||
"_priority": "5"
|
||||
},
|
||||
"created_date": "2004-06-30 17:52:51"
|
||||
},{
|
||||
"status": "closed-fixed",
|
||||
"reported_by_id": null,
|
||||
"related_artifacts": [],
|
||||
"attachments": [],
|
||||
"reported_by": "*anonymous",
|
||||
"assigned_to": "bortz",
|
||||
"labels": [],
|
||||
"discussion_disabled": false,
|
||||
"assigned_to_id": "4f3540db0594ca2bc0000b32",
|
||||
"private": false,
|
||||
"summary": "add WHOIS support and fix duplicate write to server",
|
||||
"description": "This patch adds whois support to echoping. It also\r\nremoves a\r\nproblem that caused the \"sendline\" to be sent to the\r\nserver twice. This problem causes the SMTP-checker to\r\nsend QUIT twice, which is not so important, but it\r\nactually broke the WHOIS check against some servers.\r\n\r\nTo use WHOIS, do this:\r\nechoping -W example.com hostname\r\n\r\nThe reading/writing seems to be a bit shaky, it fails\r\nwith some servers. I'm not sure why, could be something\r\nis not completely correct in the patch.\r\n\r\nKetil Froyn <ketil@froyn.name>",
|
||||
"discussion_thread": {
|
||||
"_id": "c0518af1",
|
||||
"posts": [
|
||||
{
|
||||
"text": "Patch to add WHOIS support to echoping and remove duplicate write",
|
||||
"attachments": [
|
||||
{
|
||||
"url": "http://sourceforge.net/p/echoping/patches/_discuss/thread/c0518af1/72e0/attachment/echoping_add_whois.diff",
|
||||
"bytes": 6038
|
||||
}
|
||||
],
|
||||
"author": "nobody",
|
||||
"timestamp": "2004-08-12 16:28:03",
|
||||
"last_edited": null,
|
||||
"slug": "72e0",
|
||||
"subject": "#2 add WHOIS support and fix duplicate write to server"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: NO \n\nThis is the kind of error I get:\r\n\r\nreadline error: 1 bytes read, 13 bytes requested \\(Illegal seek\\)\r\n\r\nI haven't debugged the reason for this, it works for me for now.\r\n\r\nKetil Froyn <ketil@froyn.name>",
|
||||
"attachments": [],
|
||||
"author": "nobody",
|
||||
"timestamp": "2004-08-12 16:30:53",
|
||||
"last_edited": null,
|
||||
"slug": "fbfb",
|
||||
"subject": "#2 add WHOIS support and fix duplicate write to server"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: NO\n\nThanks for the patch and report.\r\n\r\nBut, sorry, but the whois patch will not be used. The next version of echoping will use a system of plugins so every new request for a new protocol will be handled by \"Develop a plugin, Luke\" \\(there is already one for whois\\).\r\n\r\nYou can try the next version at ftp://ftp.internatif.org/pub/unix/echoping/echoping-6.0-BETA.tar.gz\r\n",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 15:37:23",
|
||||
"last_edited": null,
|
||||
"slug": "890f",
|
||||
"subject": "#2 add WHOIS support and fix duplicate write to server"
|
||||
},
|
||||
{
|
||||
"text": "- **assigned_to**: nobody --> bortz\n- **status**: open --> open-wont-fix",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 15:37:23",
|
||||
"last_edited": null,
|
||||
"slug": "1bcc",
|
||||
"subject": "#2 add WHOIS support and fix duplicate write to server"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: NO\n\nI cannot reproduce the \"two QUIT\" problem, sorry.\\(Checked with Wireshark.\\)\r\n",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 15:47:19",
|
||||
"last_edited": null,
|
||||
"slug": "24be",
|
||||
"subject": "#2 add WHOIS support and fix duplicate write to server"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: NO\n\nechoping 6 released, with the whois plugin",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-26 20:59:52",
|
||||
"last_edited": null,
|
||||
"slug": "77f4",
|
||||
"subject": "#2 add WHOIS support and fix duplicate write to server"
|
||||
},
|
||||
{
|
||||
"text": "- **status**: open-wont-fix --> closed-fixed",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-26 20:59:52",
|
||||
"last_edited": null,
|
||||
"slug": "9214",
|
||||
"subject": "#2 add WHOIS support and fix duplicate write to server"
|
||||
}
|
||||
],
|
||||
"discussion_id": "518aabb45fcbc979b923a2dd",
|
||||
"subject": ""
|
||||
},
|
||||
"mod_date": "2007-03-26 20:59:52",
|
||||
"votes_down": 0,
|
||||
"votes_up": 0,
|
||||
"_id": "518aabb55fcbc979b923a304",
|
||||
"discussion_thread_url": "http://sourceforge.net/rest/p/echoping/patches/_discuss/thread/c0518af1/",
|
||||
"ticket_num": 2,
|
||||
"custom_fields": {
|
||||
"_priority": "5"
|
||||
},
|
||||
"created_date": "2004-08-12 16:28:03"
|
||||
},{
|
||||
"status": "closed-duplicate",
|
||||
"reported_by_id": null,
|
||||
"related_artifacts": [],
|
||||
"attachments": [],
|
||||
"reported_by": "*anonymous",
|
||||
"assigned_to": "bortz",
|
||||
"labels": [],
|
||||
"discussion_disabled": false,
|
||||
"assigned_to_id": "4f3540db0594ca2bc0000b32",
|
||||
"private": false,
|
||||
"summary": "improved:add WHOIS support and fix duplicate write to server",
|
||||
"description": "Usage:\r\nechoping -W example.com whois.crsnic.net\r\n\r\nTested like this:\r\npatch -p1 < echoping\\_add\\_whois.diff\r\naclocal && automake --add-missing && autoconf &&\r\n./configure --without-libidn\r\nmake\r\n./echoping -W example.com whois.crsnic.net\r\n\r\nI haven't experienced any more problems after this rewrite.\r\n\r\nKetil Froyn <ketil@froyn.name>\r\n\r\n",
|
||||
"discussion_thread": {
|
||||
"_id": "2bdac84c",
|
||||
"posts": [
|
||||
{
|
||||
"text": "WHOIS support for echoping",
|
||||
"attachments": [
|
||||
{
|
||||
"url": "http://sourceforge.net/p/echoping/patches/_discuss/thread/2bdac84c/f246/attachment/echoping_add_whois.diff",
|
||||
"bytes": 8605
|
||||
}
|
||||
],
|
||||
"author": "nobody",
|
||||
"timestamp": "2004-08-13 11:44:10",
|
||||
"last_edited": null,
|
||||
"slug": "f246",
|
||||
"subject": "#3 improved:add WHOIS support and fix duplicate write to server"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: NO\n\nSee the discussion in \\#1008066",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 15:40:52",
|
||||
"last_edited": null,
|
||||
"slug": "074b",
|
||||
"subject": "#3 improved:add WHOIS support and fix duplicate write to server"
|
||||
},
|
||||
{
|
||||
"text": "- **assigned_to**: nobody --> bortz\n- **status**: open --> open-duplicate",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 15:40:52",
|
||||
"last_edited": null,
|
||||
"slug": "29e7",
|
||||
"subject": "#3 improved:add WHOIS support and fix duplicate write to server"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: NO\n\nechoping 6 released and should be OK.",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-26 21:01:16",
|
||||
"last_edited": null,
|
||||
"slug": "3b87",
|
||||
"subject": "#3 improved:add WHOIS support and fix duplicate write to server"
|
||||
},
|
||||
{
|
||||
"text": "- **status**: open-duplicate --> closed-duplicate",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-26 21:01:16",
|
||||
"last_edited": null,
|
||||
"slug": "5bb8",
|
||||
"subject": "#3 improved:add WHOIS support and fix duplicate write to server"
|
||||
}
|
||||
],
|
||||
"discussion_id": "518aabb45fcbc979b923a2dd",
|
||||
"subject": ""
|
||||
},
|
||||
"mod_date": "2007-03-26 21:01:16",
|
||||
"votes_down": 0,
|
||||
"votes_up": 0,
|
||||
"_id": "518aabb85fcbc979b923a333",
|
||||
"discussion_thread_url": "http://sourceforge.net/rest/p/echoping/patches/_discuss/thread/2bdac84c/",
|
||||
"ticket_num": 3,
|
||||
"custom_fields": {
|
||||
"_priority": "5"
|
||||
},
|
||||
"created_date": "2004-08-13 11:44:10"
|
||||
},{
|
||||
"status": "closed-out-of-date",
|
||||
"reported_by_id": "51840af32718467ad6898df9",
|
||||
"related_artifacts": [],
|
||||
"attachments": [],
|
||||
"reported_by": "afm",
|
||||
"assigned_to": "bortz",
|
||||
"labels": [],
|
||||
"discussion_disabled": false,
|
||||
"assigned_to_id": "4f3540db0594ca2bc0000b32",
|
||||
"private": false,
|
||||
"summary": "Fix for incorrect Host: header and memory leak",
|
||||
"description": "The attached patch takes care not to include a port in the Host: \r\nheader of the HTTP request if the port is not set \\(i.e. = 0\\) as \r\nargument to make\\_http\\_sendline.\r\n\r\nFurthermore, it fixes the memory leak caused by the fact that \r\nhostname is not freed when HTTP10 is defined.",
|
||||
"discussion_thread": {
|
||||
"_id": "c9820fce",
|
||||
"posts": [
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: NO\n\nIt seems there is no patch attached \\(same problem for \\#1282749\\)\r\n",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 15:48:52",
|
||||
"last_edited": null,
|
||||
"slug": "0000",
|
||||
"subject": "#4 Fix for incorrect Host: header and memory leak"
|
||||
},
|
||||
{
|
||||
"text": "- **assigned_to**: nobody --> bortz",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 15:48:52",
|
||||
"last_edited": null,
|
||||
"slug": "0d1d",
|
||||
"subject": "#4 Fix for incorrect Host: header and memory leak"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: NO\n\nSeems OK with the release of echoping 6. Feel free to reopen if not OK.\r\n",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-26 21:03:09",
|
||||
"last_edited": null,
|
||||
"slug": "e6e3",
|
||||
"subject": "#4 Fix for incorrect Host: header and memory leak"
|
||||
},
|
||||
{
|
||||
"text": "- **status**: open --> closed-out-of-date",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-26 21:03:09",
|
||||
"last_edited": null,
|
||||
"slug": "b2fc",
|
||||
"subject": "#4 Fix for incorrect Host: header and memory leak"
|
||||
}
|
||||
],
|
||||
"discussion_id": "518aabb45fcbc979b923a2dd",
|
||||
"subject": ""
|
||||
},
|
||||
"mod_date": "2007-03-26 21:03:09",
|
||||
"votes_down": 0,
|
||||
"votes_up": 0,
|
||||
"_id": "518aabba5fcbc979b923a358",
|
||||
"discussion_thread_url": "http://sourceforge.net/rest/p/echoping/patches/_discuss/thread/c9820fce/",
|
||||
"ticket_num": 4,
|
||||
"custom_fields": {
|
||||
"_priority": "5"
|
||||
},
|
||||
"created_date": "2005-09-06 08:46:48"
|
||||
},{
|
||||
"status": "closed-duplicate",
|
||||
"reported_by_id": "51840af32718467ad6898df9",
|
||||
"related_artifacts": [],
|
||||
"attachments": [],
|
||||
"reported_by": "afm",
|
||||
"assigned_to": "bortz",
|
||||
"labels": [],
|
||||
"discussion_disabled": false,
|
||||
"assigned_to_id": "4f3540db0594ca2bc0000b32",
|
||||
"private": false,
|
||||
"summary": "Fix for incorrect Host: header and memory leak",
|
||||
"description": "The attached patch takes care not to include a port in the Host: \r\nheader of the HTTP request if the port is not set \\(i.e. = 0\\) as \r\nargument to make\\_http\\_sendline.\r\n\r\nFurthermore, it fixes the memory leak caused by the fact that \r\nhostname is not freed when HTTP10 is defined.",
|
||||
"discussion_thread": {
|
||||
"_id": "224c2394",
|
||||
"posts": [
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: NO\n\nSee \\#1282748",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 15:49:22",
|
||||
"last_edited": null,
|
||||
"slug": "ab70",
|
||||
"subject": "#5 Fix for incorrect Host: header and memory leak"
|
||||
},
|
||||
{
|
||||
"text": "- **assigned_to**: nobody --> bortz\n- **status**: open --> open-duplicate",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 15:49:22",
|
||||
"last_edited": null,
|
||||
"slug": "6af3",
|
||||
"subject": "#5 Fix for incorrect Host: header and memory leak"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: NO\n\nShould be obsolete with the release of 6.0.0",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-26 21:04:56",
|
||||
"last_edited": null,
|
||||
"slug": "42f8",
|
||||
"subject": "#5 Fix for incorrect Host: header and memory leak"
|
||||
},
|
||||
{
|
||||
"text": "- **status**: open-duplicate --> closed-duplicate",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-26 21:04:56",
|
||||
"last_edited": null,
|
||||
"slug": "f1c6",
|
||||
"subject": "#5 Fix for incorrect Host: header and memory leak"
|
||||
}
|
||||
],
|
||||
"discussion_id": "518aabb45fcbc979b923a2dd",
|
||||
"subject": ""
|
||||
},
|
||||
"mod_date": "2007-03-26 21:04:56",
|
||||
"votes_down": 0,
|
||||
"votes_up": 0,
|
||||
"_id": "518aabbb5fcbc979b923a373",
|
||||
"discussion_thread_url": "http://sourceforge.net/rest/p/echoping/patches/_discuss/thread/224c2394/",
|
||||
"ticket_num": 5,
|
||||
"custom_fields": {
|
||||
"_priority": "5"
|
||||
},
|
||||
"created_date": "2005-09-06 08:46:49"
|
||||
},{
|
||||
"status": "closed-fixed",
|
||||
"reported_by_id": "4f3540db0594ca2bc0000b32",
|
||||
"related_artifacts": [],
|
||||
"attachments": [],
|
||||
"reported_by": "bortz",
|
||||
"assigned_to": "bortz",
|
||||
"labels": [],
|
||||
"discussion_disabled": false,
|
||||
"assigned_to_id": "4f3540db0594ca2bc0000b32",
|
||||
"private": false,
|
||||
"summary": "Stats enhancement from Andy Juniper",
|
||||
"description": "\r\nAttached is a patch which addresses the following\r\nissues/enhancements in\r\nechoping-6.0-BETA:\r\n\r\n\\* add a -D command line option to measure latency\r\nover data transfer\r\ntime only, for TCP connections this excludes the\r\nconnection setup \r\nand teardown which can take a long time if DNS and\r\nARP are involved\r\n\\* fix underflow in the standard deviation\r\ncalculation routine, where\r\nif the deviations were small \\(microseconds\\) then\r\nthe standard\r\ndeviation would report as 0 due to performing the\r\nsquare/square\r\nroot operations on integers; the whole of the SD\r\ncalculation is\r\nnow performed using doubles.\r\n\\* add a -N <number> command line option to\r\noptionally additionally\r\nreport a recalculated average which excludes\r\nvalues which are \r\nfurther than +/- N\\*standard deviation from the\r\naverage; this means\r\nthat values which are a long way off the average\r\nget removed from \r\nthe recalculated average. See \r\n\r\n\r\nhttp://www.statsoft.com/textbook/stbasic.html\\#Correlationse\r\nfor\r\ndetails of why I've done this.\r\n\r\nPlease feel free to incorporate these changes into your\r\ncode\\!\r\n\r\nAndy Juniper\r\n",
|
||||
"discussion_thread": {
|
||||
"_id": "02ec69da",
|
||||
"posts": [
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: YES\n\nUnfortunately, there is no patch attached :-\\(\r\n",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 15:51:17",
|
||||
"last_edited": null,
|
||||
"slug": "864f",
|
||||
"subject": "#6 Stats enhancement from Andy Juniper"
|
||||
},
|
||||
{
|
||||
"text": "",
|
||||
"attachments": [
|
||||
{
|
||||
"url": "http://sourceforge.net/p/echoping/patches/_discuss/thread/02ec69da/0f8a/attachment/echoping.patch",
|
||||
"bytes": 8673
|
||||
}
|
||||
],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 15:53:26",
|
||||
"last_edited": null,
|
||||
"slug": "0f8a",
|
||||
"subject": "#6 Stats enhancement from Andy Juniper"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: YES\n\nPatch attached, this time\nFile Added: echoping.patch",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 15:53:26",
|
||||
"last_edited": null,
|
||||
"slug": "a50b",
|
||||
"subject": "#6 Stats enhancement from Andy Juniper"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: YES\n\nCommitted in Subversion, r356.",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 21:02:43",
|
||||
"last_edited": null,
|
||||
"slug": "0e90",
|
||||
"subject": "#6 Stats enhancement from Andy Juniper"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: YES\n\nAnd documented and credited.\r\n",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 21:21:37",
|
||||
"last_edited": null,
|
||||
"slug": "e0e4",
|
||||
"subject": "#6 Stats enhancement from Andy Juniper"
|
||||
},
|
||||
{
|
||||
"text": "- **status**: open --> open-fixed",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-07 21:21:37",
|
||||
"last_edited": null,
|
||||
"slug": "59d9",
|
||||
"subject": "#6 Stats enhancement from Andy Juniper"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: YES\n\nShipped with echoping 6",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-26 21:07:42",
|
||||
"last_edited": null,
|
||||
"slug": "9680",
|
||||
"subject": "#6 Stats enhancement from Andy Juniper"
|
||||
},
|
||||
{
|
||||
"text": "- **status**: open-fixed --> closed-fixed",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-26 21:07:42",
|
||||
"last_edited": null,
|
||||
"slug": "ebb2",
|
||||
"subject": "#6 Stats enhancement from Andy Juniper"
|
||||
},
|
||||
{
|
||||
"text": "Wonderful blog\\! Do you have any suggestions for aspiring writers? I'm hoping to start my own website soon but I'm a little lost on everything. Would you advise starting with a free platform like Wordpress or go for a paid option? There are so many choices out there that I'm completely overwhelmed .. Any suggestions? Bless you\\!\r\nnorth face jackets on sale http://rmngnwbxvw.wallinside.com/",
|
||||
"attachments": [],
|
||||
"author": "nobody",
|
||||
"timestamp": "2012-11-11 23:53:33",
|
||||
"last_edited": null,
|
||||
"slug": "a2a1",
|
||||
"subject": "#6 Stats enhancement from Andy Juniper"
|
||||
},
|
||||
{
|
||||
"text": "Greetings from Carolina\\! I'm bored to death at work so I decided to check out your blog on my iphone during lunch break. I really like the information you provide here and can't wait to take a look when I get home. I'm amazed at how fast your blog loaded on my phone .. I'm not even using WIFI, just 3G .. Anyways, fantastic site\\!\r\nnorth face jackets for women http://ltfcjmwhsw.blinkweb.com/new-blog.html",
|
||||
"attachments": [],
|
||||
"author": "nobody",
|
||||
"timestamp": "2012-11-16 12:49:26",
|
||||
"last_edited": null,
|
||||
"slug": "31d3",
|
||||
"subject": "#6 Stats enhancement from Andy Juniper"
|
||||
},
|
||||
{
|
||||
"text": "Do you mind if I quote a couple of your articles as long as I provide credit and sources back to your weblog? My blog site is in the exact same area of interest as yours and my visitors would really benefit from a lot of the information you present here. Please let me know if this alright with you. Regards\\!\r\nnorth face jackets on sale http://vzbeclxtke.jimdo.com/2012/11/15/cheap-north-face-jackets-whether-you-are-wearing-a-dress-or-a-pantsuit/",
|
||||
"attachments": [],
|
||||
"author": "nobody",
|
||||
"timestamp": "2012-11-17 13:20:27",
|
||||
"last_edited": null,
|
||||
"slug": "1521",
|
||||
"subject": "#6 Stats enhancement from Andy Juniper"
|
||||
}
|
||||
],
|
||||
"discussion_id": "518aabb45fcbc979b923a2dd",
|
||||
"subject": ""
|
||||
},
|
||||
"mod_date": "2007-03-26 21:07:42",
|
||||
"votes_down": 0,
|
||||
"votes_up": 0,
|
||||
"_id": "518aabbb5fcbc979b923a38e",
|
||||
"discussion_thread_url": "http://sourceforge.net/rest/p/echoping/patches/_discuss/thread/02ec69da/",
|
||||
"ticket_num": 6,
|
||||
"custom_fields": {
|
||||
"_priority": "5"
|
||||
},
|
||||
"created_date": "2006-04-12 07:50:38"
|
||||
},{
|
||||
"status": "open-later",
|
||||
"reported_by_id": "514b78ad34309d5f016e9029",
|
||||
"related_artifacts": [],
|
||||
"attachments": [],
|
||||
"reported_by": "dawn_guy",
|
||||
"assigned_to": "bortz",
|
||||
"labels": [],
|
||||
"discussion_disabled": false,
|
||||
"assigned_to_id": "4f3540db0594ca2bc0000b32",
|
||||
"private": false,
|
||||
"summary": "SMTP enhancement from Dawn Keenan",
|
||||
"description": "The attached patch makes echoping more friendly towards\r\nSMTP servers as well as more accurate with respect to\r\nreal time response. Wait for the greeting before\r\nsending HELO to the mail server and then provide the\r\nstart of an email conversation in a way that isn't\r\nlikely to generate spurious warnings in the probed\r\nhost's syslog.",
|
||||
"discussion_thread": {
|
||||
"_id": "884a274b",
|
||||
"posts": [
|
||||
{
|
||||
"text": "echoping.c context diff",
|
||||
"attachments": [
|
||||
{
|
||||
"url": "http://sourceforge.net/p/echoping/patches/_discuss/thread/884a274b/21ba/attachment/echoping.c.diff",
|
||||
"bytes": 1259
|
||||
}
|
||||
],
|
||||
"author": "dawn_guy",
|
||||
"timestamp": "2006-06-26 14:53:45",
|
||||
"last_edited": null,
|
||||
"slug": "21ba",
|
||||
"subject": "#7 SMTP enhancement from Dawn Keenan"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: NO\n\nI don't think that sending \"HELO echoping\" is a good idea.\r\n\r\n1\\) It is not a legal host name and, today, with the spam problem, many sites test that\r\n\r\n2\\) Even if it were \\(HELO echoping.sourceforge.net\\), various anti-spam techniques would do more aggressive testing and probably reject.\r\n\r\nThe issue stays open. I agree with your goals but there is no simple solution.\r\n",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-08 10:28:35",
|
||||
"last_edited": null,
|
||||
"slug": "4a6f",
|
||||
"subject": "#7 SMTP enhancement from Dawn Keenan"
|
||||
},
|
||||
{
|
||||
"text": "- **assigned_to**: nobody --> bortz",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-08 10:28:35",
|
||||
"last_edited": null,
|
||||
"slug": "316a",
|
||||
"subject": "#7 SMTP enhancement from Dawn Keenan"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: NO\n\n> Wait for the greeting before\r\n> sending HELO to the mail server\r\n\r\nThis is a very good idea. Committed in Subversion, r 359.\r\n",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-08 10:34:34",
|
||||
"last_edited": null,
|
||||
"slug": "38af",
|
||||
"subject": "#7 SMTP enhancement from Dawn Keenan"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: NO\n\nThe patch to wait the greeting has been shipped with echoping 6.\r\n\r\nThe idea to add a HELO is good but postponed.\r\n",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-26 21:32:39",
|
||||
"last_edited": null,
|
||||
"slug": "7035",
|
||||
"subject": "#7 SMTP enhancement from Dawn Keenan"
|
||||
},
|
||||
{
|
||||
"text": "- **status**: open --> open-later",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-03-26 21:32:39",
|
||||
"last_edited": null,
|
||||
"slug": "c711",
|
||||
"subject": "#7 SMTP enhancement from Dawn Keenan"
|
||||
},
|
||||
{
|
||||
"text": "Logged In: YES \nuser\\_id=25865\nOriginator: NO\n\nSee \\#1692780",
|
||||
"attachments": [],
|
||||
"author": "bortz",
|
||||
"timestamp": "2007-04-02 10:27:50",
|
||||
"last_edited": null,
|
||||
"slug": "29c2",
|
||||
"subject": "#7 SMTP enhancement from Dawn Keenan"
|
||||
}
|
||||
],
|
||||
"discussion_id": "518aabb45fcbc979b923a2dd",
|
||||
"subject": ""
|
||||
},
|
||||
"mod_date": "2007-03-26 21:32:39",
|
||||
"votes_down": 0,
|
||||
"votes_up": 0,
|
||||
"_id": "518aabbf5fcbc979b923a3d1",
|
||||
"discussion_thread_url": "http://sourceforge.net/rest/p/echoping/patches/_discuss/thread/884a274b/",
|
||||
"ticket_num": 7,
|
||||
"custom_fields": {
|
||||
"_priority": "5"
|
||||
},
|
||||
"created_date": "2006-06-26 14:53:45"
|
||||
},{
|
||||
"status": "open",
|
||||
"reported_by_id": "4f3540db0594ca2bc0000b32",
|
||||
"related_artifacts": [],
|
||||
"attachments": [],
|
||||
"reported_by": "bortz",
|
||||
"assigned_to": "bortz",
|
||||
"labels": [],
|
||||
"discussion_disabled": false,
|
||||
"assigned_to_id": "4f3540db0594ca2bc0000b32",
|
||||
"private": false,
|
||||
"summary": "Hanging fgets if the server is down",
|
||||
"description": "Sent from \"Moelaert, J.P. \\(Johan\\)\" <J.P.Moelaert@utwente.nl>. Not confirmed with echoping 6.\r\n\r\n\r\nI've been using echoping for a month to test if a proxyserver.\r\nSince yesterday I wanted tio use it to test if a webhare server was\r\nrunning.\r\nThe command used was:\r\n\r\nechoping -t1 -h https://webhare.utwente.nl weblx030.civ.utwente.nl:80\r\n\r\nIt seemed to work.\r\nBut when the website was down the command seemed to hang in its fgets\r\ncall.\r\nExport help refered me to\r\n\r\nhttp://groups.google.com/group/comp.os.linux.development.system/browse\\_f\r\nrm/thread/20118509359c9292/19bd5388e468c1fa?lnk=st&q=SIGALRM+fgets&rnum=\r\n12&hl=en\\#19bd5388e468c1fa\r\n<http://groups.google.com/group/comp.os.linux.development.system/browse\\_\r\nfrm/thread/20118509359c9292/19bd5388e468c1fa?lnk=st&q=SIGALRM+fgets&rnum\r\n=12&hl=en\\#19bd5388e468c1fa>\r\n\r\nThis describes a similar problem with fgets.\r\nI added the following to readline.c in the function readline\r\n\r\nfd\\_set rfds;\r\nstruct timeval tv;\r\nint retval, fd= fileno\\(fs\\);\r\n\r\n/\\* watch fildescriptor to see when it has input. \\*/\r\nFD\\_ZERO\\(&rfds\\);\r\nFD\\_SET\\(fd, &rfds\\);\r\n/\\* wait up to number of seconds indicated by timeout \\*/\r\ntv.tv\\_sec = timeout;\r\ntv.tv\\_usec = 0;\r\n/\\* use select to determine readability \\*/\r\nretval = select\\( fd, &rfds, NULL, NULL, &tv \\);\r\n\r\n/\\* let's see what we got \\*/\r\nif \\( retval == -1 \\) \\{\r\nperror\\(\"select\\(\\)\"\\);\r\nreturn \\(-1\\);\r\n\\} else if \\( retval == 0 \\) \\{\r\n/\\* timeout reached \\*/\r\nreturn \\(-1\\); \r\n\\}\r\n/\\* passed the select; start reading from a valid stream \\*/\r\n\r\nI also brought the timeout in main from echoping.c to global level.\r\nThis was then declared as external in readline.c\r\n\r\nThis solved my problem with a hanging fgets.\r\n",
|
||||
"discussion_thread": {
|
||||
"_id": "48ab69c7",
|
||||
"posts": [
|
||||
{
|
||||
"text": "k6WEof <a href=\"http://gosjohgbbzhk.com/\">gosjohgbbzhk</a>, \\[url=http://ufkdhpznjmpw.com/\\]ufkdhpznjmpw\\[/url\\], \\[link=http://nhafrpxtcgyw.com/\\]nhafrpxtcgyw\\[/link\\], http://tvuxugxrdfgj.com/",
|
||||
"attachments": [],
|
||||
"author": "nobody",
|
||||
"timestamp": "2013-04-15 07:48:11",
|
||||
"last_edited": null,
|
||||
"slug": "521f",
|
||||
"subject": "#8 Hanging fgets if the server is down"
|
||||
}
|
||||
],
|
||||
"discussion_id": "518aabb45fcbc979b923a2dd",
|
||||
"subject": ""
|
||||
},
|
||||
"mod_date": "2007-03-26 21:09:01",
|
||||
"votes_down": 0,
|
||||
"votes_up": 0,
|
||||
"_id": "518aabc05fcbc979b923a402",
|
||||
"discussion_thread_url": "http://sourceforge.net/rest/p/echoping/patches/_discuss/thread/48ab69c7/",
|
||||
"ticket_num": 8,
|
||||
"custom_fields": {
|
||||
"_priority": "5"
|
||||
},
|
||||
"created_date": "2007-03-26 21:09:01"
|
||||
},{
|
||||
"status": "open",
|
||||
"reported_by_id": "518aabc15fcbc979b923a410",
|
||||
"related_artifacts": [],
|
||||
"attachments": [],
|
||||
"reported_by": "zu2",
|
||||
"assigned_to": null,
|
||||
"labels": [],
|
||||
"discussion_disabled": false,
|
||||
"assigned_to_id": null,
|
||||
"private": false,
|
||||
"summary": "'Cannot load \".so\"' patch on CentOS 5.4",
|
||||
"description": "When running echoping 6.0.2 on the CentOS 5.4 with option \"-m\", it becomes an error. \r\n\r\nThe same variable is used at line 476 in echoping.c , as the destination and the argument of sprintf.\r\n\r\nI think that is reason for 'Cannot load \".so\"'.\r\n\r\nI wrote a patch here. \r\n\r\nthanks.",
|
||||
"discussion_thread": {
|
||||
"_id": "feaaf7e8",
|
||||
"posts": [
|
||||
{
|
||||
"text": "",
|
||||
"attachments": [
|
||||
{
|
||||
"url": "http://sourceforge.net/p/echoping/patches/_discuss/thread/feaaf7e8/d995/attachment/echoping.patch.txt",
|
||||
"bytes": 652
|
||||
}
|
||||
],
|
||||
"author": "zu2",
|
||||
"timestamp": "2010-01-21 12:19:35",
|
||||
"last_edited": null,
|
||||
"slug": "d995",
|
||||
"subject": "#9 'Cannot load \".so\"' patch on CentOS 5.4"
|
||||
},
|
||||
{
|
||||
"text": "\\# ./echoping -m dns\r\nCannot load \".so\" \\(I tried the short name, then the complete name in \"/usr/lib/echoping\"\\): /usr/lib/echoping/.so: cannot open shared object file: No such file or directory\r\n\\#\r\n",
|
||||
"attachments": [],
|
||||
"author": "zu2",
|
||||
"timestamp": "2010-01-21 12:20:22",
|
||||
"last_edited": null,
|
||||
"slug": "b050",
|
||||
"subject": "#9 'Cannot load \".so\"' patch on CentOS 5.4"
|
||||
},
|
||||
{
|
||||
"text": "g3VkG7 <a href=\"http://owhoajeejjei.com/\">owhoajeejjei</a>, \\[url=http://qsyegjeevmkc.com/\\]qsyegjeevmkc\\[/url\\], \\[link=http://rirzyefjjvhb.com/\\]rirzyefjjvhb\\[/link\\], http://rhwqixzbyfza.com/",
|
||||
"attachments": [],
|
||||
"author": "nobody",
|
||||
"timestamp": "2013-04-15 20:16:36",
|
||||
"last_edited": null,
|
||||
"slug": "c13b",
|
||||
"subject": "#9 'Cannot load \".so\"' patch on CentOS 5.4"
|
||||
}
|
||||
],
|
||||
"discussion_id": "518aabb45fcbc979b923a2dd",
|
||||
"subject": ""
|
||||
},
|
||||
"mod_date": "2010-01-21 12:19:35",
|
||||
"votes_down": 0,
|
||||
"votes_up": 0,
|
||||
"_id": "518aabc15fcbc979b923a40f",
|
||||
"discussion_thread_url": "http://sourceforge.net/rest/p/echoping/patches/_discuss/thread/feaaf7e8/",
|
||||
"ticket_num": 9,
|
||||
"custom_fields": {
|
||||
"_priority": "5"
|
||||
},
|
||||
"created_date": "2010-01-21 12:19:35"
|
||||
}],
|
||||
"tracker_config":{
|
||||
"_id": "518aabb45fcbc979b923a2db",
|
||||
"options": {
|
||||
"ordinal": 7,
|
||||
"import_id": "tracker/304581",
|
||||
"mount_point": "patches",
|
||||
"TicketMonitoringType": null,
|
||||
"EnableVoting": false,
|
||||
"TicketMonitoringEmail": "",
|
||||
"mount_label": "Patches"
|
||||
}
|
||||
},
|
||||
"milestones":[],
|
||||
"custom_fields":[
|
||||
{
|
||||
"milestones": [],
|
||||
"type": "milestone",
|
||||
"name": "_milestone",
|
||||
"label": "Group"
|
||||
},
|
||||
{
|
||||
"label": "Priority",
|
||||
"type": "select",
|
||||
"options": "1 2 3 4 *5 6 7 8 9",
|
||||
"name": "_priority"
|
||||
}
|
||||
],
|
||||
"open_status_names":"open unread accepted pending open-fixed open-later",
|
||||
"closed_status_names":"wont-fix closed-fixed closed-duplicate closed-out-of-date",
|
||||
"saved_bins":[
|
||||
{
|
||||
"sort": "mod_date_dt desc",
|
||||
"_id": "518aabb45fcbc979b923a2e4",
|
||||
"terms": "!status:closed-duplicate && !status:wont-fix && !status:closed-fixed && !status:closed-out-of-date",
|
||||
"summary": "Changes"
|
||||
},
|
||||
{
|
||||
"sort": "",
|
||||
"_id": "518aabb45fcbc979b923a2e3",
|
||||
"terms": "status:closed-duplicate or status:wont-fix or status:closed-fixed or status:closed-out-of-date",
|
||||
"summary": "Closed Tickets"
|
||||
},
|
||||
{
|
||||
"sort": "",
|
||||
"_id": "518aabb45fcbc979b923a2e2",
|
||||
"terms": "!status:closed-duplicate && !status:wont-fix && !status:closed-fixed && !status:closed-out-of-date",
|
||||
"summary": "Open Tickets"
|
||||
}
|
||||
]}
|
Loading…
Reference in New Issue