Browse Source

tcping: use local SRC

coolsnowwolf 1 month ago
parent
commit
be514fd775
7 changed files with 610 additions and 6 deletions
  1. 1 6
      tcping/Makefile
  2. 27 0
      tcping/src/Makefile
  3. 280 0
      tcping/src/license.txt
  4. 168 0
      tcping/src/main.c
  5. 27 0
      tcping/src/readme.txt
  6. 97 0
      tcping/src/tcp.c
  7. 10 0
      tcping/src/tcp.h

+ 1 - 6
tcping/Makefile

@@ -5,14 +5,9 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=tcping
+PKG_VERSION:=1
 PKG_RELEASE:=1
 
-PKG_SOURCE_PROTO:=git
-PKG_SOURCE_URL:=https://github.com/Lienol/tcping.git
-PKG_SOURCE_DATE:=2020-07-04
-PKG_SOURCE_VERSION:=db9101834732dac9aaa59dbb7fb9c74612dbf723
-PKG_MIRROR_HASH:=d30c1bb624afd7e4f0596d5c58d393937f6c0102f0b336c604a24a35df5173b7
-
 PKG_LICENSE:=GPL-2.0-only
 PKG_LICENSE_FILES:=license.txt
 

+ 27 - 0
tcping/src/Makefile

@@ -0,0 +1,27 @@
+CC=gcc
+
+LDFLAGS=
+CFLAGS=-g -Wall -Wextra -Werror -pedantic
+
+VERSION=0.3
+
+OBJS=main.o tcp.o
+
+all: tcping
+
+tcping: $(OBJS)
+	$(CC) $(OBJS) $(LDFLAGS) -o tcping
+
+install: tcping
+	cp tcping $(DESTDIR)/usr/bin
+
+clean:
+	rm -f $(OBJS) core tcping
+
+package: clean
+	# source package
+	rm -rf tcping-$(VERSION)*
+	mkdir tcping-$(VERSION)
+	cp *.c *.h Makefile readme.txt license.txt tcping-$(VERSION)
+	tar czf tcping-$(VERSION).tgz tcping-$(VERSION)
+	rm -rf tcping-$(VERSION)

+ 280 - 0
tcping/src/license.txt

@@ -0,0 +1,280 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS

+ 168 - 0
tcping/src/main.c

@@ -0,0 +1,168 @@
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <unistd.h>
+#include <sys/time.h>
+
+#include "tcp.h"
+
+#define abs(x) ((x) < 0 ? -(x) : (x))
+
+static volatile int stop = 0;
+
+void usage(void)
+{
+	fprintf(stderr, "tcping version 0.3\n");
+
+	fprintf(stderr,
+		"Usage: tcping [-fqhv] [-p port] [-c count] [-i interval] [-t timeout] destination\n");
+	fprintf(stderr,
+		"-p port		Port number (default port 80)\n");
+	fprintf(stderr, "-c count	How many times to connect\n");
+	fprintf(stderr, "-i interval	Delay between each connect\n");
+	fprintf(stderr, "-f		Flood connect (no delays)\n");
+	fprintf(stderr, "-q		Quiet, only returncode\n");
+	fprintf(stderr, "-t              Set timeout when connecting\n");
+	fprintf(stderr, "-h		This help text\n");
+}
+
+void handler(int sig)
+{
+	fprintf(stderr, "\nreceive signal:[%d]\n", sig);
+	stop = 1;
+}
+
+int main(int argc, char *argv[])
+{
+	char *hostname = NULL;
+	char *portnr = "80";
+	int c;
+	int count = -1, curncount = 0;
+	int wait = 1, quiet = 0;
+	int ok = 0, err = 0;
+	int timeout = 3;
+	double min = 999999999999999.0, avg = 0.0, max = 0.0;
+	struct addrinfo *resolved;
+	int errcode;
+	int seen_addrnotavail;
+
+	while ((c = getopt(argc, argv, "t:hp:c:i:fq?")) != -1) {
+		switch (c) {
+		case 'p':
+			portnr = optarg;
+			break;
+
+		case 'c':
+			count = atoi(optarg);
+			break;
+
+		case 't':
+            	        timeout = atoi(optarg);
+		        break;
+
+		case 'i':
+			wait = atoi(optarg);
+			break;
+
+		case 'f':
+			wait = 0;
+			break;
+
+		case 'q':
+			quiet = 1;
+			break;
+
+		case '?':
+		default:
+			usage();
+			return 0;
+		}
+	}
+
+	if (optind >= argc) {
+	  /*
+		fprintf(stderr, "No hostname given\n");
+	  */
+		usage();
+		return 3;
+	}
+	hostname = argv[optind];
+
+	signal(SIGINT, handler);
+	signal(SIGTERM, handler);
+
+	if ((errcode = lookup(hostname, portnr, &resolved)) != 0) {
+		fprintf(stderr, "%s\n", gai_strerror(errcode));
+		return 2;
+	}
+
+	if (!quiet)
+		printf("TCPING %s:%s\n", hostname, portnr);
+
+	while ((curncount < count || count == -1) && stop == 0) {
+		double ms;
+		struct timeval rtt;
+
+		if ((errcode = connect_to(resolved, &rtt, timeout)) != 0) {
+			if (errcode != -EADDRNOTAVAIL) {
+				printf
+				    ("error connecting to host (%d): %s",
+				     -errcode, strerror(-errcode));
+				if(-errcode == EINPROGRESS){
+				  printf(" [Timeout]\n");
+				}else{
+				  printf("\n");
+				}
+				err++;
+			} else {
+				if (seen_addrnotavail) {
+					printf(".");
+					fflush(stdout);
+				} else {
+					printf
+					    ("error connecting to host (%d): %s\n",
+					     -errcode, strerror(-errcode));
+				}
+				seen_addrnotavail = 1;
+			}
+		} else {
+			seen_addrnotavail = 0;
+			ok++;
+
+			ms = ((double) rtt.tv_sec * 1000.0) +
+			    ((double) rtt.tv_usec / 1000.0);
+			avg += ms;
+			min = min > ms ? ms : min;
+			max = max < ms ? ms : max;
+
+			printf
+			    ("response from %s:%s, seq=%d time=%.2f ms\n",
+			     hostname, portnr, curncount, ms);
+			if (ms > 500)
+				break;	/* Stop the test on the first long connect() */
+		}
+
+		curncount++;
+
+		if (curncount != count)
+			sleep(wait);
+	}
+
+	if (!quiet) {
+		printf("--- %s:%s tcping statistics ---\n", hostname,
+		       portnr);
+		printf("%d responses, %d ok, %3.2f%% failed\n", curncount,
+		       ok,
+		       (((double) err) / abs(((double) count)) * 100.0));
+		printf("round-trip min/avg/max = %.1f/%.1f/%.1f ms\n", min,
+		       avg / (double) ok, max);
+	}
+
+	freeaddrinfo(resolved);
+	if (ok)
+		return 0;
+	else
+		return 127;
+}

+ 27 - 0
tcping/src/readme.txt

@@ -0,0 +1,27 @@
+Installation:
+------------
+make install
+
+
+Usage:
+-----
+Routine tasks
+
+tcping Web Server:
+	tcping localhost 
+	tcping -p 80 127.0.0.1
+	tcping -p 8080 localhost
+
+tcping once:
+	tcping -p port -c 1 hostname
+
+tcping returns:
+	0 on success
+	2 if the host or service could not be resolved
+	127 on other errors
+
+fix bug:
+	1:add timeout option  [2012年6月1日16:16:42]
+
+Todo list:
+

+ 97 - 0
tcping/src/tcp.c

@@ -0,0 +1,97 @@
+#include <errno.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "tcp.h"
+
+int lookup(char *host, char *portnr, struct addrinfo **res)
+{
+	struct addrinfo hints;
+	memset(&hints, 0, sizeof(struct addrinfo));
+	hints.ai_family = AF_UNSPEC;
+	hints.ai_socktype = SOCK_STREAM;
+	hints.ai_flags = AI_NUMERICSERV;
+	hints.ai_protocol = 0;
+
+	return getaddrinfo(host, portnr, &hints, res);
+}
+
+int connect_to(struct addrinfo *addr, struct timeval *rtt, int timeout)
+{
+	int fd;
+	struct timeval start;
+	int connect_result;
+	const int on = 1;
+	struct timeval tm;
+	fd_set set;
+	int flags;
+	int ret;
+	/* int flags; */
+	int rv = 0;
+
+	/* try to connect for each of the entries: */
+	while (addr != NULL) {
+		/* create socket */
+		if ((fd =
+		     socket(addr->ai_family, addr->ai_socktype,
+			    addr->ai_protocol)) == -1)
+			goto next_addr0;
+		if (setsockopt
+		    (fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
+			goto next_addr1;
+
+		if ((flags = fcntl(fd, F_GETFL, 0)) == -1)
+			goto next_addr1;
+		if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1)
+			goto next_addr1;
+
+		if (gettimeofday(&start, NULL) == -1)
+			goto next_addr1;
+
+		/* connect to peer */
+		connect_result = connect(fd, addr->ai_addr, addr->ai_addrlen);
+		if (connect_result == -1 && errno != EINPROGRESS) {
+		  goto next_addr1;
+		}
+			
+		tm.tv_sec  = timeout;
+		tm.tv_usec = 0;
+
+		FD_ZERO(&set);
+		FD_SET(fd, &set);
+		ret = select(fd+1, NULL, &set, NULL, &tm);
+		switch(ret){
+		case 0:/* timeout */
+		case -1:
+		  goto next_addr1;
+		  break;
+		default:/* Connection ok or refused*/
+		  ret = write(fd, "", 0);/* only test, no data send */
+		  if(ret <0) goto next_addr1;
+		  break;
+		}
+		
+		if (gettimeofday(rtt, NULL) == -1)
+		  goto next_addr1;
+		rtt->tv_sec = rtt->tv_sec - start.tv_sec;
+		rtt->tv_usec = rtt->tv_usec - start.tv_usec;
+		close(fd);
+		return 0;
+	
+	next_addr1:
+		close(fd);
+	next_addr0:
+		addr = addr->ai_next;
+	}
+	
+	rv = rv ? rv : -errno;
+	return rv;
+}

+ 10 - 0
tcping/src/tcp.h

@@ -0,0 +1,10 @@
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <sys/time.h>
+
+#ifndef TCP_H_DEFINED
+#define TCP_H_DEFINED
+int lookup(char *host, char *portnr, struct addrinfo **res);
+int connect_to(struct addrinfo *addr, struct timeval *rtt, int timeout);
+#endif				/* TCP_H_DEFINED */