home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume34 / pdksh / patch08 next >
Text File  |  1992-12-12  |  29KB  |  1,147 lines

  1. Newsgroups: comp.sources.misc
  2. From: sjg@zen.void.oz.au (Simon J. Gerraty)
  3. Subject:  v34i027:  pdksh - Public Domain Korn Shell, v4, Patch08
  4. Message-ID: <1992Dec13.033015.6978@sparky.imd.sterling.com>
  5. X-Md4-Signature: d7d38bc976062eec9124f1095b7e38f3
  6. Date: Sun, 13 Dec 1992 03:30:15 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: sjg@zen.void.oz.au (Simon J. Gerraty)
  10. Posting-number: Volume 34, Issue 27
  11. Archive-name: pdksh/patch08
  12. Environment: UNIX
  13. Patch-To: pdksh: Volume 25, Issue 47-55
  14.  
  15. This is patch08.
  16.  
  17. It contains a couple of very useful bug fixes.
  18. Including that of pipes such as:
  19.  
  20. $ zcat foo.tar.Z | tar tvf - | more
  21.  
  22. not terminating immediately when you press 'q'.
  23.  
  24. Apply this patch by changing directory to the root
  25. of the source tree and using the command:
  26.  
  27.     patch -p0 < this_file
  28.  
  29. The following is a complete list of patches to date.
  30.  
  31. # PD ksh Version 4
  32. Prereq: 09-Nov-91
  33. Prereq: 10-Nov-91
  34. Prereq: 25-Nov-91
  35. Prereq: 25-Apr-92
  36. Prereq: 26-Apr-92
  37. Prereq: 27-Apr-92
  38. Prereq: 12-May-92
  39. Prereq: 02-Aug-92
  40. Prereq: 12-Aug-92
  41. *** PATCHDATES.old    Thu Aug 13 00:14:06 1992
  42. --- PATCHDATES    Sun Dec  6 00:14:24 1992
  43. ***************
  44. *** 8,10 ****
  45. --- 8,11 ----
  46.   12-May-92
  47.   02-Aug-92
  48.   12-Aug-92
  49. + 05-Dec-92
  50. *** README.old    Tue May 12 19:30:10 1992
  51. --- README    Sun Dec  6 00:14:30 1992
  52. ***************
  53. *** 1,5 ****
  54.           Public Domain Korn Shell
  55. !               Version 4.5
  56.   
  57.   PD KSH:
  58.   
  59. --- 1,5 ----
  60.           Public Domain Korn Shell
  61. !               Version 4.8
  62.   
  63.   PD KSH:
  64.   
  65. ***************
  66. *** 7,18 ****
  67.   intended to be the ultimate shell but rather a usable ksh work
  68.   alike.  For those of us who have to work on multiple systems it
  69.   is nice to have the same user interface on all.  I resisted
  70. ! moving to the ksh on a Bull system at work for nearly a year due
  71. ! to the lack of a ksh on my Sun systems.  When I first picked up
  72. ! the 3.2 PD KSH a couple of years ago, it took only a few minutes
  73. ! to convert a C-shell fan to a ksh fan :-)  Pdksh is not 100%
  74. ! compatible with the ksh.  Having said that, I use it daily
  75. ! beside a real ksh88 and find them virtually indistinguishable.
  76.   
  77.   I only run this shell on sun's and only for interactive use.  I
  78.   use it on sun4c, sun3 and sun386 systems.  The shell itself has
  79. --- 7,20 ----
  80.   intended to be the ultimate shell but rather a usable ksh work
  81.   alike.  For those of us who have to work on multiple systems it
  82.   is nice to have the same user interface on all.  I resisted
  83. ! moving to the ksh on a System V machine where I worked, for
  84. ! nearly a year due to the lack of a ksh on my Sun systems.  When
  85. ! I first picked up the 3.2 PD KSH a couple of years ago, it took
  86. ! only a few minutes to convert a C-shell fan to a ksh fan :-)
  87. ! Pdksh is not 100% compatible with the ksh.  Having said that, I
  88. ! use it daily beside a real ksh88 and find them virtually
  89. ! indistinguishable.  With one exception - arrays!  If some one
  90. ! feels like adding arrays, I for one would appreciate it :-)
  91.   
  92.   I only run this shell on sun's and only for interactive use.  I
  93.   use it on sun4c, sun3 and sun386 systems.  The shell itself has
  94. ***************
  95. *** 21,40 ****
  96.   MACHINES for details of systems that the shell has been built
  97.   on.
  98.   
  99. ! I have released this version of the shell (with the kind
  100. ! permission of the previous maintainers and major contributors) to
  101. ! ensure that it is available from usenet archive sites.  Of
  102. ! course it remains in the Public Domain.  Equally obviously
  103. ! neither myself nor any other contributors make any claims of
  104. ! suitability etc.  Ie. NO WARRANTY!!!  If you make any changes
  105. ! and distribute them, please leave your own finger prints in the
  106. ! source.  Its bad enough being flamed for my own bugs let alone
  107. ! anyone elses :-)
  108.   
  109. - WHATS NEW:
  110. - This update includes Job Control for System V (POSIX), many bug
  111. - fixes and a simple history file mechanism.  See sh/ChangeLog.
  112.   
  113.   HISTORY:
  114.   
  115. --- 23,37 ----
  116.   MACHINES for details of systems that the shell has been built
  117.   on.
  118.   
  119. ! I released version 4.0 of the shell (with the kind permission of
  120. ! the previous maintainers and major contributors) to ensure that
  121. ! it is available from usenet archive sites.  Of course it remains
  122. ! in the Public Domain.  Equally obviously neither myself nor any
  123. ! other contributors make any claims of suitability etc.  Ie. NO
  124. ! WARRANTY!!!  If you make any changes and distribute them, please
  125. ! leave your own finger prints in the source.  Its bad enough
  126. ! being flamed for my own bugs let alone anyone elses :-)
  127.   
  128.   
  129.   HISTORY:
  130.   
  131. *** bug-report.old    Thu Aug 13 00:14:09 1992
  132. --- bug-report    Sun Dec  6 00:14:34 1992
  133. ***************
  134. *** 2,8 ****
  135.   Subject: [area]: [synopsis]   [replace with actual area and short description]
  136.   
  137.   VERSION:
  138. !     PD KSH: 4.7 12-Aug-92
  139.       [Official patches will edit this line to indicate the patch level]
  140.   
  141.   MACHINE and OPERATING SYSTEM:
  142. --- 2,8 ----
  143.   Subject: [area]: [synopsis]   [replace with actual area and short description]
  144.   
  145.   VERSION:
  146. !     PD KSH: 4.8 05-Dec-92
  147.       [Official patches will edit this line to indicate the patch level]
  148.   
  149.   MACHINE and OPERATING SYSTEM:
  150. *** etc/ksh.kshrc.old    Mon Aug 10 22:00:08 1992
  151. --- etc/ksh.kshrc    Sun Dec  6 00:14:48 1992
  152. ***************
  153. *** 17,23 ****
  154.   #
  155.   
  156.   # RCSid:
  157. ! #    $Id: ksh.kshrc,v 1.3 1992/08/10 12:00:08 sjg Exp $
  158.   #
  159.   #    @(#)Copyright (c) 1991 Simon J. Gerraty
  160.   #
  161. --- 17,23 ----
  162.   #
  163.   
  164.   # RCSid:
  165. ! #    $Id: ksh.kshrc,v 1.4 1992/12/05 13:14:48 sjg Exp $
  166.   #
  167.   #    @(#)Copyright (c) 1991 Simon J. Gerraty
  168.   #
  169. ***************
  170. *** 97,102 ****
  171. --- 97,105 ----
  172.       alias cls=clear
  173.       alias logout=exit
  174.       alias bye=exit
  175. +     alias p='ps -l'
  176. +     alias j=jobs
  177. +     alias o='fg %-'
  178.   
  179.   
  180.   # add your favourite aliases here
  181. *** ksh.1.old    Mon Aug 10 21:59:15 1992
  182. --- ksh.1    Sun Dec  6 00:14:37 1992
  183. ***************
  184. *** 1,4 ****
  185. ! .\" $Id: ksh.1,v 1.2 1992/08/10 11:59:15 sjg Exp $
  186.   .nr OJ 1 \" Job Control
  187.   .nr OE 1 \" Command Editing
  188.   .nr OB 1 \" BSD enhanced ulimit options
  189. --- 1,4 ----
  190. ! .\" $Id: ksh.1,v 1.3 1992/12/05 13:14:37 sjg Exp $
  191.   .nr OJ 1 \" Job Control
  192.   .nr OE 1 \" Command Editing
  193.   .nr OB 1 \" BSD enhanced ulimit options
  194. ***************
  195. *** 88,94 ****
  196.   .SS Alternation
  197.   Csh provides a filename expansion method known as alternation.
  198.   This has been added into this version of ksh.
  199. ! When performing filename subsitution, you can get the shell to create
  200.   a set of strings for you. For example, `exampl{a,b,c,d,e}' will expand
  201.   to ``exampla examplb examplc exampld example''.
  202.   A comma separated set of strings in curly braces 
  203. --- 88,94 ----
  204.   .SS Alternation
  205.   Csh provides a filename expansion method known as alternation.
  206.   This has been added into this version of ksh.
  207. ! When performing filename substitution, you can get the shell to create
  208.   a set of strings for you. For example, `exampl{a,b,c,d,e}' will expand
  209.   to ``exampla examplb examplc exampld example''.
  210.   A comma separated set of strings in curly braces 
  211. ***************
  212. *** 112,118 ****
  213.   .IP FCEDIT
  214.   The editor used by the \fIfc\fP command.
  215.   During startup the shell checks the value of \fBFCEDIT\fP, 
  216. ! \fBEDITOR\fP and finally \fBVISUAL\fP to try and determin what
  217.   command line edit mode to use.  Note that this is not strictly
  218.   ksh compatible behaviour.
  219.   .IP COLUMNS
  220. --- 112,118 ----
  221.   .IP FCEDIT
  222.   The editor used by the \fIfc\fP command.
  223.   During startup the shell checks the value of \fBFCEDIT\fP, 
  224. ! \fBEDITOR\fP and finally \fBVISUAL\fP to try and determine what
  225.   command line edit mode to use.  Note that this is not strictly
  226.   ksh compatible behaviour.
  227.   .IP COLUMNS
  228. ***************
  229. *** 178,184 ****
  230.   A single \fB#\fP results in the shortest match,
  231.   two \fB#\fP's results in the longest match.
  232.   .IP "${var%pattern} ${var%%pattern}"
  233. ! Like \fB#\fP substition, but deleting from the end of the value.
  234.   .SS Expressions
  235.   Expressions can be used with the \fBlet\fP command,
  236.   as numeric arguments to the \fBtest\fP command,
  237. --- 178,184 ----
  238.   A single \fB#\fP results in the shortest match,
  239.   two \fB#\fP's results in the longest match.
  240.   .IP "${var%pattern} ${var%%pattern}"
  241. ! Like \fB#\fP substitution, but deleting from the end of the value.
  242.   .SS Expressions
  243.   Expressions can be used with the \fBlet\fP command,
  244.   as numeric arguments to the \fBtest\fP command,
  245. ***************
  246. *** 250,256 ****
  247.   .IP "fc [\fB\-e\fP \fIeditor\fP] [\fB\-lnr\fP] [\fIfirst\fP [\fIlast\fP]]"
  248.   \fIFirst\fP and \fIlast\fP select commands.
  249.   Commands can be selected by history number,
  250. ! or a string specifing the most recent command starting with that string.
  251.   The \fB\-l\fP option lists the command on stdout,
  252.   and \fB\-n\fP inhibits the default command numbers.
  253.   The \fB\-r\fP option reverses the order of the list.
  254. --- 250,256 ----
  255.   .IP "fc [\fB\-e\fP \fIeditor\fP] [\fB\-lnr\fP] [\fIfirst\fP [\fIlast\fP]]"
  256.   \fIFirst\fP and \fIlast\fP select commands.
  257.   Commands can be selected by history number,
  258. ! or a string specifying the most recent command starting with that string.
  259.   The \fB\-l\fP option lists the command on stdout,
  260.   and \fB\-n\fP inhibits the default command numbers.
  261.   The \fB\-r\fP option reverses the order of the list.
  262. ***************
  263. *** 340,346 ****
  264.   .ta 5n 10n
  265.   \t\-i\tThe variable's value is stored as an integer.
  266.   .br
  267. ! \t\-x\tThe variable is exported to the enviroment.
  268.   .br
  269.   \t\-r\tThe variable is read-only cannot be reassigned a value.
  270.   .br
  271. --- 340,346 ----
  272.   .ta 5n 10n
  273.   \t\-i\tThe variable's value is stored as an integer.
  274.   .br
  275. ! \t\-x\tThe variable is exported to the environment.
  276.   .br
  277.   \t\-r\tThe variable is read-only cannot be reassigned a value.
  278.   .br
  279. ***************
  280. *** 466,472 ****
  281.   job reporting.  The jobs and kill commands
  282.   functions as above, and you will
  283.   be informed when background jobs complete.  Fg and bg are not 
  284. ! availiable.
  285.   .PD
  286.   .br
  287.   .SS "Interactive Input Line Editing"
  288. --- 466,472 ----
  289.   job reporting.  The jobs and kill commands
  290.   functions as above, and you will
  291.   be informed when background jobs complete.  Fg and bg are not 
  292. ! available.
  293.   .PD
  294.   .br
  295.   .SS "Interactive Input Line Editing"
  296. ***************
  297. *** 540,546 ****
  298.   (note that the ASCII
  299.   .SM ESC
  300.   character is written as \s-1^[\s0\|),
  301. ! then the editing function performed is decribed.
  302.   Note that
  303.   .I "editing command"
  304.   names are used only with the
  305. --- 540,546 ----
  306.   (note that the ASCII
  307.   .SM ESC
  308.   character is written as \s-1^[\s0\|),
  309. ! then the editing function performed is described.
  310.   Note that
  311.   .I "editing command"
  312.   names are used only with the
  313. ***************
  314. *** 873,879 ****
  315.   .br
  316.   \fB[\fP \fIexpression\fP \fB]\fP
  317.   .SH DESCRIPTION
  318. ! \fBTest\f evalutates the \fIexpression\fP and returns zero status if true,
  319.   and non-zero status otherwise.
  320.   It is normally used as the controlling command of the \fBif\fP and \fBwhile\fP statements.
  321.   .LP
  322. --- 873,879 ----
  323.   .br
  324.   \fB[\fP \fIexpression\fP \fB]\fP
  325.   .SH DESCRIPTION
  326. ! \fBTest\f evaluates the \fIexpression\fP and returns zero status if true,
  327.   and non-zero status otherwise.
  328.   It is normally used as the controlling command of the \fBif\fP and \fBwhile\fP statements.
  329.   .LP
  330. *** sh/ChangeLog.old    Thu Aug 13 00:15:18 1992
  331. --- sh/ChangeLog    Sun Dec  6 00:15:01 1992
  332. ***************
  333. *** 1,3 ****
  334. --- 1,40 ----
  335. + Sat Dec  5 23:54:40 1992  Simon J. Gerraty  (sjg@zen)
  336. +     * finally fixed the fd leakage that caused pipes to not terminate
  337. +     immediately.
  338. + Sat Nov 28 23:01:38 1992  Simon J. Gerraty  (sjg@zen)
  339. +     * Makefile: added install target
  340. + Wed Nov 25 09:10:11 1992  Simon J. Gerraty  (sjg@zen)
  341. +     * c_cd(c_ksh.c): fixed bug causing cd ., cd .. to look at $CDPATH.
  342. + Thu Nov 19 23:32:42 1992  Simon J. Gerraty  (sjg@zen)
  343. +     * For now bind emacs mode complete-list to ESC=
  344. + Tue Sep 15 15:24:38 1992  Simon J. Gerraty  (sjg@zen)
  345. +     * main.c: call init_editmode() between processing .profile and
  346. +     .kshrc so that edit mode can be explicitly set in .kshrc
  347. +     regardless of FCEDIT, EDITOR and VISUAL values.
  348. + Tue Sep 15 15:08:06 1992  Philippe Michel (michel@thomson-lcr.fr) 
  349. +     * main.c: fixed bug in command line argument processing.
  350. + Fri Aug 21 15:24:37 1992  Bruce Momjian  (root%candle.uucp@bts.com)
  351. +     * exec.c: replace all calls of execute(tree, 0) with 
  352. +     execute(tree, flags & XXWHL) to ensure it is passed to children. 
  353. + Thu Aug 20 23:18:45 1992  Simon J. Gerraty  (sjg@zen)
  354. +     * fixed bug in complex_history: histsize not initialized before
  355. +     call to alloc().
  356.   Thu Aug 13 00:00:42 1992  Simon J. Gerraty  (sjg@zen)
  357.   
  358.       * setstr(), varsub(): be robust when given dud args.
  359. *** sh/Makefile.old    Thu Aug 13 00:00:07 1992
  360. --- sh/Makefile    Sun Dec  6 00:15:06 1992
  361. ***************
  362. *** 1,5 ****
  363.   # PD Bourne/Korn Shell
  364. ! # $Id: Makefile,v 1.3 1992/08/10 12:02:18 sjg Exp $
  365.   
  366.   SHELL = /bin/sh
  367.   MAKE  = make
  368. --- 1,5 ----
  369.   # PD Bourne/Korn Shell
  370. ! # $Id: Makefile,v 1.4 1992/12/05 13:15:06 sjg Exp $
  371.   
  372.   SHELL = /bin/sh
  373.   MAKE  = make
  374. ***************
  375. *** 6,11 ****
  376. --- 6,17 ----
  377.   
  378.   LN    = ln -s
  379.   
  380. + CHMOD=chmod
  381. + prefix=/usr/local
  382. + target=$(prefix)/bin/ksh
  383.   # You _can_ build this shell without the ../std tree if your
  384.   # system provides a sufficiently POSIX environment, or if your
  385.   # BSD system is a Sun or close.  If not try ../std.
  386. ***************
  387. *** 107,116 ****
  388.       makedepend $(CFLAGS) $(SRCS1) $(SRCS2)
  389.   
  390.   install:
  391. !     @echo "Try:"
  392. !     @echo "cp ksh /bin"
  393. !     @echo "strip /bin/ksh"
  394. !     @echo "chmod 555 /bin/ksh"
  395.   
  396.   .c.s:
  397.       $(CC) $(CFLAGS) -S -o $@ $<
  398. --- 113,121 ----
  399.       makedepend $(CFLAGS) $(SRCS1) $(SRCS2)
  400.   
  401.   install:
  402. !     -if test -f $(target); then mv $(target) $(target).old; fi
  403. !     cp ksh $(target)
  404. !     $(CHMOD) 755 $(target)
  405.   
  406.   .c.s:
  407.       $(CC) $(CFLAGS) -S -o $@ $<
  408. *** sh/c_ksh.c.old    Sat Apr 25 18:33:28 1992
  409. --- sh/c_ksh.c    Sun Dec  6 00:15:11 1992
  410. ***************
  411. *** 3,9 ****
  412.    */
  413.   
  414.   #ifndef lint
  415. ! static char *RCSid = "$Id: c_ksh.c,v 1.2 1992/04/25 08:33:28 sjg Exp $";
  416.   #endif
  417.   
  418.   #include "stdh.h"
  419. --- 3,9 ----
  420.    */
  421.   
  422.   #ifndef lint
  423. ! static char *RCSid = "$Id: c_ksh.c,v 1.3 1992/12/05 13:15:11 sjg Exp $";
  424.   #endif
  425.   
  426.   #include "stdh.h"
  427. ***************
  428. *** 78,85 ****
  429.           dir = strval(v_oldpwd = global("OLDPWD"));
  430.           prt = 1;
  431.       }
  432. !     if (dir[0] == '/' || (dir[0] == '.' && (dir[1] == '/' ||
  433. !         (dir[1] == '.' && dir[2] == '/')))) {
  434.           /*
  435.            * dir is an explicitly named path, so no CDPATH search
  436.            */
  437. --- 78,87 ----
  438.           dir = strval(v_oldpwd = global("OLDPWD"));
  439.           prt = 1;
  440.       }
  441. !     if (dir[0] == '/' ||
  442. !         (dir[0] == '.' &&
  443. !          (dir[1] == '.' || dir[1] == '/' || dir[1] == '\0'))) {
  444.           /*
  445.            * dir is an explicitly named path, so no CDPATH search
  446.            */
  447. *** sh/config.h.old    Thu Aug 13 00:15:22 1992
  448. --- sh/config.h    Sun Dec  6 00:15:15 1992
  449. ***************
  450. *** 1,7 ****
  451.   /*
  452.    * Configuration file for the PD ksh
  453.    *
  454. !  * RCSid: $Id: config.h,v 1.5 1992/08/12 14:15:22 sjg Exp $
  455.    */
  456.   
  457.   #ifndef    _CONFIG_H
  458. --- 1,7 ----
  459.   /*
  460.    * Configuration file for the PD ksh
  461.    *
  462. !  * RCSid: $Id: config.h,v 1.6 1992/12/05 13:15:15 sjg Exp $
  463.    */
  464.   
  465.   #ifndef    _CONFIG_H
  466. ***************
  467. *** 49,61 ****
  468.   /* #define    SILLY            /* Game of life in EMACS mode */
  469.   /* #define    SWTCH            /* Handle SWTCH for shl(1) */
  470.   
  471. ! /*
  472. !  * better to leave this one out, and let users that
  473. !  * like it add
  474. !  *   bind '^[^['=complete-list
  475. !  * to their .kshrc
  476. !  */
  477. ! /*#define COMPLETE_LIST            /* default to Emacs style completion */
  478.   /*
  479.    * ALTERNATIONS is csh not ksh, but it is such a nice feature...
  480.    */
  481. --- 49,55 ----
  482.   /* #define    SILLY            /* Game of life in EMACS mode */
  483.   /* #define    SWTCH            /* Handle SWTCH for shl(1) */
  484.   
  485.   /*
  486.    * ALTERNATIONS is csh not ksh, but it is such a nice feature...
  487.    */
  488. *** sh/emacs.c.old    Mon Aug 10 22:02:31 1992
  489. --- sh/emacs.c    Sun Dec  6 00:15:20 1992
  490. ***************
  491. *** 10,16 ****
  492.   #ifdef EMACS
  493.   
  494.   #ifndef lint
  495. ! static char *RCSid = "$Id: emacs.c,v 1.3 1992/08/10 12:02:31 sjg Exp $";
  496.   #endif
  497.   
  498.   #include "stdh.h"
  499. --- 10,16 ----
  500.   #ifdef EMACS
  501.   
  502.   #ifndef lint
  503. ! static char *RCSid = "$Id: emacs.c,v 1.4 1992/12/05 13:15:20 sjg Exp $";
  504.   #endif
  505.   
  506.   #include "stdh.h"
  507. ***************
  508. *** 203,215 ****
  509.       {x_stuff,     "stuff",        0,     0,    0 },
  510.       {x_transpose,    "transpose-chars",    0, CTRL('T'),    0 },
  511.   #endif
  512. - #ifdef COMPLETE_LIST
  513. -     {x_complete,    "complete",        1,     0,    0 },
  514. -      {x_comp_list,    "complete-list",    1, CTRL('['),    0 },
  515. - #else
  516.       {x_complete,    "complete",        1, CTRL('['),    0 },
  517. !      {x_comp_list,    "complete-list",    1,      0,    0 },
  518. ! #endif
  519.       {x_enumerate,    "list",            1,    '?',    0 },
  520.       {x_comp_file,    "complete-file",    1, CTRL('X'),    0 },
  521.       {x_comp_comm,    "complete-command",    2, CTRL('['),    0 },
  522. --- 203,210 ----
  523.       {x_stuff,     "stuff",        0,     0,    0 },
  524.       {x_transpose,    "transpose-chars",    0, CTRL('T'),    0 },
  525.   #endif
  526.       {x_complete,    "complete",        1, CTRL('['),    0 },
  527. !         {x_comp_list,    "complete-list",    1,    '=',    0 },
  528.       {x_enumerate,    "list",            1,    '?',    0 },
  529.       {x_comp_file,    "complete-file",    1, CTRL('X'),    0 },
  530.       {x_comp_comm,    "complete-command",    2, CTRL('['),    0 },
  531. *** sh/eval.c.old    Thu Aug 13 00:15:28 1992
  532. --- sh/eval.c    Sun Dec  6 00:15:25 1992
  533. ***************
  534. *** 3,9 ****
  535.    */
  536.   
  537.   #ifndef lint
  538. ! static char *RCSid = "$Id: eval.c,v 1.4 1992/08/12 14:15:28 sjg Exp $";
  539.   #endif
  540.   
  541.   #include "stdh.h"
  542. --- 3,9 ----
  543.    */
  544.   
  545.   #ifndef lint
  546. ! static char *RCSid = "$Id: eval.c,v 1.5 1992/12/05 13:15:25 sjg Exp $";
  547.   #endif
  548.   
  549.   #include "stdh.h"
  550. ***************
  551. *** 469,479 ****
  552.           ofd1 = savefd(1);
  553.           dup2(pv[1], 1);
  554.           close(pv[1]);
  555. ! #if 0
  556. !         exchild(t, XXCOM|XPIPEO);
  557. ! #else
  558.           execute(t, XFORK|XXCOM|XPIPEO);
  559. - #endif
  560.           dup2(ofd1, 1);
  561.           close(ofd1);
  562.           xp->split = 1;    /* waitlast() */
  563. --- 469,477 ----
  564.           ofd1 = savefd(1);
  565.           dup2(pv[1], 1);
  566.           close(pv[1]);
  567. !         (void) fd_clexec(pv[0]);
  568. !         (void) fd_clexec(ofd1);
  569.           execute(t, XFORK|XXCOM|XPIPEO);
  570.           dup2(ofd1, 1);
  571.           close(ofd1);
  572.           xp->split = 1;    /* waitlast() */
  573. *** sh/exec.c.old    Mon Aug 10 22:02:38 1992
  574. --- sh/exec.c    Sun Dec  6 00:15:29 1992
  575. ***************
  576. *** 3,9 ****
  577.    */
  578.   
  579.   #ifndef lint
  580. ! static char *RCSid = "$Id: exec.c,v 1.4 1992/08/10 12:02:38 sjg Exp $";
  581.   #endif
  582.   
  583.   #include "stdh.h"
  584. --- 3,9 ----
  585.    */
  586.   
  587.   #ifndef lint
  588. ! static char *RCSid = "$Id: exec.c,v 1.5 1992/12/05 13:15:29 sjg Exp $";
  589.   #endif
  590.   
  591.   #include "stdh.h"
  592. ***************
  593. *** 46,56 ****
  594. --- 46,66 ----
  595.   {
  596.     (void) memset(clexec_tab, 0, sizeof(clexec_tab)-1);
  597.   }
  598. + #endif
  599.   
  600. + /*
  601. +  * we now use this function always.
  602. +  */
  603.   int
  604.   fd_clexec(fd)
  605.     int fd;
  606.   {
  607. + #ifndef F_SETFD
  608. +   static int once = 0;
  609. +   if (once++ == 0)
  610. +     init_clexec();
  611.     if (fd < sizeof(clexec_tab))
  612.     {
  613.       clexec_tab[fd] = 1;
  614. ***************
  615. *** 57,64 ****
  616.       return 0;
  617.     }
  618.     return -1;
  619. ! }
  620.   #endif
  621.   
  622.   
  623.   /*
  624. --- 67,76 ----
  625.       return 0;
  626.     }
  627.     return -1;
  628. ! #else
  629. !   return fcntl(fd, F_SETFD, 1);
  630.   #endif
  631. + }
  632.   
  633.   
  634.   /*
  635. ***************
  636. *** 123,128 ****
  637. --- 135,142 ----
  638.           while (t->type == TPIPE) {
  639.               openpipe(pv);
  640.               (void) dup2(pv[1], 1);    /* stdout of curr */
  641. +             (void) fd_clexec(pv[0]);
  642. +             (void) fd_clexec(pv[1]);
  643.               exchild(t->left, flags);
  644.               (void) dup2(pv[0], 0);    /* stdin of next */
  645.               closepipe(pv);
  646. ***************
  647. *** 131,136 ****
  648. --- 145,152 ----
  649.           }
  650.           flags &= ~ XPIPEO;
  651.           (void) dup2(e.savefd[1], 1); /* stdout of last */
  652. +         (void) fd_clexec(e.savefd[0]);
  653. +         (void) fd_clexec(e.savefd[1]);
  654.           exchild(t, flags);
  655.           (void) dup2(e.savefd[0], 0); /* close pipe in */
  656.           if (!(flags&XBGND))
  657. ***************
  658. *** 139,148 ****
  659.   
  660.         case TLIST:
  661.           while (t->type == TLIST) {
  662. !             execute(t->left, 0);
  663.               t = t->right;
  664.           }
  665. !         rv = execute(t, 0);
  666.           break;
  667.   
  668.         case TASYNC:
  669. --- 155,164 ----
  670.   
  671.         case TLIST:
  672.           while (t->type == TLIST) {
  673. !             execute(t->left, flags & XXWHL);
  674.               t = t->right;
  675.           }
  676. !         rv = execute(t, flags & XXWHL);
  677.           break;
  678.   
  679.         case TASYNC:
  680. ***************
  681. *** 151,159 ****
  682.   
  683.         case TOR:
  684.         case TAND:
  685. !         rv = execute(t->left, 0);
  686.           if (t->right != NULL && (rv == 0) == (t->type == TAND))
  687. !             rv = execute(t->right, 0);
  688.           break;
  689.   
  690.         case TFOR:
  691. --- 167,175 ----
  692.   
  693.         case TOR:
  694.         case TAND:
  695. !         rv = execute(t->left, flags & XXWHL);
  696.           if (t->right != NULL && (rv == 0) == (t->type == TAND))
  697. !             rv = execute(t->right, flags & XXWHL);
  698.           break;
  699.   
  700.         case TFOR:
  701. ***************
  702. *** 165,171 ****
  703.                   goto Break1;
  704.           while (*ap != NULL) {
  705.               setstr(global(t->str), *ap++);
  706. !             rv = execute(t->left, 0);
  707.           }
  708.         Break1:
  709.           break;
  710. --- 181,187 ----
  711.                   goto Break1;
  712.           while (*ap != NULL) {
  713.               setstr(global(t->str), *ap++);
  714. !             rv = execute(t->left, flags & XXWHL);
  715.           }
  716.         Break1:
  717.           break;
  718. ***************
  719. *** 183,189 ****
  720.               if ((cp = do_selectargs(ap, cp)) == (char *)1)
  721.                   break;
  722.               setstr(global(t->str), cp);
  723. !             rv = execute(t->left, 0);
  724.           }
  725.           break;
  726.           
  727. --- 199,205 ----
  728.               if ((cp = do_selectargs(ap, cp)) == (char *)1)
  729.                   break;
  730.               setstr(global(t->str), cp);
  731. !             rv = execute(t->left, flags & XXWHL);
  732.           }
  733.           break;
  734.           
  735. ***************
  736. *** 193,199 ****
  737.           while ((i = setjmp(e.jbuf)))
  738.               if (i == LBREAK)
  739.                   goto Break2;
  740. !         while ((execute(t->left, 0) == 0) == (t->type == TWHILE))
  741.               rv = execute(t->right, XXWHL);
  742.         Break2:
  743.           break;
  744. --- 209,215 ----
  745.           while ((i = setjmp(e.jbuf)))
  746.               if (i == LBREAK)
  747.                   goto Break2;
  748. !         while ((execute(t->left, flags & XXWHL) == 0) == (t->type == TWHILE))
  749.               rv = execute(t->right, XXWHL);
  750.         Break2:
  751.           break;
  752. ***************
  753. *** 202,210 ****
  754.         case TELIF:
  755.           if (t->right == NULL)
  756.               break;    /* should be error */
  757. !         rv = execute(t->left, 0) == 0 ?
  758. !             execute(t->right->left, 0) :
  759. !             execute(t->right->right, 0);
  760.           break;
  761.   
  762.         case TCASE:
  763. --- 218,226 ----
  764.         case TELIF:
  765.           if (t->right == NULL)
  766.               break;    /* should be error */
  767. !         rv = execute(t->left, flags & XXWHL) == 0 ?
  768. !             execute(t->right->left, flags & XXWHL) :
  769. !             execute(t->right->right, flags & XXWHL);
  770.           break;
  771.   
  772.         case TCASE:
  773. ***************
  774. *** 215,225 ****
  775.                   goto Found;
  776.           break;
  777.         Found:
  778. !         rv = execute(t->left, 0);
  779.           break;
  780.   
  781.         case TBRACE:
  782. !         rv = execute(t->left, 0);
  783.           break;
  784.   
  785.         case TFUNCT:
  786. --- 231,241 ----
  787.                   goto Found;
  788.           break;
  789.         Found:
  790. !         rv = execute(t->left, flags & XXWHL);
  791.           break;
  792.   
  793.         case TBRACE:
  794. !         rv = execute(t->left, flags & XXWHL);
  795.           break;
  796.   
  797.         case TFUNCT:
  798. ***************
  799. *** 351,357 ****
  800.           if (setjmp(e.jbuf))
  801.               rv = exstat; /* return # */
  802.           else
  803. !             rv = execute(tp->val.t, 0);
  804.           break;
  805.   
  806.       case CEXEC:        /* executable command */
  807. --- 367,373 ----
  808.           if (setjmp(e.jbuf))
  809.               rv = exstat; /* return # */
  810.           else
  811. !             rv = execute(tp->val.t, flags & XXWHL);
  812.           break;
  813.   
  814.       case CEXEC:        /* executable command */
  815. *** sh/history.c.old    Thu Aug 13 00:15:33 1992
  816. --- sh/history.c    Sun Dec  6 00:15:34 1992
  817. ***************
  818. *** 5,11 ****
  819.    */
  820.   
  821.   #ifndef lint
  822. ! static char *RCSid = "$Id: history.c,v 1.4 1992/08/12 14:15:33 sjg Exp $";
  823.   #endif
  824.   /*
  825.    *    This file contains
  826. --- 5,11 ----
  827.    */
  828.   
  829.   #ifndef lint
  830. ! static char *RCSid = "$Id: history.c,v 1.5 1992/12/05 13:15:34 sjg Exp $";
  831.   #endif
  832.   /*
  833.    *    This file contains
  834. ***************
  835. *** 643,650 ****
  836.   
  837.       histfd = fcntl(histfd, F_DUPFD, FDBASE);
  838.       
  839. !     (void) fcntl(histfd, F_SETFD, 1); /* close on exec */
  840. !     
  841.       (void) flock(histfd, LOCK_EX);
  842.   
  843.       hsize = lseek(histfd, 0L, L_XTND);
  844. --- 643,650 ----
  845.   
  846.       histfd = fcntl(histfd, F_DUPFD, FDBASE);
  847.       
  848. !     (void) fd_clexec(histfd);
  849.       (void) flock(histfd, LOCK_EX);
  850.   
  851.       hsize = lseek(histfd, 0L, L_XTND);
  852. *** sh/io.c.old    Mon Aug 10 22:02:49 1992
  853. --- sh/io.c    Sun Dec  6 00:15:39 1992
  854. ***************
  855. *** 3,9 ****
  856.    */
  857.   
  858.   #ifndef lint
  859. ! static char *RCSid = "$Id: io.c,v 1.3 1992/08/10 12:02:49 sjg Exp $";
  860.   #endif
  861.   
  862.   #include "stdh.h"
  863. --- 3,9 ----
  864.    */
  865.   
  866.   #ifndef lint
  867. ! static char *RCSid = "$Id: io.c,v 1.4 1992/12/05 13:15:39 sjg Exp $";
  868.   #endif
  869.   
  870.   #include "stdh.h"
  871. ***************
  872. *** 147,157 ****
  873.                   return -1;
  874.               else
  875.                   errorf("too many files open in shell\n");
  876. - #ifdef F_SETFD
  877. -         (void) fcntl(nfd, F_SETFD, 1);
  878. - #else
  879.           (void) fd_clexec(ttyfd);
  880. - #endif
  881.           close(fd);
  882.       } else
  883.           nfd = fd;
  884. --- 147,153 ----
  885. *** sh/jobs.c.old    Mon Aug 10 22:02:52 1992
  886. --- sh/jobs.c    Sun Dec  6 00:15:43 1992
  887. ***************
  888. *** 2,8 ****
  889.    * Process and job control
  890.    */
  891.   #ifndef lint
  892. ! static char *RCSid = "$Id: jobs.c,v 1.5 1992/08/10 12:02:52 sjg Exp $";
  893.   #endif
  894.   
  895.   /*
  896. --- 2,8 ----
  897.    * Process and job control
  898.    */
  899.   #ifndef lint
  900. ! static char *RCSid = "$Id: jobs.c,v 1.6 1992/12/05 13:15:43 sjg Exp $";
  901.   #endif
  902.   
  903.   /*
  904. ***************
  905. *** 320,327 ****
  906.       for (i = (flags&XXWHL) ? 1 : 0; i < NUFILE; i++)
  907.           flushshf(i);
  908.   
  909. -     /* create child process */
  910. -     forksleep = 0;
  911.   #ifdef JOBS
  912.       /* don't allow SIGCHLD until we are ready */
  913.   
  914. --- 320,325 ----
  915. ***************
  916. *** 331,336 ****
  917. --- 329,336 ----
  918.       sigsetmask(sm_sigchld);
  919.   # endif
  920.   #endif
  921. +     /* create child process */
  922. +     forksleep = 0;
  923.       while ((i = fork()) < 0 && errno == EAGAIN && forksleep < 32) {
  924.           if (forksleep) {
  925.               sleep(forksleep);
  926. *** sh/main.c.old    Thu Aug 13 00:15:39 1992
  927. --- sh/main.c    Sun Dec  6 00:15:49 1992
  928. ***************
  929. *** 3,9 ****
  930.    */
  931.   
  932.   #ifndef lint
  933. ! static char *RCSid = "$Id: main.c,v 1.6 1992/08/12 14:15:39 sjg Exp $";
  934.   #endif
  935.   
  936.   #define    EXTERN                /* define EXTERNs in sh.h */
  937. --- 3,9 ----
  938.    */
  939.   
  940.   #ifndef lint
  941. ! static char *RCSid = "$Id: main.c,v 1.7 1992/12/05 13:15:49 sjg Exp $";
  942.   #endif
  943.   
  944.   #define    EXTERN                /* define EXTERNs in sh.h */
  945. ***************
  946. *** 119,127 ****
  947.   #endif
  948.       ainit(&aperm);        /* initialize permanent Area */
  949.   
  950. - #ifndef F_SETFD
  951. -   init_clexec();
  952. - #endif
  953.       /* set up base enviroment */
  954.       e.type = E_NONE;
  955.       ainit(&e.area);
  956. --- 119,124 ----
  957. ***************
  958. *** 238,248 ****
  959.       }
  960.       if (s->type == STTY) {
  961.           ttyfd = fcntl(0, F_DUPFD, FDBASE);
  962. - #ifdef F_SETFD
  963. -         (void) fcntl(ttyfd, F_SETFD, 1);
  964. - #else
  965.           (void) fd_clexec(ttyfd);
  966. - #endif
  967.   #ifdef EMACS
  968.             x_init_emacs();
  969.   #endif
  970. --- 235,241 ----
  971. ***************
  972. *** 254,269 ****
  973.       if (!qflag)
  974.           ignoresig(SIGQUIT);
  975.   
  976. !     l->argv = &argv[argi];
  977.       l->argc = argc - argi;
  978.       l->argv[0] = name;
  979.       resetopts();
  980.   
  981. !     if (name[0] == '-') {
  982.           flag[FTALKING] = 1;
  983.           (void) include("/etc/profile");
  984.           (void) include(".profile");
  985.       }
  986.   
  987.       /* include $ENV */
  988.       arg = substitute(strval(global("ENV")), DOTILDE);
  989. --- 247,271 ----
  990.       if (!qflag)
  991.           ignoresig(SIGQUIT);
  992.   
  993. !     l->argv = &argv[argi - 1];
  994.       l->argc = argc - argi;
  995.       l->argv[0] = name;
  996.       resetopts();
  997.   
  998. !     if (name[0] == '-' ||
  999. !         ((arg = strrchr(name, '/')) && *++arg == '-')) {
  1000.           flag[FTALKING] = 1;
  1001.           (void) include("/etc/profile");
  1002.           (void) include(".profile");
  1003.       }
  1004. +     /*
  1005. +      * do this after reading *profile but before
  1006. +      * reading $ENV if any.
  1007. +      */
  1008. + #if defined(EMACS) || defined(VI)
  1009. +     if (flag[FTALKING])
  1010. +       init_editmode();
  1011. + #endif
  1012.   
  1013.       /* include $ENV */
  1014.       arg = substitute(strval(global("ENV")), DOTILDE);
  1015. ***************
  1016. *** 278,286 ****
  1017.         signal(SIGTERM, trapsig);
  1018.   #endif
  1019.         ignoresig(SIGINT);
  1020. - #if defined(EMACS) || defined(VI)
  1021. -       init_editmode();
  1022. - #endif
  1023.       } else
  1024.         flag[FHASHALL] = 1;
  1025.   
  1026. --- 280,285 ----
  1027. *** sh/patchlevel.h.old    Thu Aug 13 00:15:45 1992
  1028. --- sh/patchlevel.h    Sun Dec  6 00:15:52 1992
  1029. ***************
  1030. *** 1,6 ****
  1031.   /*
  1032.    * PD KSH
  1033. !  * $Id: patchlevel.h,v 4.7 1992/08/12 14:15:45 sjg Exp $
  1034.    */
  1035.   #define VERSION        4
  1036. ! #define PATCHLEVEL    7
  1037. --- 1,6 ----
  1038.   /*
  1039.    * PD KSH
  1040. !  * $Id: patchlevel.h,v 4.8 1992/12/05 13:15:52 sjg Exp $
  1041.    */
  1042.   #define VERSION        4
  1043. ! #define PATCHLEVEL    8
  1044. *** sh/version.c.old    Thu Aug 13 00:15:53 1992
  1045. --- sh/version.c    Sun Dec  6 00:15:55 1992
  1046. ***************
  1047. *** 3,9 ****
  1048.    */
  1049.   
  1050.   #ifndef lint
  1051. ! static char *RCSid = "$Id: version.c,v 1.6 1992/08/12 14:15:53 sjg Exp $";
  1052.   #endif
  1053.   
  1054.   #include "stdh.h"
  1055. --- 3,9 ----
  1056.    */
  1057.   
  1058.   #ifndef lint
  1059. ! static char *RCSid = "$Id: version.c,v 1.7 1992/12/05 13:15:55 sjg Exp $";
  1060.   #endif
  1061.   
  1062.   #include "stdh.h"
  1063. ***************
  1064. *** 12,59 ****
  1065.   #include "patchlevel.h"
  1066.   
  1067.   char ksh_version [] =
  1068. !     "KSH_VERSION=@(#)PD KSH v4.7 92/08/12";
  1069.   
  1070. - /***
  1071. - $Log: version.c,v $
  1072. -  * Revision 1.6  1992/08/12  14:15:53  sjg
  1073. -  * Patch07: fix some build problems,
  1074. -  * and avoid core dump from arg processing bug.
  1075. -  *
  1076. -  * Revision 1.5  1992/08/10  12:03:29  sjg
  1077. -  * Update for patch06.
  1078. -  * Contributions from Peter Collinson, Neil Smithline and sjg
  1079. -  *
  1080. -  * Revision 1.4  1992/05/12  09:30:37  sjg
  1081. -  * see ChangeLog
  1082. -  *
  1083. -  * Revision 1.3  1992/05/03  08:29:20  sjg
  1084. -  * Update for Patch05
  1085. -  *
  1086. -  * Revision 1.2  1992/04/25  08:33:28  sjg
  1087. -  * Added RCS key.
  1088. -  *
  1089. -  * Revision 1.1  1992/04/18  05:51:48  sjg
  1090. -  * Initial revision
  1091. -  *
  1092. - Version  4.0  91/11/09  sjg
  1093. - distribution
  1094. - Revision 3.3  89/03/27  15:52:29  egisin
  1095. - distribution
  1096. - Revision 3.2  88/12/14  20:10:41  egisin
  1097. - many fixes
  1098. - Revision 3.1  88/11/03  09:18:36  egisin
  1099. - alpha distribution
  1100. - Revision 1.3  88/10/20  17:34:03  egisin
  1101. - added @(#) to ksh_version
  1102. - Revision 1.2  88/09/27  19:01:58  egisin
  1103. - fix version.c
  1104. - Revision 1.1  88/09/27  18:59:06  egisin
  1105. - Initial revision
  1106. - ***/
  1107.   
  1108. --- 12,17 ----
  1109.   #include "patchlevel.h"
  1110.   
  1111.   char ksh_version [] =
  1112. !     "KSH_VERSION=@(#)PD KSH v4.8 92/12/05";
  1113.   
  1114.   
  1115.  
  1116. exit 0 # Just in case...
  1117.