-
Notifications
You must be signed in to change notification settings - Fork 12
/
CHANGES
1601 lines (1252 loc) · 63 KB
/
CHANGES
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
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Changes that improve compatibility w/ the Sixth Edition (V6) UNIX
Thompson shell are marked w/ a `C:' in the details below.
-------------------------------------------------------------------------------
[osh-current]: Friday, 2010-05-14:
osh.1:
* Added [--] to fd2 usage synopsis in "Special commands" subsection.
* s/Mac/Mac OS X/
-------------------------------------------------------------------------------
[osh-20100430]:
osh.c:
* Added a new, osh history-file-support feature to save the user's
command-line history to the user $h/.osh.history file. Notice
that the history file must already exist as a writable, regular
file (or a link to a regular file) when the shell is invoked to
save the user's command-line history. Otherwise, it won't do so.
An interactive shell reads each command line from its terminal and
writes the words of each one to the history file as a history entry
after performing parameter substitution and word splitting.
osh.1:
* Documented the new, osh history-file-support feature in the new
"History file (+)" subsection.
-------------------------------------------------------------------------------
[osh-20100228]:
mkconfig:
* Added a search comparison that uses which(1) to find login & newgrp
pathname(s). This allows for those cases where a sysadmin may use
locally modified versions of these utilities to deal w/ uniquely
local needs. Notice that this is in addition to how login & newgrp
pathname(s) were searched for before now.
osh.c:
* Changed osh globbing so it's handled in main osh process. This is
for user convenience to allow (for example):
% mkdir some_really_long_directory_name... ; cd some*...
...
and globbing for other special built-in commands as well.
-------------------------------------------------------------------------------
[osh-20091218]:
* Incorporated osh-20091127-p1.patch changes (see p1: below).
INSTALL, Makefile:
* Made "install-doc" and "install-exp" targets optional so that
they're no longer triggered by default "install" target(s).
mkconfig:
* p1: Defined CONFIG_SUNOS on OpenSolaris (uname -s == SunOS).
goto.c:
* p1: Fixed problem w/ external goto command on OpenSolaris where
file offset set via lseek(2) isn't shared w/ parent process,
causing unexpected behavior.
examples/*osh*:
* Made changes that allow users to use osh to initialize/invoke sh6
by doing `[exec] osh [-i | -l] sh6'. This is most convenient way
to perform startup actions for sh6 without adding undesirable
functionality to sh6 itself.
examples/dot.osh.logout:
* Fixed `rm -r $d' error on OpenSolaris.
-------------------------------------------------------------------------------
[osh-20091127]:
err.c:
* Changed setmyname(argv[0]) so that it only ditches an initial
"-" character when a binary name is "-" plus at least 1 of any
character before end-of-string. For example:
% pwd ; ln -s osh - ; ln -s osh -o ; ln -s osh -os ; \
ln -s osh -osh ; echo -* osh
/tmp/v6shell
- -o -os -osh osh
% which - -o -os -osh osh
/tmp/v6shell/-
/tmp/v6shell/-o
/tmp/v6shell/-os
/tmp/v6shell/-osh
/tmp/v6shell/osh
% - file arg1 ; -o file arg1 ; -os file arg1 ; \
-osh file arg1 ; osh file arg1
-: file: cannot open
o: file: cannot open
os: file: cannot open
osh: file: cannot open
osh: file: cannot open
-------------------------------------------------------------------------------
[osh-20091122]:
defs.h:
* Defined SBUFMM(m), small buffer max multiplier, for calculating
small buffer sizes (e.g., DOLMAX, FMTMAX, LABELMAX).
err.h:
* Changed ERR_ALTOOLONG to ERR_E2BIG, and added FMT4S.
pexec.[hc]:
* Changed err_pexec() function prototype.
* Changed it to print ERR_E2BIG diagnostic when errno == E2BIG.
* Changed exit status to 126 for such "cannot execute" conditions.
*.c:
* Changed all err_pexec() calls to match new function prototype
where appropriate.
osh.c:
* Changed main child process execute function from pexec()
to err_pexec() for external commands.
* Added getmyname() program name prefix (e.g., "osh: ")
to osh diagnostics.
v.c:
* Added "The Regents of the University of California" copyright notice
for NetBSD and OpenBSD code included in the osh project.
[fgio][dfos]*.1:
* Added COPYRIGHT section headings, and added copyright notices.
-------------------------------------------------------------------------------
[osh-20091029]:
* Remove rcsid.h file; stop adding rcsid strings for all
sources to compiled binaries.
* Re-add example rc (init and logout) files as examples/* .
* Add $h/.project file as PROJECT for quick project info.
Makefile:
* Add default DOCDIR as $(PREFIX)/share/doc/$(OSH_VERSION);
use it for [ACILNPR]* package documentation and examples/* .
* Change default MANDIR to $(PREFIX)/share/man/man1 .
v.c:
* Include OSH_VERSION from Makefile and project copyright
notices in compiled binaries.
fd2.c, if.c, pexec.[hc], util.c:
* Add err_pexec() error-handling wrapper around pexec() for
shell utilities that execute external commands.
osh.c:
* Wrap WCOREDUMP(s) w/ #ifdef WCOREDUMP ... #endif .
osh.1:
* Change example in "I/O redirection" subsection that could
confuse new users.
-------------------------------------------------------------------------------
[osh-20090527]:
* Moved inclusion of required kernel include files (e.g., <sys/*.h>)
and /usr/include files from *.c to "defs.h" where appropriate.
* Moved files: Moved manual pages from *.1.in to *.1 .
* New files: err.h, err.c (see err.[hc] description below)
Makefile:
* Changed "-O2" to "-Os" in CFLAGS to optimize for size.
* Changed how the manual pages are generated and installed.
README:
* Added Debian 5.0.1 (lenny), NetBSD 5.0, OpenBSD 4.5, and
OpenSolaris 2008.11 to the reported system list; the osh
package behaves as expected on each system.
err.[hc]:
* Unified all shell and utility error-handling routines (for all
programs) in this module (see also CHANGES6).
err.c, osh.c, util.c:
* Fixed an echo bug that caused `echo ""' to print an unnecessary
"omsg: Internal error" diagnostic.
osh.c:
* Added `cd' as a synonym for the `chdir' special command.
* Added a new special parameter, $m, which points to the current
value of the environment variable MANPATH when MANPATH is set
or to the empty string when MANPATH is not set.
* Changed do_sigign() so that invocation of the `sigign' special
command in a subshell correctly ignores, unignores, and prints
signal(s) ignored by sigign relative to the main shell process.
if.c:
* Added a call to sasignal() to set the SIGCHLD signal to its default
action so that the { command [arg ...] } primary can obtain and
return the correct exit status of "command" in all cases, even when
the parent process of `if' may ignore SIGCHLD (e.g., sh(1)).
osh.1:
* Documented the osh(1) code changes as needed.
-------------------------------------------------------------------------------
[osh-20081213]:
osh.c:
* Changed the effect of the `-v' command-line option so that, in
addition to printing non-blank command lines to the standard error,
the shell also prints each blank/empty command line as an empty line.
fd2.c, util.c:
* Changed the fd2 `-e' command-line option so that it reflects the
documented behavior. For example, this change causes invocation
of `fd2 -ef file command' to redirect both conventional output
and diagnostic output from "command" to "file".
-------------------------------------------------------------------------------
[osh-20081122]:
mkconfig:
* Added a case for DragonFly BSD (uname -s == DragonFly).
osh.c:
* Fixed a bug introduced in osh-20081026 where the shell incorrectly
prints a process ID w/ an empty termination message upon receipt
of the SIGINT signal in certain cases. For example:
% sleep 10 | sleep 20 | sleep 30 ; wait
^C
2845:
2846:
This example should only print three newlines to the standard error
on SIGINT, not one newline and two process IDs w/ empty messages.
Now, it behaves as expected.
* Fixed a bug introduced in osh-20061230 where the shell incorrectly
handles an unescaped terminating backslash (\) character at the end
of string when the shell is invoked as `osh -c string'. In this
case, the terminating backslash causes the shell to incorrectly
read from the standard input at the end of string. For example:
% osh -c 'echo Hello\'
to\
you!
Hello to you!
This example should instead do nothing and exit w/ a zero status.
For `osh -c string', an unescaped terminating backslash should
turn string into a no-op. Now, it behaves as expected.
-------------------------------------------------------------------------------
[osh-20081026]:
* New files: defs.h, sh.h, util.c, v.c
* Moved common definitions for all programs to "defs.h".
* Added an osh package comment to the top of all header files.
INSTALL, Makefile:
* Changed the "oshall" target to only build osh since the utilities
are now built into the shell.
* Changed the "install-oshall" target to only install osh and its
manual pages. This includes the utility manual pages since they
are not fully documented elsewhere.
mkconfig:
* Changed the comment describing _XOPEN_SOURCE and _BSD_SOURCE for
compiling the osh package to be more neutral.
*.1.in:
* Synced the manual pages w/ the code as needed.
osh.c:
* Included "sh.h" for needed declarations.
* See util.c below for integrated shell utilities description.
* Renamed cmd_index() to cmd_lookup(), and changed the algorithm from
a linear search to a binary search.
* Added a base reallocation multiplier to glob()'s gavnew(). This
doubles the number of new arguments for which to reallocate memory
when the current allocation will not be large enough for the resulting
argument vector. This reduces the number of realloc()s required
for very large argument vectors while allowing the first malloc()
to be a relatively small allocation for up to 126 matching
file-name arguments.
util.c:
* Included "sh.h" for needed declarations.
* Integrated the external `if', `goto', and `fd2' shell utilities as
special built-in commands to improve shell performance. Also, added
`echo' as a special built-in command. Osh executes each of these
built-ins in a subshell. Consequently, the I/O for each can be
redirected as before, and the argument list for each can be the
result of a call to glob() as before.
fd2.c:
* Added a new `-e' command-line option to fd2.
-------------------------------------------------------------------------------
[osh-20080629]:
* Replaced all instances of "sdf1" w/ "v6shell" in all files since
the osh project website has a new URL, http://v6shell.org/, as of
Wednesday, 2008-01-16.
* Changed the general contact email address and the bug report email
address for the osh project. See the README file for details.
* Changed instances of "Unix" to "UNIX" in all files (excluding C*).
Though "Unix" is not an acronym, "UNIX" is a registered trademark
of The Open Group (http://www.opengroup.org/tm-guidelines.htm).
NOTE: The developer is not a lawyer and does not know that this
change is necessary in the legal sense. In any case, it seems
appropriate and sensible to acknowledge the UNIX trademark.
* New files: sasignal.c (from OpenBSD /usr/src/lib/libc/gen/signal.c)
and a corresponding sasignal.h
LICENSE:
* Added a copy of OpenBSD's license to account for sasignal.c .
INSTALL, Makefile:
* On Mac OS X, changed how compiling universal binaries is handled.
Now, only MOXARCH is used to specify the target architecture(s)
if and when the default (native) architecture is not desired.
For example:
% make MOXARCH='-arch i386 -arch ppc'
or
% make MOXARCH='-arch x86_64'
* Made a few changes to the Makefile to allow for more flexibility
in the compilation of the osh package. This should help on systems
where GCC is not the default compiler and where /usr/bin/install
is not a BSD-like or GNU-like install utility.
mkconfig:
* Add a case to define _XOPEN_SOURCE with a value of 600 on OpenSolaris
2008.05 (uname -s == SunOS), and generate an appropriate "config.h"
file. Specifying "CC=/usr/bin/gcc" and "INSTALL=/usr/bin/ginstall"
on the make command line allows osh to compile and install.
osh.c:
* Added support for 3 new command-line options (see osh(1)):
`-i' == interactive shell
`-l' == login shell
`-v' == verbose shell
* Added support for SYSCONFDIR/osh.oshrc (system-wide rc init file
for interactive shells), SYSCONFDIR/osh.logout (system-wide rc
logout file for login shells), and $h/.osh.logout (user rc logout
file for login shells).
* Added code to handle the SIGHUP signal. Cause the shell to execute
its rc logout files (if any) upon receipt of this signal.
* Changed the way that the shell deals w/ the SIGTERM signal so that
it only sets SIGTERM to its default action for child processes if
it was set to its default action when the shell started.
Doing a `sigign + 15' causes the shell's child processes to ignore
SIGTERM in all cases.
* Changed the code to use sasignal() instead of signal(3).
* Added a "Broken pipe" termination message for the SIGPIPE signal.
Notice that the original shell did not print a termination message
for this signal, but it can be quite useful in some cases.
osh.1.in:
* Updated the documentation as needed to reflect changes to the code.
-------------------------------------------------------------------------------
[osh-20080109]:
* New file: mkconfig (see Build/Install Changes)
* Moved files: Moved manual pages from *.1 to *.1.in to make their
generation and installation simpler in the Makefile.
Build/Install Changes:
* Stopped defining _XOPEN_SOURCE when compiling on Mac OS X, FreeBSD,
NetBSD, and OpenBSD. It is simply not necessary. However, both
_XOPEN_SOURCE and _BSD_SOURCE are necessary on GNU/Linux systems.
* Added a simple configure script, mkconfig. It is automatically
invoked from the Makefile to write out an appropriate "config.h"
file according to the osh package's needs on the given system. It
simply sets PATH_LOGIN, PATH_NEWGRP, _XOPEN_SOURCE, and _BSD_SOURCE
as needed so that the user does not need to bother w/ doing it
manually at build time.
osh.c:
* Patched the code to fix a "$0" parameter-substitution problem w/
the `source' command in the following interactive context:
% cat >file
echo \$0 == \"$0\"
echo \$1 == \"$1\"
^D
% source file ; : ... gives correct value for "$0".
$0 == ""
$1 == ""
% source file arg ; : ... gives incorrect value for "$0".
$0 == "0"
$1 == "arg"
getdolp() indirectly caused the problem by returning a NULL pointer
when the intended result was a pointer to the empty string. This
problem was not fatal, as the shell handles NULL pointers from
getdolp() anyway. However, NULL is supposed to indicate an
error where the specified parameter means nothing to the shell...
For example:
% echo \$Z == \"$Z\"
$Z == "Z"
* Changed the source command's parameter-substitution behavior so
that $0 always results in the name of the sourced command file,
not the name inherited from the main shell context. This makes
the parameter-substitution behavior of sourced command files
just like that of any other osh command file. Plus, this is
the documented behavior.
osh.1.in, sh6.1.in:
* Revised some wording to remove some cases of possible ambiguity.
-------------------------------------------------------------------------------
[osh-20070707]:
* Added a new file, INSTALL, which contains build and install
instructions. Made reference to INSTALL in Makefile and README.
Makefile:
* Added 3 new variables, MOXARCH, MOXSHELLARCH, and MOXUTILSARCH, to
simplify building universal binaries for Mac OS X. These are unset
by default. See INSTALL for more info.
* Changed the default value for SYSCONFDIR from /etc to $(PREFIX)/etc.
osh.c:
* Changed the reserved file descriptors from (7 - 9) to (10 - 12) in
order to avoid fd conflict w/ rxvt-unicode (version 8.2). This
conflict prevented `chdir -' from functioning correctly, but this
problem is now fixed.
The problem was clearly visible when running an interactive instance
of osh under the rxvt-unicode daemon (urxvtd) on Mac OS X. However,
I never saw this type of conflict when running under any other type
of terminal emulator on any OS. Thus, I do not know if this was
only an osh problem, a urxvtd problem, a Mac OS X problem, or some
combination of the 3...
-------------------------------------------------------------------------------
[osh-20070324]:
osh.c:
* In main(), changed when fdfree() is called so that it is in a more
ideal sequence with other operations according to how the shell is
invoked (e.g., interactive shell vs. non-interactive shell).
-------------------------------------------------------------------------------
[osh-20070321]:
* Imported the project into a local subversion repository.
* Changed the all of the code to "#include <stdbool.h>" and to use
the "bool" data-type macro where appropriate.
Makefile:
* Added SYSCONFDIR and a new `man' target.
osh.c:
* Defined _PATH_SYSTEM_LOGIN as `SYSCONFDIR/**/"/osh.login"' instead
of "/etc/osh.login" so that the user can use SYSCONFDIR (/etc by
default) at build-time to specify the directory where the shell
shall search for its system-wide initialization file.
* Added a new special parameter, $v, which makes the version of the
osh package available as a read-only string. The format is
`osh-YYYYMMDD' for official releases and `osh-current (YYYYMMDD)'
(interpreted as one word) for development snapshots.
* Fixed a bug where interactive shells were no longer ignoring SIGTERM
when invoked, as they are supposed to. Now, SIGTERM is being ignored
again upon invocation of all interactive shells.
* Fixed the output from doing a `sigign' so that it matches its
documentation in osh.1: "..., a list is printed of those signals
which are ignored by sigign in the current shell."
Previously, the output from a `sigign' could be a little confusing.
Now, its output only indicates those cases where a given signal is
being ignored w/ the possibility that it can then be unignored
(reset) in the current shell context.
if.c:
* Added 3 new primaries: -ef (equal files - same device, same inode),
-nt (newer than), -ot (older than). See the if(1) manual page for
full details.
-------------------------------------------------------------------------------
[osh-20070131]:
osh.1:
* Made a few minimal changes to synchronize the manual w/ the code.
osh.c 1.2 (jneitzel) 2007/01/14:
* Changed the `chdir: No old directory' diagnostic to
`chdir: No previous directory' to match the manual.
-------------------------------------------------------------------------------
[osh-20061230]:
The following files have been removed in this release:
examples/*: These files are now available at:
http://jneitzel.sdf1.org/osh/initialization_files/
tests/*: ... until I have a chance to rewrite them ...
*.1:
* Changed all instances of "UNIX" to "Unix" since the name
of the "Unix" operating system is not an acronym.
pexec.c:
* Fixed a possible, but very unlikely, memory leak.
osh.c:
C: Rewrote the shell! It is now a combination of the ports of the
original source code from sh6.c and glob6.c (see CHANGES6) w/ the
prior enhancements which were found in osh-060124/osh*.[ch] .
fd2.c:
* Removed the call to lseek(2) to end-of-file for errors.
The shell determines when this is necessary.
* Changed the `: no shell' diagnostic to `: No shell!'
in the spirit of sh6(1).
goto.c:
* Fixed a bug which interfered w/ finding a requested label when
its first character had the high-order bit set. The value of the
first character is now passed to getlabel() as an unsigned char
converted to an int to allow correct comparison in such a case.
if.c:
* Removed the call to lseek(2) to end-of-file for errors.
The shell determines when this is necessary.
* Changed the method used to build the argument list for all commands
executed by this utility, and removed the `Too many args' diagnostic.
The maximum length of the argument list for a command is now limited
only by the maximum length that the invoker can pass and by any
system-imposed limit for execve(2) (see E2BIG in errno(2)).
* Changed the `: no shell' diagnostic to `: No shell!'
in the spirit of sh6(1).
* Changed the diagnostic used for `!', `-a', `-o', and `(' operator
errors from `: argument expected' to `: expression expected'.
-------------------------------------------------------------------------------
[osh-060124]:
Makefile:
* Added targets for building/installing sh6(1) and glob6(1).
Refer to the README file for further details.
* Removed the `check-sh6' target since the tests were originally
written for osh(1) and sh6(1) as Thompson-shell reimplementations,
not ports.
sh6:
* Changed sh6(1) from being a reimplementation which is compiled from
the same sources as osh(1) to being a port of the original Thompson
shell from Sixth Edition UNIX. Refer to the CHANGES6 file for
further details.
osh:
C: Treat both `( ; )' and `( & )' as syntax errors.
C: Print the process ID for each command of an asynchronous pipeline,
not just the last command.
C: Added the `newgrp' special command. It is similar to `login'
except that the newgrp(1) utility replaces the current interactive
shell rather than the login(1) utility.
* When opening `/dev/null' is needed for an asynchronous command,
call open(2) w/ the O_RDONLY flag instead of O_RDWR.
-------------------------------------------------------------------------------
[osh-051120]:
This release fixes some problems introduced in osh-051030.
[fios]*.1:
* Made a few minimal changes for the sake of clarity.
osh and sh6:
* Fixed a file (pipe) descriptor leak in pipeline execution when
the shell is interactive. This also includes those cases where
the shell is executing an initialization file or sourcing a file
from an interactive shell. Specifically, when the shell detected
an error during execution of a pipeline, it did not close(2) all
of the appropriate pipe descriptors which had been allocated by
pipe(2) for the next command in the pipeline.
* Reverted the unconventional execution error behavior introduced
in the previous release since this change was out of character
w/ the Thompson shell, and other common UNIX shells as well.
osh only:
* Fixed a bug in the `exec' special command where a pipeline such as
`( cat /dev/zero ) | exec sleep 1' would not replace the current
shell with an instance of sleep(1).
-------------------------------------------------------------------------------
[osh-051030]:
This release includes the following new files:
fd2.[1c]: This is the fd2 utility from fd2-050215.
pexec.[ch]: The pexec() function is used instead of execvp(3).
See below for details.
LICENSE:
* Added an entry for pexec.c which mentions its being derived from
the NetBSD project's /usr/src/lib/libc/gen/execvp.c and includes
a copy of its original license. Of course, the pexec.c file also
includes the pertinent license information.
Makefile:
* Added appropriate targets for building/installing the fd2 utility.
The default is to build/install osh, if, goto, and fd2.
examples:
* Updated the example initialization files and command files.
tests:
* Made changes to the tests in accordance w/ changes to the software.
*.1:
* Made revisions in accordance w/ changes to the software.
osh and sh6:
* Did some more generic code cleanup and simplification.
This was largely inspired by the fact that the developer was
seeking workarounds for a few system bugs present in Mac OS X
(Panther and Tiger). The system and library calls with some
incorrect behavior include:
lseek(2) - Panther only,
fstat(2) and glob(3) - Tiger only.
Since the bugs present in Panther differ from those in Tiger, the
workarounds were removed for the sake of simplicity. However, the
generic code cleanups remain. The observed problems for the shell
in Mac OS X are very minor and do not interfere w/ using the shell
in the normal case. The results from `make check' demonstrate the
exceptional cases where Mac OS X impedes operation of the shell.
* If the shell is invoked w/ an invalid argument list (argc == 0),
exit w/ error and print the diagnostic `Invalid argument list'.
* After the shell is invoked and initializes itself but before it
begins reading/executing commands, close any open descriptors in
the range 3 - 19 (inclusive) that the shell did not set up for
itself. Note that doing so does not break x-only scripts if
such scripts are supported on a particular UNIX system.
* Increased some key buffer sizes...
The size of the command-line buffer now allows for 2047 characters
in each command line instead of 1023. The size of the argument list
array now allows for 511 arguments in each command instead of 255.
* Set the SIGCHLD signal to its default action when the shell starts.
This is necessary on some systems because the shell's parent process
might try to ignore SIGCHLD, and correct operation of the shell
requires that zombies be created for its terminated children.
Otherwise, the shell may not be able to properly waitpid(2)
for, and report the termination status of, its children
when they terminate.
* The asynchronous and sequential process lists are no longer
dynamically allocated. Now, these process lists are statically
allocated, each allowing up to 64 process IDs. This is more than
adequate in the normal case. Also, it has the benefit of a simpler
implementation. A diagnostic is printed if the limits are exceeded.
* The shell no longer uses execvp(3). Instead, it uses pexec() which
is simply a derivation of NetBSD's execvp(3). This change allows the
shell to deal with ENOEXEC errors in a way which is to similar to how
the Thompson shell handled it. In addition, it allows the user to
disable the searching of PATH for external commands. This is done
by unsetting PATH or setting it to the empty string.
* Instead of exiting with a status of 1 for some errors and a status
of 2 for others, simply use a status of 2 to indicate that the shell
has detected an error. See the `EXIT STATUS' section of the shell
manual pages for the final word on the exit status of the shell.
* Fixed a problem in how the shell exits on error when invoked w/
the `-c' option. The problem can be observed in ssh(1) by doing
a `ssh user@host "syntax error >"' which requires the user to type
an EOT (^D) (assuming input is a terminal) in order to cause the
shell to exit. Now, the shell exits as it should.
* A cleanup of the logic and code for shell termination on errors
was also done. This is related to the problem mentioned above.
Now, for the `-c' and `-t' options the shell does not affect the
offset of the standard input when an error occurs. That is, it
no longer calls lseek(2), simply calling exit(3) in such cases.
* The shell now aborts execution of a command line when it detects
an execution error that happens before calling fork(2). This can
help in an interactive shell in particular. For example:
1)
% wc -l data
66 data
% chdir bad_dir; ( : ) >data
chdir: bad directory
% wc -l data
0 data
2)
% wc -l data
66 data
% chdir bad_dir; ( : ) >data
chdir: bad directory
% wc -l data
66 data
In the first case, this obviously clobbers the file `data' which
might be very undesirable if `data' is important. In the second
case however, `data' is never clobbered since the failed `chdir'
aborts execution of the command line.
* If command-line overflow occurs on a terminal device, the shell
no longer uses tcflush(3) to discard the overflowed characters.
Instead, it simply reads and discards the remaining overflowed
characters which have been received from the terminal for the
overflowed line.
* Changed when the shell generates termination reports for
asynchronous processes. Instead of being generated after
a command line is read and parsed, but before it is executed...
They are now generated after a command line is executed.
This prevents the possibility that the user might miss an
important process termination if it is reported just before
a screen-oriented text editor (like vi(1)) is invoked.
Now, the process termination will be reported after the
user quits the editor.
osh only:
* Eliminated all of the code for the run-time compatibility toggles.
Trying to have 2 shells in one is simply not worth the increase in
code size and complexity. If the user wants compatible only, the
simple solution is to compile and run the shell as sh6(1).
Otherwise, compile and run it as osh(1).
* Eliminated the globbing behavior for failed matches which was like
that found in the Bourne shell. Osh(1) now uses only the behavior
found in the Thompson shell for failed matches. See the manual page
for details, but in short the user may see a `No match' diagnostic.
* Changed the effect of command-line overflow when it occurs in an
initialization file. Previously, the shell would treat it as an
error and lseek(2) to the end of the file. Now, the shell shall
continue to read and execute commands from the file as if no error
had occurred. Though, the `Command line overflow' diagnostic is
still printed, and the exit status is set accordingly.
* Added 2 new environment variables and 2 new special parameters.
OSHDIR corresponds w/ `$d', and EXECSHELL corresponds w/ `$e'.
See the osh(1) manual page for full details.
* Made the shell to be more picky about correct usage for the
`setenv', `unsetenv', and `umask' special commands.
* The `source' special command can now substitute
positional parameters.
goto:
* Reduced LABELSIZE from 1024 to 64. This allows a maximum label
length of 63 characters, which is more than adequate. Assuming the
user limits each possible label character to be one of [0-9A-Za-z],
a label length limit of 63 characters still allows 8.33060e+112
possible unique labels.
* Changed the way `label too long' is handled. Rather than giving a
`label too long' error if a possible label found in a command file
is too long, simply give this error when the user-requested label
is longer than 63 characters. In such a case, no label search
shall be performed at all.
-------------------------------------------------------------------------------
[osh-050219]:
examples:
* Updated the example initialization files.
* Added a few command files to give users a head start
in scripting the shell.
osh.1 and sh6.1:
* Made a few more minimal revisions.
osh and sh6:
* Did some more code cleanup.
-------------------------------------------------------------------------------
[osh-050131]:
*.1:
* Made some revisions and added some new content.
osh and sh6:
* Did some code cleanup for the sake of clarity and simplicity.
Basically, this just removes some redundant operations.
-------------------------------------------------------------------------------
[osh-041231]:
LICENSE:
* Removed clauses 3 and 4 from the license under which I release
this software. This only affects my license. Do not worry;
this software is still free! Read LICENSE for further info.
Each file on which I explicitly claim copyright also contains
a copy of this license.
tests:
* Added 2 more tests to be run by `make check' and `make check-sh6'.
* Did some reorganization as well.
osh and sh6:
* Fixed a typo in the execute() function that can cause a memory fault
in sh6, and in osh when running in compatible mode. This error was
only possible when using the `chdir' special command preceded by a
redirection such as `> file' (e.g., `> /dev/null chdir foo').
* Made several changes to how the shell reads input into the
command-line buffer. Generally, this is not a user-visible
change but is noteworthy nonetheless.
* Made a few improvements to the parser.
It now catches a few errors that could have previously caused some
confusion. Before: `echo \<<', `echo \>>', `echo foo>bar', etc...
None of these would have been considered a syntax error. Now, all
of them are. The unquoted `<' and `>' characters in the above
commands are not considered to be redirection arguments.
In this implementation of the shell, a redirection argument must be
separated from other command-line arguments by one or more blanks.
This is unlike other shells. However, since this is the documented
behavior of the Thompson shell, this implementation of the shell
adheres to the documented behavior for the sake of simplicity.
* Fixed incorrect globbing results for quoted glob characters.
Now, the shell correctly handles quoted glob characters in an
argument when the same argument also contains *unquoted* glob
characters. Note that the correct behavior of globbing in
the shell relies on a POSIX-compliant glob(3) being available
on the system where the shell is built and/or used.
osh only:
* Fixed a small problem with the `source' special command.
Doing a `source /path/to/nonexistent_file' in an initialization file
should not cause the shell to cease execution of that file. Now,
execution of the initialization file continues as normal. Of course,
user can test for error and have the shell act accordingly in such
a case.
* Renamed the `trap' special command to `sigign' since it is really
nothing like the trap command found in other shells. Thus, I thought
calling it `trap' could be misleading to the user. On the other hand,
`sigign' makes sense given what the command does, which is to ignore
or unignore signals.
if:
* Did another rewrite of the if(1) utility.
Started with a fresh copy of if.c from Sixth Edition UNIX.
User-visible changes? None.
goto:
* Did another rewrite of the goto(1) utility.
Started with a fresh copy of goto.c from Sixth Edition UNIX.
User-visible changes? Yes, it is no longer an error for a NUL
character to appear in the input. Also, it now prints an explicit
`cannot seek' diagnostic if the input file is not seekable.
-------------------------------------------------------------------------------
[osh-041028]:
*.1:
* Fixed a few typos in osh.1 and sh6.1.
* Did a little fine tuning of osh.1 and sh6.1 to hopefully
eliminate some incomplete and/or unclear explanations.
* Did the same for both if.1 and goto.1.
osh and sh6:
* Fixed an annoying bug introduced in the previous release...
The way error messages were printed in error() was not accounting
for the fact that the standard error stream is quite often (if not
always) unbuffered by default. This could make some error messages
difficult to read when a pipeline was involved. A little example:
Before (unfixed):
% foo|bar|baz
foo: not foundbar: not foundbaz: not found
After (fixed):
% foo|bar|baz
foo: not found
bar: not found
baz: not found
-------------------------------------------------------------------------------
[osh-041018]:
This release includes sh6 in addition to osh, if, and goto.
Sh6 is simply osh without the enhancements. It is built from the
same sources as osh, but it is not built or installed by default.
Makefile:
* Added targets for sh6 so that it can optionally be built, tested,
and installed if desired.
osh and sh6:
* Split the code into modules.
This is primarily for developer sanity... ;)
The new files are osh.h, main.c, parse.c, and exec.c.
* If (geteuid() != getuid() || getegid() != getgid()) is true,
print a nice error message and exit with a status of 2.
* Strip all NUL characters from the shell's standard input as it is
being read into the command line buffer. Input to the shell is
expected to be text.
* Changed the way the shell handles non-seekable files.
This is for both initialization files (osh only) and command files.
Do not block on open(2); open it and determine if it is a regular
file (or seekable). If it is not a regular file or is not seekable,
exit with an error. If seekable, reset the file for blocking I/O
and continue as normal.
Note that you can still read commands from FIFOs if you want.
Instead of doing `osh myfifo', you can either do `osh <myfifo'
or `osh - my list of positional parameters <myfifo'.
* Changed the error handling to use stdarg(3).
This allows for more code consistency and makes it easier
to handle all errors with just one line of code.
osh only:
* Added another possible initialization file for osh: $HOME/.oshrc
Osh only attempts to execute commands from this file if it is an
interactive shell. In the case of a login shell, osh tries this
file only after it tries both /etc/osh.login and $HOME/.osh.login.
* Made osh less strict about errors in initialization files.
Previously, common shell-detected errors in any of the files
were generally treated in the same way as they would have been
treated in a command file (i.e., the error was fatal). Realizing
that this potentially caused difficulty and annoyance for the user,
I opted to change it so that these types of errors are handled as
they are when osh is interactive.
This should make it easier for the user to debug
initialization files if needed.
* Added a `source' special command.
It is functionally similar to the way this command works in csh(1).
See osh(1) for details.
if:
* Changed ARGMAX from 50 to 256.
* If (geteuid() != getuid() || getegid() != getgid()) is true,
print a nice error message and exit with a status of 2.
* Added a few new primaries: `-h', `-s', `-t', and `-x'
See if(1) for details.
goto:
* Changed the size of the label buffer from 128 to 1024.
* Do not require the `:' of a labelled line to appear in column 1.
Instead, allow the `:' to optionally be preceded by blanks so that
labelled lines can be indented in command files. See goto(1) for
more details if needed.
* Eliminated unnecessary calls to strcmp(3) whenever a possible label
cannot possibly match the label argument given on the command line.
* Give an error if any NUL character is encountered in the input.
* Give an error if a zero-length string is given as the label argument.
-------------------------------------------------------------------------------
[osh-040812]:
osh.c:
* Changed the way unused pipe descriptors are handled in the child
process after fork(). This fixes a bug where the pipe in a pipeline