]> git.saurik.com Git - apple/shell_cmds.git/commitdiff
shell_cmds-74.1.tar.gz mac-os-x-104 mac-os-x-1041 mac-os-x-10410ppc mac-os-x-1042 mac-os-x-1043 mac-os-x-1044ppc mac-os-x-1045ppc mac-os-x-1046ppc mac-os-x-1047ppc mac-os-x-1048ppc mac-os-x-1049ppc v74.1
authorApple <opensource@apple.com>
Thu, 24 Feb 2005 22:19:02 +0000 (22:19 +0000)
committerApple <opensource@apple.com>
Thu, 24 Feb 2005 22:19:02 +0000 (22:19 +0000)
99 files changed:
Makefile
Makefile.postamble
Manpages/alloc.1 [new file with mode: 0644]
Manpages/bindkey.1 [new file with mode: 0644]
Manpages/break.1 [new file with mode: 0644]
Manpages/breaksw.1 [new file with mode: 0644]
Manpages/builtin.1 [new file with mode: 0644]
Manpages/builtins.1 [new file with mode: 0644]
Manpages/case.1 [new file with mode: 0644]
Manpages/chdir.1 [new file with mode: 0644]
Manpages/complete.1 [new file with mode: 0644]
Manpages/continue.1 [new file with mode: 0644]
Manpages/default.1 [new file with mode: 0644]
Manpages/dirs.1 [new file with mode: 0644]
Manpages/do.1 [new file with mode: 0644]
Manpages/done.1 [new file with mode: 0644]
Manpages/echotc.1 [new file with mode: 0644]
Manpages/elif.1 [new file with mode: 0644]
Manpages/else.1 [new file with mode: 0644]
Manpages/end.1 [new file with mode: 0644]
Manpages/endif.1 [new file with mode: 0644]
Manpages/endsw.1 [new file with mode: 0644]
Manpages/esac.1 [new file with mode: 0644]
Manpages/eval.1 [new file with mode: 0644]
Manpages/exec.1 [new file with mode: 0644]
Manpages/exit.1 [new file with mode: 0644]
Manpages/export.1 [new file with mode: 0644]
Manpages/fi.1 [new file with mode: 0644]
Manpages/filetest.1 [new file with mode: 0644]
Manpages/foreach.1 [new file with mode: 0644]
Manpages/glob.1 [new file with mode: 0644]
Manpages/goto.1 [new file with mode: 0644]
Manpages/hashstat.1 [new file with mode: 0644]
Manpages/history.1 [new file with mode: 0644]
Manpages/hup.1 [new file with mode: 0644]
Manpages/if.1 [new file with mode: 0644]
Manpages/jobid.1 [new file with mode: 0644]
Manpages/limit.1 [new file with mode: 0644]
Manpages/log.1 [new file with mode: 0644]
Manpages/logout.1 [new file with mode: 0644]
Manpages/ls-F.1 [new file with mode: 0644]
Manpages/notify.1 [new file with mode: 0644]
Manpages/onintr.1 [new file with mode: 0644]
Manpages/popd.1 [new file with mode: 0644]
Manpages/pushd.1 [new file with mode: 0644]
Manpages/readonly.1 [new file with mode: 0644]
Manpages/rehash.1 [new file with mode: 0644]
Manpages/repeat.1 [new file with mode: 0644]
Manpages/sched.1 [new file with mode: 0644]
Manpages/set.1 [new file with mode: 0644]
Manpages/setenv.1 [new file with mode: 0644]
Manpages/settc.1 [new file with mode: 0644]
Manpages/setty.1 [new file with mode: 0644]
Manpages/setvar.1 [new file with mode: 0644]
Manpages/shift.1 [new file with mode: 0644]
Manpages/source.1 [new file with mode: 0644]
Manpages/stop.1 [new file with mode: 0644]
Manpages/suspend.1 [new file with mode: 0644]
Manpages/switch.1 [new file with mode: 0644]
Manpages/telltc.1 [new file with mode: 0644]
Manpages/then.1 [new file with mode: 0644]
Manpages/trap.1 [new file with mode: 0644]
Manpages/uncomplete.1 [new file with mode: 0644]
Manpages/unhash.1 [new file with mode: 0644]
Manpages/unlimit.1 [new file with mode: 0644]
Manpages/unset.1 [new file with mode: 0644]
Manpages/unsetenv.1 [new file with mode: 0644]
Manpages/until.1 [new file with mode: 0644]
Manpages/where.1 [new file with mode: 0644]
Manpages/while.1 [new file with mode: 0644]
PB.project
alias/Makefile [new file with mode: 0644]
alias/Makefile.postamble [new file with mode: 0644]
alias/Makefile.preamble [new file with mode: 0644]
alias/PB.project [new file with mode: 0644]
alias/alias.1 [new file with mode: 0644]
alias/alias.c [new file with mode: 0644]
alias/generic.sh [new file with mode: 0644]
date/Makefile
date/date.1
date/date.c
env/env.c
expr/Makefile
expr/expr.c
find/find.c
id/id.c
locate/Makefile
locate/Makefile.postamble
locate/locate.code.8 [new file with mode: 0644]
nohup/nohup.c
renice/renice.8
renice/renice.c
shlock/shlock.1
su/su.c
uname/uname.1
w/proc_compare.c
w/w.c
who/who.1
who/who.c

index 5975215a724928df9e8646fd336bf9dbf5f9ddf6..e9fc42f53bbb3a8f8e58593ad4e28687becec957 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -14,13 +14,12 @@ PROJECT_TYPE = Aggregate
 
 SUBPROJECTS = locate
 
-TOOLS = killall apply basename chroot date dirname echo env expr false\
-        find getopt hostname id jot kill lastcomm logname mktemp nice\
-        nohup printenv printf pwd renice script shlock sleep su\
-        tee test time true uname users w whereis which who\
-        xargs yes
+TOOLS = alias apply basename chroot date dirname echo env expr false\
+        find getopt hostname id jot kill killall lastcomm logname mktemp\
+        nice nohup printenv printf pwd renice script shlock sleep su\
+        tee test time true uname users w whereis which who xargs yes
 
-OTHERSRCS = PROJECT Makefile.preamble Makefile Makefile.postamble
+OTHERSRCS = PROJECT Makefile.preamble Makefile Makefile.postamble Manpages/*.1
 
 MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
 CODE_GEN_STYLE = DYNAMIC
index 013b558de882142e966c538876f25f5726df1f43..f2fd4e959d647d4f3654cb860822519e58795478 100644 (file)
@@ -1 +1,4 @@
 include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
+
+after_install::
+       $(INSTALL_FILE) $(SRCROOT)/Manpages/*.1 $(DSTROOT)/usr/share/man/man1
diff --git a/Manpages/alloc.1 b/Manpages/alloc.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/bindkey.1 b/Manpages/bindkey.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/break.1 b/Manpages/break.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/breaksw.1 b/Manpages/breaksw.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/builtin.1 b/Manpages/builtin.1
new file mode 100644 (file)
index 0000000..bc53b39
--- /dev/null
@@ -0,0 +1,294 @@
+.\"
+.\" Copyright (c) 1999 Sheldon Hearn
+.\"
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    $FreeBSD: src/share/man/man1/builtin.1,v 1.20 2002/07/23 14:38:07 tjr Exp $
+.\"
+.Dd September 1, 1999
+.Dt BUILTIN 1
+.Os
+.Sh NAME
+.Nm builtin ,
+.Nm alias ,
+.Nm alloc ,
+.Nm bg ,
+.Nm bind ,
+.Nm bindkey ,
+.Nm break ,
+.Nm breaksw ,
+.Nm builtins ,
+.Nm case ,
+.Nm cd ,
+.Nm chdir ,
+.Nm command ,
+.Nm complete ,
+.Nm continue ,
+.Nm default ,
+.Nm dirs ,
+.Nm do ,
+.Nm done ,
+.Nm echo ,
+.Nm echotc ,
+.Nm elif ,
+.Nm else ,
+.Nm end ,
+.Nm endif ,
+.Nm endsw ,
+.Nm esac ,
+.Nm eval ,
+.Nm exec ,
+.Nm exit ,
+.Nm export ,
+.Nm false ,
+.Nm fc ,
+.Nm fg ,
+.Nm filetest ,
+.Nm fi ,
+.Nm for ,
+.Nm foreach ,
+.Nm getopts ,
+.Nm glob ,
+.Nm goto ,
+.Nm hash ,
+.Nm hashstat ,
+.Nm history ,
+.Nm hup ,
+.Nm if ,
+.Nm jobid ,
+.Nm jobs ,
+.Nm kill ,
+.Nm limit ,
+.Nm log ,
+.Nm login ,
+.Nm logout ,
+.Nm ls-F ,
+.Nm nice ,
+.Nm nohup ,
+.Nm notify ,
+.Nm onintr ,
+.Nm popd ,
+.Nm printenv ,
+.Nm pushd ,
+.Nm pwd ,
+.Nm read ,
+.Nm readonly ,
+.Nm rehash ,
+.Nm repeat ,
+.Nm sched ,
+.Nm set ,
+.Nm setenv ,
+.Nm settc ,
+.Nm setty ,
+.Nm setvar ,
+.Nm shift ,
+.Nm source ,
+.Nm stop ,
+.Nm suspend ,
+.Nm switch ,
+.Nm telltc ,
+.Nm test ,
+.Nm then ,
+.Nm time ,
+.Nm trap ,
+.Nm true ,
+.Nm type ,
+.Nm ulimit ,
+.Nm umask ,
+.Nm unalias ,
+.Nm uncomplete ,
+.Nm unhash ,
+.Nm unlimit ,
+.Nm unset ,
+.Nm unsetenv ,
+.Nm until ,
+.Nm wait ,
+.Nm where ,
+.Nm which ,
+.Nm while
+.Nd shell builtin commands
+.Sh SYNOPSIS
+.Nm
+.Op Fl options
+.Op Ar args ...
+.Sh DESCRIPTION
+Shell builtin commands are commands that can be executed within the
+running shell's process.
+Note that, in the case of
+.Xr csh 1
+builtin commands, the command is executed in a subshell if it occurs as
+any component of a pipeline except the last.
+.Pp
+If a command specified to the shell contains a slash
+.Dq \&/ ,
+the shell will not execute a builtin command, even if the last component
+of the specified command matches the name of a builtin command.
+Thus, while specifying
+.Dq Ic echo
+causes a builtin command to be executed under shells that support the
+builtin echo command,
+specifying
+.Dq Pa /bin/echo
+or
+.Dq Pa ./echo
+does not.
+.Pp
+While some builtin commands may exist in more than one shell, their
+operation may be different under each shell which supports them.
+Below is a table which lists shell builtin commands, the standard shells
+that support them and whether they exist as standalone utilities.
+.Pp
+Only builtin commands for the
+.Xr csh 1
+and
+.Xr sh 1
+shells are listed here.
+Consult the appropriate manual page for
+details on the operation of any given builtin command under those shells.
+Users of other shells will need to consult the documentation supplied
+with the other shells.
+.Bl -column ".Ic uncomplete" ".Em External" ".Xr csh 1" ".Xr sh 1" -offset indent
+.It Xo
+.Em "Command   External" Ta Xr csh 1 Ta Xr sh 1
+.Xc
+.It Ic alias Ta Yes Ta Yes Ta Yes
+.It Ic alloc Ta \&No Ta Yes Ta \&No
+.It Ic bg Ta Yes Ta Yes Ta Yes
+.It Ic bind Ta \&No Ta \&No Ta Yes
+.It Ic bindkey Ta \&No Ta Yes Ta \&No
+.It Ic break Ta \&No Ta Yes Ta \&Yes
+.It Ic breaksw Ta \&No Ta Yes Ta \&No
+.It Ic builtins Ta \&No Ta Yes Ta \&No
+.It Ic case Ta \&No Ta Yes Ta Yes
+.It Ic cd Ta Yes Ta Yes Ta Yes
+.It Ic chdir Ta \&No Ta Yes Ta \&No
+.It Ic command Ta Yes Ta \&No Ta Yes
+.It Ic complete Ta \&No Ta Yes Ta \&No
+.It Ic continue Ta \&No Ta Yes Ta \&Yes
+.It Ic default Ta \&No Ta Yes Ta \&No
+.It Ic dirs Ta \&No Ta Yes Ta \&No
+.It Ic do Ta \&No Ta \&No Ta Yes
+.It Ic done Ta \&No Ta \&No Ta Yes
+.It Ic echo Ta Yes Ta Yes Ta Yes
+.It Ic echotc Ta \&No Ta Yes Ta \&No
+.It Ic elif Ta \&No Ta \&No Ta Yes
+.It Ic else Ta \&No Ta Yes Ta \&Yes
+.It Ic end Ta \&No Ta Yes Ta \&No
+.It Ic endif Ta \&No Ta Yes Ta \&No
+.It Ic endsw Ta \&No Ta Yes Ta \&No
+.It Ic esac Ta \&No Ta \&No Ta Yes
+.It Ic eval Ta \&No Ta Yes Ta Yes
+.It Ic exec Ta \&No Ta Yes Ta Yes
+.It Ic exit Ta \&No Ta Yes Ta Yes
+.It Ic export Ta \&No Ta \&No Ta Yes
+.It Ic false Ta Yes Ta \&No Ta Yes
+.It Ic fc Ta Yes Ta \&No Ta Yes
+.It Ic fg Ta Yes Ta Yes Ta Yes
+.It Ic filetest Ta \&No Ta Yes Ta \&No
+.It Ic fi Ta \&No Ta \&No Ta Yes
+.It Ic for Ta \&No Ta \&No Ta Yes
+.It Ic foreach Ta \&No Ta Yes Ta \&No
+.It Ic getopts Ta Yes Ta \&No Ta Yes
+.It Ic glob Ta \&No Ta Yes Ta \&No
+.It Ic goto Ta \&No Ta Yes Ta \&No
+.It Ic hash Ta \&No Ta \&No Ta Yes
+.It Ic hashstat Ta \&No Ta Yes Ta \&No
+.It Ic history Ta \&No Ta Yes Ta \&No
+.It Ic hup Ta \&No Ta Yes Ta \&No
+.It Ic if Ta \&No Ta Yes Ta \&Yes
+.It Ic jobid Ta \&No Ta \&No Ta Yes
+.It Ic jobs Ta Yes Ta Yes Ta Yes
+.It Ic kill Ta Yes Ta Yes Ta \&No
+.It Ic limit Ta \&No Ta Yes Ta \&No
+.It Ic log Ta \&No Ta Yes Ta \&No
+.It Ic login Ta Yes Ta Yes Ta \&No
+.It Ic logout Ta \&No Ta Yes Ta \&No
+.It Ic ls-F Ta \&No Ta Yes Ta \&No
+.It Ic nice Ta Yes Ta Yes Ta \&No
+.It Ic nohup Ta Yes Ta Yes Ta \&No
+.It Ic notify Ta \&No Ta Yes Ta \&No
+.It Ic onintr Ta \&No Ta Yes Ta \&No
+.It Ic popd Ta \&No Ta Yes Ta \&No
+.It Ic printenv Ta Yes Ta Yes Ta \&No
+.It Ic pushd Ta \&No Ta Yes Ta \&No
+.It Ic pwd Ta Yes Ta \&No Ta Yes
+.It Ic read Ta Yes Ta \&No Ta Yes
+.It Ic readonly Ta \&No Ta \&No Ta Yes
+.It Ic rehash Ta \&No Ta Yes Ta \&No
+.It Ic repeat Ta \&No Ta Yes Ta \&No
+.It Ic sched Ta \&No Ta Yes Ta \&No
+.It Ic set Ta \&No Ta Yes Ta \&Yes
+.It Ic setenv Ta \&No Ta Yes Ta \&No
+.It Ic settc Ta \&No Ta Yes Ta \&No
+.It Ic setty Ta \&No Ta Yes Ta \&No
+.It Ic setvar Ta \&No Ta \&No Ta Yes
+.It Ic shift Ta \&No Ta Yes Ta Yes
+.It Ic source Ta \&No Ta Yes Ta \&No
+.It Ic stop Ta \&No Ta Yes Ta \&No
+.It Ic suspend Ta \&No Ta Yes Ta \&No
+.It Ic switch Ta \&No Ta Yes Ta \&No
+.It Ic telltc Ta \&No Ta Yes Ta \&No
+.It Ic test Ta Yes Ta \&No Ta Yes
+.It Ic then Ta \&No Ta \&No Ta Yes
+.It Ic time Ta Yes Ta Yes Ta \&No
+.It Ic trap Ta \&No Ta \&No Ta Yes
+.It Ic true Ta Yes Ta \&No Ta Yes
+.It Ic type Ta \&No Ta \&No Ta Yes
+.It Ic ulimit Ta \&No Ta \&No Ta Yes
+.It Ic umask Ta Yes Ta Yes Ta Yes
+.It Ic unalias Ta Yes Ta Yes Ta Yes
+.It Ic uncomplete Ta \&No Ta Yes Ta \&No
+.It Ic unhash Ta \&No Ta Yes Ta \&No
+.It Ic unlimit Ta \&No Ta Yes Ta \&No
+.It Ic unset Ta \&No Ta Yes Ta Yes
+.It Ic unsetenv Ta \&No Ta Yes Ta \&No
+.It Ic until Ta \&No Ta \&No Ta Yes
+.It Ic wait Ta Yes Ta Yes Ta Yes
+.It Ic where Ta \&No Ta Yes Ta \&No
+.It Ic which Ta Yes Ta Yes Ta \&No
+.It Ic while Ta \&No Ta Yes Ta \&Yes
+.El
+.Sh SEE ALSO
+.Xr csh 1 ,
+.Xr echo 1 ,
+.Xr false 1 ,
+.Xr kill 1 ,
+.Xr login 1 ,
+.Xr nice 1 ,
+.Xr nohup 1 ,
+.Xr printenv 1 ,
+.Xr pwd 1 ,
+.Xr sh 1 ,
+.Xr test 1 ,
+.Xr time 1 ,
+.Xr true 1 ,
+.Xr which 1
+.Sh HISTORY
+The
+.Nm
+manual page first appeared in
+.Fx 3.4 .
+.Sh AUTHORS
+This manual page was written by
+.An Sheldon Hearn Aq sheldonh@FreeBSD.org .
diff --git a/Manpages/builtins.1 b/Manpages/builtins.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/case.1 b/Manpages/case.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/chdir.1 b/Manpages/chdir.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/complete.1 b/Manpages/complete.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/continue.1 b/Manpages/continue.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/default.1 b/Manpages/default.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/dirs.1 b/Manpages/dirs.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/do.1 b/Manpages/do.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/done.1 b/Manpages/done.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/echotc.1 b/Manpages/echotc.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/elif.1 b/Manpages/elif.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/else.1 b/Manpages/else.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/end.1 b/Manpages/end.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/endif.1 b/Manpages/endif.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/endsw.1 b/Manpages/endsw.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/esac.1 b/Manpages/esac.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/eval.1 b/Manpages/eval.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/exec.1 b/Manpages/exec.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/exit.1 b/Manpages/exit.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/export.1 b/Manpages/export.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/fi.1 b/Manpages/fi.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/filetest.1 b/Manpages/filetest.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/foreach.1 b/Manpages/foreach.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/glob.1 b/Manpages/glob.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/goto.1 b/Manpages/goto.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/hashstat.1 b/Manpages/hashstat.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/history.1 b/Manpages/history.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/hup.1 b/Manpages/hup.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/if.1 b/Manpages/if.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/jobid.1 b/Manpages/jobid.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/limit.1 b/Manpages/limit.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/log.1 b/Manpages/log.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/logout.1 b/Manpages/logout.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/ls-F.1 b/Manpages/ls-F.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/notify.1 b/Manpages/notify.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/onintr.1 b/Manpages/onintr.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/popd.1 b/Manpages/popd.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/pushd.1 b/Manpages/pushd.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/readonly.1 b/Manpages/readonly.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/rehash.1 b/Manpages/rehash.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/repeat.1 b/Manpages/repeat.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/sched.1 b/Manpages/sched.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/set.1 b/Manpages/set.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/setenv.1 b/Manpages/setenv.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/settc.1 b/Manpages/settc.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/setty.1 b/Manpages/setty.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/setvar.1 b/Manpages/setvar.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/shift.1 b/Manpages/shift.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/source.1 b/Manpages/source.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/stop.1 b/Manpages/stop.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/suspend.1 b/Manpages/suspend.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/switch.1 b/Manpages/switch.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/telltc.1 b/Manpages/telltc.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/then.1 b/Manpages/then.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/trap.1 b/Manpages/trap.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/uncomplete.1 b/Manpages/uncomplete.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/unhash.1 b/Manpages/unhash.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/unlimit.1 b/Manpages/unlimit.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/unset.1 b/Manpages/unset.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/unsetenv.1 b/Manpages/unsetenv.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/until.1 b/Manpages/until.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/where.1 b/Manpages/where.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/Manpages/while.1 b/Manpages/while.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
index 66a0c641691333093e44528ef49d454f19c46b77..9ac16b9d9f4db01a5eedd6bea55be06c9066f3b4 100644 (file)
@@ -3,6 +3,7 @@
     FILESTABLE = {
         OTHER_SOURCES = (PROJECT, Makefile.preamble, Makefile, Makefile.postamble); 
         SUBPROJECTS = (
+            alias,
             apply, 
             basename, 
             chroot, 
diff --git a/alias/Makefile b/alias/Makefile
new file mode 100644 (file)
index 0000000..89797ce
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# Generated by the NeXT Project Builder.
+#
+# NOTE: Do NOT change this file -- Project Builder maintains it.
+#
+# Put all of your customizations in files called Makefile.preamble
+# and Makefile.postamble (both optional), and Makefile will include them.
+#
+
+NAME = alias
+
+PROJECTVERSION = 2.8
+PROJECT_TYPE = Tool
+
+# The following file, alias.c is a dummy c file to make the Makefile work.
+# Do not remove it.
+CFILES = alias.c
+
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble generic.sh alias.1
+
+MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
+CODE_GEN_STYLE = DYNAMIC
+MAKEFILE = tool.make
+NEXTSTEP_INSTALLDIR = /usr/bin
+LIBS = 
+DEBUG_LIBS = $(LIBS)
+PROF_LIBS = $(LIBS)
+
+NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
+
+#NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
+NEXTSTEP_OBJCPLUS_COMPILER =
+WINDOWS_OBJCPLUS_COMPILER = $(DEVDIR)/gcc
+PDO_UNIX_OBJCPLUS_COMPILER = $(NEXTDEV_BIN)/gcc
+NEXTSTEP_JAVA_COMPILER = /usr/bin/javac
+WINDOWS_JAVA_COMPILER = $(JDKBINDIR)/javac.exe
+PDO_UNIX_JAVA_COMPILER = $(NEXTDEV_BIN)/javac
+
+-include $(MAKEFILEDIR)/platform.make
+
+-include Makefile.preamble
+
+include $(MAKEFILEDIR)/$(MAKEFILE)
+
+-include Makefile.postamble
+
+-include Makefile.dependencies
diff --git a/alias/Makefile.postamble b/alias/Makefile.postamble
new file mode 100644 (file)
index 0000000..25b1a3a
--- /dev/null
@@ -0,0 +1,40 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
+
+after_install::
+       mkdir -p "$(DSTROOT)$(INSTALLDIR)"
+       install -c -m 555 ./generic.sh $(DSTROOT)$(INSTALLDIR)/alias
+
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/bg
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/cd
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/command
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/fc
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/fg
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/getopts
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/hash
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/jobs
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/read
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/type
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/ulimit
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/umask
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/unalias
+       $(LINKPRODUCT) $(DSTROOT)$(INSTALLDIR)/wait
+
+       mkdir -p "$(DSTROOT)/usr/share/man/man1"
+       ln -f "$(DSTROOT)/usr/share/man/man1/alias.1" "$(DSTROOT)/usr/share/man/man1/bg.1"
+       ln -f "$(DSTROOT)/usr/share/man/man1/alias.1" "$(DSTROOT)/usr/share/man/man1/cd.1"
+       ln -f "$(DSTROOT)/usr/share/man/man1/alias.1" "$(DSTROOT)/usr/share/man/man1/command.1"
+       ln -f "$(DSTROOT)/usr/share/man/man1/alias.1" "$(DSTROOT)/usr/share/man/man1/fc.1"
+       ln -f "$(DSTROOT)/usr/share/man/man1/alias.1" "$(DSTROOT)/usr/share/man/man1/fg.1"
+       ln -f "$(DSTROOT)/usr/share/man/man1/alias.1" "$(DSTROOT)/usr/share/man/man1/getopts.1"
+       ln -f "$(DSTROOT)/usr/share/man/man1/alias.1" "$(DSTROOT)/usr/share/man/man1/hash.1"
+       ln -f "$(DSTROOT)/usr/share/man/man1/alias.1" "$(DSTROOT)/usr/share/man/man1/jobs.1"
+       ln -f "$(DSTROOT)/usr/share/man/man1/alias.1" "$(DSTROOT)/usr/share/man/man1/read.1"
+       ln -f "$(DSTROOT)/usr/share/man/man1/alias.1" "$(DSTROOT)/usr/share/man/man1/type.1"
+       ln -f "$(DSTROOT)/usr/share/man/man1/alias.1" "$(DSTROOT)/usr/share/man/man1/ulimit.1"
+       ln -f "$(DSTROOT)/usr/share/man/man1/alias.1" "$(DSTROOT)/usr/share/man/man1/umask.1"
+       ln -f "$(DSTROOT)/usr/share/man/man1/alias.1" "$(DSTROOT)/usr/share/man/man1/unalias.1"
+       ln -f "$(DSTROOT)/usr/share/man/man1/alias.1" "$(DSTROOT)/usr/share/man/man1/wait.1"
+
+
+
+
diff --git a/alias/Makefile.preamble b/alias/Makefile.preamble
new file mode 100644 (file)
index 0000000..9e10e90
--- /dev/null
@@ -0,0 +1 @@
+include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Preamble.Common
diff --git a/alias/PB.project b/alias/PB.project
new file mode 100644 (file)
index 0000000..24f70e0
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    DYNAMIC_CODE_GEN = YES; 
+    FILESTABLE = {
+        FRAMEWORKS = (); 
+        H_FILES = (); 
+        OTHER_LINKED = (); 
+        OTHER_SOURCES = (Makefile, Makefile.preamble, Makefile.postamble alias.1 generic.sh); 
+        SUBPROJECTS = (); 
+    }; 
+    LANGUAGE = English; 
+    LOCALIZABLE_FILES = {}; 
+    MAKEFILEDIR = "$(MAKEFILEPATH)/pb_makefiles"; 
+    NEXTSTEP_BUILDDIR = "/tmp/$(NAME)/Build"; 
+    NEXTSTEP_BUILDTOOL = /bin/gnumake; 
+    NEXTSTEP_INSTALLDIR = /usr/bin; 
+    NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; 
+    NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; 
+    PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; 
+    PDO_UNIX_JAVA_COMPILER = "$(NEXTDEV_BIN)/javac"; 
+    PDO_UNIX_OBJCPLUS_COMPILER = "$(NEXTDEV_BIN)/gcc"; 
+    PROJECTNAME = alias; 
+    PROJECTTYPE = Tool; 
+    PROJECTVERSION = 2.8; 
+    WINDOWS_BUILDTOOL = $NEXT_ROOT/Developer/Executables/make; 
+    WINDOWS_JAVA_COMPILER = "$(JDKBINDIR)/javac.exe"; 
+    WINDOWS_OBJCPLUS_COMPILER = "$(DEVDIR)/gcc"; 
+}
diff --git a/alias/alias.1 b/alias/alias.1
new file mode 100644 (file)
index 0000000..5a811f4
--- /dev/null
@@ -0,0 +1 @@
+.so man1/builtin.1
diff --git a/alias/alias.c b/alias/alias.c
new file mode 100644 (file)
index 0000000..23abd94
--- /dev/null
@@ -0,0 +1,10 @@
+
+/* This file is a dummy file to make the Makefile to work correctly to install
+   the shell scripts. It does not lead to any deliverable. Do not remove this
+   file from this (..../shell_cmds/alias) directory.
+*/
+int main()
+{
+  exit(0);
+}
+
diff --git a/alias/generic.sh b/alias/generic.sh
new file mode 100644 (file)
index 0000000..ebc2b85
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/sh
+# $FreeBSD: src/usr.bin/alias/generic.sh,v 1.1 2002/07/16 22:16:03 wollman Exp $
+# This file is in the public domain.
+${0##*/} ${1+"$@"}
index d96b895acb48c51fffb823a9ea50a19d93572a73..a7632ac5859de67457151f7c205913bb97c7566f 100644 (file)
@@ -28,8 +28,6 @@ DEBUG_LIBS = $(LIBS)
 PROF_LIBS = $(LIBS)
 
 
-
-
 NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
 
 NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc
@@ -48,3 +46,6 @@ include $(MAKEFILEDIR)/$(MAKEFILE)
 -include Makefile.postamble
 
 -include Makefile.dependencies
+
+ALL_CFLAGS += -I/System/Library/Frameworks/System.framework/PrivateHeaders
+
index d21d8d84a09ebbe2331d062384e69aeff1542a29..e5962fe4e83f2e1ff702136477c86168a4d74920 100644 (file)
@@ -36,7 +36,7 @@
 .\"
 .\"     @(#)date.1     8.3 (Berkeley) 4/28/95
 .\"
-.Dd January 20, 1998
+.Dd September 22, 2004
 .Dt DATE 1
 .Os
 .Sh NAME
 .Op Fl r Ar seconds
 .Op Cm + Ns Ar format
 .Nm
-.Ar [[[[[cc]yy]mm]dd]hh]mm[\&.ss]
+.Op Fl u
+.Ar mmddhhmm[[cc]yy]
 .Sh DESCRIPTION
 .Nm
 displays the current date and time when invoked without arguments.
 Providing arguments will format the date and time in a user-defined
-way or set the date.
-Only the superuser may set the date.
+way or set the date.  Only the superuser may set the date.
 .Pp
 The options are as follows:
 .Bl -tag -width Ds
@@ -130,6 +130,24 @@ Everything but the minutes is optional.
 .Pp
 Time changes for Daylight Saving and Standard time and leap seconds
 and years are handled automatically.
+.Sh ENVIRONMENT VARIABLES
+The following environment variables affect the execution of
+.Nm
+:
+.Bl -tag -width TZ
+.It Ev TZ
+The timezone to use when displaying dates.
+See
+.Xr environ 7
+for more information.
+.El
+.Sh FILES
+.Bl -tag -width /var/log/messages -compact
+.It Pa /var/log/wtmp
+A record of date resets and time changes.
+.It Pa /var/log/messages
+A record of the user setting the time.
+.El
 .Sh EXAMPLES
 The command:
 .Bd -literal -offset indent
@@ -144,7 +162,7 @@ TIME: 13:36:16
 .Pp
 The command:
 .Bd -literal -offset indent
-date 8506131627
+date 061316271985
 .Ed
 .Pp
 sets the date to
@@ -158,42 +176,15 @@ date 1432
 sets the time to
 .Li "2:32 PM" ,
 without modifying the date.
-.Sh ENVIRONMENT VARIABLES
-The following environment variables affect the execution of
-.Nm
-:
-.Bl -tag -width TZ
-.It Ev TZ
-The timezone to use when displaying dates.
-See
-.Xr environ 7
-for more information.
-.El
-.Sh FILES
-.Bl -tag -width /var/log/messages -compact
-.It Pa /var/log/wtmp
-A record of date resets and time changes.
-.It Pa /var/log/messages
-A record of the user setting the time.
-.El
-.Sh SEE ALSO
-.Xr gettimeofday 2 ,
-.Xr strftime 3 ,
-.Xr utmp 5 ,
-.Xr timed 8
-.Rs
-.%T "TSP: The Time Synchronization Protocol for UNIX 4.3BSD"
-.%A R. Gusella
-.%A S. Zatti
-.Re
 .Sh DIAGNOSTICS
-Exit status is 0 on success, 1 if unable to set the date, and 2
-if able to set the local date, but unable to set it globally.
+The following exit values are returned:
+ 0    The date was written successfully (either locally or globally)
+ >0   An error occurred.
 .Pp
 Occasionally, when
 .Xr timed 8
-synchronizes the time on many hosts, the setting of a new time value may
-require more than a few seconds.
+synchronizes the time on many hosts, the setting of a new time value
+may require more than a few seconds.
 On these occasions,
 .Nm
 prints:
@@ -203,11 +194,36 @@ The message
 occurs when the communication
 between
 .Nm
-and
-timed
-fails.
+and timed fails.
+.Sh LEGACY SYNOPSIS
+.Nm
+.Op Fl nu
+.Op Fl r Ar seconds
+.Op Cm + Ns Ar format
+.Pp
+.Nm "    "
+.Ar [[[[[cc]yy]mm]dd]hh]mm[\&.ss]
+.Sh LEGACY DIAGNOSTICS
+.Pp
+When invoked in legacy mode the following exit values are returned:
+ 0    The date was written successfully
+ 1    Unable to set the date
+ 2    Able to set the local date, but unable to set it globally
+.Sh SEE ALSO
+.Xr gettimeofday 2 ,
+.Xr strftime 3 ,
+.Xr compat 5 ,
+.Xr utmp 5 ,
+.Xr timed 8
+.Rs
+.%T "TSP: The Time Synchronization Protocol for UNIX 4.3BSD"
+.%A R. Gusella
+.%A S. Zatti
+.Re
 .Sh STANDARDS
 The
 .Nm
-utility is expected to be compatible with
+utility supports the
+.St -susv3 .
+It is also expected to be compatible with
 .St -p1003.2 .
index 9c59b074fb633f221ecbf15a73e03a2113ed040b..7067535488ab13e8cfce2eabf69d15177a2b5ba9 100644 (file)
@@ -64,10 +64,14 @@ __RCSID("$NetBSD: date.c,v 1.25 1998/07/28 11:41:47 mycroft Exp $");
 #include <unistd.h>
 #include <util.h>
 
+#include "get_compat.h"
+
 #include "extern.h"
 
 time_t tval;
-int retval, nflag;
+int nflag;
+int retval = 0;
+int  unix2003_std = 0;         /* to determine legacy vs std mode */
 
 int main __P((int, char *[]));
 static void setthetime __P((const char *));
@@ -127,8 +131,15 @@ main(argc, argv)
 
        (void)strftime(buf, sizeof(buf), format, localtime(&tval));
        (void)printf("%s\n", buf);
-       exit(retval);
-       /* NOTREACHED */
+
+       /* if date/time could not be set/notified in the other hosts as
+          determined by netsetval() a return value 2 is set, which is
+          to be propogated back to shell in the legacy mode.
+       */
+       if( unix2003_std )
+               exit(0);        /* set/notify time thru NTPD isn't stds */
+       else
+               exit(retval);   /* Propogate the error condition set, if any */
 }
 
 #define        ATOI2(s)        ((s) += 2, ((s)[-2] - '0') * 10 + ((s)[-1] - '0'))
@@ -137,11 +148,15 @@ void
 setthetime(p)
        const char *p;
 {
+
        struct tm *lt;
        struct timeval tv;
        const char *dot, *t;
        int yearset, len;
 
+       char tmp1_p[5] = "";            /* to hold ccyy and reformat */
+       char tmp2_p[16] = "";           /* ccyyMMddhhmm.ss is 15 chars */
+
        for (t = p, dot = NULL; *t; ++t) {
                if (isdigit(*t))
                        continue;
@@ -166,12 +181,43 @@ setthetime(p)
        }
 
        yearset = 0;
+
+       if (compat_mode("bin/date", "unix2003"))        /* Determine the STD */
+               unix2003_std = 1;
+       else
+               unix2003_std = 0;
+
        switch (strlen(p) - len) {
        case 12:                                /* cc */
+               if(unix2003_std) {
+                       /* The last 4 chars are ccyy;
+                          reformat it to be in the first */
+                       strncpy(tmp1_p, &p[8], 4);
+                       tmp1_p[4] = '\0';
+                       p[8] = '\0';    /* .ss already processed; so no harm */
+                       strcpy(tmp2_p, p);
+                       strcpy(p, tmp1_p);
+                       strcat(p, tmp2_p);
+               }
+
                lt->tm_year = ATOI2(p) * 100 - TM_YEAR_BASE;
                yearset = 1;
                /* FALLTHROUGH */
        case 10:                                /* yy */
+               if(unix2003_std) {
+                       /* The last 2 chars are yy; reformat it to be in the
+                          first, only if already not done. */
+                       if (tmp1_p[0] == '\0') {
+                               strncpy(tmp1_p, &p[8], 2);
+                               tmp1_p[2] = '\0';
+                               p[8] = '\0';    /* .ss done; so no harm */
+                               strcpy(tmp2_p, p);
+                               strcpy(p, tmp1_p);
+                               strcat(p, tmp2_p);
+                       } else
+                               ;  /* do nothing, already reformatted */
+               }
+
                if (yearset) {
                        lt->tm_year += ATOI2(p);
                } else {
@@ -238,7 +284,10 @@ usage()
 {
        (void)fprintf(stderr,
            "usage: date [-nu] [-r seconds] [+format]\n");
-       (void)fprintf(stderr, "       date [[[[[cc]yy]mm]dd]hh]mm[.ss]\n");
+       if (unix2003_std)
+               (void)fprintf(stderr, "       date [-u] mmddhhmm[[cc]yy]\n");
+       else
+               (void)fprintf(stderr, "       date [[[[[cc]yy]mm]dd]hh]mm[.ss]\n");
        exit(1);
        /* NOTREACHED */
 }
index 6aa4716683d23376e2c068d61f302d73821789ac..8d71dd80ce82767bf86bbed190f42e13a12df574 100644 (file)
--- a/env/env.c
+++ b/env/env.c
@@ -76,7 +76,7 @@ main(int argc, char **argv)
                        usage();
                }
        for (argv += optind; *argv && (p = strchr(*argv, '=')); ++argv)
-               (void)setenv(*argv, ++p, 1);
+               (void)putenv(*argv);
        if (*argv) {
                execvp(*argv, argv);
                err(errno == ENOENT ? 127 : 126, "%s", *argv);
index 8df16b045c0809c64b189840e8bb590fb23709dd..633213ab042abd127917639eacc5ef8d4f6b69ee 100644 (file)
@@ -25,7 +25,7 @@ LIBS =
 DEBUG_LIBS = $(LIBS)
 PROF_LIBS = $(LIBS)
 
-
+NEXTSTEP_PB_CFLAGS = -D__DARWIN_UNIX03=1
 
 
 NEXTSTEP_BUILD_OUTPUT_DIR = /tmp/$(NAME)/Build
index 4732044b8bf2efd42b8430a56a523d590f0a7bee..36b998f6f4146091c170a05ffc7e3fccaab7ccb0 100644 (file)
@@ -41,6 +41,7 @@ void free_value __P((struct val *));
 int is_integer __P((struct val *, int64_t *));
 int to_integer __P((struct val *));
 void to_string __P((struct val *));
+int is_null __P((struct val *));
 int is_zero_or_null __P((struct val *));
 void nexttoken __P((void));
 void error __P((void)) __attribute__((__noreturn__));
@@ -118,8 +119,14 @@ is_integer(vp, r)
        i = 0;
 
        neg = (*s == '-');
-       if (neg)
+       if (neg) {
                s++;
+               /* the optional unary minus *must* be followed by digits to 
+                * be considered an integer.  A '-' alone is not an integer.
+                */
+               if(!*s)
+                       return 0;
+       }
 
        while (*s) {
                if (!isdigit(*s))
@@ -179,6 +186,14 @@ to_string(vp)
        vp->u.s = tmp;
 }
 
+int is_null(vp)
+       struct val     *vp;
+{
+       if ((vp->type != integer) && (*vp->u.s == 0))
+               return 1;
+       return 0;
+}
+
 int
 is_zero_or_null(vp)
        struct val     *vp;
@@ -513,6 +528,10 @@ eval0()
                if (is_zero_or_null(l)) {
                        free_value(l);
                        l = r;
+                       if( is_null(r) ) {
+                               free_value(r);
+                               l = make_int(0);
+                       }
                } else {
                        free_value(r);
                }
@@ -531,13 +550,15 @@ main(argc, argv)
 
        (void) setlocale(LC_ALL, "");
        av = argv + 1;
-
+       if (!strcmp(*av, "--"))
+           av++;
        nexttoken();
        vp = eval0();
 
        if (token != EOI)
                error();
-
+        if (vp->type == string && vp->u.s[0]) 
+               to_integer(vp);         /* -0 is not a string */
        if (vp->type == integer)
                (void)printf("%lld\n", vp->u.i);
        else
index 6a14c92d7ea5199e0426c063d2074d29edfe88fc..e5577ea637f435de1d60fee2e5733e0402c6df28 100644 (file)
@@ -53,6 +53,7 @@ static const char rcsid[] =
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <unistd.h>
 
 #include "find.h"
 
@@ -168,6 +169,30 @@ find_formplan(argv)
        return (plan);
 }
 
+/* addPath - helper function used to build a list of paths that were
+ * specified on the command line that we are allowed to search.
+ */
+static char **addPath(char **array, char *newPath)
+{
+       static int pathCounter = 0;
+       
+       if (newPath == NULL) {  /* initialize array */
+               if ((array = malloc(sizeof(char *))) == NULL)
+                       err(2, "out of memory");
+               array[0] = NULL;
+       }
+       else {
+               array = realloc(array, (++pathCounter + 1) * sizeof(char *));
+               if (array == NULL)
+                       err(2, "out of memory");
+               else {
+                       array[pathCounter - 1] = newPath;
+                       array[pathCounter] = NULL;      /* ensure array is null terminated */
+               }
+       }
+       return (array);
+}
+
 FTS *tree;                     /* pointer to top of FTS hierarchy */
 
 /*
@@ -183,12 +208,44 @@ find_execute(plan, paths)
        register FTSENT *entry;
        PLAN *p;
        int rval;
+       char    **myPaths;
+       int     nonSearchableDirFound = 0;
+       int                     pathIndex;
+       struct stat statInfo;
 
-       tree = fts_open(paths, ftsoptions, (issort ? find_compare : NULL));
+       /* special-case directories specified on command line - explicitly examine
+        * mode bits, to ensure failure if the directory cannot be searched
+        * (whether or not it's empty). UNIX conformance... <sigh>
+        */
+               
+       myPaths = addPath(NULL, NULL);
+       for (pathIndex = 0; paths[pathIndex] != NULL; ++pathIndex) {
+               /* retrieve mode bits, and examine "searchable" bit of directories */
+               /* exempt root from POSIX conformance */
+               if (getuid() && (stat(paths[pathIndex], &statInfo) == 0) && ((statInfo.st_mode & S_IFMT) == S_IFDIR)) {
+                       if ((statInfo.st_mode & (S_IXUSR + S_IXGRP + S_IXOTH)) != 0) {
+                               myPaths = addPath(myPaths, paths[pathIndex]);
+                       } else {
+                               if (errno != ENAMETOOLONG) {    /* if name is too long, just let existing logic handle it */
+                                       warnx("%s: Permission denied", paths[pathIndex]);
+                                       nonSearchableDirFound = 1;
+                               }
+                       }
+               } else {
+                       /* not a directory, so add path to array */
+                       myPaths = addPath(myPaths, paths[pathIndex]);
+               }
+       }
+       if (myPaths[0] == NULL) {       /* were any directories searchable? */
+               free(myPaths);
+               return(nonSearchableDirFound);  /* no... */
+       }
+
+       tree = fts_open(myPaths, ftsoptions, (issort ? find_compare : NULL));
        if (tree == NULL)
                err(1, "ftsopen");
 
-       for (rval = 0; (entry = fts_read(tree)) != NULL;) {
+       for (rval = nonSearchableDirFound; (entry = fts_read(tree)) != NULL;) {
                switch (entry->fts_info) {
                case FTS_D:
                        if (isdepth)
@@ -237,5 +294,7 @@ find_execute(plan, paths)
        }
        if (errno)
                err(1, "fts_read");
+
+       free (myPaths);
        return (rval);
 }
diff --git a/id/id.c b/id/id.c
index 74434393c82d7c5e3e7ab78e05ca3bb9d2598d02..e3957e691ed54c2e1f2ea4a174942ed73c1cdfc6 100644 (file)
--- a/id/id.c
+++ b/id/id.c
@@ -219,7 +219,7 @@ current(void)
 {
        struct group *gr;
        struct passwd *pw;
-       int cnt, id, eid, lastid, ngroups;
+       int cnt, id, eid, gid, egid, lastid, ngroups;
        gid_t groups[NGROUPS];
        const char *fmt;
 
@@ -227,18 +227,18 @@ current(void)
        (void)printf("uid=%u", id);
        if ((pw = getpwuid(id)))
                (void)printf("(%s)", pw->pw_name);
+       gid = getgid();
+       (void)printf(" gid=%u", gid);
+       if ((gr = getgrgid(gid)))
+               (void)printf("(%s)", gr->gr_name);
        if ((eid = geteuid()) != id) {
                (void)printf(" euid=%u", eid);
                if ((pw = getpwuid(eid)))
                        (void)printf("(%s)", pw->pw_name);
        }
-       id = getgid();
-       (void)printf(" gid=%u", id);
-       if ((gr = getgrgid(id)))
-               (void)printf("(%s)", gr->gr_name);
-       if ((eid = getegid()) != id) {
-               (void)printf(" egid=%u", eid);
-               if ((gr = getgrgid(eid)))
+       if ((egid = getegid()) != gid) {
+               (void)printf(" egid=%u", egid);
+               if ((gr = getgrgid(egid)))
                        (void)printf("(%s)", gr->gr_name);
        }
        if ((ngroups = getgroups(NGROUPS, groups))) {
index 16bdac7e679faef90143d13486a55788b84abcd1..f428494e54fb395e7701af0a1155319932946010 100644 (file)
@@ -14,7 +14,7 @@ PROJECT_TYPE = Aggregate
 
 TOOLS = bigram code locate
 
-OTHERSRCS = Makefile Makefile.preamble Makefile.postamble
+OTHERSRCS = Makefile Makefile.preamble Makefile.postamble locate.code.8
 
 
 MAKEFILEDIR = $(MAKEFILEPATH)/pb_makefiles
index 013b558de882142e966c538876f25f5726df1f43..07c8d200aab427a8d2b1f4cc56607dbe1b42e08a 100644 (file)
@@ -1 +1,7 @@
 include $(CoreOSMakefiles)/ProjectBuilder/Makefile.Postamble.Common
+
+after_install:
+       $(MKDIR) $(DSTROOT)/usr/share/man/man8
+       $(INSTALL_FILE) locate.code.8 $(DSTROOT)/usr/share/man/man8
+       $(LN) $(DSTROOT)/usr/share/man/man8/locate.code.8 \
+               $(DSTROOT)/usr/share/man/man8/locate.bigram.8
diff --git a/locate/locate.code.8 b/locate/locate.code.8
new file mode 100644 (file)
index 0000000..64dcfea
--- /dev/null
@@ -0,0 +1,23 @@
+.Dd October 15, 2004
+.Dt LOCATE.CODE 8  
+.Os Darwin
+.Sh NAME
+.Nm locate.code, locate.bigram
+.Nd sorted list compressor
+.Sh SYNOPSIS
+.Nm locate.code
+.Nm locate.bigram
+.Sh DESCRIPTION
+.Nm locate.code
+and
+.Nm locate.bigram
+are programs used by
+.Xr locate 1
+during the indexing process.
+.Nm locate.code
+and
+.Nm locate.bigram
+should not be run manually.
+.Sh SEE ALSO
+.Xr locate 1 ,
+.Xr locate.updatedb 8
index e939a7de92d35572e1d96e355b91889f57696005..677ab9ece4627d6ab034528f779dae49c48507e7 100644 (file)
@@ -77,6 +77,10 @@ main(argc, argv)
 {
        int exit_status;
 
+       if (argc > 1 && !strcmp(argv[1], "--")) {
+               argv++;
+               argc--;
+       }
        if (argc < 2)
                usage();
 
index 395b097366f1cdc917f2c71b0ef42dba10b5229f..d42123879b3ce135cc9dd6d4d8258817aa4eb90a 100644 (file)
@@ -1,5 +1,3 @@
-.\"    $NetBSD: renice.8,v 1.5 1997/10/19 14:01:33 lukem Exp $
-.\"
 .\" Copyright (c) 1983, 1991, 1993
 .\"    The Regents of the University of California.  All rights reserved.
 .\"
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.\"     from: @(#)renice.8     8.1 (Berkeley) 6/9/93
-.\"    $NetBSD: renice.8,v 1.5 1997/10/19 14:01:33 lukem Exp $
+.\"     @(#)renice.8   8.1 (Berkeley) 6/9/93
+.\" $FreeBSD: src/usr.bin/renice/renice.8,v 1.16 2003/02/26 20:27:24 charnier Exp $
 .\"
 .Dd June 9, 1993
 .Dt RENICE 8
-.Os BSD 4
+.Os
 .Sh NAME
 .Nm renice
 .Nd alter priority of running processes
 .Sh SYNOPSIS
 .Nm
 .Ar priority
-.Oo
-.Op Fl p
-.Ar pid ...
-.Oc
-.Oo
-.Op Fl g
-.Ar pgrp ...
-.Oc
-.Oo
-.Op Fl u
-.Ar user ...
-.Oc
+.Op Oo Fl p Oc Ar pid ...
+.Op Oo Fl g Oc Ar pgrp ...
+.Op Oo Fl u Oc Ar user ...
+.Nm
+.Fl n Ar increment
+.Op Oo Fl p Oc Ar pid ...
+.Op Oo Fl g Oc Ar pgrp ...
+.Op Oo Fl u Oc Ar user ...
 .Sh DESCRIPTION
+The
 .Nm
-alters the 
+utility alters the
 scheduling priority of one or more running processes.
 The following
 .Ar who
 parameters are interpreted as process ID's, process group
-ID's, or user names.
+ID's, user ID's or user names.
+The
 .Nm Ns 'ing
-a process group causes all processes in the process group
-to have their scheduling priority altered.  
+of a process group causes all processes in the process group
+to have their scheduling priority altered.
+The
 .Nm Ns 'ing
-a user causes all processes owned by the user to have
+of a user causes all processes owned by the user to have
 their scheduling priority altered.
 By default, the processes to be affected are specified by
 their process ID's.
 .Pp
-Options supported by
-.Nm :
-.Bl -tag -width Ds
+The following options are available:
+.Bl -tag -width indent
 .It Fl g
-Force 
+Force
 .Ar who
 parameters to be interpreted as process group ID's.
+.It Fl n
+Instead of changing the specified processes to the given priority,
+interpret the following argument as an increment to be applied to
+the current priority of each process.
 .It Fl u
 Force the
 .Ar who
-parameters to be interpreted as user names.
+parameters to be interpreted as user names or user ID's.
 .It Fl p
-Resets the
+Reset the
 .Ar who
 interpretation to be (the default) process ID's.
 .El
 .Pp
 For example,
-.Bd -literal -offset
-renice +1 987 -u daemon root -p 32
-.Ed
+.Pp
+.Dl "renice +1 987 -u daemon root -p 32"
 .Pp
 would change the priority of process ID's 987 and 32, and
 all processes owned by users daemon and root.
@@ -123,13 +122,19 @@ to map user names to user ID's
 .El
 .Sh SEE ALSO
 .Xr nice 1 ,
+.Xr rtprio 1 ,
 .Xr getpriority 2 ,
 .Xr setpriority 2
-.Sh BUGS
-Non super-users can not increase scheduling priorities of their own processes,
-even if they were the ones that decreased the priorities in the first place.
+.Sh STANDARDS
+The
+.Nm
+utility conforms to
+.St -p1003.1-2001 .
 .Sh HISTORY
 The
 .Nm
-command appeared in
+utility appeared in
 .Bx 4.0 .
+.Sh BUGS
+Non super-users cannot increase scheduling priorities of their own processes,
+even if they were the ones that decreased the priorities in the first place.
index abc9b2014ca47075ef86d7515a6a5201461669f7..d7253e0424522ef49d6a7cf564cd54baa0ff0a68 100644 (file)
@@ -1,5 +1,3 @@
-/*     $NetBSD: renice.c,v 1.5 1997/10/19 14:01:38 lukem Exp $ */
-
 /*
  * Copyright (c) 1983, 1989, 1993
  *     The Regents of the University of California.  All rights reserved.
  * SUCH DAMAGE.
  */
 
-#include <sys/cdefs.h>
 #ifndef lint
-__COPYRIGHT("@(#) Copyright (c) 1983, 1989, 1993\n\
-       The Regents of the University of California.  All rights reserved.\n");
+static const char copyright[] =
+"@(#) Copyright (c) 1983, 1989, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n";
 #endif /* not lint */
 
+#if 0
 #ifndef lint
-/*static char sccsid[] = "from: @(#)renice.c   8.1 (Berkeley) 6/9/93";*/
-__RCSID("$NetBSD: renice.c,v 1.5 1997/10/19 14:01:38 lukem Exp $");
+static char sccsid[] = "@(#)renice.c   8.1 (Berkeley) 6/9/93";
 #endif /* not lint */
+#endif
 
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/resource.h>
 
 #include <err.h>
+#include <errno.h>
+#include <limits.h>
 #include <pwd.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
-int    donice __P((int, int, int));
-int    main __P((int, char **));
+static int     donice(int, int, int, int);
+static int     getnum(const char *, const char *, int *);
+static void    usage(void);
 
 /*
  * Change the priority (nice) of processes
@@ -63,26 +65,37 @@ int main __P((int, char **));
  * running.
  */
 int
-main(argc, argv)
-       int argc;
-       char **argv;
+main(int argc, char *argv[])
 {
-       int which = PRIO_PROCESS;
-       int who = 0, prio, errs = 0;
+       struct passwd *pwd;
+       int errs, incr, prio, which, who;
+       int delim;
+       int priflag;
 
+       errs = 0;
+       incr = 0;
+       which = PRIO_PROCESS;
+       who = 0;
        argc--, argv++;
-       if (argc < 2) {
-               fprintf(stderr, "usage: renice priority [ [ -p ] pids ] ");
-               fprintf(stderr, "[ [ -g ] pgrps ] [ [ -u ] users ]\n");
-               exit(1);
-       }
-       prio = atoi(*argv);
-       argc--, argv++;
-       if (prio > PRIO_MAX)
-               prio = PRIO_MAX;
-       if (prio < PRIO_MIN)
-               prio = PRIO_MIN;
-       for (; argc > 0; argc--, argv++) {
+       if (argc < 2)
+               usage();
+       delim = 0;
+       priflag = 0;
+
+       /* incrementing priflag here ensures we only process
+          the single priority arg if it is the very first arg */
+       for (; argc > 0; argc--, argv++, priflag++) {
+         /* once we've seen -- , don't process anymore switches */
+         if (0 == delim) {
+           /* -n must immediately be followed by the incremental
+              priority */
+           if (strcmp(*argv, "-n") == 0) {
+             incr = 1;
+             argc--, argv++;
+             if (getnum("priority", *argv, &prio))
+               return (1);
+             continue;
+           }
                if (strcmp(*argv, "-g") == 0) {
                        which = PRIO_PGRP;
                        continue;
@@ -95,42 +108,96 @@ main(argc, argv)
                        which = PRIO_PROCESS;
                        continue;
                }
+               if (strcmp(*argv, "--") == 0) {
+                       delim = 1;
+                       continue;
+               }
+               if (0 == priflag) {
+               /* if very first switch/arg and we've made it to
+                  here, this must be the priority */
+                 if (getnum("priority", *argv, &prio)) {
+                 return(1);
+                 }
+               continue;
+               }
+         }
                if (which == PRIO_USER) {
-                       register struct passwd *pwd = getpwnam(*argv);
-                       
-                       if (pwd == NULL) {
-                               warnx("%s: unknown user", *argv);
+                       if ((pwd = getpwnam(*argv)) != NULL)
+                               who = pwd->pw_uid;
+                       else if (getnum("uid", *argv, &who)) {
+                               errs++;
+                               continue;
+                       } else if (who < 0) {
+                               warnx("%s: bad value", *argv);
+                               errs++;
                                continue;
                        }
-                       who = pwd->pw_uid;
                } else {
-                       who = atoi(*argv);
+                       if (getnum("pid", *argv, &who)) {
+                               errs++;
+                               continue;
+                       }
                        if (who < 0) {
                                warnx("%s: bad value", *argv);
+                               errs++;
                                continue;
                        }
                }
-               errs += donice(which, who, prio);
+               errs += donice(which, who, prio, incr);
        }
        exit(errs != 0);
 }
 
-int
-donice(which, who, prio)
-       int which, who, prio;
+static int
+donice(int which, int who, int prio, int incr)
 {
        int oldprio;
-       extern int errno;
 
-       errno = 0, oldprio = getpriority(which, who);
+       errno = 0;
+       oldprio = getpriority(which, who);
        if (oldprio == -1 && errno) {
                warn("%d: getpriority", who);
                return (1);
        }
+       if (incr)
+               prio = oldprio + prio;
+       if (prio > PRIO_MAX)
+               prio = PRIO_MAX;
+       if (prio < PRIO_MIN)
+               prio = PRIO_MIN;
        if (setpriority(which, who, prio) < 0) {
                warn("%d: setpriority", who);
                return (1);
        }
-       fprintf(stderr, "%d: old priority %d, new priority %d\n", who, oldprio, prio);
        return (0);
 }
+
+static int
+getnum(const char *com, const char *str, int *val)
+{
+       long v;
+       char *ep;
+
+       errno = 0;
+       v = strtol(str, &ep, 10);
+       if (v < INT_MIN || v > INT_MAX || errno == ERANGE) {
+               warnx("%s argument %s is out of range.", com, str);
+               return (1);
+       }
+       if (ep == str || *ep != '\0' || errno != 0) {
+               warnx("Bad %s argument: %s.", com, str);
+               return (1);
+       }
+
+       *val = (int)v;
+       return (0);
+}
+
+static void
+usage()
+{
+       fprintf(stderr, "%s\n%s\n",
+"usage: renice priority     [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...]",
+"       renice -n increment [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...]");
+       exit(1);
+}
index 82b62d203f36928e7f3c554e5d77357993c90daa..9654fcb67826d43b58d0e4abdddfd9e790059765 100644 (file)
@@ -98,7 +98,6 @@ else
        echo Lock ${lckfile} already held by `cat ${lckfile}`
 endif
 .Ed
-
 .Pp
 The examples assume that the filesystem where the lock file is to
 be created is writeable by the user, and has space available.
diff --git a/su/su.c b/su/su.c
index 71e7a6cc76a737cf685653498d47a8743e919802..fec3606d728bc841f136ffc3e0027a5308390495 100644 (file)
--- a/su/su.c
+++ b/su/su.c
@@ -65,10 +65,6 @@ static const char rcsid[] =
 #include <pam/pam_appl.h>
 #include <pam/pam_misc.h>
 
-#include <bsm/libbsm.h>
-#include <bsm/audit_uevents.h>
-
-
 #define PAM_END() do {                                         \
        int local_ret;                                          \
        if (pamh != NULL && creds_set) {                        \
@@ -108,9 +104,6 @@ static void usage(void);
 static int     export_pam_environment(void);
 static int     ok_to_export(const char *);
 
-void audit_success(struct passwd *pwd);
-void audit_fail(struct passwd *pwd, char *errmsg);
-
 extern char    **environ;
 
 int
@@ -163,16 +156,12 @@ main(int argc, char *argv[])
        if (user == NULL)
                usage();
 
-       if (strlen(user) > MAXLOGNAME - 1) { 
-               audit_fail(NULL, "username too long");
+       if (strlen(user) > MAXLOGNAME - 1)
                errx(1, "username too long");
-       }
 
        nargv = malloc(sizeof(char *) * (argc + 4));
-       if (nargv == NULL) { 
-               audit_fail(NULL, "malloc failure");
+       if (nargv == NULL)
                errx(1, "malloc failure");
-       }
 
        nargv[argc + 3] = NULL;
        for (i = argc; i >= optind; i--)
@@ -195,18 +184,13 @@ main(int argc, char *argv[])
        pwd = getpwnam(username);
        if (username == NULL || pwd == NULL || pwd->pw_uid != ruid)
                pwd = getpwuid(ruid);
-       if (pwd == NULL) { 
-               audit_fail(NULL, "who are you?");
+       if (pwd == NULL)
                errx(1, "who are you?");
-       }
-
        gid = pwd->pw_gid;
 
        username = strdup(pwd->pw_name);
-       if (username == NULL) { 
-               audit_fail(NULL, "strdup failure");
+       if (username == NULL)
                err(1, "strdup failure");
-       }
 
        if (asme) {
                if (pwd->pw_shell != NULL && *pwd->pw_shell != '\0') {
@@ -221,13 +205,10 @@ main(int argc, char *argv[])
                }
        }
 
-       pwd = getpwnam(user);
-
        /* Do the whole PAM startup thing */
        retcode = pam_start("su", user, &conv, &pamh);
        if (retcode != PAM_SUCCESS) {
                syslog(LOG_ERR, "pam_start: %s", pam_strerror(pamh, retcode));
-               audit_fail(pwd, "pam_start error");
                errx(1, "pam_start: %s", pam_strerror(pamh, retcode));
        }
 
@@ -242,7 +223,6 @@ main(int argc, char *argv[])
        if (retcode != PAM_SUCCESS) {
                syslog(LOG_ERR, "pam_authenticate: %s",
                    pam_strerror(pamh, retcode));
-               audit_fail(pwd, "pam_authenticate error");
                errx(1, "Sorry");
        }
        retcode = pam_get_item(pamh, PAM_USER, (const void **)&p);
@@ -259,33 +239,28 @@ main(int argc, char *argv[])
                if (retcode != PAM_SUCCESS) {
                        syslog(LOG_ERR, "pam_chauthtok: %s",
                            pam_strerror(pamh, retcode));
-                       audit_fail(pwd, "pam_chauthtok error");
                        errx(1, "Sorry");
                }
        }
        if (retcode != PAM_SUCCESS) {
                syslog(LOG_ERR, "pam_acct_mgmt: %s",
                        pam_strerror(pamh, retcode));
-               audit_fail(pwd, "pam_acct_mgmt error");
                errx(1, "Sorry");
        }
 
        /* get target login information, default to root */
        pwd = getpwnam(user);
-       if (pwd == NULL) {
-               audit_fail(NULL, "unknown login");
+       if (pwd == NULL)
                errx(1, "unknown login: %s", user);
-       }
 
        /* if asme and non-standard target shell, must be root */
        if (asme) {
-               if (ruid != 0 && !chshell(pwd->pw_shell)) { 
-                       audit_fail(pwd, "permission denied (shell)");
+               if (ruid != 0 && !chshell(pwd->pw_shell))
                        errx(1, "permission denied (shell).");
-               }
        }
        else if (pwd->pw_shell && *pwd->pw_shell) {
-               shell = pwd->pw_shell;
+               shell = strncpy(shellbuf, pwd->pw_shell, sizeof(shellbuf));
+               shellbuf[sizeof(shellbuf) - 1] = '\0';
                iscsh = UNSET;
        }
        else {
@@ -308,10 +283,8 @@ main(int argc, char *argv[])
         * PAM modules might add supplementary groups in pam_setcred(), so
         * initialize them first.
         */
-       if( initgroups(user, pwd->pw_gid) ) {
-               audit_fail(pwd, "initgroups failed");
+       if( initgroups(user, pwd->pw_gid) )
                err(1, "initgroups failed");
-       }
 
        retcode = pam_open_session(pamh, 0);
        if( retcode != PAM_SUCCESS ) {
@@ -351,13 +324,10 @@ main(int argc, char *argv[])
                PAM_END();
                exit(WEXITSTATUS(statusp));
        case -1:
-               audit_fail(pwd, "fork() error");
                err(1, "fork");
                PAM_END();
                exit(1);
        case 0:
-               /* audit before we relinquish privileges */
-               audit_success(pwd);
                if( setgid(pwd->pw_gid) )
                        err(1, "setgid");
                if( setuid(pwd->pw_uid) )
@@ -483,122 +453,3 @@ ontty(void)
                snprintf(buf, sizeof(buf), " on %s", p);
        return buf;
 }
-
-/*
- * Include the following tokens in the audit record for successful su attempts
- * header
- * subject
- * return
- */
-void audit_success(struct passwd *pwd)
-{
-       int aufd;
-       token_t *tok;
-       auditinfo_t auinfo;
-       long au_cond;
-       uid_t uid = pwd->pw_uid;
-       gid_t gid = pwd->pw_gid;
-       pid_t pid = getpid();
-
-       /* If we are not auditing, don't cut an audit record; just return */
-       if (auditon(A_GETCOND, &au_cond, sizeof(long)) < 0) {
-               fprintf(stderr, "su: Could not determine audit condition\n");
-               exit(1);
-       }
-       if (au_cond == AUC_NOAUDIT)
-               return;
-
-       if(getaudit(&auinfo) != 0) {
-               fprintf(stderr, "su: getaudit failed:  %s\n", strerror(errno));
-               exit(1);
-       }
-
-       if((aufd = au_open()) == -1) {
-               fprintf(stderr, "su: Audit Error: au_open() failed\n");
-               exit(1);      
-       }
-
-       /* record the subject being created */
-       if((tok = au_to_subject32(auinfo.ai_auid, geteuid(), getegid(), 
-                       uid, gid, pid, auinfo.ai_asid, &auinfo.ai_termid)) == NULL) {
-               fprintf(stderr, "su: Audit Error: au_to_subject32() failed\n");
-               exit(1);      
-       }
-       au_write(aufd, tok);
-
-       if((tok = au_to_return32(0, 0)) == NULL) {
-               fprintf(stderr, "su: Audit Error: au_to_return32() failed\n");
-               exit(1);
-       }
-       au_write(aufd, tok);
-
-       if(au_close(aufd, 1, AUE_su) == -1) {
-               fprintf(stderr, "su: Audit Error: au_close() failed\n");
-               exit(1);
-       }
-       return; 
-}
-
-/*
- * Include the following tokens in the audit record for successful su attempts
- * header
- * subject
- * text
- * return
- */
-void audit_fail(struct passwd *pwd, char *errmsg)
-{
-       int aufd;
-       token_t *tok;
-       auditinfo_t auinfo;
-       long au_cond;
-       /* If pwd is NULL, the event dont attribute it to any user */
-       uid_t uid = pwd ? pwd->pw_uid : -1;
-       gid_t gid = pwd ? pwd->pw_gid : -1;
-       pid_t pid = getpid();
-
-       /* If we are not auditing, don't cut an audit record; just return */
-       if (auditon(A_GETCOND, &au_cond, sizeof(long)) < 0) {
-               fprintf(stderr, "su: Could not determine audit condition\n");
-               exit(1);
-       }
-       if (au_cond == AUC_NOAUDIT)
-               return;
-
-       if(getaudit(&auinfo) != 0) {
-               fprintf(stderr, "su: getaudit failed:  %s\n", strerror(errno));
-               exit(1);
-       }
-
-       if((aufd = au_open()) == -1) {
-               fprintf(stderr, "su: Audit Error: au_open() failed\n");
-               exit(1);      
-       }
-
-       /* subject token corresponds to the subject being created */
-       if((tok = au_to_subject32(auinfo.ai_auid, geteuid(), getegid(), 
-                       uid, gid, pid, auinfo.ai_asid, &auinfo.ai_termid)) == NULL) {
-               fprintf(stderr, "su: Audit Error: au_to_subject32() failed\n");
-               exit(1);      
-       }
-       au_write(aufd, tok);
-
-       /* the actual error message text */
-       if((tok = au_to_text(errmsg)) == NULL) {
-               fprintf(stderr, "su: Audit Error: au_to_text() failed\n");
-               exit(1);
-       }
-       au_write(aufd, tok);
-
-       if((tok = au_to_return32(1, errno)) == NULL) {
-               fprintf(stderr, "su: Audit Error: au_to_return32() failed\n");
-               exit(1);
-       }
-       au_write(aufd, tok);
-
-       if(au_close(aufd, 1, AUE_su) == -1) {
-               fprintf(stderr, "su: Audit Error: au_close() failed\n");
-               exit(1);
-       }
-       return;
-}
index 685a07fa57619e5bf62eb381de665b558e216ed1..4ccc596ae1bbafd82890e2d4dbdcc30719ef94ba 100644 (file)
@@ -85,4 +85,3 @@ The
 .Nm
 utility conforms to
 .St -p1003.2-92 .
-
index f07638ae59d48d0108f0cf4149fb476d6ef33d23..94665dd423039f544e9368bac091b59e482b964d 100644 (file)
@@ -114,12 +114,5 @@ proc_compare(p1, p2)
                return (0);
        if (p1->p_slptime > p2->p_slptime)
                return (1);
-       /*
-        * favor one sleeping in a non-interruptible sleep
-        */
-       if (p1->p_flag & P_SINTR && (p2->p_flag & P_SINTR) == 0)
-               return (1);
-       if (p2->p_flag & P_SINTR && (p1->p_flag & P_SINTR) == 0)
-               return (0);
        return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
 }
diff --git a/w/w.c b/w/w.c
index c27f07094f3f38f25635a521120ac8d1d46aae72..0cda4e430fef25e9f1a181e7a913316befae51df 100644 (file)
--- a/w/w.c
+++ b/w/w.c
@@ -59,7 +59,6 @@ static const char sccsid[] = "@(#)w.c 8.4 (Berkeley) 4/16/94";
 #include <sys/socket.h>
 #include <sys/tty.h>
 
-#include <machine/cpu.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <arpa/nameser.h>
index 9d16881d56a716801bd1d0f208a4c9254edb7b3b..333d180d5d349db58bd0c578084824c5ffe69252 100644 (file)
--- a/who/who.1
+++ b/who/who.1
@@ -1,5 +1,3 @@
-.\"    $NetBSD: who.1,v 1.9 1997/10/20 03:20:28 lukem Exp $
-.\"
 .\" Copyright (c) 1986, 1991, 1993
 .\"    The Regents of the University of California.  All rights reserved.
 .\"
 .\" SUCH DAMAGE.
 .\"
 .\"     @(#)who.1      8.2 (Berkeley) 12/30/93
+.\" $FreeBSD: src/usr.bin/who/who.1,v 1.16 2004/07/02 22:22:34 ru Exp $
 .\"
-.Dd December 6, 1994
+.Dd May 8, 2002
 .Dt WHO 1
 .Os
 .Sh NAME
 .Nm who
-.Nd display who is logged in
+.Nd display who is on the system
 .Sh SYNOPSIS
 .Nm
-.Op Fl mTuH
-.Op Ar file 
-.Nm
-.Ar am i
+.Op Fl HmqsTu
+.Op Cm am I
+.Op Ar file
 .Sh DESCRIPTION
-The 
+The
 .Nm
-utility displays a list of all users currently logged on, showing for
-each user the login name, tty name, the date and time of login, and
-hostname if not local.
-.Pp
-Available options:
+utility displays information about currently logged in users.
+By default, this includes the login name, tty name, date and time of login and
+remote hostname if not local.
 .Pp
-.Bl -tag -width file
+The options are as follows:
+.Bl -tag -width indent
+.It Fl H
+Write column headings above the output.
 .It Fl m
-Only print information about the current terminal.  This is the
-.Tn POSIX
-way of saying
-.Nm
-.Ar am i .
+Show information about the terminal attached to standard input only.
+.It Fl q
+.Dq "Quick mode" :
+List the names and number of logged in users in columns.
+All other command line options are ignored.
+.It Fl s
+Show the name, line and time fields only.
+This is the default.
 .It Fl T
-Print a character after the user name indicating the state of the
-terminal line:
-.Sq + 
-if the terminal is writable;
-.Sq - 
-if it is not;
-and
-.Sq ?
-if a bad line is encountered.
+Indicate whether each user is accepting messages.
+One of the following characters is written:
+.Pp
+.Bl -tag -width 1n -compact
+.It Li +
+User is accepting messages.
+.It Li \&-
+User is not accepting messages.
+.It Li \&?
+An error occurred.
+.El
 .It Fl u
-Print the idle time for each user.
-.It Fl H
-Write column headings above the regular output.
-.It Ar \&am I
-Returns the invoker's real user name. 
-.It Ar file
+Show idle time for each user in hours and minutes as
+.Ar hh Ns : Ns Ar mm ,
+.Ql \&.
+if the user has been idle less that a minute, and
+.Dq Li old
+if the user has been idle more than 24 hours.
+.It Cm am I
+Equivalent to
+.Fl m .
+.El
+.Pp
 By default,
 .Nm
 gathers information from the file
 .Pa /var/run/utmp .
-An alternative
+An alternate
 .Ar file
 may be specified which is usually
 .Pa /var/log/wtmp
@@ -101,34 +110,45 @@ since
 .Pa wtmp
 was last truncated or
 created.
-.El
 .Pp
 If
 .Pa /var/log/wtmp
 is being used as the file, the user name may be empty
-or one of the special characters '|', '}' and '~'.  Logouts produce
-an output line without any user name.  For more information on the
+or one of the special characters '|', '}' and '~'.
+Logouts produce
+an output line without any user name.
+For more information on the
 special characters, see
 .Xr utmp 5 .
+.Sh ENVIRONMENT
+The
+.Ev COLUMNS , LANG , LC_ALL
+and
+.Ev LC_TIME
+environment variables affect the execution of
+.Nm
+as described in
+.Xr environ 7 .
 .Sh FILES
 .Bl -tag -width /var/log/wtmp.[0-6] -compact
 .It Pa /var/run/utmp
 .It Pa /var/log/wtmp
 .It Pa /var/log/wtmp.[0-6]
 .El
+.Sh DIAGNOSTICS
+.Ex -std
 .Sh SEE ALSO
 .Xr last 1 ,
-.Xr mesg 1 ,
 .Xr users 1 ,
-.Xr getuid 2 ,
+.Xr w 1 ,
 .Xr utmp 5
 .Sh STANDARDS
 The
 .Nm
-utility is expected to conform to
-.St -p1003.2-92 .
+utility conforms to
+.St -p1003.1-2001 .
 .Sh HISTORY
 A
 .Nm
-utility appeared in
-.At v6 .
+command appeared in
+.At v1 .
index f045888f13a6ba27a786536e21b74f3678fafee0..8b2633379abef973d41b44bb7e4c6e09c95c279d 100644 (file)
--- a/who/who.c
+++ b/who/who.c
@@ -1,11 +1,6 @@
-/*     $NetBSD: who.c,v 1.6 1997/10/20 03:20:29 lukem Exp $    */
-
-/*
- * Copyright (c) 1989, 1993
- *     The Regents of the University of California.  All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Michael Fischbein.
+/*-
+ * Copyright (c) 2002 Tim J. Robbins.
+ * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
  *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  */
 
 #include <sys/cdefs.h>
-#ifndef lint
-__COPYRIGHT(
-"@(#) Copyright (c) 1989, 1993\n\
-       The Regents of the University of California.  All rights reserved.\n");
-#endif /* not lint */
-
-#ifndef lint
-#if 0
-static char sccsid[] = "@(#)who.c      8.1 (Berkeley) 6/6/93";
-#endif
-__RCSID("$NetBSD: who.c,v 1.6 1997/10/20 03:20:29 lukem Exp $");
-#endif /* not lint */
+/* commented as FBSDID not needed for Tiger ......
+__FBSDID("$FreeBSD: src/usr.bin/who/who.c,v 1.20 2003/10/26 05:05:48 peter Exp $");
+*/
 
 #include <sys/types.h>
+#include <sys/ioctl.h>
 #include <sys/stat.h>
+
 #include <err.h>
+#include <errno.h>
+#include <langinfo.h>
+#include <limits.h>
 #include <locale.h>
+#include <paths.h>
 #include <pwd.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <time.h>
+#include <timeconv.h>
 #include <unistd.h>
 #include <utmp.h>
 
-void output __P((struct utmp *));
-void output_labels __P((void));
-void who_am_i __P((FILE *));
-FILE *file __P((char *));
-void usage __P((void));
-
-int show_term;                 /* show term state */
-int show_idle;                 /* show idle time */
-
-int main __P((int, char **));
+static void    heading(void);
+static void    process_utmp(FILE *);
+static void    process_wtmp(FILE *);
+static void    quick(FILE *);
+static void    row(struct utmp *);
+static int     ttywidth(void);
+static void    usage(void);
+static void    whoami(FILE *);
+
+static int     bflag;                  /* date & time of last reboot */
+static int     dflag;                  /* dead processes */
+static int     Hflag;                  /* Write column headings */
+static int     lflag;                  /* waiting to login */
+static int     mflag;                  /* Show info about current terminal */
+static int     pflag;                  /* Processes active & spawned by init */
+static int     qflag;                  /* "Quick" mode */
+static int     rflag;                  /* run-level of the init process */
+static int     sflag;                  /* Show name, line, time */
+static int     tflag;                  /* time of change to system clock */
+static int     Tflag;                  /* Show terminal state */
+static int     uflag;                  /* Show idle time */
 
 int
-main(argc, argv)
-       int argc;
-       char **argv;
+main(int argc, char *argv[])
 {
-       struct utmp usr;
-       FILE *ufp;
-       int c, only_current_term, show_labels;
+       int ch;
+       const char *file;
+       FILE *fp;
+       FILE *wtmp_fp;
+
+       setlocale(LC_TIME, "");
 
-       setlocale(LC_ALL, "");
+       while ((ch = getopt(argc, argv, "abdHlmpqrstTu")) != -1) {
+               switch (ch) {
 
-       only_current_term = show_term = show_idle = show_labels = 0;
-       while ((c = getopt(argc, argv, "mTuH")) != -1) {
-               switch (c) {
-               case 'm':
-                       only_current_term = 1;
+               case 'a':               /* -b, -d, -l, -p, -r, -t, -T and -u */
+                       bflag = dflag = lflag = pflag = 1;
+                       rflag = tflag = Tflag = uflag = 1;
+                       break;
+               case 'b':               /* date & time of last reboot */
+                       bflag = 1;
+                       break;
+               case 'd':               /* dead processes */
+                       dflag = 1;
+                       break;
+               case 'H':               /* Write column headings */
+                       Hflag = 1;
+                       break;
+               case 'l':               /* waiting to login */
+                       lflag = 1;
+                       break;
+               case 'm':               /* Show info about current terminal */
+                       mflag = 1;
+                       break;
+               case 'p':               /* Processes active & spawned by init */
+                       pflag = 1;
+                       break;
+               case 'q':               /* "Quick" mode */
+                       qflag = 1;
                        break;
-               case 'T':
-                       show_term = 1;
+               case 'r':               /* run-level of the init process */
+                       rflag = 1;
                        break;
-               case 'u':
-                       show_idle = 1;
+               case 's':               /* Show name, line, time */
+                       sflag = 1;
                        break;
-               case 'H':
-                       show_labels = 1;
+               case 't':               /* time of change to system clock */
+                       tflag = 1;
+                       break;
+               case 'T':               /* Show terminal state */
+                       Tflag = 1;
+                       break;
+               case 'u':               /* Show idle time */
+                       uflag = 1;
                        break;
                default:
                        usage();
-                       /* NOTREACHED */
+                       /*NOTREACHED*/
                }
        }
        argc -= optind;
        argv += optind;
 
-       if (chdir("/dev")) {
-               err(1, "cannot change directory to /dev");
-               /* NOTREACHED */
+       if (argc >= 2 && strcmp(argv[0], "am") == 0 &&
+           (strcmp(argv[1], "i") == 0 || strcmp(argv[1], "I") == 0)) {
+               /* "who am i" or "who am I", equivalent to -m */
+               mflag = 1;
+               argc -= 2;
+               argv += 2;
        }
+       if (argc > 1)
+               usage();
 
-       if (show_labels)
-               output_labels();
+       if (*argv != NULL)
+               file = *argv;
+       else
+               file = _PATH_UTMP;
+       if ((fp = fopen(file, "r")) == NULL)
+               err(1, "%s", file);
+
+       if (qflag)
+               quick(fp);
+       else {
+               if (sflag)
+                       Tflag = uflag = 0;
+               if (Hflag)
+                       heading();
+               if (mflag)
+                       whoami(fp);
+               else
+                       /* read and process utmp file for relevant options */
+                       if( Tflag || uflag || !(bflag || dflag || lflag || pflag || rflag) )
+                               process_utmp(fp);
+       }
 
-       switch (argc) {
-       case 0:                                 /* who */
-               ufp = file(_PATH_UTMP);
+       fclose(fp);
 
-               if (only_current_term) {
-                       who_am_i(ufp);
-               } else {
-                       /* only entries with both name and line fields */
-                       while (fread((char *)&usr, sizeof(usr), 1, ufp) == 1)
-                               if (*usr.ut_name && *usr.ut_line)
-                                       output(&usr);
-               }
-               break;
-       case 1:                                 /* who utmp_file */
-               ufp = file(*argv);
-
-               if (only_current_term) {
-                       who_am_i(ufp);
-               } else {
-                       /* all entries */
-                       while (fread((char *)&usr, sizeof(usr), 1, ufp) == 1)
-                               output(&usr);
+       /* read and process wtmp file for relevant options */
+       if (bflag || dflag || lflag || pflag || rflag ) {
+
+               /* Open the wtmp file */
+               if ((wtmp_fp = fopen(_PATH_WTMP, "r")) == NULL)
+                       err(1, "%s", _PATH_WTMP);
+               else {
+                       process_wtmp(wtmp_fp);
+                       fclose(wtmp_fp);
                }
-               break;
-       case 2:                                 /* who am i */
-               ufp = file(_PATH_UTMP);
-               who_am_i(ufp);
-               break;
-       default:
-               usage();
-               /* NOTREACHED */
        }
+
        exit(0);
 }
 
-void
-who_am_i(ufp)
-       FILE *ufp;
+static void
+usage(void)
 {
-       struct utmp usr;
-       struct passwd *pw;
-       char *p;
-       char *t;
-
-       /* search through the utmp and find an entry for this tty */
-       if ((p = ttyname(0)) != NULL) {
-               /* strip any directory component */
-               if ((t = strrchr(p, '/')) != NULL)
-                       p = t + 1;
-               while (fread((char *)&usr, sizeof(usr), 1, ufp) == 1)
-                       if (usr.ut_name && !strcmp(usr.ut_line, p)) {
-                               output(&usr);
-                               return;
-                       }
-               /* well, at least we know what the tty is */
-               (void)strncpy(usr.ut_line, p, UT_LINESIZE);
-       } else
-               (void)strcpy(usr.ut_line, "tty??");
-
-       pw = getpwuid(getuid());
-       (void)strncpy(usr.ut_name, pw ? pw->pw_name : "?", UT_NAMESIZE);
-       (void)time(&usr.ut_time);
-       *usr.ut_host = '\0';
-       output(&usr);
+
+       fprintf(stderr, "usage: who [-abdHlmpqrstTu] [am I] [file]\n");
+       exit(1);
 }
 
-void
-output(up)
-       struct utmp *up;
+static void
+heading(void)
 {
+
+       printf("%-*s ", UT_NAMESIZE, "NAME");
+       if (Tflag)
+               printf("S ");
+       printf("%-*s ", UT_LINESIZE, "LINE");
+       printf("%-*s ", 12, "TIME");
+       if (uflag)
+               printf("IDLE  ");
+       printf("%-*s", UT_HOSTSIZE, "FROM");
+       putchar('\n');
+}
+
+static void
+row(struct utmp *ut)
+{
+       char buf[80], tty[sizeof(_PATH_DEV) + UT_LINESIZE];
        struct stat sb;
-       char line[sizeof (up->ut_line) + 1];
+       time_t idle, t;
+       static int d_first = -1;
+       struct tm *tm;
        char state;
-       static time_t now = 0;
-       time_t idle;
-
-       state = '?';
-       idle = 0;
-
-       if (show_term || show_idle) {
-               if (now == 0)
-                       time(&now);
-               
-               strncpy(line, up->ut_line, sizeof (up->ut_line));
-               line[sizeof (up->ut_line)] = '\0';
-
-               if (stat(line, &sb) == 0) {
-                       state = (sb.st_mode & 020) ? '+' : '-';
-                       idle = now - sb.st_atime;
-               }
-               
-       }
-
-       (void)printf("%-*.*s ", UT_NAMESIZE, UT_NAMESIZE, up->ut_name);
 
-       if (show_term) {
-               (void)printf("%c ", state);
+       if (d_first < 0)
+               d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
+
+       if (Tflag || uflag) {
+               snprintf(tty, sizeof(tty), "%s%.*s", _PATH_DEV,
+                       UT_LINESIZE, ut->ut_line);
+               state = '?';
+               idle = 0;
+               if (stat(tty, &sb) == 0) {
+                       state = sb.st_mode & (S_IWOTH|S_IWGRP) ?
+                           '+' : '-';
+                       idle = time(NULL) - sb.st_mtime;
+               }
        }
 
-       (void)printf("%-*.*s ", UT_LINESIZE, UT_LINESIZE, up->ut_line);
-       (void)printf("%.12s ", ctime(&up->ut_time) + 4);
-
-       if (show_idle) {
-               if (idle < 60) 
-                       (void)printf("  .   ");
-               else if (idle < (24 * 60 * 60))
-                       (void)printf("%02ld:%02ld ", 
-                                    (long)(idle / (60 * 60)),
-                                    (long)(idle % (60 * 60)) / 60);
+       printf("%-*.*s ", UT_NAMESIZE, UT_NAMESIZE, ut->ut_name);
+       if (Tflag)
+               printf("%c ", state);
+       printf("%-*.*s ", UT_LINESIZE, UT_LINESIZE, ut->ut_line);
+       t = _time32_to_time(ut->ut_time);
+       tm = localtime(&t);
+       strftime(buf, sizeof(buf), d_first ? "%e %b %R" : "%b %e %R", tm);
+       printf("%-*s ", 12, buf);
+       if (uflag) {
+               if (idle < 60)
+                       printf("  .   ");
+               else if (idle < 24 * 60 * 60)
+                       printf("%02d:%02d ", (int)(idle / 60 / 60),
+                           (int)(idle / 60 % 60));
                else
-                       (void)printf(" old  ");
+                       printf(" old  ");
        }
-       
-       if (*up->ut_host)
-               printf("\t(%.*s)", UT_HOSTSIZE, up->ut_host);
-       (void)putchar('\n');
+       if (*ut->ut_host != '\0')
+               printf("(%.*s)", UT_HOSTSIZE, ut->ut_host);
+       putchar('\n');
+
 }
 
-void
-output_labels()
+static void
+process_utmp(FILE *fp)
 {
-       (void)printf("%-*.*s ", UT_NAMESIZE, UT_NAMESIZE, "USER");
+       struct utmp ut;
 
-       if (show_term)
-               (void)printf("S ");
-       
-       (void)printf("%-*.*s ", UT_LINESIZE, UT_LINESIZE, "LINE");
-       (void)printf("WHEN         ");
+       while (fread(&ut, sizeof(ut), 1, fp) == 1)
+               if (*ut.ut_name != '\0') {
+                       row(&ut);
+               }
+}
 
-       if (show_idle)
-               (void)printf("IDLE  ");
-       
-       (void)printf("\t%.*s", UT_HOSTSIZE, "FROM");
+/* For some options, process the wtmp file to generate output */
+static void
+process_wtmp(FILE *fp)
+{
+       struct utmp ut;
+       struct utmp lboot_ut = { "", "", "", 0 };
+       int num = 0;    /* count of user entries */
+
+       while (fread(&ut, sizeof(ut), 1, fp) == 1)
+               if (*ut.ut_name != '\0') {
+                       if (bflag && (!strcmp(ut.ut_name, "reboot"))) {
+                               memcpy(&lboot_ut, &ut, sizeof(ut));
+                       }
+                       else
+                               num++;
+               };
+
+       if (bflag && (!strcmp(lboot_ut.ut_name, "reboot")))
+               row(&lboot_ut);
+
+       /* run level of the init process is unknown in BSD system. If multi
+          user, then display the highest run level. Else, no-op.
+       */
+       if (rflag && (num > 1))
+               printf("   .       run-level 3\n");
+}
+
+static void
+quick(FILE *fp)
+{
+       struct utmp ut;
+       int col, ncols, num;
+
+       ncols = ttywidth();
+       col = num = 0;
+       while (fread(&ut, sizeof(ut), 1, fp) == 1) {
+               if (*ut.ut_name == '\0')
+                       continue;
+               printf("%-*.*s", UT_NAMESIZE, UT_NAMESIZE, ut.ut_name);
+               if (++col < ncols / (UT_NAMESIZE + 1))
+                       putchar(' ');
+               else {
+                       col = 0;
+                       putchar('\n');
+               }
+               num++;
+       }
+       if (col != 0)
+               putchar('\n');
 
-       (void)putchar('\n');
+       printf("# users = %d\n", num);
 }
 
-FILE *
-file(name)
-       char *name;
+static void
+whoami(FILE *fp)
 {
-       FILE *ufp;
+       struct utmp ut;
+       struct passwd *pwd;
+       const char *name, *p, *tty;
+
+       if ((tty = ttyname(STDIN_FILENO)) == NULL)
+               tty = "tty??";
+       else if ((p = strrchr(tty, '/')) != NULL)
+               tty = p + 1;
+
+       /* Search utmp for our tty, dump first matching record. */
+       while (fread(&ut, sizeof(ut), 1, fp) == 1)
+               if (*ut.ut_name != '\0' && strncmp(ut.ut_line, tty,
+                   UT_LINESIZE) == 0) {
+                       row(&ut);
+                       return;
+               }
 
-       if (!(ufp = fopen(name, "r"))) {
-               err(1, "%s", name);
-               /* NOTREACHED */
-       }
-       return (ufp);
+       /* Not found; fill the utmp structure with the information we have. */
+       memset(&ut, 0, sizeof(ut));
+       if ((pwd = getpwuid(getuid())) != NULL)
+               name = pwd->pw_name;
+       else
+               name = "?";
+       strncpy(ut.ut_name, name, UT_NAMESIZE);
+       strncpy(ut.ut_line, tty, UT_LINESIZE);
+       ut.ut_time = _time_to_time32(time(NULL));
+       row(&ut);
 }
 
-void
-usage()
+static int
+ttywidth(void)
 {
-       (void)fprintf(stderr, "usage: who [-mTuH] [ file ]\n       who am i\n");
-       exit(1);
+       struct winsize ws;
+       long width;
+       char *cols, *ep;
+
+       if ((cols = getenv("COLUMNS")) != NULL && *cols != '\0') {
+               errno = 0;
+               width = strtol(cols, &ep, 10);
+               if (errno || width <= 0 || width > INT_MAX || ep == cols ||
+                   *ep != '\0')
+                       warnx("invalid COLUMNS environment variable ignored");
+               else
+                       return (width);
+       }
+       if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) != -1)
+               return (ws.ws_col);
+
+       return (80);
 }