hrev48856 adds 1 changeset to branch 'master' old head: cec6d794428b86df22e5b1bec0d5af2d7b541a4a new head: f19ef17518b79b15b123975b6d642186479b2a0e overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=f19ef17518b7+%5Ecec6d794428b ---------------------------------------------------------------------------- f19ef17518b7: Added netcat packages for x86 and x86_64, use them. * removed netcat Jamfile from the build and from the tree. * clean image and package definitions. * added netcat in regular builds. [ Jérôme Duval <jerome.duval@xxxxxxxxx> ] ---------------------------------------------------------------------------- Revision: hrev48856 Commit: f19ef17518b79b15b123975b6d642186479b2a0e URL: http://cgit.haiku-os.org/haiku/commit/?id=f19ef17518b7 Author: Jérôme Duval <jerome.duval@xxxxxxxxx> Date: Tue Mar 3 21:43:01 2015 UTC ---------------------------------------------------------------------------- 14 files changed, 6 insertions(+), 2100 deletions(-) Jamfile | 1 + build/jam/images/definitions/minimum | 2 +- build/jam/repositories/HaikuPorts/x86 | 2 + build/jam/repositories/HaikuPorts/x86_64 | 2 + src/bin/network/Jamfile | 1 - src/bin/network/netcat/Jamfile | 14 - src/bin/network/netcat/generic.h | 377 ------ src/bin/network/netcat/netcat.c | 1701 -------------------------- src/data/package_infos/arm/haiku | 1 - src/data/package_infos/m68k/haiku | 1 - src/data/package_infos/ppc/haiku | 1 - src/data/package_infos/x86/haiku | 1 - src/data/package_infos/x86_64/haiku | 1 - src/data/package_infos/x86_gcc2/haiku | 1 - ---------------------------------------------------------------------------- diff --git a/Jamfile b/Jamfile index f32d083..32df27a 100644 --- a/Jamfile +++ b/Jamfile @@ -28,6 +28,7 @@ AddHaikuImagePackages [ FFilterByBuildFeatures regular_image @{ bzip2 ctags ffmpeg findutils gawk glu grep gutenprint jasper jpeg less libicns libpng libpng16 libwebp mesa mesa_devel mesa_swrast + netcat sed sharutils tar tiff unzip wget which zip }@ diff --git a/build/jam/images/definitions/minimum b/build/jam/images/definitions/minimum index 5bf5761..ac1e517 100644 --- a/build/jam/images/definitions/minimum +++ b/build/jam/images/definitions/minimum @@ -18,7 +18,7 @@ SYSTEM_BIN = [ FFilterByBuildFeatures listport listres listsem listusb locale logger login lsindex makebootable message mimeset mkfs mkindex modifiers mount mountvolume - netcat netstat notify + netstat notify open package package_repo passwd pc ping ping6 pkgman prio profile ps diff --git a/build/jam/repositories/HaikuPorts/x86 b/build/jam/repositories/HaikuPorts/x86 index d9fdc70..2c8990c 100644 --- a/build/jam/repositories/HaikuPorts/x86 +++ b/build/jam/repositories/HaikuPorts/x86 @@ -157,6 +157,7 @@ RemotePackageRepository HaikuPorts ncurses_devel-5.9-10 neon-0.29.6-7 neon_devel-0.29.6-7 + netcat-1.10-1 ninja-1.5.1-2 openjdk-1.7_2013_11_08-2 openssh-6.0p1-8 @@ -371,6 +372,7 @@ RemotePackageRepository HaikuPorts nasm ncurses neon + netcat openssh openssl p7zip diff --git a/build/jam/repositories/HaikuPorts/x86_64 b/build/jam/repositories/HaikuPorts/x86_64 index 869ae57..5b3f94c 100644 --- a/build/jam/repositories/HaikuPorts/x86_64 +++ b/build/jam/repositories/HaikuPorts/x86_64 @@ -167,6 +167,7 @@ RemotePackageRepository HaikuPorts ncurses_devel-5.9-10 neon-0.29.6-7 neon_devel-0.29.6-7 + netcat-1.10-1 ninja-1.5.1-2 openssh-6.6p1-1 openssl-1.0.0p-1 @@ -310,6 +311,7 @@ RemotePackageRepository HaikuPorts nasm ncurses neon + netcat ninja openssh openssl diff --git a/src/bin/network/Jamfile b/src/bin/network/Jamfile index 92a245b..cd785e6 100644 --- a/src/bin/network/Jamfile +++ b/src/bin/network/Jamfile @@ -9,7 +9,6 @@ SubInclude HAIKU_TOP src bin network ftp ; SubInclude HAIKU_TOP src bin network ftpd ; SubInclude HAIKU_TOP src bin network ifconfig ; SubInclude HAIKU_TOP src bin network mount_nfs ; -SubInclude HAIKU_TOP src bin network netcat ; SubInclude HAIKU_TOP src bin network netstat ; #SubInclude HAIKU_TOP src bin network pppconfig ; #SubInclude HAIKU_TOP src bin network ppp_up ; diff --git a/src/bin/network/netcat/Jamfile b/src/bin/network/netcat/Jamfile deleted file mode 100644 index 727d20e..0000000 --- a/src/bin/network/netcat/Jamfile +++ /dev/null @@ -1,14 +0,0 @@ -SubDir HAIKU_TOP src bin network netcat ; - -SetSubDirSupportedPlatforms $(HAIKU_BONE_COMPATIBLE_PLATFORMS) ; - -if ! $(TARGET_PLATFORM_HAIKU_COMPATIBLE) { - UseHeaders [ FDirName $(HAIKU_TOP) headers posix ] : true ; - # We need the public network headers also when not compiling for Haiku. - # Unfortunately we get more than we want, namely all POSIX headers. -} - -BinCommand netcat : - netcat.c - : $(TARGET_NETWORK_LIBS) -; diff --git a/src/bin/network/netcat/generic.h b/src/bin/network/netcat/generic.h deleted file mode 100644 index b3dd5f5..0000000 --- a/src/bin/network/netcat/generic.h +++ /dev/null @@ -1,377 +0,0 @@ -/* generic.h -- anything you don't #undef at the end remains in effect. - The ONLY things that go in here are generic indicator flags; it's up - to your programs to declare and call things based on those flags. - - You should only need to make changes via a minimal system-specific section - at the end of this file. To build a new section, rip through this and - check everything it mentions on your platform, and #undef that which needs - it. If you generate a system-specific section you didn't find in here, - please mail me a copy so I can update the "master". - - I realize I'm probably inventing another pseudo-standard here, but - goddamnit, everybody ELSE has already, and I can't include all of their - hairball schemes too. HAVE_xx conforms to the gnu/autoconf usage and - seems to be the most common format. In fact, I dug a lot of these out - of autoconf and tried to common them all together using "stupidh" to - collect data from platforms. - - In disgust... _H* 940910, 941115, 950511. Pseudo-version: 1.3 - - Updated 951104 with many patches from netcat feedback, and properly - closed a lot of slop in open-ended comments: version 1.4 - 960217 + nextstep: version 1.5 -*/ - -#ifndef GENERIC_H /* only run through this once */ -#define GENERIC_H - -/* =============================== */ -/* System calls, lib routines, etc */ -/* =============================== */ - -/* How does your system declare malloc, void or char? Usually void, but go - ask the SunOS people why they had to be different... */ -#define VOID_MALLOC - -/* notably from fwtk/firewall.h: posix locking? */ -#define HAVE_FLOCK /* otherwise it's lockf() */ - -/* if you don't have setsid(), you might have setpgrp(). */ -#define HAVE_SETSID - -/* random() is generally considered better than rand() */ -#define HAVE_RANDOM - -/* the srand48/lrand48/etc family is s'posedly even better */ -#define HAVE_RAND48 -/* bmc@telebase and others have suggested these macros if a box *does* have - rand48. Will consider for later if we're doing something that really - requires stronger random numbers, but netcat and such certainly doesn't. -#define srandom(seed) srand48((long) seed) -#define random() lrand48() */ - -/* if your machine doesn't have lstat(), it should have stat() [dos...] */ -#define HAVE_LSTAT - -/* different kinds of term ioctls. How to recognize them, very roughly: - sysv/POSIX_ME_HARDER: termio[s].h, struct termio[s], tty.c_*[] - bsd/old stuff: sgtty.h, ioctl(TIOCSETP), sgttyb.sg_*, tchars.t_* */ -#define HAVE_TERMIOS - -/* dbm vs ndbm */ -#define HAVE_NDBM - -/* extended utmp/wtmp stuff. MOST machines still do NOT have this SV-ism */ -#define UTMPX - -/* some systems have nice() which takes *relative* values... [resource.h] */ -#define HAVE_SETPRIORITY - -/* a sysvism, I think, but ... */ -#define HAVE_SYSINFO - -/* ============= */ -/* Include files */ -/* ============= */ - -/* Presence of these can be determined via a script that sniffs them - out if you aren't sure. See "stupidh"... */ - -/* stdlib comes with most modern compilers, but ya never know */ -#define HAVE_STDLIB_H - -/* not on a DOS box! */ -#define HAVE_UNISTD_H - -/* stdarg is a weird one */ -#define HAVE_STDARG_H - -/* dir.h or maybe ndir.h otherwise. */ -#define HAVE_DIRENT_H - -/* string or strings */ -#define HAVE_STRINGS_H - -/* if you don't have lastlog.h, what you want might be in login.h */ -#define HAVE_LASTLOG_H - -/* predefines for _PATH_various */ -#define HAVE_PATHS_H - -/* some SV-flavors break select stuff out separately */ -#define HAVE_SELECT_H - -/* assorted others */ -#define HAVE_PARAM_H /* in sys/ */ -#define HAVE_SYSMACROS_H /* in sys/ */ -#define HAVE_TTYENT_H /* securetty et al */ - -/* ==================== */ - -/* Still maybe have to do something about the following, if it's even - worth it. I just grepped a lot of these out of various code, without - looking them up yet: - -#define HAVE_EINPROGRESS -#define HAVE_F_SETOWN -HAVE_FILIO_H ... fionbio, fiosetown, etc... will need for hairier - select loops. -#define HAVE_SETENV ... now *there's* a hairy one; **environ is portable -#define BIG_ENDIAN/little_endian ... *please* try to avoid this stupidity - and LSBFIRST/MSBFIRST -#define HAVE_GETUSERSHELL ... you could always pull it out of getpwent() -#define HAVE_SETE[UG]ID ... lib or syscall, it varies on diff platforms -#define HAVE_STRCHR ... should actually be handled by string/strings -#define HAVE_PSTAT -#define HAVE_ST_BLKSIZE ... a stat() thing? -#define HAVE_IP_TOS -#define HAVE_STRFTIME ... screw this, we'll just INCLUDE one for lame - old boxes that don't have it [sunos 3.x, early 4.x?] -#define HAVE_VFPRINTF -#define HAVE_SHADOW_PASSWD ... in its multitudinous schemes?? ... how - about sumpin' like #define SHADOW_PASSWD_TYPE ... could get grody. - ... looks like sysv /etc/shadow, getspent() family is common. -#define SIG* ... what a swamp, punt for now; should all be in signal.h -#define HAVE_STRCSPN ... see larry wall's comment in the fwtk regex code -#define ULTRIX_AUTH ... bwahaha. -#define HAVE_YP or NIS or whatever you wanna call it this week -randomness about VARARGS?? ---- later stuff to be considered --- -#define UINT4 ... u-int on alpha/osf, i.e. __alpha/__osf__, ulong elsewhere? - dont name it that, though, it'll conflict with extant .h files like md5 -randomness about machine/endian.h, machine/inline.h -- bsdi, net/2 -randomness about _PATH_WTMP vs WTMP_FILE and where they even live!! -#define HAVE_SYS_ERRLIST ... whether it's in stdio.h or not [bsd 4.4] ---- still more stuff -#define HAVE_SETENV -#define _PATH_UTMP vs UTMP_FILE, a la deslogind?! -#define HAVE_DAEMON -#define HAVE_INETADDR [vixie bind?] -lseek: SEEK_SET vs L_SET and associated lossage [epi-notes, old 386Mach] -bsdi: ioctl_compat.h ? ---- takin' some ifdefs from CNS krb: -F_GETOWN/F_SETOWN -CRAY: long = 8 bytes, etc [class with alpha?] -CGETENT -SIGINFO -SIGTSTP SIGTTOU SIGWINCH -SPX? -SYSV_TERMIO -- covered elsewhere, I hope -TIOCEXT TIOCFLUSH TIOC[GS]WINSIZ -NEWINIT: something about init cleaning up dead login processes [telnet?] -PARENT_DOES_UTMP, too [telnet] -VDISCARD -VEOL/VEOL2/VLNEXT VREPRINT -- termios stuff?, and related... -STREAMSPTY/STREAMSPTYEM -AF_INET/AF_UNSPEC, PF_* -ECHOCTL/ECHOKE -F_ULOCK [?!] -setpgrp/getpgrp() ONEARG business.. -HAVE_ALLOCA -HAVE_GETUTENT -HAVE_SYS_SELECT_H [irix!] -HAVE_DIRENT [old 386mach has *direct.h*!] -HAVE_SIGSET -HAVE_VFORK_H and HAVE_VFORK -HAVE_VHANGUP -HAVE_VSPRINTF -HAVE_IPTOS_* -HAVE_STRCASECMP, STRNCASECMP -HAVE_SYS_FCNTL_H -HAVE_SYS_TIME_H -HAVE_UTIMES -NOTTYENT [?] -HAVE_FCHMOD -HAVE_GETUSERSHELL -HAVE_SIGCONTEXT [stack hair, very machine-specific] -YYLINENO? -POSIX_SIGNALS -POSIX_TERMIOS -SETPROCTITLE -- breaks some places, like fbsd sendmail -SIG* -- actual signal names? some are missing -SIOCGIFCONF -SO_BROADCAST -SHMEM [krb tickets] -VARARGS, or HAVE_VARARGS -CBAUD -... and B300, B9600, etc etc -HAVE_BZERO vs memset/memcpy -HAVE_SETVBUF -HAVE_STRDUP -HAVE_GETENV -HAVE_STRSAVE -HAVE_STBLKSIZE [stat?] -HAVE_STREAM_H -- in sys/, ref sendmail 8.7 for IP_SRCROUTE -FCHMOD -INITGROUPS -- most machines seem to *have* -SETREUID -SNPRINTF -SETPGRP semantics bsd vs. sys5 style - -There's also the issue about WHERE various .h files live, sys/ or otherwise. -There's a BIG swamp lurking where network code of any sort lives. -*/ - -/* ======================== */ -/* System-specific sections */ -/* ======================== */ - -/* By turning OFF various bits of the above, you can customize for - a given platform. Yes, we're ignoring the stock compiler predefines - and using our own plugged in via the Makefile. */ - -/* DOS boxes, with MSC; you may need to adapt to a different compiler. */ -/* looks like later ones *do* have dirent.h, for example */ -#ifdef MSDOS -#undef HAVE_FLOCK -#undef HAVE_RANDOM -#undef HAVE_LSTAT -#undef HAVE_TERMIOS -#undef UTMPX -#undef HAVE_SYSINFO -#undef HAVE_UNISTD_H -#undef HAVE_DIRENT_H /* unless you have the k00l little wrapper from L5!! */ -#undef HAVE_STRINGS_H -#undef HAVE_LASTLOG_H -#undef HAVE_PATHS_H -#undef HAVE_PARAM_H -#undef HAVE_SYSMACROS_H -#undef HAVE_SELECT_H -#undef HAVE_TTYENT_H -#endif /* MSDOS */ - -/* buglix 4.x; dunno about 3.x on down. should be bsd4.2 */ -#ifdef ULTRIX -#undef UTMPX -#undef HAVE_PATHS_H -#undef HAVE_SYSMACROS_H -#undef HAVE_SELECT_H -#endif /* buglix */ - -/* some of this might still be broken on older sunoses */ -#ifdef SUNOS -#undef VOID_MALLOC -#undef UTMPX -#undef HAVE_PATHS_H -#undef HAVE_SELECT_H -#endif /* sunos */ - -/* "contact your vendor for a fix" */ -#ifdef SOLARIS -/* has UTMPX */ -#undef HAVE_RANDOM -#undef HAVE_SETPRIORITY -#undef HAVE_STRINGS_H /* this is genuinely the case, go figure */ -#undef HAVE_PATHS_H -#undef HAVE_SELECT_H -#undef HAVE_TTYENT_H -#endif /* SOLARIS */ - -/* whatever aix variant MIT had at the time; 3.2.x?? */ -#ifdef AIX -#undef UTMPX -#undef HAVE_LASTLOG_H -#define HAVE_LOGIN_H /* "special", in the educational sense */ -#endif /* aix */ - -/* linux, which is trying as desperately as the gnu folks can to be - POSIXLY_CORRECT. I think I'm gonna hurl... */ -#ifdef LINUX -#undef UTMPX -#undef HAVE_SYSINFO -#undef HAVE_SELECT_H -#undef HAVE_TTYENT_H -#endif /* linux */ - -/* irix 5.x; may not be correct for earlier ones */ -#ifdef IRIX -/* wow, does irix really have everything?! */ -#endif /* irix */ - -/* osf on alphas */ -#ifdef OSF -#undef UTMPX -#undef HAVE_SELECT_H -#endif /* osf */ - -/* they's some FUCKED UP paths in this one! */ -#ifdef FREEBSD -#undef UTMPX -#undef HAVE_SYSINFO -#undef HAVE_LASTLOG_H -#undef HAVE_SYSMACROS_H -#undef HAVE_SELECT_H /* actually a lie, but only for kernel */ -#endif /* freebsd */ - -/* Originally from the sidewinder site, of all places, but subsequently - checked further under a more normal bsdi 2.0 */ -#ifdef BSDI -#undef UTMPX -#undef HAVE_LASTLOG_H -#undef HAVE_SYSMACROS_H -/* and their malloc.h was in sys/ ?! */ -#undef HAVE_SELECT_H -#endif /* bsdi */ - -/* netbsd/44lite, jives with amiga-netbsd from cactus */ -#ifdef NETBSD -#undef UTMPX -#undef HAVE_SYSINFO -#undef HAVE_LASTLOG_H -#undef HAVE_SELECT_H -#endif /* netbsd */ - -/* Hpux 9.0x, from BBN and various patches sent in */ -#ifdef HPUX -#undef HAVE_RANDOM /* but *does* have ?rand48 -- need to consider.. */ -#undef HAVE_UTMPX -#undef HAVE_LASTLOG_H /* has utmp/wtmp/btmp nonsense, and pututline() */ -#undef HAVE_PATHS_H -#undef HAVE_SELECT_H -#undef HAVE_TTYENT_H -#endif /* hockeypux */ - -/* Unixware [a loose definition of "unix", to be sure], 1.1.2 [at least] - from Brian Clapper. He wasn't sure about 2.0... */ -#ifdef UNIXWARE -/* has UTMPX */ -#undef HAVE_SETPRIORITY -/* NOTE: UnixWare does provide the BSD stuff, in "/usr/ucbinclude" (headers) - and "/usr/ucblib" (libraries). However, I've run into problems linking - stuff out of that version of the C library, when objects are also coming - out of the "regular" C library. My advice: Avoid the BSD compatibility - stuff wherever possible. Brian Clapper <bmc@xxxxxxxxxxxx> */ -#undef HAVE_STRINGS_H -#undef HAVE_PATHS_H -#undef HAVE_TTYENT_H -#endif /* UNIXWARE */ - -/* A/UX 3.1.x from darieb@xxxxxxxxxx */ -#ifdef AUX -#undef HAVE_RANDOM -#undef HAVE_SELECT_H /* xxx: untested */ -#endif /* a/ux */ - -/* NeXTSTEP 3.2 motorola mudge@xxxxxxxxx xxx should also work with - white hardware and Sparc/HPPA. Should work with 3.3 too as it's - 4.3 / 4.4 bsd wrapped around mach */ -#ifdef NEXT -#undef UTMPX -#undef HAVE_SELECT_X -#endif /* NeXTSTEP 3.2 motorola */ - -/* Make some "generic" assumptions if all else fails */ -#ifdef GENERIC -#undef HAVE_FLOCK -#if defined(SYSV) && (SYSV < 4) /* TW leftover: old SV doesnt have symlinks */ -#undef HAVE_LSTAT -#endif /* old SYSV */ -#undef HAVE_TERMIOS -#undef UTMPX -#undef HAVE_PATHS_H -#undef HAVE_SELECT_H -#endif /* generic */ - -/* ================ */ -#endif /* GENERIC_H */ - diff --git a/src/bin/network/netcat/netcat.c b/src/bin/network/netcat/netcat.c deleted file mode 100644 index 8de7ecc..0000000 --- a/src/bin/network/netcat/netcat.c +++ /dev/null @@ -1,1701 +0,0 @@ -/* Netcat 1.10 RELEASE 960320 - - A damn useful little "backend" utility begun 950915 or thereabouts, - as *Hobbit*'s first real stab at some sockets programming. Something that - should have and indeed may have existed ten years ago, but never became a - standard Unix utility. IMHO, "nc" could take its place right next to cat, - cp, rm, mv, dd, ls, and all those other cryptic and Unix-like things. - - Read the README for the whole story, doc, applications, etc. - - Layout: - conditional includes: - includes: - handy defines: - globals: - malloced globals: - cmd-flag globals: - support routines: - readwrite select loop: - main: - - bluesky: - parse ranges of IP address as well as ports, perhaps - RAW mode! - backend progs to grab a pty and look like a real telnetd?! - backend progs to do various encryption modes??!?! -*/ - -#include "generic.h" /* same as with L5, skey, etc */ - -/* conditional includes -- a very messy section which you may have to dink - for your own architecture [and please send diffs...]: */ -/* #undef _POSIX_SOURCE */ /* might need this for something? */ -/* #define HAVE_BIND */ /* ASSUMPTION -- seems to work everywhere! */ -#define HAVE_HELP /* undefine if you dont want the help text */ -/* #define ANAL */ /* if you want case-sensitive DNS matching */ - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#else -#include <malloc.h> -#endif -#ifdef HAVE_SELECT_H /* random SV variants need this */ -#include <sys/select.h> -#endif - -/* have to do this *before* including types.h. xxx: Linux still has it wrong */ -#ifdef FD_SETSIZE /* should be in types.h, butcha never know. */ -#undef FD_SETSIZE /* if we ever need more than 16 active */ -#endif /* fd's, something is horribly wrong! */ -#define FD_SETSIZE 16 /* <-- this'll give us a long anyways, wtf */ -#include <sys/types.h> /* *now* do it. Sigh, this is broken */ - -#ifdef HAVE_RANDOM /* aficionados of ?rand48() should realize */ -#define SRAND srandom /* that this doesn't need *strong* random */ -#define RAND random /* numbers just to mix up port numbers!! */ -#else -#define SRAND srand -#define RAND rand -#endif /* HAVE_RANDOM */ - -/* includes: */ -#include <sys/time.h> /* timeval, time_t */ -#include <setjmp.h> /* jmp_buf et al */ -#include <sys/socket.h> /* basics, SO_ and AF_ defs, sockaddr, ... */ -#include <netinet/in.h> /* sockaddr_in, htons, in_addr */ -#include <netinet/ip.h> /* IPOPT_LSRR, header stuff */ -#include <netdb.h> /* hostent, gethostby*, getservby* */ -#include <arpa/inet.h> /* inet_ntoa */ -#include <stdio.h> -#include <string.h> /* strcpy, strchr, yadda yadda */ -#include <errno.h> -#include <signal.h> -#include <fcntl.h> /* O_WRONLY et al */ - -/* handy stuff: */ -#define SA struct sockaddr /* socket overgeneralization braindeath */ -#define SAI struct sockaddr_in /* ... whoever came up with this model */ -#define IA struct in_addr /* ... should be taken out and shot, */ - /* ... not that TLI is any better. sigh.. */ -#define SLEAZE_PORT 31337 /* for UDP-scan RTT trick, change if ya want */ -#define USHORT unsigned short /* use these for options an' stuff */ -#define BIGSIZ 8192 /* big buffers */ - -#ifndef INADDR_NONE -#define INADDR_NONE 0xffffffff -#endif -#ifdef MAXHOSTNAMELEN -#undef MAXHOSTNAMELEN /* might be too small on aix, so fix it */ -#endif -#define MAXHOSTNAMELEN 256 - -struct host_poop { - char name[MAXHOSTNAMELEN]; /* dns name */ - char addrs[8][24]; /* ascii-format IP addresses */ - struct in_addr iaddrs[8]; /* real addresses: in_addr.s_addr: ulong */ -}; -#define HINF struct host_poop - -struct port_poop { - char name [64]; /* name in /etc/services */ - char anum [8]; /* ascii-format number */ - USHORT num; /* real host-order number */ -}; -#define PINF struct port_poop - -/* globals: */ -jmp_buf jbuf; /* timer crud */ -int jval = 0; /* timer crud */ -int netfd = -1; -int ofd = 0; /* hexdump output fd */ -static char unknown[] = "(UNKNOWN)"; -static char p_tcp[] = "tcp"; /* for getservby* */ -static char p_udp[] = "udp"; -#ifdef HAVE_BIND -extern int h_errno; -/* stolen almost wholesale from bsd herror.c */ -static char * h_errs[] = { - "Error 0", /* but we *don't* use this */ - "Unknown host", /* 1 HOST_NOT_FOUND */ - "Host name lookup failure", /* 2 TRY_AGAIN */ - "Unknown server error", /* 3 NO_RECOVERY */ - "No address associated with name", /* 4 NO_ADDRESS */ -}; -#else -int h_errno; /* just so we *do* have it available */ -#endif /* HAVE_BIND */ -int gatesidx = 0; /* LSRR hop count */ -int gatesptr = 4; /* initial LSRR pointer, settable */ -USHORT Single = 1; /* zero if scanning */ -unsigned int insaved = 0; /* stdin-buffer size for multi-mode */ -unsigned int wrote_out = 0; /* total stdout bytes */ -unsigned int wrote_net = 0; /* total net bytes */ -static char wrote_txt[] = " sent %d, rcvd %d"; -static char hexnibs[20] = "0123456789abcdef "; - -/* will malloc up the following globals: */ -struct timeval * timer1 = NULL; -struct timeval * timer2 = NULL; -SAI * lclend = NULL; /* sockaddr_in structs */ -SAI * remend = NULL; -HINF ** gates = NULL; /* LSRR hop hostpoop */ -char * optbuf = NULL; /* LSRR or sockopts */ -char * bigbuf_in; /* data buffers */ -char * bigbuf_net; -fd_set * ding1; /* for select loop */ -fd_set * ding2; -PINF * portpoop = NULL; /* for getportpoop / getservby* */ -unsigned char * stage = NULL; /* hexdump line buffer */ - -/* global cmd flags: */ -USHORT o_alla = 0; -unsigned int o_interval = 0; -USHORT o_listen = 0; -USHORT o_nflag = 0; -USHORT o_wfile = 0; -int o_quittimeout = 0; -USHORT o_random = 0; -USHORT o_udpmode = 0; -USHORT o_verbose = 0; -unsigned int o_wait = 0; -USHORT o_zero = 0; -/* o_tn in optional section */ - -/* Debug macro: squirt whatever message and sleep a bit so we can see it go - by. need to call like Debug ((stuff)) [with no ; ] so macro args match! - Beware: writes to stdOUT... */ -#ifdef DEBUG -#define Debug(x) printf x; printf ("\n"); fflush (stdout); sleep (1); -#else -#define Debug(x) /* nil... */ -#endif - - -/* support routines -- the bulk of this thing. Placed in such an order that - we don't have to forward-declare anything: */ - -#ifdef HAVE_HELP -void helpme(); -#endif - - -/* holler : - fake varargs -- need to do this way because we wind up calling through - more levels of indirection than vanilla varargs can handle, and not all - machines have vfprintf/vsyslog/whatever! 6 params oughta be enough. */ -void holler (str, p1, p2, p3, p4, p5, p6) - char * str; - char * p1, * p2, * p3, * p4, * p5, * p6; -{ - if (o_verbose) { - fprintf (stderr, str, p1, p2, p3, p4, p5, p6); -#ifdef HAVE_BIND - if (h_errno) { /* if host-lookup variety of error ... */ - if (h_errno > 4) /* oh no you don't, either */ - fprintf (stderr, "preposterous h_errno: %d", h_errno); - else - fprintf (stderr, h_errs[h_errno]); /* handle it here */ - h_errno = 0; /* and reset for next call */ - } -#endif - if (errno) { /* this gives funny-looking messages, but */ - perror (" "); /* it's more portable than sys_errlist[]... */ - } else /* xxx: do something better? */ - fprintf (stderr, "\n"); - fflush (stderr); - } -} /* holler */ - -/* bail : - error-exit handler, callable from anywhere */ -void bail (str, p1, p2, p3, p4, p5, p6) - char * str; - char * p1, * p2, * p3, * p4, * p5, * p6; -{ - o_verbose = 1; - holler (str, p1, p2, p3, p4, p5, p6); - close (netfd); - sleep (1); - exit (1); -} /* bail */ - -/* catch : - no-brainer interrupt handler */ -void catch () -{ - errno = 0; - if (o_verbose > 1) /* normally we don't care */ - bail (wrote_txt, wrote_net, wrote_out); - bail (" punt!"); -} - -/* quitaftertimeout : - singal handler which quits after user given seconds after close of stdin */ -void quitaftertimeout () -{ - close(netfd); - exit(0); -} - -/* timeout and other signal handling cruft */ -void tmtravel () -{ - signal (SIGALRM, SIG_IGN); - alarm (0); - if (jval == 0) - bail ("spurious timer interrupt!"); - longjmp (jbuf, jval); -} - -/* arm : - set the timer. Zero secs arg means unarm */ -void arm (num, secs) - unsigned int num; - unsigned int secs; -{ - if (secs == 0) { /* reset */ - signal (SIGALRM, SIG_IGN); - alarm (0); - jval = 0; - } else { /* set */ - signal (SIGALRM, tmtravel); - alarm (secs); - jval = num; - } /* if secs */ -} /* arm */ - -/* Hmalloc : - malloc up what I want, rounded up to *4, and pre-zeroed. Either succeeds - or bails out on its own, so that callers don't have to worry about it. */ -char * Hmalloc (size) - unsigned int size; -{ - unsigned int s = (size + 4) & 0xfffffffc; /* 4GB?! */ - char * p = malloc (s); - if (p != NULL) - memset (p, 0, s); - else - bail ("Hmalloc %d failed", s); - return (p); -} /* Hmalloc */ - -/* findline : - find the next newline in a buffer; return inclusive size of that "line", - or the entire buffer size, so the caller knows how much to then write(). - Not distinguishing \n vs \r\n for the nonce; it just works as is... */ -unsigned int findline (buf, siz) - char * buf; - unsigned int siz; -{ - register char * p; - register int x; - if (! buf) /* various sanity checks... */ - return (0); - if (siz > BIGSIZ) - return (0); - x = siz; - for (p = buf; x > 0; x--) { - if (*p == '\n') { - x = (int) (p - buf); - x++; /* 'sokay if it points just past the end! */ -Debug (("findline returning %d", x)) - return (x); - } - p++; - } /* for */ -Debug (("findline returning whole thing: %d", siz)) - return (siz); -} /* findline */ - -/* comparehosts : - cross-check the host_poop we have so far against new gethostby*() info, - and holler about mismatches. Perhaps gratuitous, but it can't hurt to - point out when someone's DNS is fukt. Returns 1 if mismatch, in case - someone else wants to do something about it. */ -int comparehosts (poop, hp) - HINF * poop; - struct hostent * hp; -{ - errno = 0; - h_errno = 0; -/* The DNS spec is officially case-insensitive, but for those times when you - *really* wanna see any and all discrepancies, by all means define this. */ -#ifdef ANAL - if (strcmp (poop->name, hp->h_name) != 0) { /* case-sensitive */ -#else - if (strcasecmp (poop->name, hp->h_name) != 0) { /* normal */ -#endif - holler ("DNS fwd/rev mismatch: %s != %s", poop->name, hp->h_name); - return (1); - } - return (0); -/* ... do we need to do anything over and above that?? */ -} /* comparehosts */ - -/* gethostpoop : - resolve a host 8 ways from sunday; return a new host_poop struct with its - info. The argument can be a name or [ascii] IP address; it will try its - damndest to deal with it. "numeric" governs whether we do any DNS at all, - and we also check o_verbose for what's appropriate work to do. */ -HINF * gethostpoop (name, numeric) - char * name; - USHORT numeric; -{ - struct hostent * hostent; - struct in_addr iaddr; - register HINF * poop = NULL; - register int x; - -/* I really want to strangle the twit who dreamed up all these sockaddr and - hostent abstractions, and then forced them all to be incompatible with - each other so you *HAVE* to do all this ridiculous casting back and forth. - If that wasn't bad enough, all the doc insists on referring to local ports - and addresses as "names", which makes NO sense down at the bare metal. - - What an absolutely horrid paradigm, and to think of all the people who - have been wasting significant amounts of time fighting with this stupid - deliberate obfuscation over the last 10 years... then again, I like - languages wherein a pointer is a pointer, what you put there is your own - business, the compiler stays out of your face, and sheep are nervous. - Maybe that's why my C code reads like assembler half the time... */ - -/* If we want to see all the DNS stuff, do the following hair -- - if inet_addr, do reverse and forward with any warnings; otherwise try - to do forward and reverse with any warnings. In other words, as long - as we're here, do a complete DNS check on these clowns. Yes, it slows - things down a bit for a first run, but once it's cached, who cares? */ - - errno = 0; - h_errno = 0; - if (name) - poop = (HINF *) Hmalloc (sizeof (HINF)); - if (! poop) - bail ("gethostpoop fuxored"); - strcpy (poop->name, unknown); /* preload it */ -/* see wzv:workarounds.c for dg/ux return-a-struct inet_addr lossage */ - iaddr.s_addr = inet_addr (name); - - if (iaddr.s_addr == INADDR_NONE) { /* here's the great split: names... */ - if (numeric) - bail ("Can't parse %s as an IP address", name); - hostent = gethostbyname (name); - if (! hostent) -/* failure to look up a name is fatal, since we can't do anything with it */ - bail ("%s: forward host lookup failed: ", name); - strncpy (poop->name, hostent->h_name, MAXHOSTNAMELEN - 2); - for (x = 0; hostent->h_addr_list[x] && (x < 8); x++) { - memcpy (&poop->iaddrs[x], hostent->h_addr_list[x], sizeof (IA)); - strlcpy (poop->addrs[x], inet_ntoa (poop->iaddrs[x]), - sizeof (poop->addrs[0])); - } /* for x -> addrs, part A */ - if (! o_verbose) /* if we didn't want to see the */ - return (poop); /* inverse stuff, we're done. */ -/* do inverse lookups in separate loop based on our collected forward addrs, - since gethostby* tends to crap into the same buffer over and over */ - for (x = 0; poop->iaddrs[x].s_addr && (x < 8); x++) { - hostent = gethostbyaddr ((char *)&poop->iaddrs[x], - sizeof (IA), AF_INET); - if ((! hostent) || (! hostent-> h_name)) - holler ("Warning: inverse host lookup failed for %s: ", - poop->addrs[x]); - else - (void) comparehosts (poop, hostent); - } /* for x -> addrs, part B */ - - } else { /* not INADDR_NONE: numeric addresses... */ - memcpy (poop->iaddrs, &iaddr, sizeof (IA)); - strncpy (poop->addrs[0], inet_ntoa (iaddr), sizeof (poop->addrs)); - if (numeric) /* if numeric-only, we're done */ - return (poop); - if (! o_verbose) /* likewise if we don't want */ - return (poop); /* the full DNS hair */ - hostent = gethostbyaddr ((char *) &iaddr, sizeof (IA), AF_INET); -/* numeric or not, failure to look up a PTR is *not* considered fatal */ - if (! hostent) - holler ("%s: inverse host lookup failed: ", name); - else { - strncpy (poop->name, hostent->h_name, MAXHOSTNAMELEN - 2); - hostent = gethostbyname (poop->name); - if ((! hostent) || (! hostent->h_addr_list[0])) - holler ("Warning: forward host lookup failed for %s: ", - poop->name); - else - (void) comparehosts (poop, hostent); - } /* if hostent */ - } /* INADDR_NONE Great Split */ - -/* whatever-all went down previously, we should now have a host_poop struct - with at least one IP address in it. */ - h_errno = 0; - return (poop); -} /* gethostpoop */ - -/* getportpoop : - Same general idea as gethostpoop -- look up a port in /etc/services, fill - in global port_poop, but return the actual port *number*. Pass ONE of: - pstring to resolve stuff like "23" or "exec"; - pnum to reverse-resolve something that's already a number. - If o_nflag is on, fill in what we can but skip the getservby??? stuff. - Might as well have consistent behavior here, and it *is* faster. */ -USHORT getportpoop (pstring, pnum) - char * pstring; - unsigned int pnum; -{ - struct servent * servent; - register int x; - register int y; - char * whichp = p_tcp; - if (o_udpmode) - whichp = p_udp; - portpoop->name[0] = '?'; /* fast preload */ - portpoop->name[1] = '\0'; - -/* case 1: reverse-lookup of a number; placed first since this case is much - more frequent if we're scanning */ - if (pnum) { - if (pstring) /* one or the other, pleeze */ - return (0); - x = pnum; - if (o_nflag) /* go faster, skip getservbyblah */ - goto gp_finish; - y = htons (x); /* gotta do this -- see Fig.1 below */ - servent = getservbyport (y, whichp); - if (servent) { - y = ntohs (servent->s_port); - if (x != y) /* "never happen" */ - holler ("Warning: port-bynum mismatch, %d != %d", x, y); - strncpy (portpoop->name, servent->s_name, sizeof (portpoop->name)); - } /* if servent */ - goto gp_finish; - } /* if pnum */ - -/* case 2: resolve a string, but we still give preference to numbers instead - of trying to resolve conflicts. None of the entries in *my* extensive - /etc/services begins with a digit, so this should "always work" unless - you're at 3com and have some company-internal services defined... */ - if (pstring) { - if (pnum) /* one or the other, pleeze */ - return (0); - x = atoi (pstring); - if (x) - return (getportpoop (NULL, x)); /* recurse for numeric-string-arg */ - if (o_nflag) /* can't use names! */ - return (0); - servent = getservbyname (pstring, whichp); - if (servent) { - strncpy (portpoop->name, servent->s_name, sizeof (portpoop->name)); - x = ntohs (servent->s_port); - goto gp_finish; - } /* if servent */ - } /* if pstring */ - - return (0); /* catches any problems so far */ - -/* Obligatory netdb.h-inspired rant: servent.s_port is supposed to be an int. - Despite this, we still have to treat it as a short when copying it around. - Not only that, but we have to convert it *back* into net order for - getservbyport to work. Manpages generally aren't clear on all this, but - there are plenty of examples in which it is just quietly done. More BSD - lossage... since everything getserv* ever deals with is local to our own - host, why bother with all this network-order/host-order crap at all?! - That should be saved for when we want to actually plug the port[s] into - some real network calls -- and guess what, we have to *re*-convert at that - point as well. Fuckheads. */ - -gp_finish: -/* Fall here whether or not we have a valid servent at this point, with - x containing our [host-order and therefore useful, dammit] port number */ - sprintf (portpoop->anum, "%d", x); /* always load any numeric specs! */ - portpoop->num = (x & 0xffff); /* ushort, remember... */ - return (portpoop->num); -} /* getportpoop */ - -/* nextport : - Come up with the next port to try, be it random or whatever. "block" is - a ptr to randports array, whose bytes [so far] carry these meanings: - 0 ignore - 1 to be tested - 2 tested [which is set as we find them here] - returns a USHORT random port, or 0 if all the t-b-t ones are used up. */ -USHORT nextport (block) - char * block; -{ - register unsigned int x; - register unsigned int y; - - y = 70000; /* high safety count for rnd-tries */ - while (y > 0) { - x = (RAND() & 0xffff); - if (block[x] == 1) { /* try to find a not-done one... */ - block[x] = 2; - break; - } - x = 0; /* bummer. */ - y--; - } /* while y */ - if (x) - return (x); - - y = 65535; /* no random one, try linear downsearch */ - while (y > 0) { /* if they're all used, we *must* be sure! */ - if (block[y] == 1) { - block[y] = 2; - break; - } - y--; - } /* while y */ - if (y) - return (y); /* at least one left */ - - return (0); /* no more left! */ -} /* nextport */ - -/* loadports : - set "to be tested" indications in BLOCK, from LO to HI. Almost too small - to be a separate routine, but makes main() a little cleaner... */ -void loadports (block, lo, hi) - char * block; - USHORT lo; - USHORT hi; -{ - USHORT x; - - if (! block) - bail ("loadports: no block?!"); - if ((! lo) || (! hi)) - bail ("loadports: bogus values %d, %d", lo, hi); - x = hi; - while (lo <= x) { - block[x] = 1; - x--; - } -} /* loadports */ - -#ifdef GAPING_SECURITY_HOLE -char * pr00gie = NULL; /* global ptr to -e arg */ - -/* doexec : - fiddle all the file descriptors around, and hand off to another prog. Sort - of like a one-off "poor man's inetd". This is the only section of code - that would be security-critical, which is why it's ifdefed out by default. - Use at your own hairy risk; if you leave shells lying around behind open - listening ports you deserve to lose!! */ -doexec (fd) - int fd; -{ - register char * p; - - dup2 (fd, 0); /* the precise order of fiddlage */ - close (fd); /* is apparently crucial; this is */ - dup2 (0, 1); /* swiped directly out of "inetd". */ - dup2 (0, 2); - p = strrchr (pr00gie, '/'); /* shorter argv[0] */ - if (p) - p++; - else - p = pr00gie; -Debug (("gonna exec %s as %s...", pr00gie, p)) - execl (pr00gie, p, NULL); - bail ("exec %s failed", pr00gie); /* this gets sent out. Hmm... */ -} /* doexec */ -#endif /* GAPING_SECURITY_HOLE */ - -/* doconnect : - do all the socket stuff, and return an fd for one of - an open outbound TCP connection - a UDP stub-socket thingie - with appropriate socket options set up if we wanted source-routing, or - an unconnected TCP or UDP socket to listen on. - Examines various global o_blah flags to figure out what-all to do. */ -int doconnect (rad, rp, lad, lp) - IA * rad; - USHORT rp; - IA * lad; - USHORT lp; -{ - register int nnetfd; - register int rr; - int x, y; - errno = 0; - -/* grab a socket; set opts */ -newskt: - if (o_udpmode) - nnetfd = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); - else - nnetfd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (nnetfd < 0) - bail ("Can't get socket"); - if (nnetfd == 0) /* if stdin was closed this might *be* 0, */ - goto newskt; /* so grab another. See text for why... */ - x = 1; - rr = setsockopt (nnetfd, SOL_SOCKET, SO_REUSEADDR, &x, sizeof (x)); - if (rr == -1) - holler ("nnetfd reuseaddr failed"); /* ??? */ -#ifdef SO_REUSEPORT /* doesnt exist everywhere... */ - rr = setsockopt (nnetfd, SOL_SOCKET, SO_REUSEPORT, &x, sizeof (x)); - if (rr == -1) - holler ("nnetfd reuseport failed"); /* ??? */ -#endif -#if 0 -/* If you want to screw with RCVBUF/SNDBUF, do it here. Liudvikas Bukys at - Rochester sent this example, which would involve YET MORE options and is - just archived here in case you want to mess with it. o_xxxbuf are global - integers set in main() getopt loop, and check for rr == 0 afterward. */ - rr = setsockopt(nnetfd, SOL_SOCKET, SO_RCVBUF, &o_rcvbuf, sizeof o_rcvbuf); - rr = setsockopt(nnetfd, SOL_SOCKET, SO_SNDBUF, &o_sndbuf, sizeof o_sndbuf); -#endif - - /* fill in all the right sockaddr crud */ - lclend->sin_family = AF_INET; - -/* fill in all the right sockaddr crud */ - lclend->sin_family = AF_INET; - remend->sin_family = AF_INET; - -/* if lad/lp, do appropriate binding */ - if (lad) - memcpy (&lclend->sin_addr.s_addr, lad, sizeof (IA)); - if (lp) - lclend->sin_port = htons (lp); - rr = 0; - if (lad || lp) { - x = (int) lp; -/* try a few times for the local bind, a la ftp-data-port... */ - for (y = 4; y > 0; y--) { - rr = bind (nnetfd, (SA *)lclend, sizeof (SA)); - if (rr == 0) - break; - if (errno != EADDRINUSE) - break; - else { - holler ("retrying local %s:%d", inet_ntoa (lclend->sin_addr), lp); - sleep (2); - errno = 0; /* clear from sleep */ - } /* if EADDRINUSE */ - } /* for y counter */ - } /* if lad or lp */ - if (rr) - bail ("Can't grab %s:%d with bind", - inet_ntoa(lclend->sin_addr), lp); - - if (o_listen) - return (nnetfd); /* thanks, that's all for today */ - - memcpy (&remend->sin_addr.s_addr, rad, sizeof (IA)); - remend->sin_port = htons (rp); - -/* rough format of LSRR option and explanation of weirdness. -Option comes after IP-hdr dest addr in packet, padded to *4, and ihl > 5. -IHL is multiples of 4, i.e. real len = ip_hl << 2. - type 131 1 ; 0x83: copied, option class 0, number 3 - len 1 ; of *whole* option! - pointer 1 ; nxt-hop-addr; 1-relative, not 0-relative - addrlist... var ; 4 bytes per hop-addr - pad-to-32 var ; ones, i.e. "NOP" - -If we want to route A -> B via hops C and D, we must add C, D, *and* B to the -options list. Why? Because when we hand the kernel A -> B with list C, D, B -the "send shuffle" inside the kernel changes it into A -> C with list D, B and -the outbound packet gets sent to C. If B wasn't also in the hops list, the -final destination would have been lost at this point. - -When C gets the packet, it changes it to A -> D with list C', B where C' is -the interface address that C used to forward the packet. This "records" the -route hop from B's point of view, i.e. which address points "toward" B. This -is to make B better able to return the packets. The pointer gets bumped by 4, -so that D does the right thing instead of trying to forward back to C. - -When B finally gets the packet, it sees that the pointer is at the end of the -LSRR list and is thus "completed". B will then try to use the packet instead -of forwarding it, i.e. deliver it up to some application. - -Note that by moving the pointer yourself, you could send the traffic directly -to B but have it return via your preconstructed source-route. Playing with -this and watching "tcpdump -v" is the best way to understand what's going on. - -Only works for TCP in BSD-flavor kernels. UDP is a loss; udp_input calls -stripoptions() early on, and the code to save the srcrt is notdef'ed. -Linux is also still a loss at 1.3.x it looks like; the lsrr code is { }... -*/ - -/* if any -g arguments were given, set up source-routing. We hit this after - the gates are all looked up and ready to rock, any -G pointer is set, - and gatesidx is now the *number* of hops */ - if (gatesidx) { /* if we wanted any srcrt hops ... */ -/* don't even bother compiling if we can't do IP options here! */ -#ifdef IP_OPTIONS - if (! optbuf) { /* and don't already *have* a srcrt set */ - char * opp; /* then do all this setup hair */ - optbuf = Hmalloc (48); - opp = optbuf; - *opp++ = IPOPT_LSRR; /* option */ - *opp++ = (char) - (((gatesidx + 1) * sizeof (IA)) + 3) & 0xff; /* length */ - *opp++ = gatesptr; /* pointer */ -/* opp now points at first hop addr -- insert the intermediate gateways */ - for ( x = 0; x < gatesidx; x++) { - memcpy (opp, gates[x]->iaddrs, sizeof (IA)); - opp += sizeof (IA); - } -/* and tack the final destination on the end [needed!] */ - memcpy (opp, rad, sizeof (IA)); - opp += sizeof (IA); - *opp = IPOPT_NOP; /* alignment filler */ - } /* if empty optbuf */ -/* calculate length of whole option mess, which is (3 + [hops] + [final] + 1), - and apply it [have to do this every time through, of course] */ - x = ((gatesidx + 1) * sizeof (IA)) + 4; - rr = setsockopt (nnetfd, IPPROTO_IP, IP_OPTIONS, optbuf, x); - if (rr == -1) - bail ("srcrt setsockopt fuxored"); -#else /* IP_OPTIONS */ - holler ("Warning: source routing unavailable on this machine, ignoring"); -#endif /* IP_OPTIONS*/ - } /* if gatesidx */ - -/* wrap connect inside a timer, and hit it */ - arm (1, o_wait); - if (setjmp (jbuf) == 0) { - rr = connect (nnetfd, (SA *)remend, sizeof (SA)); - } else { /* setjmp: connect failed... */ - rr = -1; - errno = ETIMEDOUT; /* fake it */ - } - arm (0, 0); - if (rr == 0) - return (nnetfd); - close (nnetfd); /* clean up junked socket FD!! */ - return (-1); -} /* doconnect */ - -/* dolisten : - just like doconnect, and in fact calls a hunk of doconnect, but listens for - incoming and returns an open connection *from* someplace. If we were - given host/port args, any connections from elsewhere are rejected. This - in conjunction with local-address binding should limit things nicely... */ -int dolisten (rad, rp, lad, lp) - IA * rad; - USHORT rp; - IA * lad; - USHORT lp; -{ - register int nnetfd; - register int rr; - HINF * whozis = NULL; - int x; - char * cp; - USHORT z; - errno = 0; - -/* Pass everything off to doconnect, who in o_listen mode just gets a socket */ - nnetfd = doconnect (rad, rp, lad, lp); - if (nnetfd <= 0) - return (-1); - if (o_udpmode) { /* apparently UDP can listen ON */ - if (! lp) /* "port 0", but that's not useful */ - bail ("UDP listen needs -p arg"); - } else { - rr = listen (nnetfd, 1); /* gotta listen() before we can get */ - if (rr < 0) /* our local random port. sheesh. */ - bail ("local listen fuxored"); - } - -/* Various things that follow temporarily trash bigbuf_net, which might contain - a copy of any recvfrom()ed packet, but we'll read() another copy later. */ - -/* I can't believe I have to do all this to get my own goddamn bound address - and port number. It should just get filled in during bind() or something. - All this is only useful if we didn't say -p for listening, since if we - said -p we *know* what port we're listening on. At any rate we won't bother - with it all unless we wanted to see it, although listening quietly on a - random unknown port is probably not very useful without "netstat". */ - if (o_verbose) { - x = sizeof (SA); /* how 'bout getsockNUM instead, pinheads?! */ - rr = getsockname (nnetfd, (SA *) lclend, &x); - if (rr < 0) - holler ("local getsockname failed"); - strcpy (bigbuf_net, "listening on ["); /* buffer reuse... */ - if (lclend->sin_addr.s_addr) - strcat (bigbuf_net, inet_ntoa (lclend->sin_addr)); - else - strcat (bigbuf_net, "any"); - strcat (bigbuf_net, "] %d ..."); - z = ntohs (lclend->sin_port); - holler (bigbuf_net, z); - } /* verbose -- whew!! */ - -/* UDP is a speeeeecial case -- we have to do I/O *and* get the calling - party's particulars all at once, listen() and accept() don't apply. - At least in the BSD universe, however, recvfrom/PEEK is enough to tell - us something came in, and we can set things up so straight read/write - actually does work after all. Yow. YMMV on strange platforms! */ - if (o_udpmode) { - x = sizeof (SA); /* retval for recvfrom */ - arm (2, o_wait); /* might as well timeout this, too */ - if (setjmp (jbuf) == 0) { /* do timeout for initial connect */ - rr = recvfrom /* and here we block... */ - (nnetfd, bigbuf_net, BIGSIZ, MSG_PEEK, (SA *) remend, &x); -Debug (("dolisten/recvfrom ding, rr = %d, netbuf %s ", rr, bigbuf_net)) - } else - goto dol_tmo; /* timeout */ - arm (0, 0); -/* I'm not completely clear on how this works -- BSD seems to make UDP - just magically work in a connect()ed context, but we'll undoubtedly run - into systems this deal doesn't work on. For now, we apparently have to - issue a connect() on our just-tickled socket so we can write() back. - Again, why the fuck doesn't it just get filled in and taken care of?! - This hack is anything but optimal. Basically, if you want your listener - to also be able to send data back, you need this connect() line, which - also has the side effect that now anything from a different source or even a - different port on the other end won't show up and will cause ICMP errors. - I guess that's what they meant by "connect". - Let's try to remember what the "U" is *really* for, eh? */ - rr = connect (nnetfd, (SA *)remend, sizeof (SA)); - goto whoisit; - } /* o_udpmode */ - -/* fall here for TCP */ - x = sizeof (SA); /* retval for accept */ - arm (2, o_wait); /* wrap this in a timer, too; 0 = forever */ - if (setjmp (jbuf) == 0) { - rr = accept (nnetfd, (SA *)remend, &x); - } else - goto dol_tmo; /* timeout */ - arm (0, 0); - close (nnetfd); /* dump the old socket */ - nnetfd = rr; /* here's our new one */ - -whoisit: - if (rr < 0) - goto dol_err; /* bail out if any errors so far */ - -/* If we can, look for any IP options. Useful for testing the receiving end of - such things, and is a good exercise in dealing with it. We do this before - the connect message, to ensure that the connect msg is uniformly the LAST - thing to emerge after all the intervening crud. Doesn't work for UDP on - any machines I've tested, but feel free to surprise me. */ -#ifdef IP_OPTIONS - if (! o_verbose) /* if we wont see it, we dont care */ - goto dol_noop; - optbuf = Hmalloc (40); - x = 40; - rr = getsockopt (nnetfd, IPPROTO_IP, IP_OPTIONS, optbuf, &x); - if (rr < 0) - holler ("getsockopt failed"); -Debug (("ipoptions ret len %d", x)) - if (x) { /* we've got options, lessee em... */ - unsigned char * q = (unsigned char *) optbuf; - char * p = bigbuf_net; /* local variables, yuk! */ - char * pp = &bigbuf_net[128]; /* get random space farther out... */ - memset (bigbuf_net, 0, 256); /* clear it all first */ - while (x > 0) { - sprintf (pp, "%2.2x ", *q); /* clumsy, but works: turn into hex */ - strcat (p, pp); /* and build the final string */ - q++; p++; - x--; - } - holler ("IP options: %s", bigbuf_net); - } /* if x, i.e. any options */ -dol_noop: -#endif /* IP_OPTIONS */ - -/* find out what address the connection was *to* on our end, in case we're - doing a listen-on-any on a multihomed machine. This allows one to - offer different services via different alias addresses, such as the - "virtual web site" hack. */ - memset (bigbuf_net, 0, 64); - cp = &bigbuf_net[32]; - x = sizeof (SA); - rr = getsockname (nnetfd, (SA *) lclend, &x); - if (rr < 0) - holler ("post-rcv getsockname failed"); - strcpy (cp, inet_ntoa (lclend->sin_addr)); - -/* now check out who it is. We don't care about mismatched DNS names here, - but any ADDR and PORT we specified had better fucking well match the caller. - Converting from addr to inet_ntoa and back again is a bit of a kludge, but - gethostpoop wants a string and there's much gnarlier code out there already, - so I don't feel bad. - The *real* question is why BFD sockets wasn't designed to allow listens for - connections *from* specific hosts/ports, instead of requiring the caller to - accept the connection and then reject undesireable ones by closing. In - other words, we need a TCP MSG_PEEK. */ - z = ntohs (remend->sin_port); - strcpy (bigbuf_net, inet_ntoa (remend->sin_addr)); - whozis = gethostpoop (bigbuf_net, o_nflag); - errno = 0; - x = 0; /* use as a flag... */ - if (rad) /* xxx: fix to go down the *list* if we have one? */ - if (memcmp (rad, whozis->iaddrs, sizeof (SA))) - x = 1; - if (rp) - if (z != rp) - x = 1; - if (x) /* guilty! */ - bail ("invalid connection to [%s] from %s [%s] %d", - cp, whozis->name, whozis->addrs[0], z); - holler ("connect to [%s] from %s [%s] %d", /* oh, you're okay.. */ - cp, whozis->name, whozis->addrs[0], z); - return (nnetfd); /* open! */ - -dol_tmo: - errno = ETIMEDOUT; /* fake it */ -dol_err: - close (nnetfd); - return (-1); -} /* dolisten */ - -/* udptest : - fire a couple of packets at a UDP target port, just to see if it's really - there. On BSD kernels, ICMP host/port-unreachable errors get delivered to - our socket as ECONNREFUSED write errors. On SV kernels, we lose; we'll have - to collect and analyze raw ICMP ourselves a la satan's probe_udp_ports - backend. Guess where one could swipe the appropriate code from... - - Use the time delay between writes if given, otherwise use the "tcp ping" - trick for getting the RTT. [I got that idea from pluvius, and warped it.] - Return either the original fd, or clean up and return -1. */ -udptest (fd, where) - int fd; - IA * where; -{ - register int rr; - - rr = write (fd, bigbuf_in, 1); - if (rr != 1) - holler ("udptest first write failed?! errno %d", errno); - if (o_wait) - sleep (o_wait); - else { -/* use the tcp-ping trick: try connecting to a normally refused port, which - causes us to block for the time that SYN gets there and RST gets back. - Not completely reliable, but it *does* mostly work. */ - o_udpmode = 0; /* so doconnect does TCP this time */ -/* Set a temporary connect timeout, so packet filtration doesnt cause - us to hang forever, and hit it */ - o_wait = 5; /* enough that we'll notice?? */ - rr = doconnect (where, SLEAZE_PORT, 0, 0); - if (rr > 0) - close (rr); /* in case it *did* open */ - o_wait = 0; /* reset it */ - o_udpmode++; /* we *are* still doing UDP, right? */ - } /* if o_wait */ - errno = 0; /* clear from sleep */ - rr = write (fd, bigbuf_in, 1); - if (rr == 1) /* if write error, no UDP listener */ - return (fd); - close (fd); /* use it or lose it! */ - return (-1); -} /* udptest */ - -/* oprint : - Hexdump bytes shoveled either way to a running logfile, in the format: -D offset - - - - --- 16 bytes --- - - - - # .... ascii ..... - where "which" sets the direction indicator, D: - 0 -- sent to network, or ">" - 1 -- rcvd and printed to stdout, or "<" - and "buf" and "n" are data-block and length. If the current block generates - a partial line, so be it; we *want* that lockstep indication of who sent - what when. Adapted from dgaudet's original example -- but must be ripping - *fast*, since we don't want to be too disk-bound... */ -void oprint (which, buf, n) - int which; - char * buf; - int n; -{ - int bc; /* in buffer count */ - int obc; /* current "global" offset */ - int soc; /* stage write count */ - register unsigned char * p; /* main buf ptr; m.b. unsigned here */ - register unsigned char * op; /* out hexdump ptr */ - register unsigned char * a; /* out asc-dump ptr */ - register int x; - register unsigned int y; - - if (! ofd) - bail ("oprint called with no open fd?!"); - if (n == 0) - return; - - op = stage; - if (which) { - *op = '<'; - obc = wrote_out; /* use the globals! */ - } else { - *op = '>'; - obc = wrote_net; - } - op++; /* preload "direction" */ - *op = ' '; - p = (unsigned char *) buf; - bc = n; - stage[59] = '#'; /* preload separator */ - stage[60] = ' '; - - while (bc) { /* for chunk-o-data ... */ - x = 16; - soc = 78; /* len of whole formatted line */ - if (bc < x) { - soc = soc - 16 + bc; /* fiddle for however much is left */ - x = (bc * 3) + 11; /* 2 digits + space per, after D & offset */ - op = &stage[x]; - x = 16 - bc; - while (x) { - *op++ = ' '; /* preload filler spaces */ - *op++ = ' '; - *op++ = ' '; - x--; - } - x = bc; /* re-fix current linecount */ - } /* if bc < x */ - - bc -= x; /* fix wrt current line size */ - sprintf (&stage[2], "%8.8x ", obc); /* xxx: still slow? */ - obc += x; /* fix current offset */ - op = &stage[11]; /* where hex starts */ - a = &stage[61]; /* where ascii starts */ - - while (x) { /* for line of dump, however long ... */ - y = (int)(*p >> 4); /* hi half */ - *op = hexnibs[y]; - op++; - y = (int)(*p & 0x0f); /* lo half */ - *op = hexnibs[y]; - op++; - *op = ' '; - op++; - if ((*p > 31) && (*p < 127)) - *a = *p; /* printing */ - else - *a = '.'; /* nonprinting, loose def */ - a++; - p++; - x--; - } /* while x */ - *a = '\n'; /* finish the line */ - x = write (ofd, stage, soc); - if (x < 0) - bail ("ofd write err"); - } /* while bc */ -} /* oprint */ - -#ifdef TELNET -USHORT o_tn = 0; /* global -t option */ - -/* atelnet : - Answer anything that looks like telnet negotiation with don't/won't. - This doesn't modify any data buffers, update the global output count, - or show up in a hexdump -- it just shits into the outgoing stream. - Idea and codebase from Mudge@xxxxxxxxx. */ -void atelnet (buf, size) - unsigned char * buf; /* has to be unsigned here! */ - unsigned int size; -{ - static unsigned char obuf [4]; /* tiny thing to build responses into */ - register int x; - register unsigned char y; - register unsigned char * p; - - y = 0; - p = buf; - x = size; - while (x > 0) { - if (*p != 255) /* IAC? */ - goto notiac; - obuf[0] = 255; - p++; x--; - if ((*p == 251) || (*p == 252)) /* WILL or WONT */ - y = 254; /* -> DONT */ - if ((*p == 253) || (*p == 254)) /* DO or DONT */ - y = 252; /* -> WONT */ - if (y) { - obuf[1] = y; - p++; x--; - obuf[2] = *p; /* copy actual option byte */ - (void) write (netfd, obuf, 3); -/* if one wanted to bump wrote_net or do a hexdump line, here's the place */ - y = 0; - } /* if y */ -notiac: - p++; x--; - } /* while x */ -} /* atelnet */ -#endif /* TELNET */ - -/* readwrite : - handle stdin/stdout/network I/O. Bwahaha!! -- the select loop from hell. - In this instance, return what might become our exit status. */ -int readwrite (fd) - int fd; -{ - register int rr; - register char * zp; /* stdin buf ptr */ - register char * np; /* net-in buf ptr */ - unsigned int rzleft; - unsigned int rnleft; - USHORT netretry; /* net-read retry counter */ - USHORT wretry; /* net-write sanity counter */ - USHORT wfirst; /* one-shot flag to skip first net read */ - -/* if you don't have all this FD_* macro hair in sys/types.h, you'll have to - either find it or do your own bit-bashing: *ding1 |= (1 << fd), etc... */ - if (fd > FD_SETSIZE) { - holler ("Preposterous fd value %d", fd); - return (1); - } - FD_SET (fd, ding1); /* global: the net is open */ - netretry = 2; - wfirst = 0; - rzleft = rnleft = 0; - if (insaved) { - rzleft = insaved; /* preload multi-mode fakeouts */ - zp = bigbuf_in; - wfirst = 1; - if (Single) /* if not scanning, this is a one-off first */ - insaved = 0; /* buffer left over from argv construction, */ - else { - FD_CLR (0, ding1); /* OR we've already got our repeat chunk, */ - close (0); /* so we won't need any more stdin */ - } /* Single */ - } /* insaved */ - if (o_interval) - sleep (o_interval); /* pause *before* sending stuff, too */ - errno = 0; /* clear from sleep, close, whatever */ - -/* and now the big ol' select shoveling loop ... */ - while (FD_ISSET (fd, ding1)) { /* i.e. till the *net* closes! */ - wretry = 8200; /* more than we'll ever hafta write */ - if (wfirst) { /* any saved stdin buffer? */ - wfirst = 0; /* clear flag for the duration */ - goto shovel; /* and go handle it first */ - } - *ding2 = *ding1; /* FD_COPY ain't portable... */ -/* some systems, notably linux, crap into their select timers on return, so - we create a expendable copy and give *that* to select. *Fuck* me ... */ - if (timer1) - memcpy (timer2, timer1, sizeof (struct timeval)); - rr = select (16, ding2, 0, 0, timer2); /* here it is, kiddies */ - if (rr < 0) { - if (errno != EINTR) { /* might have gotten ^Zed, etc ?*/ - holler ("select fuxored"); - close (fd); - return (1); - } - } /* select fuckup */ -/* if we have a timeout AND stdin is closed AND we haven't heard anything - from the net during that time, assume it's dead and close it too. */ - -/* we need this section of if -q is not given, otherwise we dont quit if we - dont receive from net, we quit after timeout given with -q */ - if (o_quittimeout == 0) { - if (rr == 0) { - if (! FD_ISSET (0, ding1)) - netretry--; /* we actually try a coupla times. */ - if (! netretry) { - if (o_verbose > 1) /* normally we don't care */ - holler ("net timeout"); - close (fd); - return (0); /* not an error! */ - } - } /* select timeout */ - } -/* xxx: should we check the exception fds too? The read fds seem to give - us the right info, and none of the examples I found bothered. */ - -/* Ding!! Something arrived, go check all the incoming hoppers, net first */ - if (FD_ISSET (fd, ding2)) { /* net: ding! */ - rr = read (fd, bigbuf_net, BIGSIZ); - if (rr <= 0) { - FD_CLR (fd, ding1); /* net closed, we'll finish up... */ - rzleft = 0; /* can't write anymore: broken pipe */ - } else { - rnleft = rr; - np = bigbuf_net; -#ifdef TELNET - if (o_tn) - atelnet (np, rr); /* fake out telnet stuff */ -#endif /* TELNET */ - } /* if rr */ -Debug (("got %d from the net, errno %d", rr, errno)) - } /* net:ding */ - -/* if we're in "slowly" mode there's probably still stuff in the stdin - buffer, so don't read unless we really need MORE INPUT! MORE INPUT! */ - if (rzleft) - goto shovel; - -/* okay, suck more stdin */ - if (FD_ISSET (0, ding2)) { /* stdin: ding! */ - rr = read (0, bigbuf_in, BIGSIZ); -/* Considered making reads here smaller for UDP mode, but 8192-byte - mobygrams are kinda fun and exercise the reassembler. */ - if (rr <= 0) { /* at end, or fukt, or ... */ - FD_CLR (0, ding1); /* disable and close stdin */ - close (0); - if (o_quittimeout > 0) { - if (o_verbose > 1) - fprintf (stderr, "STDIN closed, quit after %d seconds\n", o_quittimeout); - signal (SIGALRM, quitaftertimeout); - alarm (o_quittimeout); - // if -q argument is < 0 we dont trigger any signal and we also don't - // check for rr == 0 above, hence this is an infinite loop, essentially - // waiting forever on fd of net. - } - } else { - rzleft = rr; - zp = bigbuf_in; -/* special case for multi-mode -- we'll want to send this one buffer to every - open TCP port or every UDP attempt, so save its size and clean up stdin */ - if (! Single) { /* we might be scanning... */ - insaved = rr; /* save len */ - FD_CLR (0, ding1); /* disable further junk from stdin */ - close (0); /* really, I mean it */ - } /* Single */ - } /* if rr/read */ - } /* stdin:ding */ - -shovel: -/* now that we've dingdonged all our thingdings, send off the results. - Geez, why does this look an awful lot like the big loop in "rsh"? ... - not sure if the order of this matters, but write net -> stdout first. */ - -/* sanity check. Works because they're both unsigned... */ - if ((rzleft > 8200) || (rnleft > 8200)) { - holler ("Bogus buffers: %d, %d", rzleft, rnleft); - rzleft = rnleft = 0; - } -/* net write retries sometimes happen on UDP connections */ - if (! wretry) { /* is something hung? */ - holler ("too many output retries"); - return (1); - } - if (rnleft) { - rr = write (1, np, rnleft); - if (rr > 0) { - if (o_wfile) - oprint (1, np, rr); /* log the stdout */ - np += rr; /* fix up ptrs and whatnot */ - rnleft -= rr; /* will get sanity-checked above */ - wrote_out += rr; /* global count */ - } -Debug (("wrote %d to stdout, errno %d", rr, errno)) - } /* rnleft */ - if (rzleft) { - if (o_interval) /* in "slowly" mode ?? */ - rr = findline (zp, rzleft); - else - rr = rzleft; - rr = write (fd, zp, rr); /* one line, or the whole buffer */ - if (rr > 0) { - if (o_wfile) - oprint (0, zp, rr); /* log what got sent */ - zp += rr; - rzleft -= rr; - wrote_net += rr; /* global count */ - } -Debug (("wrote %d to net, errno %d", rr, errno)) - } /* rzleft */ - if (o_interval) { /* cycle between slow lines, or ... */ - sleep (o_interval); - errno = 0; /* clear from sleep */ - continue; /* ...with hairy select loop... */ - } - if ((rzleft) || (rnleft)) { /* shovel that shit till they ain't */ - wretry--; /* none left, and get another load */ - goto shovel; - } - } /* while ding1:netfd is open */ - -/* XXX: maybe want a more graceful shutdown() here, or screw around with - linger times?? I suspect that I don't need to since I'm always doing - blocking reads and writes and my own manual "last ditch" efforts to read - the net again after a timeout. I haven't seen any screwups yet, but it's - not like my test network is particularly busy... */ - close (fd); - return (0); -} /* readwrite */ - - -/* main : - now we pull it all together... */ -main (argc, argv) - int argc; - char ** argv; -{ -#ifndef HAVE_GETOPT - extern char * optarg; - extern int optind, optopt; -#endif - register int x; - register char *cp; - HINF * gp; - HINF * whereto = NULL; - HINF * wherefrom = NULL; - IA * ouraddr = NULL; - IA * themaddr = NULL; - USHORT o_lport = 0; - USHORT ourport = 0; - USHORT loport = 0; /* for scanning stuff */ - USHORT hiport = 0; - USHORT curport = 0; - char * randports = NULL; - -#ifdef HAVE_BIND -/* can *you* say "cc -yaddayadda netcat.c -lresolv -l44bsd" on SunLOSs? */ - res_init(); -#endif -/* I was in this barbershop quartet in Skokie IL ... */ -/* round up the usual suspects, i.e. malloc up all the stuff we need */ - lclend = (SAI *) Hmalloc (sizeof (SA)); - remend = (SAI *) Hmalloc (sizeof (SA)); - bigbuf_in = Hmalloc (BIGSIZ); - bigbuf_net = Hmalloc (BIGSIZ); - ding1 = (fd_set *) Hmalloc (sizeof (fd_set)); - ding2 = (fd_set *) Hmalloc (sizeof (fd_set)); - portpoop = (PINF *) Hmalloc (sizeof (PINF)); - - errno = 0; - gatesptr = 4; - h_errno = 0; - -/* catch a signal or two for cleanup */ - signal (SIGINT, catch); - signal (SIGQUIT, catch); - signal (SIGTERM, catch); -/* and suppress others... */ -#ifdef SIGURG - signal (SIGURG, SIG_IGN); -#endif -#ifdef SIGPIPE - signal (SIGPIPE, SIG_IGN); /* important! */ -#endif - -/* if no args given at all, get 'em from stdin, construct an argv, and hand - anything left over to readwrite(). */ - if (argc == 1) { - cp = argv[0]; - argv = (char **) Hmalloc (128 * sizeof (char *)); /* XXX: 128? */ - argv[0] = cp; /* leave old prog name intact */ - cp = Hmalloc (BIGSIZ); - argv[1] = cp; /* head of new arg block */ - fprintf (stderr, "Cmd line: "); - fflush (stderr); /* I dont care if it's unbuffered or not! */ - insaved = read (0, cp, BIGSIZ); /* we're gonna fake fgets() here */ - if (insaved <= 0) - bail ("wrong"); - x = findline (cp, insaved); - if (x) - insaved -= x; /* remaining chunk size to be sent */ - if (insaved) /* which might be zero... */ - memcpy (bigbuf_in, &cp[x], insaved); - cp = strchr (argv[1], '\n'); - if (cp) - *cp = '\0'; - cp = strchr (argv[1], '\r'); /* look for ^M too */ - if (cp) - *cp = '\0'; - -/* find and stash pointers to remaining new "args" */ - cp = argv[1]; - cp++; /* skip past first char */ - x = 2; /* we know argv 0 and 1 already */ - for (; *cp != '\0'; cp++) { - if (*cp == ' ') { - *cp = '\0'; /* smash all spaces */ - continue; - } else { - if (*(cp-1) == '\0') { - argv[x] = cp; - x++; - } - } /* if space */ - } /* for cp */ - argc = x; - } /* if no args given */ - -/* If your shitbox doesn't have getopt, step into the nineties already. */ -/* optarg, optind = next-argv-component [i.e. flag arg]; optopt = last-char */ - while ((x = getopt (argc, argv, "ae:g:G:hi:lno:p:q:rs:tuvw:z")) != EOF) { -/* Debug (("in go: x now %c, optarg %x optind %d", x, optarg, optind)) */ - switch (x) { - case 'a': - bail ("all-A-records NIY"); - o_alla++; break; -#ifdef GAPING_SECURITY_HOLE - case 'e': /* prog to exec */ - pr00gie = optarg; - break; -#endif - case 'G': /* srcrt gateways pointer val */ - x = atoi (optarg); - if ((x) && (x == (x & 0x1c))) /* mask off bits of fukt values */ - gatesptr = x; - else - bail ("invalid hop pointer %d, must be multiple of 4 <= 28", x); - break; - case 'g': /* srcroute hop[s] */ - if (gatesidx > 8) - bail ("too many -g hops"); - if (gates == NULL) /* eat this, Billy-boy */ - gates = (HINF **) Hmalloc (sizeof (HINF *) * 10); - gp = gethostpoop (optarg, o_nflag); - if (gp) - gates[gatesidx] = gp; - gatesidx++; - break; - case 'h': - errno = 0; -#ifdef HAVE_HELP - helpme(); /* exits by itself */ -#else - bail ("no help available, dork -- RTFS"); -#endif - case 'i': /* line-interval time */ - o_interval = atoi (optarg) & 0xffff; - if (! o_interval) - bail ("invalid interval time %s", optarg); - break; - case 'l': /* listen mode */ - o_listen++; break; - case 'n': /* numeric-only, no DNS lookups */ - o_nflag++; break; - case 'o': /* hexdump log */ - stage = (unsigned char *) optarg; - o_wfile++; break; - case 'p': /* local source port */ - o_lport = getportpoop (optarg, 0); - if (o_lport == 0) - bail ("invalid local port %s", optarg); - break; - case 'q': - o_quittimeout = atoi(optarg); break; - case 'r': /* randomize various things */ - o_random++; break; - case 's': /* local source address */ -/* do a full lookup [since everything else goes through the same mill], - unless -n was previously specified. In fact, careful placement of -n can - be useful, so we'll still pass o_nflag here instead of forcing numeric. */ - wherefrom = gethostpoop (optarg, o_nflag); - ouraddr = &wherefrom->iaddrs[0]; - break; -#ifdef TELNET - case 't': /* do telnet fakeout */ - o_tn++; break; -#endif /* TELNET */ - case 'u': /* use UDP */ - o_udpmode++; break; - case 'v': /* verbose */ - o_verbose++; break; - case 'w': /* wait time */ - o_wait = atoi (optarg); - if (o_wait <= 0) - bail ("invalid wait-time %s", optarg); - timer1 = (struct timeval *) Hmalloc (sizeof (struct timeval)); - timer2 = (struct timeval *) Hmalloc (sizeof (struct timeval)); - timer1->tv_sec = o_wait; /* we need two. see readwrite()... */ - break; - case 'z': /* little or no data xfer */ - o_zero++; - break; - default: - errno = 0; - bail ("nc -h for help"); - } /* switch x */ - } /* while getopt */ - -/* other misc initialization */ -Debug (("fd_set size %d", sizeof (*ding1))) /* how big *is* it? */ - FD_SET (0, ding1); /* stdin *is* initially open */ - if (o_random) { - SRAND (time (0)); - randports = Hmalloc (65536); /* big flag array for ports */ - } -#ifdef GAPING_SECURITY_HOLE - if (pr00gie) { - close (0); /* won't need stdin */ - o_wfile = 0; /* -o with -e is meaningless! */ - ofd = 0; - } -#endif /* G_S_H */ - if (o_wfile) { - ofd = open (stage, O_WRONLY | O_CREAT | O_TRUNC, 0664); - if (ofd <= 0) /* must be > extant 0/1/2 */ - bail ("can't open %s", stage); - stage = (unsigned char *) Hmalloc (100); - } - -/* optind is now index of first non -x arg */ -Debug (("after go: x now %c, optarg %x optind %d", x, optarg, optind)) -/* Debug (("optind up to %d at host-arg %s", optind, argv[optind])) */ -/* gonna only use first addr of host-list, like our IQ was normal; if you wanna - get fancy with addresses, look up the list yourself and plug 'em in for now. - unless we finally implement -a, that is. */ - if (argv[optind]) - whereto = gethostpoop (argv[optind], o_nflag); - if (whereto && whereto->iaddrs) - themaddr = &whereto->iaddrs[0]; - if (themaddr) - optind++; /* skip past valid host lookup */ - errno = 0; - h_errno = 0; - -/* Handle listen mode here, and exit afterward. Only does one connect; - this is arguably the right thing to do. A "persistent listen-and-fork" - mode a la inetd has been thought about, but not implemented. A tiny - wrapper script can handle such things... */ - if (o_listen) { - curport = 0; /* rem port *can* be zero here... */ - if (argv[optind]) { /* any rem-port-arg? */ - curport = getportpoop (argv[optind], 0); - if (curport == 0) /* if given, demand correctness */ - bail ("invalid port %s", argv[optind]); - } /* if port-arg */ - netfd = dolisten (themaddr, curport, ouraddr, o_lport); -/* dolisten does its own connect reporting, so we don't holler anything here */ - if (netfd > 0) { -#ifdef GAPING_SECURITY_HOLE - if (pr00gie) /* -e given? */ - doexec (netfd); -#endif /* GAPING_SECURITY_HOLE */ - x = readwrite (netfd); /* it even works with UDP! */ - if (o_verbose > 1) /* normally we don't care */ - holler (wrote_txt, wrote_net, wrote_out); - exit (x); /* "pack out yer trash" */ - } else /* if no netfd */ - bail ("no connection"); - } /* o_listen */ - -/* fall thru to outbound connects. Now we're more picky about args... */ - if (! themaddr) - bail ("no destination"); - if (argv[optind] == NULL) - bail ("no port[s] to connect to"); - if (argv[optind + 1]) /* look ahead: any more port args given? */ - Single = 0; /* multi-mode, case A */ - ourport = o_lport; /* which can be 0 */ - -/* everything from here down is treated as as ports and/or ranges thereof, so - it's all enclosed in this big ol' argv-parsin' loop. Any randomization is - done within each given *range*, but in separate chunks per each succeeding - argument, so we can control the pattern somewhat. */ - while (argv[optind]) { - hiport = loport = 0; - cp = strchr (argv[optind], '-'); /* nn-mm range? */ - if (cp) { - *cp = '\0'; - cp++; - hiport = getportpoop (cp, 0); - if (hiport == 0) - bail ("invalid port %s", cp); - } /* if found a dash */ - loport = getportpoop (argv[optind], 0); - if (loport == 0) - bail ("invalid port %s", argv[optind]); - if (hiport > loport) { /* was it genuinely a range? */ - Single = 0; /* multi-mode, case B */ - curport = hiport; /* start high by default */ - if (o_random) { /* maybe populate the random array */ - loadports (randports, loport, hiport); - curport = nextport (randports); - } - } else /* not a range, including args like "25-25" */ - curport = loport; -Debug (("Single %d, curport %d", Single, curport)) - -/* Now start connecting to these things. curport is already preloaded. */ - while (loport <= curport) { - if ((! o_lport) && (o_random)) { /* -p overrides random local-port */ - ourport = (RAND() & 0xffff); /* random local-bind -- well above */ - if (ourport < 8192) /* resv and any likely listeners??? */ - ourport += 8192; /* if it *still* conflicts, use -s. */ - } - curport = getportpoop (NULL, curport); - netfd = doconnect (themaddr, curport, ouraddr, ourport); -Debug (("netfd %d from port %d to port %d", netfd, ourport, curport)) - if (netfd > 0) - if (o_zero && o_udpmode) /* if UDP scanning... */ - netfd = udptest (netfd, themaddr); - if (netfd > 0) { /* Yow, are we OPEN YET?! */ - x = 0; /* pre-exit status */ - holler ("%s [%s] %d (%s) open", - whereto->name, whereto->addrs[0], curport, portpoop->name); -#ifdef GAPING_SECURITY_HOLE - if (pr00gie) /* exec is valid for outbound, too */ - doexec (netfd); -#endif /* GAPING_SECURITY_HOLE */ - if (! o_zero) - x = readwrite (netfd); /* go shovel shit */ - } else { /* no netfd... */ - x = 1; /* preload exit status for later */ -/* if we're scanning at a "one -v" verbosity level, don't print refusals. - Give it another -v if you want to see everything. */ - if ((Single || (o_verbose > 1)) || (errno != ECONNREFUSED)) - holler ("%s [%s] %d (%s)", - whereto->name, whereto->addrs[0], curport, portpoop->name); - } /* if netfd */ - close (netfd); /* just in case we didn't already */ - if (o_interval) - sleep (o_interval); /* if -i, delay between ports too */ - if (o_random) - curport = nextport (randports); - else - curport--; /* just decrement... */ - } /* while curport within current range */ - optind++; - } /* while remaining port-args -- end of big argv-ports loop*/ - - errno = 0; - if (o_verbose > 1) /* normally we don't care */ - holler (wrote_txt, wrote_net, wrote_out); - if (Single) - exit (x); /* give us status on one connection */ - exit (0); /* otherwise, we're just done */ -} /* main */ - -#ifdef HAVE_HELP /* unless we wanna be *really* cryptic */ -/* helpme : - the obvious */ -void helpme() -{ - o_verbose = 1; - holler ("[v1.10]\n\ -connect to somewhere: nc [-options] hostname port[s] [ports] ... \n\ -listen for inbound: nc -l -p port [-options] [hostname] [port]\n\ -options:"); -/* sigh, this necessarily gets messy. And the trailing \ characters may be - interpreted oddly by some compilers, generating or not generating extra - newlines as they bloody please. u-fix... */ -#ifdef GAPING_SECURITY_HOLE /* needs to be separate holler() */ - holler ("\ - -e prog program to exec after connect [dangerous!!]"); -#endif - holler ("\ - -g gateway source-routing hop point[s], up to 8\n\ - -G num source-routing pointer: 4, 8, 12, ...\n\ - -h this cruft\n\ - -i secs delay interval for lines sent, ports scanned\n\ - -l listen mode, for inbound connects\n\ - -n numeric-only IP addresses, no DNS\n\ - -o file hex dump of traffic\n\ - -p port local port number\n\ - -q secs after EOF on stdin, wait the specified number\n\ - of seconds and then quit. If seconds is\n\ - negative, wait forever.\n\ - -r randomize local and remote ports\n\ - -s addr local source address"); -#ifdef TELNET - holler ("\ - -t answer TELNET negotiation"); -#endif - holler ("\ - -u UDP mode\n\ - -v verbose [use twice to be more verbose]\n\ - -w secs timeout for connects and final net reads\n\ - -z zero-I/O mode [used for scanning]"); - bail ("port numbers can be individual or ranges: lo-hi [inclusive]"); -} /* helpme */ -#endif /* HAVE_HELP */ - -/* None genuine without this seal! _H*/ diff --git a/src/data/package_infos/arm/haiku b/src/data/package_infos/arm/haiku index e68b896..c19250f 100644 --- a/src/data/package_infos/arm/haiku +++ b/src/data/package_infos/arm/haiku @@ -38,7 +38,6 @@ provides { cmd:hey cmd:login cmd:more - cmd:netcat cmd:passwd cmd:ping cmd:ping6 diff --git a/src/data/package_infos/m68k/haiku b/src/data/package_infos/m68k/haiku index 054a4f2..30d7543 100644 --- a/src/data/package_infos/m68k/haiku +++ b/src/data/package_infos/m68k/haiku @@ -38,7 +38,6 @@ provides { cmd:hey cmd:login cmd:more - cmd:netcat cmd:passwd cmd:ping cmd:ping6 diff --git a/src/data/package_infos/ppc/haiku b/src/data/package_infos/ppc/haiku index 7f6b8ad..6ea67fc 100644 --- a/src/data/package_infos/ppc/haiku +++ b/src/data/package_infos/ppc/haiku @@ -38,7 +38,6 @@ provides { cmd:hey cmd:login cmd:more - cmd:netcat cmd:passwd cmd:ping cmd:ping6 diff --git a/src/data/package_infos/x86/haiku b/src/data/package_infos/x86/haiku index 48ead63..bacf9bf 100644 --- a/src/data/package_infos/x86/haiku +++ b/src/data/package_infos/x86/haiku @@ -38,7 +38,6 @@ provides { cmd:hey cmd:login cmd:more - cmd:netcat cmd:passwd cmd:ping cmd:ping6 diff --git a/src/data/package_infos/x86_64/haiku b/src/data/package_infos/x86_64/haiku index 4f0839d..fa08e8c0 100644 --- a/src/data/package_infos/x86_64/haiku +++ b/src/data/package_infos/x86_64/haiku @@ -37,7 +37,6 @@ provides { cmd:hey cmd:login cmd:more - cmd:netcat cmd:passwd cmd:ping cmd:ping6 diff --git a/src/data/package_infos/x86_gcc2/haiku b/src/data/package_infos/x86_gcc2/haiku index 2b2cac0..9fe33c6 100644 --- a/src/data/package_infos/x86_gcc2/haiku +++ b/src/data/package_infos/x86_gcc2/haiku @@ -38,7 +38,6 @@ provides { cmd:hey cmd:login cmd:more - cmd:netcat cmd:passwd cmd:ping cmd:ping6