freebsd-src/contrib/tcsh
Roman Divacky e05b498065 Fix tcsh losing history when tcsh terminates because the pty beneath it
is closed.

Diagnosed by Ted Anderson:

New signal queuing logic was introduced in 6.15 and allows the signal handlers
to be run explicitly by calling handle_pending_signals, instead of
immediately when the signal is delivered.  This function is called at
various places, typically when receiving a EINTR from a slow system call
such as read or write.  In the pty exit case, it was called from xwrite,
called from flush, while printing the "exit" message after receiving EOF
when reading from the pty (note that the read did not return EINTR but
zero bytes, indicating EOF).  The SIGHUP handler, phup(), called
rechist, which opened the history file and began writing the merged
history to it.  This process invoked flush recursively to actually write
the data.  In this case, however, the flush noticed it was being called
recursively and decided fail by calling stderror.

My conclusion was that the signal was being handled at a bad time.  But
whether to fix flush not to care about the recursive call, or to handle
the signal some other time and when to handle it, was unclear to me.
However, by adding an extra call to handle_pending_signals, just after
process() returns to main(), I was able to avoid the truncated history
after network outages and similar failures.  I verified this fix in
version 6.17.

Approved by:	ed (mentor)
MFC after:	1 week
2009-10-06 20:19:16 +00:00
..
config Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
nls Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
complete.tcsh Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
config_f.h Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
config.guess Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
config.h.in Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
config.rpath Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
config.sub Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
configure Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
configure.in Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
csh-mode.el Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
ed.chared.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
ed.decls.h Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
ed.defns.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
ed.h Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
ed.init.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
ed.inputl.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
ed.refresh.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
ed.screen.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
ed.term.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
ed.term.h Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
ed.xmap.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
eight-bit.me Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
FAQ Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
Fixes Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
FREEBSD-upgrade Build updates for tcsh-6.15.00 import. 2007-03-11 22:41:19 +00:00
FREEBSD-Xlist Build updates for tcsh-6.15.00 import. 2007-03-11 22:41:19 +00:00
gethost.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
glob.3 Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
glob.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
glob.h Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
host.defs Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
imake.config Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
Imakefile Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
install-sh Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
ma.setp.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
MAKEDIFFS Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
Makefile.in Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
Makefile.std Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
Makefile.vms Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
MAKESHAR Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
mi.termios.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
mi.varargs.h Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
mi.wait.h Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
NewThings Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
patchlevel.h Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
pathnames.h Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
Ported Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
README Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
README.imake Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
sh.c Fix tcsh losing history when tcsh terminates because the pty beneath it 2009-10-06 20:19:16 +00:00
sh.char.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.char.h Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.decls.h Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.dir.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.dir.h Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
sh.dol.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.err.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.exec.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.exp.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.file.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.func.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.glob.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.h Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.hist.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
sh.init.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
sh.lex.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.misc.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
sh.parse.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
sh.print.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
sh.proc.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.proc.h Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.sem.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.set.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
sh.time.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
sh.types.h Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
snames.h Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
src.desc Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tc.alloc.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tc.bind.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
tc.const.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
tc.decls.h Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
tc.disc.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tc.func.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
tc.h Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tc.nls.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tc.nls.h Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tc.os.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tc.os.h Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
tc.printf.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tc.prompt.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tc.sched.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tc.sig.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tc.sig.h Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
tc.str.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
tc.vers.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tc.wait.h Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tc.who.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tcsh.man Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
tcsh.man2html Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
termcap.vms Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tw.color.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
tw.comp.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
tw.decls.h Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tw.h Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tw.help.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tw.init.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
tw.parse.c Update to tcsh 6.17.00. 2009-07-11 05:35:08 +00:00
tw.spell.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
vms.termcap.c Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
WishList Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00
Y2K Flatten vendor/tcsh/dist. 2009-07-10 21:00:38 +00:00

This is tcsh version 6.17.00.  Tcsh is a version of the Berkeley
C-Shell, with the addition of: a command line editor, command and file
name completion, listing, etc. and a bunch of small additions to the
shell itself.

Tcsh has been ported to most unix variants, and can be tinkered to work
in unix systems that it has not ported yet. See the Ported file for
a more complete list of ported systems and in the config directory for
a configuration file that matches your system.
Tcsh also runs under VMS/POSIX and OS/2+emx; the OS/2 port is not
complete yet.

Feel free to use it.  These changes to csh may only be included in a
commercial product if the inclusion or exclusion does not change the
purchase price, level of support, etc.  Please respect the individual
authors by giving credit where credit is due (in other words, don't
claim that you wrote portions that you haven't, and don't delete the
names of the authors from the source code or documentation).  

To install tcsh:

0)  Try running "./configure".  If that doesn't work, goto step 1.
    Run "./configure --help" to see possible options.  After running
    configure, goto step 3.

1)  Otherwise copy Makefile.std to Makefile. Look at the Makefile and
    make sure that you are using the right compilation flags.

2)  Copy the appropriate for your machine and OS config file from the
    config subdirectory into config.h.  Consult the file "Ported" for
    settings known to work on various machines.  If you are trying to
    compile tcsh on a machine for which there is no config file yet,
    you will need to create a config file using as a template one of
    the supplied ones.  If you get tcsh working on a new machine, I'd
    appreciate a copy of the config file plus additional information
    about the architecture/OS.  If you are creating a new config file,
    look very hard at BSDJOBS and BSDTIMES if you are running
    a non-BSD machine.  For vanila SysV, these would all be #undef-ed,
    but others may vary (such as A/UX or HPUX).  On a pyramid, compile
    in the UCB universe even if you are running under the ATT universe
    usually; it will work anyway, and you get job control for free.

3)  Look at config_f.h, and enable or disable any features you want.
    It is configured the way I like it, but you may disagree.

4)  Look at host.defs to make sure that you have the right defines to set
    the environment variables "HOSTTYPE", "MACHTYPE", "OSTYPE" and 
    "VENDOR" correctly.  If you need to make changes, PLEASE SEND THEM 
    BACK TO ME.

5)  You may want to adjust the DESTBIN and DESTMAN entries in
    the Makefile.  These are the directories that tcsh, and the tcsh.1
    man entry will be placed in when you do a "make install" and "make
    install.man" respectively.  If you decide to install tcsh somewhere
    other than in /usr/local/bin/tcsh, you should #define _PATH_TCSHELL
    "/your/installation/directory/tcsh" in pathnames.h.

6)  make

7)  Read the documentation while you are waiting.  The file tcsh.man
    is in standard [nt]roff -man format. If you like, you can run the
    tcsh.man2html script (requires Perl) to generate an HTML version of
    the manpage which you can read with Mosaic, lynx or other HTML browser.

8)  Test tcsh by typing ./tcsh to see that it has compiled correctly.
    The history command should give a time stamp on every entry.
    Typing normal characters should echo each exactly once.  Control-A
    should put the cursor at the beginning of the input line, but after
    the prompt.  Typing characters after that should insert them into
    the line.  If you have job control make sure that stopping and
    restarting jobs works. Make sure you can ^C in the middle of the
    input line.  Also make sure that pipelines work correctly and there
    are no races. Try 'echo | cat | cat | cat | cat | more' a couple of
    times. If you have job control, try this command in the background
    and bring it in the foreground when it stops for tty output.  Also
    make sure that the ioctl() modes are preserved.  Get into vi, enter
    and exit input mode and suspend it, background it and foreground it
    again. After all that, lastly make sure that the tty process group
    manipulation is happening correctly. Try ftp to some host. If your
    passwd appears on the screen, you have lost /dev/tty. Otherwise
    everything is fine.

9)  Once satisfied that tcsh is working correctly, complete the installation
    by typing "make install" to install the binary, and "make install.man" to
    install the documentation. Don't forget to look at complete.tcsh for
    useful completions...

10) Enjoy.

12) PLEASE file any bug reports (and fixes), code for new features at:

	http://bugs.gw.com/

    Comments, questions, etc. (even flames) are welcome via email to:

	The tcsh bugs mailing list
	tcsh-bugs@mx.gw.com

Various:

***************************************************************************

On sysv versions < 3.0 (not hpux) Doug Gwyn's public domain directory 
manipulation library has to be installed. This library is available
for anonymous ftp from prep.ai.mit.edu:/pub/gnu/dirent.tar.Z
If the network is not installed, then there is a gethostname()
routine is tc.os.c

***************************************************************************

On BSDreno, in ttyname() closedir() is called twice and so the same
pointer gets free'd twice. tcsh's malloc is picky and it prints an
error message to that effect. If you don't like the message:

1. Apply the following patch:

*** /usr/src/lib/libc/gen/ttyname.c.orig	Fri Jun  1 17:17:15 1990
--- /usr/src/lib/libc/gen/ttyname.c	Tue Oct 29 16:33:12 1991
***************
*** 51,57 ****
  		if (stat(buf, &sb2) < 0 || sb1.st_dev != sb2.st_dev ||
  		    sb1.st_ino != sb2.st_ino)
  			continue;
- 		closedir(dp);
  		rval = buf;
  		break;
  	}
--- 51,56 ----

Or: Comment the error printing out in tc.alloc.c
Or: Compile -DSYSMALLOC


***************************************************************************

From: Scott Krotz <krotz@honey.rtsg.mot.com>

Tcsh has been ported to minix by  Scott Krotz (krotz@honey.rtsg.mot.com).
Unfortunately the minix sed is broken, so you'll have to find a way to
make tc.const.h, sh.err.h, ed.defns.h which are automatically generated.
The easiest way to create them is to make a copy from unix, copying 
minix to config.h, and then 'make sh.err.h tc.const.h ed.defns.h'

The OS/dependent files are in mi.termios.h, mi.wait.h, mi.varargs.h

You will get some warnings, but dont worry about them, just ignore
them.  After tcsh has compiled and the gcc binary is converted to a
minix binary, remember to chmem it to give it more memory - it will
need it!  How much you need depends on how many aliases you have, etc..
Add at least 50000 to it.

One last thing.  You might have to make some links for include files so
that they are in the directories that tcsh is expecting while compiling.
I forget if I had to do this or not, but it should be fairly easy to sort
out.  If it cant find any include files this is probably the reason.

If you have any problems, please tell me.  I can be contacted through
e-mail at:

krotz@honey.rtsg.mot.com

I also read comp.os.minix on a regular basis, so a note there will get
my attention also.

Have fun!

ps.  The termios functions are provided by Magnus Doell and Bruce Evans.
     Thanks, guys!


From: Bob Byrnes <byrnes@ee.cornell.edu>

This is for minix 1.5 (straight out of the box from P-H) plus the i386
patches from Bruce Evans.

I cross-compiled on a Sun using gcc 2.1 with a target of i386-bsd
(using the minix include files instead of the bsd versions), and then
linked the resulting object files with similarly compiled crtso.o and
libc.a on vax (little endian) using a hacked version of ld which I put
together to generate minix executables instead of bsd a.out format.
What a kludge ...

I compiled with -O2 -Wall ...  So far I haven't noticed any problems
with the optimizer.

In case anyone is contemplating compiling tcsh with bcc (Bruce Evan's
i386 compiler that comes with the minix386 upgrade package), don't bother.
It is some serious bugs that kill tcsh when compiled for 16-bit characters.
I can provide more details of bugs that I noticed for brave souls who want
to try, but it would be hard (and why bother if you can get gcc?).

I can make the binary available to anyone who wants it (for example people
who can't get access to a cross-compiling environment, and who don't yet
have gcc running under minix).


***************************************************************************

If your compiler cannot handle long symbol names, add 

#include "snames.h" 

to your config.h file

	     -- Christos Zoulas
		christos@zoulas.com