summaryrefslogtreecommitdiffstats
path: root/source/n/nc/nc-110-21.diff
blob: ad5ae8ad691ffc18e25198c742d5fe51b5857c1c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
--- netcat-1.10.orig/Makefile
+++ netcat-1.10/Makefile
@@ -14,8 +14,8 @@
 XLIBS =		# xtra libs if necessary?
 # -Bstatic for sunos,  -static for gcc, etc.  You want this, trust me.
 STATIC =
-CC = cc $(CFLAGS)
-LD = $(CC) -s	# linker; defaults to stripped executables
+CC = gcc $(CFLAGS)
+LD = $(CC)	# linker; defaults to unstripped executables
 o = o		# object extension
 
 ALL = nc
--- netcat-1.10.orig/debian/nc.1
+++ netcat-1.10/debian/nc.1
@@ -0,0 +1,146 @@
+.TH NC 1 
+.SH NAME
+nc \- TCP/IP swiss army knife
+.SH SYNOPSIS
+.B nc
+.I "[-options] hostname port[s] [ports] ..."
+.br
+.B nc
+.I "-l -p port [-options] [hostname] [port]"
+.SH "DESCRIPTION"
+.B netcat
+is a simple unix utility which reads and writes data across network
+connections, using TCP or UDP protocol. It is designed to be a
+reliable "back-end" tool that can be used directly or easily driven by
+other programs and scripts.  At the same time, it is a feature-rich
+network debugging and exploration tool, since it can create almost any
+kind of connection you would need and has several interesting built-in
+capabilities.  Netcat, or "nc" as the actual program is named, should
+have been supplied long ago as another one of those cryptic but
+standard Unix tools.
+.P
+In the simplest usage, "nc host port" creates a TCP connection to the
+given port on the given target host.  Your standard input is then sent
+to the host, and anything that comes back across the connection is
+sent to your standard output.  This continues indefinitely, until the
+network side of the connection shuts down.  Note that this behavior is
+different from most other applications which shut everything down and
+exit after an end-of-file on the standard input.
+.P
+Netcat can also function as a server, by listening for inbound
+connections on arbitrary ports and then doing the same reading and
+writing.  With minor limitations, netcat doesn't really care if it
+runs in "client" or "server" mode -- it still shovels data back and
+forth until there isn't any more left. In either mode, shutdown can be
+forced after a configurable time of inactivity on the network side.
+.P
+And it can do this via UDP too, so netcat is possibly the "udp
+telnet-like" application you always wanted for testing your UDP-mode
+servers.  UDP, as the "U" implies, gives less reliable data
+transmission than TCP connections and some systems may have trouble
+sending large amounts of data that way, but it's still a useful
+capability to have.
+.P
+You may be asking "why not just use telnet to connect to arbitrary
+ports?" Valid question, and here are some reasons.  Telnet has the
+"standard input EOF" problem, so one must introduce calculated delays
+in driving scripts to allow network output to finish.  This is the
+main reason netcat stays running until the *network* side closes.
+Telnet also will not transfer arbitrary binary data, because certain
+characters are interpreted as telnet options and are thus removed from
+the data stream.  Telnet also emits some of its diagnostic messages to
+standard output, where netcat keeps such things religiously separated
+from its *output* and will never modify any of the real data in
+transit unless you *really* want it to.  And of course telnet is
+incapable of listening for inbound connections, or using UDP instead.
+Netcat doesn't have any of these limitations, is much smaller and
+faster than telnet, and has many other advantages.
+.SH OPTIONS
+.TP 13
+.I \-g gateway
+source-routing hop point[s], up to 8
+.TP 13
+.I \-G num
+source-routing pointer: 4, 8, 12, ...
+.TP 13
+.I \-h
+display help
+.TP 13
+.I \-i secs
+delay interval for lines sent, ports scanned
+.TP 13
+.I \-l
+listen mode, for inbound connects
+.TP 13
+.I \-n
+numeric-only IP addresses, no DNS
+.TP 13
+.I \-o file
+hex dump of traffic
+.TP 13
+.I \-p port
+local port number (port numbers can be individual or ranges: lo-hi
+[inclusive])
+.TP 13
+.I \-q seconds
+after EOF is detected, wait the specified number of seconds and then
+quit.
+.TP 13
+.I \-b
+allow UDP broadcasts
+.TP 13
+.I \-r
+randomize local and remote ports
+.TP 13
+.I \-s addr
+local source address
+.TP 13
+.I \-t
+enable telnet negotiation
+.TP 13
+.I \-e prog
+specify program to exec after connect (use with caution)
+.TP 13
+.I \-u
+UDP mode
+.TP 13
+.I \-v
+verbose [use twice to be more verbose]
+.TP 13
+.I \-w secs
+timeout for connects and final net reads
+.TP 13
+.I \-z
+zero-I/O mode [used for scanning]
+.SH COPYRIGHT
+Netcat is entirely my own creation, although plenty of other code was
+used as examples.  It is freely given away to the Internet community
+in the hope that it will be useful, with no restrictions except giving
+credit where it is due.  No GPLs, Berkeley copyrights or any of that
+nonsense.  The author assumes NO responsibility for how anyone uses
+it.  If netcat makes you rich somehow and you're feeling generous,
+mail me a check.  If you are affiliated in any way with Microsoft
+Network, get a life.  Always ski in control.  Comments, questions, and
+patches to hobbit@avian.org.
+.SH BUGS
+Efforts have been made to have netcat "do the right thing" in all its
+various modes.  If you believe that it is doing the wrong thing under
+whatever circumstances, please notify me and tell me how you think it
+should behave.  If netcat is not able to do some task you think up,
+minor tweaks to the code will probably fix that.  It provides a basic
+and easily-modified template for writing other network applications,
+and I certainly encourage people to make custom mods and send in any
+improvements they make to it. Continued feedback from the Internet
+community is always welcome!
+.P
+Some port names in /etc/services contain hyphens -- netcat currently
+will not correctly parse those, so specify ranges using numbers if you
+can.
+.SH "SEE ALSO"
+/usr/share/doc/netcat/README.gz
+.SH AUTHOR
+This manual page was written by Joey Hess <joeyh@debian.org> and
+Robert Woodcock <rcw@debian.org>, cribbing heavily from Netcat's
+README file.
+.P
+Netcat was written by a guy we know as the Hobbit <hobbit@avian.org>.
--- netcat-1.10.orig/debian/control
+++ netcat-1.10/debian/control
@@ -0,0 +1,18 @@
+Source: netcat
+Section: net
+Priority: optional
+Maintainer: Decklin Foster <decklin@red-bean.com>
+Standards-Version: 3.5.6
+Build-Depends: debhelper (>= 3.0.0)
+
+Package: netcat
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: TCP/IP swiss army knife
+ A simple Unix utility which reads and writes data across network 
+ connections using TCP or UDP protocol.  It is designed to be a reliable
+ "back-end" tool that can be used directly or easily driven by other 
+ programs and scripts. At the same time it is a feature-rich network
+ debugging and exploration tool, since it can create almost any kind of
+ connection you would need and has several interesting built-in 
+ capabilities.
--- netcat-1.10.orig/debian/netcat.examples
+++ netcat-1.10/debian/netcat.examples
@@ -0,0 +1,2 @@
+data/
+scripts/
--- netcat-1.10.orig/debian/rules
+++ netcat-1.10/debian/rules
@@ -0,0 +1,64 @@
+#!/usr/bin/make -f
+# Sample debian/rules that uses debhelper.
+# This file is public domain software, originally written by Joey Hess.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# This is the debhelper compatibility version to use.
+export DH_COMPAT=3
+
+DEB_CFLAGS = -O2
+ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS)))
+DEB_CFLAGS += -g
+endif
+
+build: build-stamp
+build-stamp:
+	dh_testdir
+	$(MAKE) linux CFLAGS='$(DEB_CFLAGS)' STATIC='' \
+	    DFLAGS='-DLINUX -DTELNET -DGAPING_SECURITY_HOLE'
+	touch build-stamp
+
+clean:
+	dh_testdir
+	dh_testroot
+	rm -f build-stamp
+	# Add here commands to clean up after the build process.
+	-$(MAKE) clean
+	dh_clean
+
+install:
+	dh_testdir
+	dh_testroot
+	dh_clean -k
+	dh_installdirs
+	install -m 0755 nc debian/netcat/usr/bin
+	ln -s nc debian/netcat/usr/bin/netcat
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+	dh_testdir
+	dh_testroot
+	dh_installdocs
+	dh_installexamples
+#	dh_installmenu
+	dh_installman
+	ln -s nc.1.gz debian/netcat/usr/share/man/man1/netcat.1.gz
+	dh_installchangelogs Changelog
+	dh_link
+	dh_strip
+	dh_compress -Xexamples
+	dh_fixperms
+	dh_installdeb
+	dh_shlibdeps
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install
--- netcat-1.10.orig/debian/netcat.copyright
+++ netcat-1.10/debian/netcat.copyright
@@ -0,0 +1,12 @@
+The netcat Debian package was originally created by Michael Shields
+<shields@crosslink.net>. It is currently maintained by Decklin Foster
+<decklin@red-bean.com>.
+
+Netcat was written by *Hobbit* <hobbit@avian.org>, and can be
+downloaded from <URL:ftp://avian.org/src/hacks/>.
+
+The following permission statement is excerpted from `netcat.blurb':
+
+  Netcat and the associated package is a product of Avian Research,
+  and is freely available in full source form with no restrictions
+  save an obligation to give credit where due.
--- netcat-1.10.orig/debian/changelog
+++ netcat-1.10/debian/changelog
@@ -0,0 +1,157 @@
+netcat (1.10-21) unstable; urgency=low
+
+  * Documented -e in man page. (Closes: #131269)
+
+ -- Decklin Foster <decklin@red-bean.com>  Tue, 29 Jan 2002 16:30:30 -0500
+
+netcat (1.10-20) unstable; urgency=low
+
+  * Moved around shutdown call in -q patch to be more compatible with standard
+    nc. Thanks to Dmitry Chernyak <cdl@inkasbank.ru> for pointing this out.
+  * Applied UDP broadcast patch from NetBSD (Closes: #108182)
+    - Updated man page to document this option
+    - Also applied patch to use inet_aton instead of IADDR_NONE (which is
+      obsolete), so that it will work.
+  * Bumped Standards-Version to 3.5.6
+
+ -- Decklin Foster <decklin@red-bean.com>  Tue,  9 Oct 2001 18:08:24 -0400
+
+netcat (1.10-19) unstable; urgency=low
+
+  * Reupload source package (my typo fix was lost due to a misconfigured
+    dput). This should really fix #97583.
+
+ -- Decklin Foster <decklin@red-bean.com>  Fri,  1 Jun 2001 18:18:17 -0400
+
+netcat (1.10-18) unstable; urgency=low
+
+  * Applied patch from Joe Pepin <jdp@ll.mit.edu> to fix multiple timeouts
+    (Closes: #97583)
+  * Lookup services with getservbyname even if resolving hostnames with DNS is
+    disabled (Closes: #98902)
+  * Install a symlink to the nc binary called 'netcat'. (Closes: #97625)
+
+ -- Decklin Foster <decklin@red-bean.com>  Fri,  1 Jun 2001 13:13:25 -0400
+
+netcat (1.10-17) unstable; urgency=low
+
+  * Added include for <resolv.h>, which is needed to compile with recent
+    versions of glibc.
+  * Added patch to always print "connection refused" messages, without having
+    to turn on the other junk that -v prints. (Closes: #65413)
+  * Upgraded to debhelper 3 and policy 3.5.2.0.
+  * Added DEB_BUILD_OPTIONS =~ /debug/ support.
+
+ -- Decklin Foster <decklin@red-bean.com>  Wed, 28 Feb 2001 16:53:33 -0500
+
+netcat (1.10-16) unstable; urgency=low
+
+  * Rebuild with dpkg 1.8.1.2 to fix bad .diff.gz
+
+ -- Decklin Foster <decklin@red-bean.com>  Mon,  8 Jan 2001 14:54:48 -0500
+
+netcat (1.10-15) unstable; urgency=low
+
+  * Add shutdown() patch back in (Closes: #81384)
+  * updated /usr/doc -> /usr/share/doc in man page.
+
+ -- Decklin Foster <decklin@red-bean.com>  Sat,  6 Jan 2001 08:58:21 -0500
+
+netcat (1.10-14) unstable; urgency=low
+
+  * Ship with -e turned on. (Closes: #66355)
+  * Fix debian/copyright typo.
+
+ -- Decklin Foster <decklin@red-bean.com>  Sat, 30 Dec 2000 13:27:33 -0500
+
+netcat (1.10-13) unstable; urgency=low
+
+  * New maintainer. (Closes: #80305)
+  * Updated debhelper rules to v2. Also cleaned up/moved some targets and dh_*
+    options.
+  * Bumped Standards-Version to 3.2.1.0.
+  * Compress README file, as per policy.
+  * Applied -q patch properly (Closes: #62402). I think that this is also what
+    caused #71616, but I'll hold off on closing that one.
+  * Added README.Debian explanation about -e. This is possibly the problem
+    behind #66355, so maybe I can close that as well.
+
+ -- Decklin Foster <decklin@red-bean.com>  Thu, 28 Dec 2000 19:02:56 -0500
+
+netcat (1.10-12.1) frozen unstable; urgency=low
+
+  * Non-maintained upload.
+  * Rename arm() to arm_timer() (Closes: #56390) 
+
+ -- Edward Brocklesby <ejb@styx.uucp.openprojects.net>  Tue, 22 Feb 2000 12:59:12 +0000
+
+netcat (1.10-12) unstable; urgency=low
+
+  * Fixed bugs #45669 and #45675 (removed extraneous sleep(1) command and also
+    removed the "punt!" message; added -q feature)
+
+ -- Robert S. Edmonds <stu@novare.net>  Wed, 22 Sep 1999 19:29:47 -0400
+
+netcat (1.10-11) unstable; urgency=low
+
+  * Applied patch from Graham Stoney <greyham@research.canon.com.au> that
+    fixes deadlock if the server doesn't close its end until it reads EOF on
+    the connection
+
+ -- Robert S. Edmonds <stu@novare.net>  Mon, 13 Sep 1999 21:53:59 -0400
+
+netcat (1.10-10) unstable; urgency=low
+
+  * Man page fixed (/usr/doc/netcat/README.gz). Fixes bug #35811
+
+ -- Robert S. Edmonds <edmonds@freewwweb.com>  Sat, 12 Jun 1999 15:21:31 -0400
+
+netcat (1.10-9) unstable; urgency=low
+
+  * Compiled with -DTELNET.
+
+ -- Robert S. Edmonds <edmonds@freewwweb.com>  Wed,  4 Nov 1998 09:27:40 -0500
+
+netcat (1.10-8) unstable frozen; urgency=low
+
+  * At the request of many users (and a few bug reports) the binary is now
+    going to be called "nc" as it always was.
+
+ -- Robert S. Edmonds <edmonds@freewwweb.com>  Sun, 26 Apr 1998 19:36:00 -0400
+
+netcat (1.10-7) unstable; urgency=low
+
+  * Fixed lintian error possible-name-space-pollution. (binary nc -> netcat)
+
+ -- Robert S. Edmonds <edmonds@freewwweb.com>  Mon, 30 Mar 1998 19:11:49 -0500
+
+netcat (1.10-6) unstable; urgency=low
+
+  * Upgraded to Standards-Version 2.4.0.0.
+
+ -- Robert S. Edmonds <edmonds@freewwweb.com>  Tue, 17 Feb 1998 13:06:22 -0500
+
+netcat (1.10-5) unstable; urgency=low
+
+  * Merged in changes from Robert Woodcock <rcw@oz.net>.
+    - Man page updates.
+    - Compiled with -DTELNET
+  * Removed bogus menu file.
+  * Full source upload.
+
+ -- Joey Hess <joeyh@master.debian.org>  Sat, 10 Jan 1998 13:53:59 -0500
+
+netcat (1.10-4) unstable; urgency=low
+
+  * Updated to "new" source format. (#9489)
+  * Libc6. (#11716)
+  * Orphaned the package.
+  * Fixed up description in control file to conform with policy, short
+    description doesn't include package name now.
+  * Fixed documentation location to comply with current policy. (#13194,
+    #11530, #9785)
+  * Wrote a man page. (#9785, #5304, #6647)
+  * Rewrote debian/rules to use debhelper.
+  * Install upstream changelog.
+
+ -- Joey Hess <joeyh@master.debian.org>  Sat, 10 Jan 1998 00:53:45 -0500
--- netcat-1.10.orig/debian/netcat.manpages
+++ netcat-1.10/debian/netcat.manpages
@@ -0,0 +1 @@
+debian/nc.1
--- netcat-1.10.orig/debian/netcat.README.Debian
+++ netcat-1.10/debian/netcat.README.Debian
@@ -0,0 +1,17 @@
+netcat for Debian
+-----------------
+
+netcat has been compiled with -DGAPING_SECURITY_HOLE turned on. I do
+not believe this is as much of a security hole as the author makes it
+out to be, *if* you know what you're doing (but then, if you didn't,
+you'd still be using telnet ;-)). Since the spawned program will run
+as whatever user started netcat, don't use -e as root. You have been
+warned, so if some cracker breaks into your system due to your own
+stupidity, don't blame me.
+
+A symlink to the netcat binary called 'netcat' has been installed.
+However, the canonical name is still 'nc'. If you use netcat on other
+systems, it will probably only be installed as 'nc', so keep this in
+mind when writing scripts.
+
+ -- Decklin Foster <decklin@red-bean.com>  Fri,  1 Jun 2001 13:38:10 -0400
--- netcat-1.10.orig/debian/netcat.dirs
+++ netcat-1.10/debian/netcat.dirs
@@ -0,0 +1 @@
+usr/bin
--- netcat-1.10.orig/debian/netcat.docs
+++ netcat-1.10/debian/netcat.docs
@@ -0,0 +1 @@
+README
--- netcat-1.10.orig/netcat.c
+++ netcat-1.10/netcat.c
@@ -59,6 +59,14 @@
 #define RAND rand
 #endif /* HAVE_RANDOM */
 
+/* #define POSIX_SETJMP		/* If you want timeouts to work under the */
+				/* posixly correct, yet non-standard glibc-2.x*/
+				/* then define this- you may also need it for */
+				/* IRIX, and maybe some others */
+#ifdef LINUX
+#define POSIX_SETJMP
+#endif
+
 /* includes: */
 #include <sys/time.h>		/* timeval, time_t */
 #include <setjmp.h>		/* jmp_buf et al */
@@ -73,6 +81,9 @@
 #include <errno.h>
 #include <signal.h>
 #include <fcntl.h>		/* O_WRONLY et al */
+#ifdef LINUX			/* Linux needs the HERE, oh well. */
+#include <resolv.h>
+#endif
 
 /* handy stuff: */
 #define SA struct sockaddr	/* socket overgeneralization braindeath */
@@ -106,7 +117,11 @@
 #define PINF struct port_poop
 
 /* globals: */
+#ifdef POSIX_SETJMP
+sigjmp_buf jbuf;		/* timer crud */
+#else
 jmp_buf jbuf;			/* timer crud */
+#endif
 int jval = 0;			/* timer crud */
 int netfd = -1;
 int ofd = 0;			/* hexdump output fd */
@@ -151,6 +166,7 @@
 
 /* global cmd flags: */
 USHORT o_alla = 0;
+USHORT o_allowbroad = 0;
 unsigned int o_interval = 0;
 USHORT o_listen = 0;
 USHORT o_nflag = 0;
@@ -160,6 +176,7 @@
 USHORT o_verbose = 0;
 unsigned int o_wait = 0;
 USHORT o_zero = 0;
+int o_quit = -1; /* 0 == quit-now; >0 == quit after o_quit seconds */
 /* o_tn in optional section */
 
 /* Debug macro: squirt whatever message and sleep a bit so we can see it go
@@ -211,7 +228,6 @@
   o_verbose = 1;
   holler (str, p1, p2, p3, p4, p5, p6);
   close (netfd);
-  sleep (1);
   exit (1);
 } /* bail */
 
@@ -222,7 +238,15 @@
   errno = 0;
   if (o_verbose > 1)		/* normally we don't care */
     bail (wrote_txt, wrote_net, wrote_out);
-  bail (" punt!");
+  bail ("");
+}
+
+/* quit :
+   handler for a "-q" timeout (exit 0 instead of 1) */
+void quit()
+{
+  close(netfd);
+  exit(0);
 }
 
 /* timeout and other signal handling cruft */
@@ -232,12 +256,16 @@
   alarm (0);
   if (jval == 0)
     bail ("spurious timer interrupt!");
+#ifdef POSIX_SETJMP
+  siglongjmp (jbuf, jval);
+#else
   longjmp (jbuf, jval);
+#endif
 }
 
-/* arm :
+/* arm_timer :
    set the timer.  Zero secs arg means unarm */
-void arm (num, secs)
+void arm_timer (num, secs)
   unsigned int num;
   unsigned int secs;
 {
@@ -250,7 +278,7 @@
     alarm (secs);
     jval = num;
   } /* if secs */
-} /* arm */
+} /* arm_timer */
 
 /* Hmalloc :
    malloc up what I want, rounded up to *4, and pre-zeroed.  Either succeeds
@@ -333,6 +361,7 @@
   struct in_addr iaddr;
   register HINF * poop = NULL;
   register int x;
+  int rc;
 
 /* 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
@@ -361,9 +390,9 @@
     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);
+  rc = inet_aton(name, &iaddr);
 
-  if (iaddr.s_addr == INADDR_NONE) {	/* here's the great split: names... */
+  if (rc == 0) {	/* here's the great split: names... */
     if (numeric)
       bail ("Can't parse %s as an IP address", name);
     hostent = gethostbyname (name);
@@ -444,8 +473,10 @@
     if (pstring)			/* one or the other, pleeze */
       return (0);
     x = pnum;
-    if (o_nflag)			/* go faster, skip getservbyblah */
-      goto gp_finish;
+    /* disabled, see bug #98902. if this is *really* slowing someone
+     * down I'll reconsider. */
+    /* 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) {
@@ -620,6 +651,13 @@
   rr = setsockopt (nnetfd, SOL_SOCKET, SO_REUSEADDR, &x, sizeof (x));
   if (rr == -1)
     holler ("nnetfd reuseaddr failed");		/* ??? */
+#ifdef SO_BROADCAST
+  if (o_allowbroad) {
+    rr = setsockopt (nnetfd, SOL_SOCKET, SO_BROADCAST, &x, sizeof (x));
+    if (rr == -1)
+       holler ("nnetfd reuseaddr failed");         /* ??? */
+  }
+#endif
 #ifdef SO_REUSEPORT	/* doesnt exist everywhere... */
   rr = setsockopt (nnetfd, SOL_SOCKET, SO_REUSEPORT, &x, sizeof (x));
   if (rr == -1)
@@ -743,14 +781,23 @@
   } /* if gatesidx */
 
 /* wrap connect inside a timer, and hit it */
-  arm (1, o_wait);
+  arm_timer (1, o_wait);
+#ifdef POSIX_SETJMP
+  if (sigsetjmp (jbuf,1) == 0) {
+    rr = connect (nnetfd, (SA *)remend, sizeof (SA));
+  } else {				/* setjmp: connect failed... */
+    rr = -1;
+    errno = ETIMEDOUT;			/* fake it */
+  }
+#else
   if (setjmp (jbuf) == 0) {
     rr = connect (nnetfd, (SA *)remend, sizeof (SA));
   } else {				/* setjmp: connect failed... */
     rr = -1;
     errno = ETIMEDOUT;			/* fake it */
   }
-  arm (0, 0);
+#endif
+  arm_timer (0, 0);
   if (rr == 0)
     return (nnetfd);
   close (nnetfd);			/* clean up junked socket FD!! */
@@ -820,14 +867,15 @@
    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 */
+    arm_timer (2, o_wait);		/* might as well timeout this, too */
+#ifdef POSIX_SETJMP
+    if (sigsetjmp (jbuf,1) == 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);
+    arm_timer (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
@@ -842,15 +890,45 @@
     rr = connect (nnetfd, (SA *)remend, sizeof (SA));
     goto whoisit;
   } /* o_udpmode */
+#else
+    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 */ 
+#endif
 
 /* fall here for TCP */
   x = sizeof (SA);		/* retval for accept */
-  arm (2, o_wait);		/* wrap this in a timer, too; 0 = forever */
+  arm_timer (2, o_wait);		/* wrap this in a timer, too; 0 = forever */
+#ifdef POSIX_SETJMP
+  if (sigsetjmp (jbuf,1) == 0) {
+    rr = accept (nnetfd, (SA *)remend, &x);
+  } else
+    goto dol_tmo;		/* timeout */
+#else
   if (setjmp (jbuf) == 0) {
     rr = accept (nnetfd, (SA *)remend, &x);
   } else
     goto dol_tmo;		/* timeout */
-  arm (0, 0);
+#endif
+  arm_timer (0, 0);
   close (nnetfd);		/* dump the old socket */
   nnetfd = rr;			/* here's our new one */
 
@@ -1216,6 +1294,18 @@
 	if (rr <= 0) {			/* at end, or fukt, or ... */
 	  FD_CLR (0, ding1);		/* disable and close stdin */
 	  close (0);
+	  /* if the user asked to exit on EOF, do it */
+	  if (o_quit == 0) {
+	    shutdown(netfd, 1);
+	    close (fd);
+	    exit (0);
+	  }
+	  /* if user asked to die after a while, arrange for it */
+	  if (o_quit > 0) {
+	    shutdown(netfd, 1);
+	    signal (SIGALRM, quit);
+	    alarm(o_quit);
+	  }
 	} else {
 	  rzleft = rr;
 	  zp = bigbuf_in;
@@ -1389,12 +1479,14 @@
 
 /* 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:rs:tuvw:z")) != EOF) {
+  while ((x = getopt (argc, argv, "abe: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;
+      case 'b':
+	o_allowbroad++; break;
 #ifdef GAPING_SECURITY_HOLE
       case 'e':				/* prog to exec */
 	pr00gie = optarg;
@@ -1443,6 +1535,8 @@
 	break;
       case 'r':				/* randomize various things */
 	o_random++; break;
+      case 'q':				/* quit after stdin does EOF */
+	o_quit = atoi(optarg); 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
@@ -1602,8 +1696,16 @@
 /* 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))
+	{
+	  /* bug 65413 - if we're not scanning, we always want an
+	   * error to be printed for refused connects. This is a
+	   * disgustingly ugly way to do it, I really should just
+	   * rewrite the holler() interface... */
+	  if (Single) o_verbose++;
 	  holler ("%s [%s] %d (%s)",
 	    whereto->name, whereto->addrs[0], curport, portpoop->name);
+	  if (Single) o_verbose--;
+	}
       } /* if netfd */
       close (netfd);			/* just in case we didn't already */
       if (o_interval)
@@ -1642,6 +1744,7 @@
 	-e prog			program to exec after connect [dangerous!!]");
 #endif
   holler ("\
+	-b			allow broadcasts\n\
 	-g gateway		source-routing hop point[s], up to 8\n\
 	-G num			source-routing pointer: 4, 8, 12, ...\n\
 	-h			this cruft\n\
@@ -1651,6 +1754,7 @@
 	-o file			hex dump of traffic\n\
 	-p port			local port number\n\
 	-r			randomize local and remote ports\n\
+	-q secs			quit after EOF on stdin and delay of secs\n\
 	-s addr			local source address");
 #ifdef TELNET
   holler ("\