mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-10-29 20:04:57 +01:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e5eb97b547 |
No files matched your search
+2
-5
@@ -183,8 +183,6 @@ TMPPATH= ${STRICTTMPPATH}:${PATH}
|
||||
COMPILER_ENV= BISON_SIMPLE=${TOOLROOT}/usr/share/misc/bison.simple \
|
||||
COMPILER_PATH=${TOOLROOT}/usr/libexec:${TOOLROOT}/usr/bin \
|
||||
GCC_EXEC_PREFIX=${WORLDTMP}${SHLIBDIR}:${WORLDTMP}/usr/lib/ \
|
||||
GROFF_FONT_PATH=${WORLDTMP}/usr/share/groff_font \
|
||||
GROFF_TMAC_PATH=${WORLDTMP}/usr/share/tmac \
|
||||
LD_LIBRARY_PATH=${TOOLROOT}${SHLIBDIR} \
|
||||
LIBRARY_PATH=${WORLDTMP}${SHLIBDIR}:${WORLDTMP}/usr/lib
|
||||
|
||||
@@ -398,7 +396,7 @@ update:
|
||||
@echo "--------------------------------------------------------------"
|
||||
@echo ">>> Updating /usr/src from cvs repository" ${CVSROOT}
|
||||
@echo "--------------------------------------------------------------"
|
||||
cd ${.CURDIR}; cvs -q update -rRELENG_3 -P -d
|
||||
cd ${.CURDIR}; cvs -q update -P -d
|
||||
.endif
|
||||
|
||||
#
|
||||
@@ -554,11 +552,10 @@ includes:
|
||||
cd ${.CURDIR}/lib/libftpio; ${MAKE} beforeinstall
|
||||
cd ${.CURDIR}/lib/libmd; ${MAKE} beforeinstall
|
||||
cd ${.CURDIR}/lib/libmytinfo; ${MAKE} beforeinstall
|
||||
cd ${.CURDIR}/lib/libncurses; ${MAKE} beforeinstall
|
||||
.if !defined(WANT_CSRG_LIBM)
|
||||
cd ${.CURDIR}/lib/msun; ${MAKE} beforeinstall
|
||||
.endif
|
||||
cd ${.CURDIR}/lib/libncurses; ${MAKE} beforeinstall
|
||||
cd ${.CURDIR}/lib/libnetgraph; ${MAKE} beforeinstall
|
||||
cd ${.CURDIR}/lib/libopie; ${MAKE} beforeinstall
|
||||
cd ${.CURDIR}/lib/libpam/libpam; ${MAKE} beforeinstall
|
||||
cd ${.CURDIR}/lib/libpcap; ${MAKE} beforeinstall
|
||||
|
||||
@@ -35,7 +35,7 @@ bin System/User commands.
|
||||
|
||||
contrib Packages contributed by 3rd parties.
|
||||
|
||||
crypto Cryptography stuff (see crypto/README).
|
||||
crypto Export controlled stuff (see crypto/README).
|
||||
|
||||
etc Template files for /etc
|
||||
|
||||
|
||||
@@ -1,6 +1,137 @@
|
||||
Updating Information for FreeBSD Stable users
|
||||
Updating Information for FreeBSD current users
|
||||
|
||||
When updating to 4.x-stable from 3.x-stable, please read src/UPDATING
|
||||
after updating to the new sources for important information.
|
||||
This file is maintained by [email protected]. Please send new entries
|
||||
directly to him. See end of file for further details.
|
||||
|
||||
19990510:
|
||||
Previously, one would define "NOAOUT" to keep from building
|
||||
the legacy a.out bits. Now one would define "WANT_AOUT" to
|
||||
build them.
|
||||
|
||||
19990507:
|
||||
New devstat API requires recompilation of libdevstat, systat,
|
||||
iostat, vmstat and rpc.rstatd. A new kernel is also required.
|
||||
make world + building a kernel should do all of this. Any
|
||||
ports that use devstat need to be recompiled as well.
|
||||
|
||||
19990424:
|
||||
The 'nlpt' driver has changed names to become the 'lpt' driver.
|
||||
See ppbus(4) or http://www.freebsd.org/~nsouch/ppbus.html
|
||||
for proper configuration details.
|
||||
|
||||
19990209:
|
||||
New devstat API requires recompilation of libdevstat, systat,
|
||||
iostat, vmstat and rpc.rstatd. A new kernel is also required.
|
||||
make world + building a kernel should do all of this. Any
|
||||
ports that use devstat need to be recompiled as well.
|
||||
|
||||
19990125:
|
||||
Linux threads options has gone away (they are now standard in
|
||||
the FreeBSD kernel). A recompile of all libkvm using programs
|
||||
is in order (or better yet a make world).
|
||||
|
||||
19990122:
|
||||
On or about this date there was a small window when the boot
|
||||
blocks had some minor problems which seemed to force one to
|
||||
edit /etc/fstab. This has been corrected, if you are seeing this
|
||||
problem, please rebuild and reinstall your boot blocks.
|
||||
|
||||
19990121:
|
||||
Vinum has changed. The "vinum read" command has changed. For
|
||||
updates, please see
|
||||
|
||||
http://www.freebsd.org/cgi/getmsg.cgi?fetch=800363+0+current/freebsd-current
|
||||
|
||||
for details.
|
||||
|
||||
19990120:
|
||||
Stable branch created. You might want to consider using this
|
||||
branch. It is tagged with RELENG_3.
|
||||
|
||||
19990119:
|
||||
More work on the syscons driver has been committed. Since
|
||||
files moved around, you will need to reconfigure your kernel,
|
||||
and make clean; make depend before rebuilding the kernel. No
|
||||
config file changes are needed.
|
||||
|
||||
19990111:
|
||||
New keyboard and video card drivers are introduced as the first
|
||||
stage of console driver reorganization. You are required to
|
||||
update the kernel configuration file and rebuild the kernel.
|
||||
kbdcontrol, vidcontrol, and screen savers also need recompilation.
|
||||
The instruction can be found in
|
||||
|
||||
http://www.freebsd.org/~yokota/sc_update.txt
|
||||
|
||||
It has notes on splash screen too.
|
||||
|
||||
19990106:
|
||||
Robert Nordier was kind enough to make this page to enable people to
|
||||
install the new bootblocks:
|
||||
|
||||
http://www.freebsd.org/~rnordier/boot.txt
|
||||
|
||||
When updating to ELF, make sure that you have updated your
|
||||
/etc/rc files which have different ldconfig invocations for
|
||||
elf and aout. Otherwise things like X will stop working with
|
||||
messages about being unable to find library files. The
|
||||
mergemaster utility in ports/sysutils/mergemaster helps to
|
||||
keep critical files like this in sync, and its use is
|
||||
recommended.
|
||||
|
||||
19990104:
|
||||
Information about ELF day (see 19981230) can be found in
|
||||
|
||||
http://www.freebsd.org/~peter/elfday.html
|
||||
|
||||
about the upcoming change, its motivations and instructions
|
||||
for doing the upgrade.
|
||||
|
||||
19981230:
|
||||
You should install new bootblocks now. The ELF kernel will
|
||||
become default soon. In addition, you'll need to upgrade
|
||||
your userland programs to ELF before then as well. Use
|
||||
make aout-to-elf to upgrade your userland programs (old
|
||||
a.out programs in, for example, /usr/local/bin will
|
||||
continue to work, even after the upgrade). See src/Makefile
|
||||
for more details.
|
||||
|
||||
19981224:
|
||||
The old wcd driver has been deleted from the kernel. The
|
||||
driver that replaces it is named acd. You'll need to change
|
||||
this in your configuration files.
|
||||
|
||||
Failure to do this will result in "ATAPI CD-ROMs not
|
||||
configured" at boot time.
|
||||
|
||||
The floppy tape driver (ft) has been removed from the kernel,
|
||||
with no replacement driver.
|
||||
|
||||
19981202:
|
||||
New groups from 19981201 commented out of mtree, so they
|
||||
aren't strictly needed, but still a good idea to have.
|
||||
|
||||
19981201:
|
||||
New user/group added: bind. From src/etc/master.passwd and
|
||||
src/etc/group:
|
||||
% grep <newstuff> /usr/src/etc/group
|
||||
bind:*:53:
|
||||
% grep <newstuff> /usr/src/etc/master.passwd
|
||||
tty:*:4:65533::0:0:Tty Sandbox:/:/sbin/nologin
|
||||
kmem:*:5:65533::0:0:KMem Sandbox:/:/sbin/nologin
|
||||
bind:*:53:53::0:0:Bind Sandbox:/:/sbin/nologin
|
||||
|
||||
19981118:
|
||||
PAM integrated into the tree. Requires new /etc/pam.conf file
|
||||
to silence warnings from authentication programs (login, etc).
|
||||
See src/etc/pam.conf for a sample.
|
||||
|
||||
This file contains a list, in reverse chronologocal order, of major
|
||||
breakages in tracking -stable. Not all things will be listed here,
|
||||
and it only starts on Novemeber 18, 1998. If you have an earlier
|
||||
version of FreeBSD, you are on your own to get to November 18, 1998.
|
||||
|
||||
Please filter your entries through Warner ([email protected]) so that
|
||||
the style, formatting, etc of this file can be maintained.
|
||||
|
||||
$FreeBSD$
|
||||
+1
-1
@@ -135,7 +135,7 @@ respectively.
|
||||
.Pp
|
||||
Note that not all medium changers support the
|
||||
.Ic exchange
|
||||
operation; the changer must have multiple free pickers or emulate
|
||||
operation; The changer must have multiple free pickers or emulate
|
||||
multiple free pickers with transient storage.
|
||||
.It Xo Nm position
|
||||
.Ar <to ET> <to EU>
|
||||
|
||||
+57
-100
@@ -34,12 +34,11 @@
|
||||
* Additional Copyright (c) 1997, by Matthew Jacob, for NASA/Ames Research Ctr.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
static const char copyright[] =
|
||||
"@(#) Copyright (c) 1996 Jason R. Thorpe. All rights reserved.";
|
||||
static const char rcsid[] =
|
||||
"$FreeBSD$";
|
||||
#endif /* not lint */
|
||||
__COPYRIGHT("@(#) Copyright (c) 1996 Jason R. Thorpe. All rights reserved.");
|
||||
__RCSID("$NetBSD: chio.c,v 1.6 1998/01/04 23:53:58 thorpej Exp $");
|
||||
#endif
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/chio.h>
|
||||
@@ -56,44 +55,45 @@ static const char rcsid[] =
|
||||
extern char *__progname; /* from crt0.o */
|
||||
extern int optreset; /* from getopt.o */
|
||||
|
||||
static void usage __P((void));
|
||||
static void cleanup __P((void));
|
||||
static int parse_element_type __P((char *));
|
||||
static int parse_element_unit __P((char *));
|
||||
static const char * element_type_name __P((int et));
|
||||
static int parse_special __P((char *));
|
||||
static int is_special __P((char *));
|
||||
static const char *bits_to_string __P((int, const char *));
|
||||
int main(int, char *[]);
|
||||
static void usage(void);
|
||||
static void cleanup(void);
|
||||
static int parse_element_type(char *);
|
||||
static int parse_element_unit(char *);
|
||||
static const char * element_type_name(int et);
|
||||
static int parse_special(char *);
|
||||
static int is_special(char *);
|
||||
static char *bits_to_string(int, const char *);
|
||||
|
||||
static int do_move __P((char *, int, char **));
|
||||
static int do_exchange __P((char *, int, char **));
|
||||
static int do_position __P((char *, int, char **));
|
||||
static int do_params __P((char *, int, char **));
|
||||
static int do_getpicker __P((char *, int, char **));
|
||||
static int do_setpicker __P((char *, int, char **));
|
||||
static int do_status __P((char *, int, char **));
|
||||
static int do_ielem __P((char *, int, char **));
|
||||
static int do_voltag __P((char *, int, char **));
|
||||
static int do_move(char *, int, char **);
|
||||
static int do_exchange(char *, int, char **);
|
||||
static int do_position(char *, int, char **);
|
||||
static int do_params(char *, int, char **);
|
||||
static int do_getpicker(char *, int, char **);
|
||||
static int do_setpicker(char *, int, char **);
|
||||
static int do_status(char *, int, char **);
|
||||
static int do_ielem(char *, int, char **);
|
||||
static int do_voltag(char *, int, char **);
|
||||
|
||||
/* Valid changer element types. */
|
||||
const struct element_type elements[] = {
|
||||
{ "drive", CHET_DT },
|
||||
{ "picker", CHET_MT },
|
||||
{ "portal", CHET_IE },
|
||||
{ "slot", CHET_ST },
|
||||
{ "portal", CHET_IE },
|
||||
{ "drive", CHET_DT },
|
||||
{ NULL, 0 },
|
||||
};
|
||||
|
||||
/* Valid commands. */
|
||||
const struct changer_command commands[] = {
|
||||
{ "exchange", do_exchange },
|
||||
{ "getpicker", do_getpicker },
|
||||
{ "ielem", do_ielem },
|
||||
{ "move", do_move },
|
||||
{ "params", do_params },
|
||||
{ "exchange", do_exchange },
|
||||
{ "position", do_position },
|
||||
{ "params", do_params },
|
||||
{ "getpicker", do_getpicker },
|
||||
{ "setpicker", do_setpicker },
|
||||
{ "status", do_status },
|
||||
{ "ielem", do_ielem },
|
||||
{ "voltag", do_voltag },
|
||||
{ NULL, 0 },
|
||||
};
|
||||
@@ -107,12 +107,10 @@ const struct special_word specials[] = {
|
||||
};
|
||||
|
||||
static int changer_fd;
|
||||
static const char *changer_name;
|
||||
static char *changer_name;
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int ch, i;
|
||||
|
||||
@@ -149,26 +147,15 @@ main(argc, argv)
|
||||
for (i = 0; commands[i].cc_name != NULL; ++i)
|
||||
if (strcmp(*argv, commands[i].cc_name) == 0)
|
||||
break;
|
||||
if (commands[i].cc_name == NULL) {
|
||||
/* look for abbreviation */
|
||||
for (i = 0; commands[i].cc_name != NULL; ++i)
|
||||
if (strncmp(*argv, commands[i].cc_name,
|
||||
strlen(*argv)) == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (commands[i].cc_name == NULL)
|
||||
errx(1, "unknown command: %s", *argv);
|
||||
|
||||
exit ((*commands[i].cc_handler)(commands[i].cc_name, argc, argv));
|
||||
exit((*commands[i].cc_handler)(commands[i].cc_name, argc, argv));
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
static int
|
||||
do_move(cname, argc, argv)
|
||||
char *cname;
|
||||
int argc;
|
||||
char **argv;
|
||||
do_move(char *cname, int argc, char **argv)
|
||||
{
|
||||
struct changer_move cmd;
|
||||
int val;
|
||||
@@ -236,10 +223,7 @@ do_move(cname, argc, argv)
|
||||
}
|
||||
|
||||
static int
|
||||
do_exchange(cname, argc, argv)
|
||||
char *cname;
|
||||
int argc;
|
||||
char **argv;
|
||||
do_exchange(char *cname, int argc, char **argv)
|
||||
{
|
||||
struct changer_exchange cmd;
|
||||
int val;
|
||||
@@ -334,10 +318,7 @@ do_exchange(cname, argc, argv)
|
||||
}
|
||||
|
||||
static int
|
||||
do_position(cname, argc, argv)
|
||||
char *cname;
|
||||
int argc;
|
||||
char **argv;
|
||||
do_position(char *cname, int argc, char **argv)
|
||||
{
|
||||
struct changer_position cmd;
|
||||
int val;
|
||||
@@ -398,10 +379,7 @@ do_position(cname, argc, argv)
|
||||
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
do_params(cname, argc, argv)
|
||||
char *cname;
|
||||
int argc;
|
||||
char **argv;
|
||||
do_params(char *cname, int argc, char **argv)
|
||||
{
|
||||
struct changer_params data;
|
||||
int picker;
|
||||
@@ -444,10 +422,7 @@ do_params(cname, argc, argv)
|
||||
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
do_getpicker(cname, argc, argv)
|
||||
char *cname;
|
||||
int argc;
|
||||
char **argv;
|
||||
do_getpicker(char *cname, int argc, char **argv)
|
||||
{
|
||||
int picker;
|
||||
|
||||
@@ -474,10 +449,7 @@ do_getpicker(cname, argc, argv)
|
||||
}
|
||||
|
||||
static int
|
||||
do_setpicker(cname, argc, argv)
|
||||
char *cname;
|
||||
int argc;
|
||||
char **argv;
|
||||
do_setpicker(char *cname, int argc, char **argv)
|
||||
{
|
||||
int picker;
|
||||
|
||||
@@ -505,10 +477,7 @@ do_setpicker(cname, argc, argv)
|
||||
}
|
||||
|
||||
static int
|
||||
do_status(cname, argc, argv)
|
||||
char *cname;
|
||||
int argc;
|
||||
char **argv;
|
||||
do_status(char *cname, int argc, char **argv)
|
||||
{
|
||||
struct changer_params cp;
|
||||
struct changer_element_status_request cesr;
|
||||
@@ -527,7 +496,7 @@ do_status(cname, argc, argv)
|
||||
description = NULL;
|
||||
|
||||
optind = optreset = 1;
|
||||
while ((c = getopt(argc, argv, "vVsSbaI")) != -1) {
|
||||
while ((c = getopt(argc, argv, "vVsSbaI")) != EOF) {
|
||||
switch (c) {
|
||||
case 'v':
|
||||
pvoltag = 1;
|
||||
@@ -687,7 +656,7 @@ do_status(cname, argc, argv)
|
||||
printf(" avoltag: <%s:%d>",
|
||||
ces->ces_avoltag.cv_volid,
|
||||
ces->ces_avoltag.cv_serial);
|
||||
if (source) {
|
||||
if (source)
|
||||
if (ces->ces_flags & CES_SOURCE_VALID)
|
||||
printf(" source: <%s %d>",
|
||||
element_type_name(
|
||||
@@ -695,7 +664,6 @@ do_status(cname, argc, argv)
|
||||
ces->ces_source_addr);
|
||||
else
|
||||
printf(" source: <>");
|
||||
}
|
||||
if (intaddr)
|
||||
printf(" intaddr: <%d>", ces->ces_int_addr);
|
||||
if (scsi) {
|
||||
@@ -727,10 +695,7 @@ do_status(cname, argc, argv)
|
||||
}
|
||||
|
||||
static int
|
||||
do_ielem(cname, argc, argv)
|
||||
char *cname;
|
||||
int argc;
|
||||
char **argv;
|
||||
do_ielem(char *cname, int argc, char **argv)
|
||||
{
|
||||
int timeout = 0;
|
||||
|
||||
@@ -753,10 +718,7 @@ do_ielem(cname, argc, argv)
|
||||
}
|
||||
|
||||
static int
|
||||
do_voltag(cname, argc, argv)
|
||||
char *cname;
|
||||
int argc;
|
||||
char **argv;
|
||||
do_voltag(char *cname, int argc, char **argv)
|
||||
{
|
||||
int force = 0;
|
||||
int clear = 0;
|
||||
@@ -767,7 +729,7 @@ do_voltag(cname, argc, argv)
|
||||
bzero(&csvr, sizeof(csvr));
|
||||
|
||||
optind = optreset = 1;
|
||||
while ((c = getopt(argc, argv, "fca")) != -1) {
|
||||
while ((c = getopt(argc, argv, "fca")) != EOF) {
|
||||
switch (c) {
|
||||
case 'f':
|
||||
force = 1;
|
||||
@@ -841,8 +803,7 @@ do_voltag(cname, argc, argv)
|
||||
}
|
||||
|
||||
static int
|
||||
parse_element_type(cp)
|
||||
char *cp;
|
||||
parse_element_type(char *cp)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -855,8 +816,7 @@ parse_element_type(cp)
|
||||
}
|
||||
|
||||
static const char *
|
||||
element_type_name(et)
|
||||
int et;
|
||||
element_type_name(int et)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -868,8 +828,7 @@ element_type_name(et)
|
||||
}
|
||||
|
||||
static int
|
||||
parse_element_unit(cp)
|
||||
char *cp;
|
||||
parse_element_unit(char *cp)
|
||||
{
|
||||
int i;
|
||||
char *p;
|
||||
@@ -882,8 +841,7 @@ parse_element_unit(cp)
|
||||
}
|
||||
|
||||
static int
|
||||
parse_special(cp)
|
||||
char *cp;
|
||||
parse_special(char *cp)
|
||||
{
|
||||
int val;
|
||||
|
||||
@@ -896,8 +854,7 @@ parse_special(cp)
|
||||
}
|
||||
|
||||
static int
|
||||
is_special(cp)
|
||||
char *cp;
|
||||
is_special(char *cp)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -908,10 +865,8 @@ is_special(cp)
|
||||
return (0);
|
||||
}
|
||||
|
||||
static const char *
|
||||
bits_to_string(v, cp)
|
||||
int v;
|
||||
const char *cp;
|
||||
static char *
|
||||
bits_to_string(int v, const char *cp)
|
||||
{
|
||||
const char *np;
|
||||
char f, sep, *bp;
|
||||
@@ -925,9 +880,7 @@ bits_to_string(v, cp)
|
||||
np++;
|
||||
if ((v & (1 << (f - 1))) == 0)
|
||||
continue;
|
||||
(void) snprintf(bp, sizeof(buf) - (bp - &buf[0]),
|
||||
"%c%.*s", sep, (int)(long)(np - cp), cp);
|
||||
bp += strlen(bp);
|
||||
bp += sprintf(bp, "%c%.*s", sep, (int)(long)(np - cp), cp);
|
||||
sep = ',';
|
||||
}
|
||||
if (sep != '<')
|
||||
@@ -946,7 +899,11 @@ cleanup()
|
||||
static void
|
||||
usage()
|
||||
{
|
||||
(void) fprintf(stderr, "usage: %s [-f changer] command [-<flags>] "
|
||||
"arg1 arg2 [arg3 [...]]\n", __progname);
|
||||
|
||||
(void) fprintf(stderr, "usage: %s command arg1 arg2 ...\n", __progname);
|
||||
(void) fprintf(stderr, "Examples:\n");
|
||||
(void) fprintf(stderr, "\tchio -f /dev/ch0 move slot 1 drive 0\n");
|
||||
(void) fprintf(stderr, "\tchio ielem\n");
|
||||
(void) fprintf(stderr, "\tchio -f /dev/ch1 status\n");
|
||||
exit(1);
|
||||
}
|
||||
+3
-12
@@ -47,7 +47,6 @@
|
||||
.Fl f
|
||||
.Fl R
|
||||
.Op Fl H | Fl L | Fl P
|
||||
.Fl v
|
||||
.Oc
|
||||
.Ar mode
|
||||
.Ar file ...
|
||||
@@ -65,8 +64,7 @@ The options are as follows:
|
||||
If the
|
||||
.Fl R
|
||||
option is specified, symbolic links on the command line are followed.
|
||||
(Symbolic links encountered in the tree traversal are not followed by
|
||||
default.)
|
||||
(Symbolic links encountered in the tree traversal are not followed.)
|
||||
.It Fl L
|
||||
If the
|
||||
.Fl R
|
||||
@@ -83,10 +81,6 @@ Do not display a diagnostic message if
|
||||
.Nm
|
||||
could not modify the mode for
|
||||
.Va file .
|
||||
.It Fl v
|
||||
Cause
|
||||
.Nm
|
||||
to be verbose, showing files as the mode is modified.
|
||||
.El
|
||||
.Pp
|
||||
Symbolic links do not have modes, so unless the
|
||||
@@ -172,8 +166,9 @@ others, and no set-uid or set-gid behaviour is 755
|
||||
The symbolic mode is described by the following grammar:
|
||||
.Bd -literal -offset indent
|
||||
mode ::= clause [, clause ...]
|
||||
clause ::= [who ...] [action ...] action
|
||||
clause ::= [who ...] [action ...] last_action
|
||||
action ::= op [perm ...]
|
||||
last_action ::= op [perm ...]
|
||||
who ::= a | u | g | o
|
||||
op ::= + | \- | =
|
||||
perm ::= r | s | t | w | x | X | u | g | o
|
||||
@@ -312,10 +307,6 @@ set the group bits equal to the user bits, but clear the group write bit.
|
||||
There's no
|
||||
.Ar perm
|
||||
option for the naughty bits.
|
||||
.Sh COMPATIBILITY
|
||||
The
|
||||
.Fl v
|
||||
option is non-standard and its use in scripts is not recommended.
|
||||
.Sh SEE ALSO
|
||||
.Xr chflags 1 ,
|
||||
.Xr install 1 ,
|
||||
|
||||
+3
-10
@@ -70,13 +70,12 @@ main(argc, argv)
|
||||
long val;
|
||||
int oct, omode;
|
||||
int Hflag, Lflag, Pflag, Rflag, ch, fflag, fts_options, hflag, rval;
|
||||
int vflag;
|
||||
char *ep, *mode;
|
||||
|
||||
set = NULL;
|
||||
omode = 0;
|
||||
Hflag = Lflag = Pflag = Rflag = fflag = hflag = vflag = 0;
|
||||
while ((ch = getopt(argc, argv, "HLPRXfgorstuvwx")) != -1)
|
||||
Hflag = Lflag = Pflag = Rflag = fflag = hflag = 0;
|
||||
while ((ch = getopt(argc, argv, "HLPRXfgorstuwx")) != -1)
|
||||
switch (ch) {
|
||||
case 'H':
|
||||
Hflag = 1;
|
||||
@@ -119,9 +118,6 @@ main(argc, argv)
|
||||
argv[optind - 1][2] == '\0')
|
||||
--optind;
|
||||
goto done;
|
||||
case 'v':
|
||||
vflag = 1;
|
||||
break;
|
||||
case '?':
|
||||
default:
|
||||
usage();
|
||||
@@ -195,9 +191,6 @@ done: argv += optind;
|
||||
getmode(set, p->fts_statp->st_mode)) && !fflag) {
|
||||
warn(p->fts_path);
|
||||
rval = 1;
|
||||
} else {
|
||||
if (vflag)
|
||||
(void)printf("%s\n", p->fts_accpath);
|
||||
}
|
||||
}
|
||||
if (errno)
|
||||
@@ -210,6 +203,6 @@ void
|
||||
usage()
|
||||
{
|
||||
(void)fprintf(stderr,
|
||||
"usage: chmod [-fv] [-R [-H | -L | -P]] mode file ...\n");
|
||||
"usage: chmod [-f -R [-H | -L | -P]] mode file ...\n");
|
||||
exit(1);
|
||||
}
|
||||
+2
-10
@@ -48,7 +48,7 @@
|
||||
.Op Fl H | Fl L | Fl P
|
||||
.Oc
|
||||
.Op Fl f | i
|
||||
.Op Fl pv
|
||||
.Op Fl p
|
||||
.Ar source_file target_file
|
||||
.Nm cp
|
||||
.Oo
|
||||
@@ -56,7 +56,7 @@
|
||||
.Op Fl H | Fl L | Fl P
|
||||
.Oc
|
||||
.Op Fl f | i
|
||||
.Op Fl pv
|
||||
.Op Fl p
|
||||
.Ar source_file ... target_directory
|
||||
.Sh DESCRIPTION
|
||||
In the first synopsis form, the
|
||||
@@ -145,10 +145,6 @@ If the source file has both its set user ID and set group ID bits on,
|
||||
and either the user ID or group ID cannot be preserved, neither
|
||||
the set user ID nor set group ID bits are preserved in the copy's
|
||||
permissions.
|
||||
.It Fl v
|
||||
Cause
|
||||
.Nm
|
||||
to be verbose, showing files as they are copied.
|
||||
.El
|
||||
.Pp
|
||||
For each destination file that already exists, its contents are
|
||||
@@ -214,10 +210,6 @@ option.
|
||||
This implementation supports that option, however, its use is strongly
|
||||
discouraged, as it does not correctly copy special files, symbolic links
|
||||
or fifo's.
|
||||
.Pp
|
||||
The
|
||||
.Fl v
|
||||
option is non-standard and its use in scripts is not recommended.
|
||||
.Sh SEE ALSO
|
||||
.Xr mv 1 ,
|
||||
.Xr rcp 1 ,
|
||||
|
||||
+19
-26
@@ -69,7 +69,6 @@ static const char rcsid[] =
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <fts.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
@@ -80,10 +79,10 @@ static const char rcsid[] =
|
||||
*--(p).p_end = 0; \
|
||||
}
|
||||
|
||||
PATH_T to = { to.p_path, "", "" };
|
||||
PATH_T to = { to.p_path, "" };
|
||||
|
||||
uid_t myuid;
|
||||
int Rflag, iflag, pflag, rflag, fflag, vflag;
|
||||
int Rflag, iflag, pflag, rflag, fflag;
|
||||
int myumask;
|
||||
|
||||
enum op { FILE_TO_FILE, FILE_TO_DIR, DIR_TO_DNE };
|
||||
@@ -102,7 +101,7 @@ main(argc, argv)
|
||||
char *target;
|
||||
|
||||
Hflag = Lflag = Pflag = 0;
|
||||
while ((ch = getopt(argc, argv, "HLPRfiprv")) != -1)
|
||||
while ((ch = getopt(argc, argv, "HLPRfipr")) != -1)
|
||||
switch (ch) {
|
||||
case 'H':
|
||||
Hflag = 1;
|
||||
@@ -133,9 +132,6 @@ main(argc, argv)
|
||||
case 'r':
|
||||
rflag = 1;
|
||||
break;
|
||||
case 'v':
|
||||
vflag = 1;
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
break;
|
||||
@@ -253,23 +249,23 @@ copy(argv, type, fts_options)
|
||||
struct stat to_stat;
|
||||
FTS *ftsp;
|
||||
FTSENT *curr;
|
||||
int base = 0, dne, badcp, nlen, rval;
|
||||
int base = 0, dne, nlen, rval;
|
||||
char *p, *target_mid;
|
||||
|
||||
if ((ftsp = fts_open(argv, fts_options, mastercmp)) == NULL)
|
||||
err(1, NULL);
|
||||
for (badcp = rval = 0; (curr = fts_read(ftsp)) != NULL; badcp = 0) {
|
||||
for (rval = 0; (curr = fts_read(ftsp)) != NULL;) {
|
||||
switch (curr->fts_info) {
|
||||
case FTS_NS:
|
||||
case FTS_DNR:
|
||||
case FTS_ERR:
|
||||
warnx("%s: %s",
|
||||
curr->fts_path, strerror(curr->fts_errno));
|
||||
badcp = rval = 1;
|
||||
rval = 1;
|
||||
continue;
|
||||
case FTS_DC: /* Warn, continue. */
|
||||
warnx("%s: directory causes a cycle", curr->fts_path);
|
||||
badcp = rval = 1;
|
||||
rval = 1;
|
||||
continue;
|
||||
case FTS_DP: /* Ignore, continue. */
|
||||
continue;
|
||||
@@ -299,7 +295,7 @@ copy(argv, type, fts_options)
|
||||
* Since the first level MUST be FTS_ROOTLEVEL, base
|
||||
* is always initialized.
|
||||
*/
|
||||
if (curr->fts_level == FTS_ROOTLEVEL) {
|
||||
if (curr->fts_level == FTS_ROOTLEVEL)
|
||||
if (type != DIR_TO_DNE) {
|
||||
p = strrchr(curr->fts_path, '/');
|
||||
base = (p == NULL) ? 0 :
|
||||
@@ -310,7 +306,6 @@ copy(argv, type, fts_options)
|
||||
base += 1;
|
||||
} else
|
||||
base = curr->fts_pathlen;
|
||||
}
|
||||
|
||||
p = &curr->fts_path[base];
|
||||
nlen = curr->fts_pathlen - base;
|
||||
@@ -321,7 +316,7 @@ copy(argv, type, fts_options)
|
||||
if (target_mid - to.p_path + nlen > MAXPATHLEN) {
|
||||
warnx("%s%s: name too long (not copied)",
|
||||
to.p_path, p);
|
||||
badcp = rval = 1;
|
||||
rval = 1;
|
||||
continue;
|
||||
}
|
||||
(void)strncat(target_mid, p, nlen);
|
||||
@@ -338,7 +333,7 @@ copy(argv, type, fts_options)
|
||||
to_stat.st_ino == curr->fts_statp->st_ino) {
|
||||
warnx("%s and %s are identical (not copied).",
|
||||
to.p_path, curr->fts_path);
|
||||
badcp = rval = 1;
|
||||
rval = 1;
|
||||
if (S_ISDIR(curr->fts_statp->st_mode))
|
||||
(void)fts_set(ftsp, curr, FTS_SKIP);
|
||||
continue;
|
||||
@@ -347,7 +342,7 @@ copy(argv, type, fts_options)
|
||||
S_ISDIR(to_stat.st_mode)) {
|
||||
warnx("cannot overwrite directory %s with non-directory %s",
|
||||
to.p_path, curr->fts_path);
|
||||
badcp = rval = 1;
|
||||
rval = 1;
|
||||
continue;
|
||||
}
|
||||
dne = 0;
|
||||
@@ -356,14 +351,14 @@ copy(argv, type, fts_options)
|
||||
switch (curr->fts_statp->st_mode & S_IFMT) {
|
||||
case S_IFLNK:
|
||||
if (copy_link(curr, !dne))
|
||||
badcp = rval = 1;
|
||||
rval = 1;
|
||||
break;
|
||||
case S_IFDIR:
|
||||
if (!Rflag && !rflag) {
|
||||
warnx("%s is a directory (not copied).",
|
||||
curr->fts_path);
|
||||
(void)fts_set(ftsp, curr, FTS_SKIP);
|
||||
badcp = rval = 1;
|
||||
rval = 1;
|
||||
break;
|
||||
}
|
||||
/*
|
||||
@@ -389,7 +384,7 @@ copy(argv, type, fts_options)
|
||||
* forever.
|
||||
*/
|
||||
if (pflag && setfile(curr->fts_statp, 0))
|
||||
badcp = rval = 1;
|
||||
rval = 1;
|
||||
else if (dne)
|
||||
(void)chmod(to.p_path,
|
||||
curr->fts_statp->st_mode);
|
||||
@@ -398,28 +393,26 @@ copy(argv, type, fts_options)
|
||||
case S_IFCHR:
|
||||
if (Rflag) {
|
||||
if (copy_special(curr->fts_statp, !dne))
|
||||
badcp = rval = 1;
|
||||
rval = 1;
|
||||
} else {
|
||||
if (copy_file(curr, dne))
|
||||
badcp = rval = 1;
|
||||
rval = 1;
|
||||
}
|
||||
break;
|
||||
case S_IFIFO:
|
||||
if (Rflag) {
|
||||
if (copy_fifo(curr->fts_statp, !dne))
|
||||
badcp = rval = 1;
|
||||
rval = 1;
|
||||
} else {
|
||||
if (copy_file(curr, dne))
|
||||
badcp = rval = 1;
|
||||
rval = 1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (copy_file(curr, dne))
|
||||
badcp = rval = 1;
|
||||
rval = 1;
|
||||
break;
|
||||
}
|
||||
if (vflag && !badcp)
|
||||
(void)printf("%s -> %s\n", curr->fts_path, to.p_path);
|
||||
}
|
||||
if (errno)
|
||||
err(1, "fts_read");
|
||||
|
||||
+4
-7
@@ -50,7 +50,6 @@ static const char rcsid[] =
|
||||
#include <fcntl.h>
|
||||
#include <fts.h>
|
||||
#include <stdio.h>
|
||||
#include <sysexits.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "extern.h"
|
||||
@@ -184,7 +183,7 @@ copy_file(entp, dne)
|
||||
*/
|
||||
#define RETAINBITS \
|
||||
(S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO)
|
||||
else if (fs->st_mode & (S_ISUID | S_ISGID) && fs->st_uid == myuid) {
|
||||
else if (fs->st_mode & (S_ISUID | S_ISGID) && fs->st_uid == myuid)
|
||||
if (fstat(to_fd, &to_stat)) {
|
||||
warn("%s", to.p_path);
|
||||
rval = 1;
|
||||
@@ -193,7 +192,6 @@ copy_file(entp, dne)
|
||||
warn("%s", to.p_path);
|
||||
rval = 1;
|
||||
}
|
||||
}
|
||||
(void)close(from_fd);
|
||||
if (close(to_fd)) {
|
||||
warn("%s", to.p_path);
|
||||
@@ -321,9 +319,8 @@ setfile(fs, fd)
|
||||
void
|
||||
usage()
|
||||
{
|
||||
|
||||
(void)fprintf(stderr, "%s\n%s\n",
|
||||
"usage: cp [-R [-H | -L | -P]] [-f | -i] [-pv] src target",
|
||||
" cp [-R [-H | -L | -P]] [-f | -i] [-pv] src1 ... srcN directory");
|
||||
exit(EX_USAGE);
|
||||
"usage: cp [-R [-H | -L | -P]] [-f | -i] [-p] src target",
|
||||
" cp [-R [-H | -L | -P]] [-f | -i] [-p] src1 ... srcN directory");
|
||||
exit(1);
|
||||
}
|
||||
+4
-4
@@ -15,10 +15,10 @@ SRCS= alloc.c char.c const.c csh.c dir.c dol.c err.c exec.c exp.c file.c \
|
||||
.PATH: ${.CURDIR}/../../usr.bin/printf
|
||||
|
||||
MAN1= csh.1
|
||||
# MLINKS for Shell built in commands for which there are no userland
|
||||
# utilities of the same name are handled with the associated manpage,
|
||||
# builtin.1 in share/man/man1/.
|
||||
|
||||
MLINKS= csh.1 limit.1 csh.1 alias.1 csh.1 bg.1 csh.1 dirs.1 csh.1 fg.1 \
|
||||
csh.1 foreach.1 csh.1 history.1 csh.1 jobs.1 csh.1 popd.1 \
|
||||
csh.1 pushd.1 csh.1 rehash.1 csh.1 repeat.1 csh.1 suspend.1 \
|
||||
csh.1 stop.1 csh.1 source.1
|
||||
CLEANFILES+=const.h errnum.h
|
||||
|
||||
const.h: errnum.h
|
||||
|
||||
@@ -875,8 +875,7 @@ to remind you which command is being continued, and cause the command
|
||||
to resume execution. Unless any input files in use by the suspended
|
||||
command have been changed in the meantime, the suspension has no effect
|
||||
whatsoever on the execution of the command. This feature can be very useful
|
||||
during editing, when you need to look at another file before continuing.
|
||||
An
|
||||
during editing, when you need to look at another file before continuing. An
|
||||
example of command suspension follows.
|
||||
.DS
|
||||
% mail harold
|
||||
@@ -904,8 +903,7 @@ suspended, it typed `Stopped' and prompted for a new command. Then the
|
||||
.I ls
|
||||
command was typed to find out the name of the file. The
|
||||
.I jobs
|
||||
command was run to find out which command was suspended.
|
||||
At this time the
|
||||
command was run to find out which command was suspended. At this time the
|
||||
.I fg
|
||||
command was typed to continue execution of the mail program. Input
|
||||
to the mail program was then continued and ended with a ^D
|
||||
|
||||
@@ -678,8 +678,7 @@ the same until the job terminates and then are re-used.
|
||||
.PP
|
||||
When a job is started in the backgound using `&', its number, as well
|
||||
as the process numbers of all its (top level) commands, is typed by the shell
|
||||
before prompting you for another command.
|
||||
For example,
|
||||
before prompting you for another command. For example,
|
||||
.DS
|
||||
% ls \-s | sort \-n > usage &
|
||||
[2] 2034 2035
|
||||
|
||||
@@ -224,8 +224,7 @@ is quite special and is replaced by the next line of input read from
|
||||
the shell's standard input (not the script it is reading). This is
|
||||
useful for writing shell scripts that are interactive, reading
|
||||
commands from the terminal, or even writing a shell script that
|
||||
acts as a filter, reading lines from its input file.
|
||||
Thus the sequence
|
||||
acts as a filter, reading lines from its input file. Thus the sequence
|
||||
.DS
|
||||
echo 'yes or no?\ec'
|
||||
set a=($<)
|
||||
|
||||
+19
-33
@@ -55,11 +55,10 @@ job control facilities (see
|
||||
interactive file name
|
||||
and user name completion (see
|
||||
.Sx File Name Completion ) ,
|
||||
and a C-like syntax.
|
||||
It is used both as an interactive login shell and
|
||||
a shell script command processor.
|
||||
and a C-like syntax. It is used both as an interactive
|
||||
login shell and a shell script command processor.
|
||||
.Ss Argument list processing
|
||||
If the shell is executed with a program name starting with
|
||||
If the first argument (argument 0) to the shell is
|
||||
.Ql Fl \& ,
|
||||
then this is a login shell.
|
||||
A login shell also can be specified by invoking the shell with the
|
||||
@@ -132,11 +131,12 @@ variable to be set even before
|
||||
.Pa .cshrc
|
||||
is executed.
|
||||
.It Fl X
|
||||
Cause the
|
||||
.Ar echo
|
||||
variable to be set even before
|
||||
.Pa .cshrc
|
||||
is executed.
|
||||
Is to
|
||||
.Fl x
|
||||
as
|
||||
.Fl V
|
||||
is to
|
||||
.Fl v .
|
||||
.El
|
||||
.Pp
|
||||
After processing of flag arguments, if arguments remain but none of the
|
||||
@@ -236,9 +236,8 @@ may be a component of a pipeline, etc.).
|
||||
It is also possible to separate pipelines with `\&|\&|' or `&&' showing,
|
||||
as in the C language,
|
||||
that the second is to be executed only if the first fails or succeeds
|
||||
respectively.
|
||||
See
|
||||
.Sx Expressions .
|
||||
respectively. (See
|
||||
.Em Expressions . )
|
||||
.Ss Jobs
|
||||
The shell associates a
|
||||
.Ar job
|
||||
@@ -318,15 +317,12 @@ The job control mechanism requires that the
|
||||
.Xr stty 1
|
||||
option
|
||||
.Ic new
|
||||
be set.
|
||||
It is an artifact from a
|
||||
be set. It is an artifact from a
|
||||
.Em new
|
||||
implementation
|
||||
of the
|
||||
tty driver that allows generation of interrupt characters from
|
||||
the keyboard to tell jobs to stop. See
|
||||
.Xr stty 1
|
||||
for details
|
||||
the keyboard to tell jobs to stop. See stty(1) for details
|
||||
on setting options in the new tty driver.
|
||||
.Ss Status reporting
|
||||
This shell learns immediately whenever a process changes state.
|
||||
@@ -570,8 +566,8 @@ Repeat the previous substitution.
|
||||
Apply the change once on each word, prefixing the above, e.g., `g&'.
|
||||
.It a
|
||||
Apply the change as many times as possible on a single word, prefixing
|
||||
the above.
|
||||
It can be used together with `g' to apply a substitution globally.
|
||||
the above. It can be used together with `g' to apply a substitution
|
||||
globally.
|
||||
.It p
|
||||
Print the new command line but do not execute it.
|
||||
.It q
|
||||
@@ -1491,7 +1487,7 @@ entry in the stack.
|
||||
The members of the directory stack are numbered from the top starting at 0.
|
||||
.Pp
|
||||
.It Ic printf Ar format-string values
|
||||
Invokes a builtin version of
|
||||
Invokes a built-in version of
|
||||
.Ic printf
|
||||
after evaluating the
|
||||
.Ar format-string
|
||||
@@ -2138,18 +2134,9 @@ To detect looping, the shell restricts the number of
|
||||
.Ic alias
|
||||
substitutions on a single line to 20.
|
||||
.Sh SEE ALSO
|
||||
.Xr builtin 1 ,
|
||||
.Xr echo 1 ,
|
||||
.Xr kill 1 ,
|
||||
.Xr login 1 ,
|
||||
.Xr nice 1 ,
|
||||
.Xr nohup 1 ,
|
||||
.Xr printenv 1 ,
|
||||
.Xr printf 1 ,
|
||||
.Xr sh 1 ,
|
||||
.Xr su 1 ,
|
||||
.Xr time 1 ,
|
||||
.Xr which 1 ,
|
||||
.Xr access 2 ,
|
||||
.Xr execve 2 ,
|
||||
.Xr fork 2 ,
|
||||
@@ -2162,9 +2149,8 @@ substitutions on a single line to 20.
|
||||
.Xr tty 4 ,
|
||||
.Xr a.out 5 ,
|
||||
.Xr environ 7
|
||||
.Rs
|
||||
.%T "An introduction to the C shell"
|
||||
.Re
|
||||
.br
|
||||
.Em An introduction to the C shell
|
||||
.Sh HISTORY
|
||||
.Nm Csh
|
||||
appeared in
|
||||
@@ -2208,7 +2194,7 @@ shell procedures should be provided instead of aliases.
|
||||
Commands within loops, prompted for by `?', are not placed on the
|
||||
.Ic history
|
||||
list.
|
||||
Control structure should be parsed instead of being recognized as builtin
|
||||
Control structure should be parsed instead of being recognized as built-in
|
||||
commands. This would allow control commands to be placed anywhere,
|
||||
to be combined with `\&|', and to be used with `&' and `;' metasyntax.
|
||||
.Pp
|
||||
|
||||
+5
-13
@@ -40,7 +40,6 @@ static const char rcsid[] =
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
@@ -851,20 +850,13 @@ heredoc(term)
|
||||
Char **vp;
|
||||
bool quoted;
|
||||
char *tmp;
|
||||
struct timeval tv;
|
||||
|
||||
again:
|
||||
tmp = short2str(shtemp);
|
||||
if (open(tmp, O_RDWR|O_CREAT|O_TRUNC|O_EXCL, 0600) < 0) {
|
||||
if (creat(tmp = short2str(shtemp), 0600) < 0)
|
||||
stderror(ERR_SYSTEM, tmp, strerror(errno));
|
||||
(void) close(0);
|
||||
if (open(tmp, O_RDWR) < 0) {
|
||||
int oerrno = errno;
|
||||
if (errno == EEXIST) {
|
||||
if (unlink(tmp) == -1) {
|
||||
(void) gettimeofday(&tv, NULL);
|
||||
shtemp = Strspl(STRtmpsh, putn((((int)tv.tv_sec) ^
|
||||
((int)tv.tv_usec) ^ ((int)getpid())) & 0x00ffffff));
|
||||
}
|
||||
goto again;
|
||||
}
|
||||
|
||||
(void) unlink(tmp);
|
||||
errno = oerrno;
|
||||
stderror(ERR_SYSTEM, tmp, strerror(errno));
|
||||
|
||||
+5
-35
@@ -49,7 +49,7 @@
|
||||
.Op Fl t Ar minutes_west
|
||||
.Op Fl v Ns Ar [+|-]val Ns Op ymwdHMS
|
||||
.Ar ...
|
||||
.Op Fl f Ar fmt Ar date | [[[[[cc]yy]mm]dd]HH]MM[\&.ss]
|
||||
.Op Fl f Ar fmt Ar date | [[[[yy]mm]dd]HH]MM[\&.ss]
|
||||
.Op Cm + Ns Ar format
|
||||
.Sh DESCRIPTION
|
||||
.Nm Date
|
||||
@@ -74,7 +74,7 @@ Use
|
||||
.Ar fmt
|
||||
as the format string to parse the date provided rather than using
|
||||
the default
|
||||
.Ar [[[[[cc]yy]mm]dd]HH]MM[.ss]
|
||||
.Ar [[[[yy]mm]dd]HH]MM[.ss]
|
||||
format. Parsing is done using
|
||||
.Xr strptime 3 .
|
||||
.It Fl n
|
||||
@@ -92,14 +92,9 @@ option stops
|
||||
.Nm
|
||||
from setting the time for other than the current machine.
|
||||
.It Fl r
|
||||
Print out the date and time that is
|
||||
Print out the date and time in
|
||||
.Ar seconds
|
||||
from the Epoch
|
||||
.Po
|
||||
00:00:00 UTC, January 1, 1970;
|
||||
see
|
||||
.Xr time 3
|
||||
.Pc .
|
||||
from the Epoch.
|
||||
.It Fl t
|
||||
Set the kernel's value for minutes west of
|
||||
.Tn GMT .
|
||||
@@ -122,9 +117,7 @@ or backwards according to the remaining string, otherwise the relevant
|
||||
part of the date is set. The date can be adjusted as many times as
|
||||
required using these flags. Flags are processed in the order given.
|
||||
.Pp
|
||||
When setting values
|
||||
.Pq rather than adjusting them ,
|
||||
seconds are in the range 0-59, minutes are in the range 0-59, hours are
|
||||
Seconds are in the range 0-59, minutes are in the range 0-59, hours are
|
||||
in the range 1-12, month days are in the range 1-31, week days are in the
|
||||
range 0-6 (Sun-Sat), months are in the range 1-12 (Jan-Dec) and years are
|
||||
in the range 80-38 or 1980-2038.
|
||||
@@ -148,27 +141,6 @@ will be put forwards (or backwards) to the next (previous) date that
|
||||
matches the given week day or month. This will not adjust the date
|
||||
if the given week day or month is the same as the current one.
|
||||
.Pp
|
||||
When a date is adjusted to a specific value or in units greater than hours,
|
||||
daylight savings time considerations are ignored.
|
||||
Adjustments in units of hours or less honour daylight savings time.
|
||||
So, assuming the current date is March 26, 0:30 and that the DST adjustment
|
||||
means that the clock goes forward at 01:00 to 02:00, using
|
||||
.Fl v No +1H
|
||||
will adjust the date to March 26, 2:30.
|
||||
Likewise, if the date is October 29, 0:30 and the DST adjustment means that
|
||||
the clock goes back at 02:00 to 01:00, using
|
||||
.Fl v No +3H
|
||||
will be necessary to reach October 20, 2:30.
|
||||
.Pp
|
||||
When the date is adjusted to a specific value that doesn't actually exist
|
||||
.Pq for example March 26, 1:30 BST 2000 ,
|
||||
the date will be silently adjusted forwards in units of one hour until it
|
||||
reaches a valid time.
|
||||
When the date is adjusted to a specific value that occurs twice
|
||||
.Pq for example October 29, 1:30 2000 ,
|
||||
the resulting timezone will be set so that the date matches the earlier of
|
||||
the two times.
|
||||
.Pp
|
||||
Refer to the examples below for further details.
|
||||
.El
|
||||
.Pp
|
||||
@@ -190,8 +162,6 @@ a value for setting the system's notion of the current date and time.
|
||||
The canonical representation for setting the date and time is:
|
||||
.Pp
|
||||
.Bl -tag -width Ds -compact -offset indent
|
||||
.It Ar cc
|
||||
Century (either 19 or 20) prepended to the abbreviated year.
|
||||
.It Ar yy
|
||||
Year in abbreviated form (e.g. 89 for 1989, 06 for 2006).
|
||||
.It Ar mm
|
||||
|
||||
+2
-10
@@ -170,8 +170,6 @@ main(argc, argv)
|
||||
}
|
||||
|
||||
#define ATOI2(ar) ((ar)[0] - '0') * 10 + ((ar)[1] - '0'); (ar) += 2;
|
||||
#define ATOI4(ar) ((ar)[0] - '0') * 1000 + ((ar)[1] - '0') * 100 + \
|
||||
((ar)[2] - '0') * 10 + ((ar)[3] - '0'); (ar) += 4;
|
||||
void
|
||||
setthetime(fmt, p)
|
||||
const char *fmt;
|
||||
@@ -217,16 +215,11 @@ setthetime(fmt, p)
|
||||
|
||||
/* if p has a ".ss" field then let's pretend it's not there */
|
||||
switch (strlen(p) - ((dot != NULL) ? 3 : 0)) {
|
||||
case 12: /* cc */
|
||||
lt->tm_year = -1900 + ATOI4(p);
|
||||
if (lt->tm_year < 0)
|
||||
badformat();
|
||||
goto year_done;
|
||||
case 10: /* yy */
|
||||
lt->tm_year = ATOI2(p);
|
||||
if (lt->tm_year < 69) /* hack for 2000 ;-} */
|
||||
lt->tm_year += 100;
|
||||
year_done: /* FALLTHROUGH */
|
||||
/* FALLTHROUGH */
|
||||
case 8: /* mm */
|
||||
lt->tm_mon = ATOI2(p);
|
||||
if (lt->tm_mon > 12)
|
||||
@@ -285,7 +278,6 @@ usage()
|
||||
(void)fprintf(stderr, "%s\n%s\n",
|
||||
"usage: date [-nu] [-d dst] [-r seconds] [-t west] "
|
||||
"[-v[+|-]val[ymwdHMS]] ... ",
|
||||
" "
|
||||
"[-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]");
|
||||
" [-f fmt date | [[[[yy]mm]dd]HH]MM[.ss]] [+format]");
|
||||
exit(1);
|
||||
}
|
||||
+88
-131
@@ -41,8 +41,8 @@ struct trans {
|
||||
|
||||
static struct trans trans_mon[] = {
|
||||
{ 1, "january" }, { 2, "february" }, { 3, "march" }, { 4, "april" },
|
||||
{ 5, "may"}, { 6, "june" }, { 7, "july" }, { 8, "august" },
|
||||
{ 9, "september" }, { 10, "october" }, { 11, "november" }, { 12, "december" },
|
||||
{ 6, "june" }, { 7, "july" }, { 8, "august" }, { 9, "september" },
|
||||
{ 10, "october" }, { 11, "november" }, { 12, "december" },
|
||||
{ -1, NULL }
|
||||
};
|
||||
|
||||
@@ -53,19 +53,6 @@ static struct trans trans_wday[] = {
|
||||
};
|
||||
|
||||
static char digits[] = "0123456789";
|
||||
static int adjhour(struct tm *, char, int, int);
|
||||
|
||||
static int
|
||||
domktime(struct tm *t, char type)
|
||||
{
|
||||
time_t ret;
|
||||
|
||||
while ((ret = mktime(t)) == -1 && t->tm_year > 68 && t->tm_year < 138)
|
||||
/* While mktime() fails, adjust by an hour */
|
||||
adjhour(t, type == '-' ? type : '+', 1, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
trans(const struct trans t[], const char *arg)
|
||||
@@ -125,7 +112,7 @@ daysinmonth(const struct tm *t)
|
||||
|
||||
|
||||
static int
|
||||
adjyear(struct tm *t, char type, int val, int mk)
|
||||
adjyear(struct tm *t, char type, int val)
|
||||
{
|
||||
switch (type) {
|
||||
case '+':
|
||||
@@ -142,51 +129,45 @@ adjyear(struct tm *t, char type, int val, int mk)
|
||||
t->tm_year -= 1900; /* struct tm holds years since 1900 */
|
||||
break;
|
||||
}
|
||||
return !mk || domktime(t, type) != -1;
|
||||
return mktime(t) != -1;
|
||||
}
|
||||
|
||||
static int
|
||||
adjmon(struct tm *t, char type, int val, int istext, int mk)
|
||||
adjmon(struct tm *t, char type, int val, int istext)
|
||||
{
|
||||
if (val < 0)
|
||||
return 0;
|
||||
|
||||
switch (type) {
|
||||
case '+':
|
||||
if (istext) {
|
||||
if (istext)
|
||||
if (val <= t->tm_mon)
|
||||
val += 11 - t->tm_mon; /* early next year */
|
||||
else
|
||||
val -= t->tm_mon + 1; /* later this year */
|
||||
}
|
||||
if (val) {
|
||||
if (!adjyear(t, '+', (t->tm_mon + val) / 12, 0))
|
||||
return 0;
|
||||
val %= 12;
|
||||
t->tm_mon += val;
|
||||
if (t->tm_mon > 11)
|
||||
t->tm_mon -= 12;
|
||||
}
|
||||
if (!adjyear(t, '+', (t->tm_mon + val) / 12))
|
||||
return 0;
|
||||
val %= 12;
|
||||
t->tm_mon += val;
|
||||
if (t->tm_mon > 11)
|
||||
t->tm_mon -= 12;
|
||||
break;
|
||||
|
||||
case '-':
|
||||
if (istext) {
|
||||
if (istext)
|
||||
if (val-1 > t->tm_mon)
|
||||
val = 13 - val + t->tm_mon; /* later last year */
|
||||
else
|
||||
val = t->tm_mon - val + 1; /* early this year */
|
||||
}
|
||||
if (val) {
|
||||
if (!adjyear(t, '-', val / 12, 0))
|
||||
if (!adjyear(t, '-', val / 12))
|
||||
return 0;
|
||||
val %= 12;
|
||||
if (val > t->tm_mon) {
|
||||
if (!adjyear(t, '-', 1))
|
||||
return 0;
|
||||
val %= 12;
|
||||
if (val > t->tm_mon) {
|
||||
if (!adjyear(t, '-', 1, 0))
|
||||
return 0;
|
||||
val -= 12;
|
||||
}
|
||||
t->tm_mon -= val;
|
||||
val -= 12;
|
||||
}
|
||||
t->tm_mon -= val;
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -195,14 +176,13 @@ adjmon(struct tm *t, char type, int val, int istext, int mk)
|
||||
t->tm_mon = --val;
|
||||
}
|
||||
|
||||
return !mk || domktime(t, type) != -1;
|
||||
return mktime(t) != -1;
|
||||
}
|
||||
|
||||
static int
|
||||
adjday(struct tm *t, char type, int val, int mk)
|
||||
adjday(struct tm *t, char type, int val)
|
||||
{
|
||||
int mdays;
|
||||
|
||||
switch (type) {
|
||||
case '+':
|
||||
while (val) {
|
||||
@@ -210,7 +190,7 @@ adjday(struct tm *t, char type, int val, int mk)
|
||||
if (val > mdays - t->tm_mday) {
|
||||
val -= mdays - t->tm_mday + 1;
|
||||
t->tm_mday = 1;
|
||||
if (!adjmon(t, '+', 1, 0, 0))
|
||||
if (!adjmon(t, '+', 1, 0))
|
||||
return 0;
|
||||
} else {
|
||||
t->tm_mday += val;
|
||||
@@ -223,7 +203,7 @@ adjday(struct tm *t, char type, int val, int mk)
|
||||
if (val >= t->tm_mday) {
|
||||
val -= t->tm_mday;
|
||||
t->tm_mday = 1;
|
||||
if (!adjmon(t, '-', 1, 0, 0))
|
||||
if (!adjmon(t, '-', 1, 0))
|
||||
return 0;
|
||||
t->tm_mday = daysinmonth(t);
|
||||
} else {
|
||||
@@ -239,11 +219,11 @@ adjday(struct tm *t, char type, int val, int mk)
|
||||
break;
|
||||
}
|
||||
|
||||
return !mk || domktime(t, type) != -1;
|
||||
return mktime(t) != -1;
|
||||
}
|
||||
|
||||
static int
|
||||
adjwday(struct tm *t, char type, int val, int istext, int mk)
|
||||
adjwday(struct tm *t, char type, int val, int istext)
|
||||
{
|
||||
if (val < 0)
|
||||
return 0;
|
||||
@@ -256,62 +236,54 @@ adjwday(struct tm *t, char type, int val, int istext, int mk)
|
||||
else
|
||||
val -= t->tm_wday; /* later this week */
|
||||
else
|
||||
val *= 7; /* "-v+5w" == "5 weeks in the future" */
|
||||
return !val || adjday(t, '+', val, mk);
|
||||
val *= 7; /* "-W +5" == "5 weeks in the future" */
|
||||
return adjday(t, '+', val);
|
||||
case '-':
|
||||
if (istext) {
|
||||
if (istext)
|
||||
if (val > t->tm_wday)
|
||||
val = 7 - val + t->tm_wday; /* later last week */
|
||||
else
|
||||
val = t->tm_wday - val; /* early this week */
|
||||
} else
|
||||
val *= 7; /* "-v-5w" == "5 weeks ago" */
|
||||
return !val || adjday(t, '-', val, mk);
|
||||
else
|
||||
val *= 7; /* "-W -5" == "5 weeks ago" */
|
||||
return adjday(t, '-', val);
|
||||
default:
|
||||
if (val < t->tm_wday)
|
||||
return adjday(t, '-', t->tm_wday - val, mk);
|
||||
return adjday(t, '-', t->tm_wday - val);
|
||||
else if (val > 6)
|
||||
return 0;
|
||||
else if (val > t->tm_wday)
|
||||
return adjday(t, '+', val - t->tm_wday, mk);
|
||||
return adjday(t, '+', val - t->tm_wday);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
adjhour(struct tm *t, char type, int val, int mk)
|
||||
adjhour(struct tm *t, char type, int val)
|
||||
{
|
||||
if (val < 0)
|
||||
return 0;
|
||||
|
||||
switch (type) {
|
||||
case '+':
|
||||
if (val) {
|
||||
int days;
|
||||
|
||||
days = (t->tm_hour + val) / 24;
|
||||
val %= 24;
|
||||
t->tm_hour += val;
|
||||
t->tm_hour %= 24;
|
||||
if (!adjday(t, '+', days, 0))
|
||||
return 0;
|
||||
}
|
||||
if (!adjday(t, '+', (t->tm_hour + val) / 24))
|
||||
return 0;
|
||||
val %= 24;
|
||||
t->tm_hour += val;
|
||||
if (t->tm_hour > 23)
|
||||
t->tm_hour -= 24;
|
||||
break;
|
||||
|
||||
case '-':
|
||||
if (val) {
|
||||
int days;
|
||||
|
||||
days = val / 24;
|
||||
val %= 24;
|
||||
if (val > t->tm_hour) {
|
||||
days++;
|
||||
val -= 24;
|
||||
}
|
||||
t->tm_hour -= val;
|
||||
if (!adjday(t, '-', days, 0))
|
||||
if (!adjday(t, '-', val / 24))
|
||||
return 0;
|
||||
val %= 24;
|
||||
if (val > t->tm_hour) {
|
||||
if (!adjday(t, '-', 1))
|
||||
return 0;
|
||||
val -= 24;
|
||||
}
|
||||
t->tm_hour -= val;
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -320,39 +292,35 @@ adjhour(struct tm *t, char type, int val, int mk)
|
||||
t->tm_hour = val;
|
||||
}
|
||||
|
||||
return !mk || domktime(t, type) != -1;
|
||||
return mktime(t) != -1;
|
||||
}
|
||||
|
||||
static int
|
||||
adjmin(struct tm *t, char type, int val, int mk)
|
||||
adjmin(struct tm *t, char type, int val)
|
||||
{
|
||||
if (val < 0)
|
||||
return 0;
|
||||
|
||||
switch (type) {
|
||||
case '+':
|
||||
if (val) {
|
||||
if (!adjhour(t, '+', (t->tm_min + val) / 60, 0))
|
||||
return 0;
|
||||
val %= 60;
|
||||
t->tm_min += val;
|
||||
if (t->tm_min > 59)
|
||||
t->tm_min -= 60;
|
||||
}
|
||||
if (!adjhour(t, '+', (t->tm_min + val) / 60))
|
||||
return 0;
|
||||
val %= 60;
|
||||
t->tm_min += val;
|
||||
if (t->tm_min > 59)
|
||||
t->tm_min -= 60;
|
||||
break;
|
||||
|
||||
case '-':
|
||||
if (val) {
|
||||
if (!adjhour(t, '-', val / 60, 0))
|
||||
if (!adjhour(t, '-', val / 60))
|
||||
return 0;
|
||||
val %= 60;
|
||||
if (val > t->tm_min) {
|
||||
if (!adjhour(t, '-', 1))
|
||||
return 0;
|
||||
val %= 60;
|
||||
if (val > t->tm_min) {
|
||||
if (!adjhour(t, '-', 1, 0))
|
||||
return 0;
|
||||
val -= 60;
|
||||
}
|
||||
t->tm_min -= val;
|
||||
val -= 60;
|
||||
}
|
||||
t->tm_min -= val;
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -361,39 +329,35 @@ adjmin(struct tm *t, char type, int val, int mk)
|
||||
t->tm_min = val;
|
||||
}
|
||||
|
||||
return !mk || domktime(t, type) != -1;
|
||||
return mktime(t) != -1;
|
||||
}
|
||||
|
||||
static int
|
||||
adjsec(struct tm *t, char type, int val, int mk)
|
||||
adjsec(struct tm *t, char type, int val)
|
||||
{
|
||||
if (val < 0)
|
||||
return 0;
|
||||
|
||||
switch (type) {
|
||||
case '+':
|
||||
if (val) {
|
||||
if (!adjmin(t, '+', (t->tm_sec + val) / 60, 0))
|
||||
return 0;
|
||||
val %= 60;
|
||||
t->tm_sec += val;
|
||||
if (t->tm_sec > 59)
|
||||
t->tm_sec -= 60;
|
||||
}
|
||||
if (!adjmin(t, '+', (t->tm_sec + val) / 60))
|
||||
return 0;
|
||||
val %= 60;
|
||||
t->tm_sec += val;
|
||||
if (t->tm_sec > 59)
|
||||
t->tm_sec -= 60;
|
||||
break;
|
||||
|
||||
case '-':
|
||||
if (val) {
|
||||
if (!adjmin(t, '-', val / 60, 0))
|
||||
if (!adjmin(t, '-', val / 60))
|
||||
return 0;
|
||||
val %= 60;
|
||||
if (val > t->tm_sec) {
|
||||
if (!adjmin(t, '-', 1))
|
||||
return 0;
|
||||
val %= 60;
|
||||
if (val > t->tm_sec) {
|
||||
if (!adjmin(t, '-', 1, 0))
|
||||
return 0;
|
||||
val -= 60;
|
||||
}
|
||||
t->tm_sec -= val;
|
||||
val -= 60;
|
||||
}
|
||||
t->tm_sec -= val;
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -402,7 +366,7 @@ adjsec(struct tm *t, char type, int val, int mk)
|
||||
t->tm_sec = val;
|
||||
}
|
||||
|
||||
return !mk || domktime(t, type) != -1;
|
||||
return mktime(t) != -1;
|
||||
}
|
||||
|
||||
const struct vary *
|
||||
@@ -425,18 +389,15 @@ vary_apply(const struct vary *v, struct tm *t)
|
||||
if (len < 2)
|
||||
return v;
|
||||
|
||||
if (type == '\0')
|
||||
t->tm_isdst = -1;
|
||||
|
||||
if (strspn(arg, digits) != len-1) {
|
||||
val = trans(trans_wday, arg);
|
||||
if (val != -1) {
|
||||
if (!adjwday(t, type, val, 1, 1))
|
||||
if (!adjwday(t, type, val, 1))
|
||||
return v;
|
||||
} else {
|
||||
val = trans(trans_mon, arg);
|
||||
if (val != -1) {
|
||||
if (!adjmon(t, type, val, 1, 1))
|
||||
if (!adjmon(t, type, val, 1))
|
||||
return v;
|
||||
} else
|
||||
return v;
|
||||
@@ -447,35 +408,31 @@ vary_apply(const struct vary *v, struct tm *t)
|
||||
|
||||
switch (which) {
|
||||
case 'S':
|
||||
if (!adjsec(t, type, val, 1))
|
||||
if (!adjsec(t, type, val))
|
||||
return v;
|
||||
break;
|
||||
case 'M':
|
||||
if (!adjmin(t, type, val, 1))
|
||||
if (!adjmin(t, type, val))
|
||||
return v;
|
||||
break;
|
||||
case 'H':
|
||||
if (!adjhour(t, type, val, 1))
|
||||
if (!adjhour(t, type, val))
|
||||
return v;
|
||||
break;
|
||||
case 'd':
|
||||
t->tm_isdst = -1;
|
||||
if (!adjday(t, type, val, 1))
|
||||
if (!adjday(t, type, val))
|
||||
return v;
|
||||
break;
|
||||
case 'w':
|
||||
t->tm_isdst = -1;
|
||||
if (!adjwday(t, type, val, 0, 1))
|
||||
if (!adjwday(t, type, val, 0))
|
||||
return v;
|
||||
break;
|
||||
case 'm':
|
||||
t->tm_isdst = -1;
|
||||
if (!adjmon(t, type, val, 0, 1))
|
||||
if (!adjmon(t, type, val, 0))
|
||||
return v;
|
||||
break;
|
||||
case 'y':
|
||||
t->tm_isdst = -1;
|
||||
if (!adjyear(t, type, val, 1))
|
||||
if (!adjyear(t, type, val))
|
||||
return v;
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -4,6 +4,4 @@
|
||||
PROG= dd
|
||||
SRCS= args.c conv.c conv_tab.c dd.c misc.c position.c
|
||||
|
||||
MAINTAINER= [email protected]
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
+57
-96
@@ -67,11 +67,10 @@ static void f_obs __P((char *));
|
||||
static void f_of __P((char *));
|
||||
static void f_seek __P((char *));
|
||||
static void f_skip __P((char *));
|
||||
static quad_t get_num __P((char *));
|
||||
static off_t get_offset __P((char *));
|
||||
static u_long get_bsz __P((char *));
|
||||
|
||||
static const struct arg {
|
||||
const char *name;
|
||||
static struct arg {
|
||||
char *name;
|
||||
void (*f) __P((char *));
|
||||
u_int set, noset;
|
||||
} args[] = {
|
||||
@@ -142,14 +141,14 @@ jcl(argv)
|
||||
* Ascii/ebcdic and cbs implies block/unblock.
|
||||
* Block/unblock requires cbs and vice-versa.
|
||||
*/
|
||||
if (ddflags & (C_BLOCK | C_UNBLOCK)) {
|
||||
if (ddflags & (C_BLOCK|C_UNBLOCK)) {
|
||||
if (!(ddflags & C_CBS))
|
||||
errx(1, "record operations require cbs");
|
||||
if (cbsz == 0)
|
||||
errx(1, "cbs cannot be zero");
|
||||
cfunc = ddflags & C_BLOCK ? block : unblock;
|
||||
} else if (ddflags & C_CBS) {
|
||||
if (ddflags & (C_ASCII | C_EBCDIC)) {
|
||||
if (ddflags & (C_ASCII|C_EBCDIC)) {
|
||||
if (ddflags & C_ASCII) {
|
||||
ddflags |= C_UNBLOCK;
|
||||
cfunc = unblock;
|
||||
@@ -159,14 +158,23 @@ jcl(argv)
|
||||
}
|
||||
} else
|
||||
errx(1, "cbs meaningless if not doing record operations");
|
||||
if (cbsz == 0)
|
||||
errx(1, "cbs cannot be zero");
|
||||
} else
|
||||
cfunc = def;
|
||||
|
||||
if (in.dbsz == 0 || out.dbsz == 0)
|
||||
errx(1, "buffer sizes cannot be zero");
|
||||
|
||||
/*
|
||||
* Bail out if the calculation of a file offset would overflow.
|
||||
* Read, write and seek calls take ints as arguments. Seek sizes
|
||||
* could be larger if we wanted to do it in stages or check only
|
||||
* regular files, but it's probably not worth it.
|
||||
*/
|
||||
if (in.offset > QUAD_MAX / in.dbsz || out.offset > QUAD_MAX / out.dbsz)
|
||||
errx(1, "seek offsets cannot be larger than %qd", QUAD_MAX);
|
||||
if (in.dbsz > INT_MAX || out.dbsz > INT_MAX)
|
||||
errx(1, "buffer sizes cannot be greater than %d", INT_MAX);
|
||||
if (in.offset > INT_MAX / in.dbsz || out.offset > INT_MAX / out.dbsz)
|
||||
errx(1, "seek offsets cannot be larger than %d", INT_MAX);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -174,32 +182,23 @@ c_arg(a, b)
|
||||
const void *a, *b;
|
||||
{
|
||||
|
||||
return (strcmp(((const struct arg *)a)->name,
|
||||
((const struct arg *)b)->name));
|
||||
return (strcmp(((struct arg *)a)->name, ((struct arg *)b)->name));
|
||||
}
|
||||
|
||||
static void
|
||||
f_bs(arg)
|
||||
char *arg;
|
||||
{
|
||||
quad_t res;
|
||||
|
||||
res = get_num(arg);
|
||||
if (res < 1 || res > SSIZE_MAX)
|
||||
errx(1, "bs must be between 1 and %d", SSIZE_MAX);
|
||||
in.dbsz = out.dbsz = (size_t)res;
|
||||
in.dbsz = out.dbsz = (int)get_bsz(arg);
|
||||
}
|
||||
|
||||
static void
|
||||
f_cbs(arg)
|
||||
char *arg;
|
||||
{
|
||||
quad_t res;
|
||||
|
||||
res = get_num(arg);
|
||||
if (res < 1 || res > SSIZE_MAX)
|
||||
errx(1, "cbs must be between 1 and %d", SSIZE_MAX);
|
||||
cbsz = (size_t)res;
|
||||
cbsz = (int)get_bsz(arg);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -207,11 +206,9 @@ f_count(arg)
|
||||
char *arg;
|
||||
{
|
||||
|
||||
cpy_cnt = get_num(arg);
|
||||
if (cpy_cnt < 0)
|
||||
errx(1, "count cannot be negative");
|
||||
if (cpy_cnt == 0)
|
||||
cpy_cnt = -1;
|
||||
cpy_cnt = (u_int)get_bsz(arg);
|
||||
if (!cpy_cnt)
|
||||
terminate(0);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -219,23 +216,16 @@ f_files(arg)
|
||||
char *arg;
|
||||
{
|
||||
|
||||
files_cnt = get_num(arg);
|
||||
if (files_cnt < 1)
|
||||
errx(1, "files must be between 1 and %qd", QUAD_MAX);
|
||||
files_cnt = (int)get_bsz(arg);
|
||||
}
|
||||
|
||||
static void
|
||||
f_ibs(arg)
|
||||
char *arg;
|
||||
{
|
||||
quad_t res;
|
||||
|
||||
if (!(ddflags & C_BS)) {
|
||||
res = get_num(arg);
|
||||
if (res < 1 || res > SSIZE_MAX)
|
||||
errx(1, "ibs must be between 1 and %d", SSIZE_MAX);
|
||||
in.dbsz = (size_t)res;
|
||||
}
|
||||
if (!(ddflags & C_BS))
|
||||
in.dbsz = (int)get_bsz(arg);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -250,14 +240,9 @@ static void
|
||||
f_obs(arg)
|
||||
char *arg;
|
||||
{
|
||||
quad_t res;
|
||||
|
||||
if (!(ddflags & C_BS)) {
|
||||
res = get_num(arg);
|
||||
if (res < 1 || res > SSIZE_MAX)
|
||||
errx(1, "obs must be between 1 and %d", SSIZE_MAX);
|
||||
out.dbsz = (size_t)res;
|
||||
}
|
||||
if (!(ddflags & C_BS))
|
||||
out.dbsz = (int)get_bsz(arg);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -273,7 +258,7 @@ f_seek(arg)
|
||||
char *arg;
|
||||
{
|
||||
|
||||
out.offset = get_offset(arg);
|
||||
out.offset = (u_int)get_bsz(arg);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -281,13 +266,13 @@ f_skip(arg)
|
||||
char *arg;
|
||||
{
|
||||
|
||||
in.offset = get_offset(arg);
|
||||
in.offset = (u_int)get_bsz(arg);
|
||||
}
|
||||
|
||||
static const struct conv {
|
||||
const char *name;
|
||||
static struct conv {
|
||||
char *name;
|
||||
u_int set, noset;
|
||||
const u_char *ctab;
|
||||
u_char *ctab;
|
||||
} clist[] = {
|
||||
{ "ascii", C_ASCII, C_EBCDIC, e2a_POSIX },
|
||||
{ "block", C_BLOCK, C_UNBLOCK, NULL },
|
||||
@@ -315,9 +300,9 @@ f_conv(arg)
|
||||
|
||||
while (arg != NULL) {
|
||||
tmp.name = strsep(&arg, ",");
|
||||
cp = bsearch(&tmp, clist, sizeof(clist) / sizeof(struct conv),
|
||||
sizeof(struct conv), c_conv);
|
||||
if (cp == NULL)
|
||||
if (!(cp = (struct conv *)bsearch(&tmp, clist,
|
||||
sizeof(clist)/sizeof(struct conv), sizeof(struct conv),
|
||||
c_conv)))
|
||||
errx(1, "unknown conversion %s", tmp.name);
|
||||
if (ddflags & cp->noset)
|
||||
errx(1, "%s: illegal conversion combination", tmp.name);
|
||||
@@ -332,38 +317,34 @@ c_conv(a, b)
|
||||
const void *a, *b;
|
||||
{
|
||||
|
||||
return (strcmp(((const struct conv *)a)->name,
|
||||
((const struct conv *)b)->name));
|
||||
return (strcmp(((struct conv *)a)->name, ((struct conv *)b)->name));
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert an expression of the following forms to a quad_t.
|
||||
* Convert an expression of the following forms to an unsigned long.
|
||||
* 1) A positive decimal number.
|
||||
* 2) A positive decimal number followed by a b (mult by 512.)
|
||||
* 3) A positive decimal number followed by a k (mult by 1 << 10.)
|
||||
* 4) A positive decimal number followed by a m (mult by 1 << 20.)
|
||||
* 5) A positive decimal number followed by a g (mult by 1 << 30.)
|
||||
* 5) A positive decimal number followed by a w (mult by sizeof int.)
|
||||
* 6) Two or more positive decimal numbers (with/without [bkmgw])
|
||||
* 2) A positive decimal number followed by a b (mult by 512).
|
||||
* 3) A positive decimal number followed by a k (mult by 1024).
|
||||
* 4) A positive decimal number followed by a m (mult by 512).
|
||||
* 5) A positive decimal number followed by a w (mult by sizeof int)
|
||||
* 6) Two or more positive decimal numbers (with/without k,b or w).
|
||||
* separated by x (also * for backwards compatibility), specifying
|
||||
* the product of the indicated values.
|
||||
*/
|
||||
static quad_t
|
||||
get_num(val)
|
||||
static u_long
|
||||
get_bsz(val)
|
||||
char *val;
|
||||
{
|
||||
quad_t num, t;
|
||||
u_long num, t;
|
||||
char *expr;
|
||||
|
||||
errno = 0;
|
||||
num = strtoq(val, &expr, 0);
|
||||
if (errno != 0) /* Overflow or underflow. */
|
||||
num = strtoul(val, &expr, 0);
|
||||
if (num == ULONG_MAX) /* Overflow. */
|
||||
err(1, "%s", oper);
|
||||
|
||||
if (expr == val) /* No valid digits. */
|
||||
if (expr == val) /* No digits. */
|
||||
errx(1, "%s: illegal numeric value", oper);
|
||||
|
||||
switch (*expr) {
|
||||
switch(*expr) {
|
||||
case 'b':
|
||||
t = num;
|
||||
num *= 512;
|
||||
@@ -373,21 +354,14 @@ get_num(val)
|
||||
break;
|
||||
case 'k':
|
||||
t = num;
|
||||
num *= 1 << 10;
|
||||
num *= 1024;
|
||||
if (t > num)
|
||||
goto erange;
|
||||
++expr;
|
||||
break;
|
||||
case 'm':
|
||||
t = num;
|
||||
num *= 1 << 20;
|
||||
if (t > num)
|
||||
goto erange;
|
||||
++expr;
|
||||
break;
|
||||
case 'g':
|
||||
t = num;
|
||||
num *= 1 << 30;
|
||||
num *= 1048576;
|
||||
if (t > num)
|
||||
goto erange;
|
||||
++expr;
|
||||
@@ -401,31 +375,18 @@ get_num(val)
|
||||
break;
|
||||
}
|
||||
|
||||
switch (*expr) {
|
||||
switch(*expr) {
|
||||
case '\0':
|
||||
break;
|
||||
case '*': /* Backward compatible. */
|
||||
case 'x':
|
||||
t = num;
|
||||
num *= get_num(expr + 1);
|
||||
if (t <= num)
|
||||
break;
|
||||
erange:
|
||||
errx(1, "%s: %s", oper, strerror(ERANGE));
|
||||
num *= get_bsz(expr + 1);
|
||||
if (t > num)
|
||||
erange: errx(1, "%s: %s", oper, strerror(ERANGE));
|
||||
break;
|
||||
default:
|
||||
errx(1, "%s: illegal numeric value", oper);
|
||||
}
|
||||
return (num);
|
||||
}
|
||||
|
||||
static off_t
|
||||
get_offset(val)
|
||||
char *val;
|
||||
{
|
||||
quad_t num;
|
||||
|
||||
num = get_num(val);
|
||||
if (num > QUAD_MAX || num < 0) /* XXX quad_t != off_t */
|
||||
errx(1, "%s: illegal offset", oper); /* Too big/negative. */
|
||||
return ((off_t)num);
|
||||
}
|
||||
+24
-29
@@ -60,9 +60,8 @@ static const char rcsid[] =
|
||||
void
|
||||
def()
|
||||
{
|
||||
u_char *inp;
|
||||
const u_char *t;
|
||||
size_t cnt;
|
||||
int cnt;
|
||||
u_char *inp, *t;
|
||||
|
||||
if ((t = ctab) != NULL)
|
||||
for (inp = in.dbp - (cnt = in.dbrcnt); cnt--; ++inp)
|
||||
@@ -104,11 +103,9 @@ def_close()
|
||||
void
|
||||
block()
|
||||
{
|
||||
u_char *inp, *outp;
|
||||
const u_char *t;
|
||||
size_t cnt, maxlen;
|
||||
static int intrunc;
|
||||
int ch;
|
||||
int ch, cnt, maxlen;
|
||||
u_char *inp, *outp, *t;
|
||||
|
||||
/*
|
||||
* Record truncation can cross block boundaries. If currently in a
|
||||
@@ -117,8 +114,8 @@ block()
|
||||
* left empty.
|
||||
*/
|
||||
if (intrunc) {
|
||||
for (inp = in.db, cnt = in.dbrcnt; cnt && *inp++ != '\n'; --cnt)
|
||||
;
|
||||
for (inp = in.db, cnt = in.dbrcnt;
|
||||
cnt && *inp++ != '\n'; --cnt);
|
||||
if (!cnt) {
|
||||
in.dbcnt = 0;
|
||||
in.dbp = in.db;
|
||||
@@ -138,19 +135,19 @@ block()
|
||||
for (inp = in.dbp - in.dbcnt, outp = out.dbp; in.dbcnt;) {
|
||||
maxlen = MIN(cbsz, in.dbcnt);
|
||||
if ((t = ctab) != NULL)
|
||||
for (cnt = 0; cnt < maxlen && (ch = *inp++) != '\n';
|
||||
++cnt)
|
||||
for (cnt = 0;
|
||||
cnt < maxlen && (ch = *inp++) != '\n'; ++cnt)
|
||||
*outp++ = t[ch];
|
||||
else
|
||||
for (cnt = 0; cnt < maxlen && (ch = *inp++) != '\n';
|
||||
++cnt)
|
||||
for (cnt = 0;
|
||||
cnt < maxlen && (ch = *inp++) != '\n'; ++cnt)
|
||||
*outp++ = ch;
|
||||
/*
|
||||
* Check for short record without a newline. Reassemble the
|
||||
* input block.
|
||||
*/
|
||||
if (ch != '\n' && in.dbcnt < cbsz) {
|
||||
(void)memmove(in.db, in.dbp - in.dbcnt, in.dbcnt);
|
||||
memmove(in.db, in.dbp - in.dbcnt, in.dbcnt);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -200,9 +197,9 @@ block_close()
|
||||
*/
|
||||
if (in.dbcnt) {
|
||||
++st.trunc;
|
||||
(void)memmove(out.dbp, in.dbp - in.dbcnt, in.dbcnt);
|
||||
(void)memset(out.dbp + in.dbcnt, ctab ? ctab[' '] : ' ',
|
||||
cbsz - in.dbcnt);
|
||||
memmove(out.dbp, in.dbp - in.dbcnt, in.dbcnt);
|
||||
(void)memset(out.dbp + in.dbcnt,
|
||||
ctab ? ctab[' '] : ' ', cbsz - in.dbcnt);
|
||||
out.dbcnt += cbsz;
|
||||
}
|
||||
}
|
||||
@@ -217,9 +214,8 @@ block_close()
|
||||
void
|
||||
unblock()
|
||||
{
|
||||
u_char *inp;
|
||||
const u_char *t;
|
||||
size_t cnt;
|
||||
int cnt;
|
||||
u_char *inp, *t;
|
||||
|
||||
/* Translation and case conversion. */
|
||||
if ((t = ctab) != NULL)
|
||||
@@ -231,36 +227,35 @@ unblock()
|
||||
* spaces.
|
||||
*/
|
||||
for (inp = in.db; in.dbcnt >= cbsz; inp += cbsz, in.dbcnt -= cbsz) {
|
||||
for (t = inp + cbsz - 1; t >= inp && *t == ' '; --t)
|
||||
;
|
||||
for (t = inp + cbsz - 1; t >= inp && *t == ' '; --t);
|
||||
if (t >= inp) {
|
||||
cnt = t - inp + 1;
|
||||
(void)memmove(out.dbp, inp, cnt);
|
||||
memmove(out.dbp, inp, cnt);
|
||||
out.dbp += cnt;
|
||||
out.dbcnt += cnt;
|
||||
}
|
||||
++out.dbcnt;
|
||||
*out.dbp++ = '\n';
|
||||
if (++out.dbcnt >= out.dbsz)
|
||||
if (out.dbcnt >= out.dbsz)
|
||||
dd_out(0);
|
||||
}
|
||||
if (in.dbcnt)
|
||||
(void)memmove(in.db, in.dbp - in.dbcnt, in.dbcnt);
|
||||
memmove(in.db, in.dbp - in.dbcnt, in.dbcnt);
|
||||
in.dbp = in.db + in.dbcnt;
|
||||
}
|
||||
|
||||
void
|
||||
unblock_close()
|
||||
{
|
||||
int cnt;
|
||||
u_char *t;
|
||||
size_t cnt;
|
||||
|
||||
if (in.dbcnt) {
|
||||
warnx("%s: short input record", in.name);
|
||||
for (t = in.db + in.dbcnt - 1; t >= in.db && *t == ' '; --t)
|
||||
;
|
||||
for (t = in.db + in.dbcnt - 1; t >= in.db && *t == ' '; --t);
|
||||
if (t >= in.db) {
|
||||
cnt = t - in.db + 1;
|
||||
(void)memmove(out.dbp, in.db, cnt);
|
||||
memmove(out.dbp, in.db, cnt);
|
||||
out.dbp += cnt;
|
||||
out.dbcnt += cnt;
|
||||
}
|
||||
|
||||
+15
-8
@@ -46,7 +46,10 @@ static const char rcsid[] =
|
||||
#include <sys/types.h>
|
||||
|
||||
/*
|
||||
* There are currently six tables:
|
||||
* There are currently eight tables:
|
||||
*
|
||||
* lower-case -> upper-case conv=upper
|
||||
* upper-case -> lower-case conv=lower
|
||||
*
|
||||
* ebcdic -> ascii 32V conv=oldascii
|
||||
* ascii -> ebcdic 32V conv=oldebcdic
|
||||
@@ -69,10 +72,14 @@ static const char rcsid[] =
|
||||
* ACM, Volume 11, Number 11, November 1968, pp. 783-789.
|
||||
*/
|
||||
|
||||
u_char casetab[256];
|
||||
/* Lower-case to upper-case */
|
||||
u_char l2u[256];
|
||||
|
||||
/* Upper-case to lower-case */
|
||||
u_char u2l[256];
|
||||
|
||||
/* EBCDIC to ASCII -- 32V compatible. */
|
||||
const u_char e2a_32V[] = {
|
||||
u_char e2a_32V[] = {
|
||||
0000, 0001, 0002, 0003, 0234, 0011, 0206, 0177, /* 0000 */
|
||||
0227, 0215, 0216, 0013, 0014, 0015, 0016, 0017, /* 0010 */
|
||||
0020, 0021, 0022, 0023, 0235, 0205, 0010, 0207, /* 0020 */
|
||||
@@ -108,7 +115,7 @@ const u_char e2a_32V[] = {
|
||||
};
|
||||
|
||||
/* ASCII to EBCDIC -- 32V compatible. */
|
||||
const u_char a2e_32V[] = {
|
||||
u_char a2e_32V[] = {
|
||||
0000, 0001, 0002, 0003, 0067, 0055, 0056, 0057, /* 0000 */
|
||||
0026, 0005, 0045, 0013, 0014, 0015, 0016, 0017, /* 0010 */
|
||||
0020, 0021, 0022, 0023, 0074, 0075, 0062, 0046, /* 0020 */
|
||||
@@ -144,7 +151,7 @@ const u_char a2e_32V[] = {
|
||||
};
|
||||
|
||||
/* ASCII to IBM EBCDIC -- 32V compatible. */
|
||||
const u_char a2ibm_32V[] = {
|
||||
u_char a2ibm_32V[] = {
|
||||
0000, 0001, 0002, 0003, 0067, 0055, 0056, 0057, /* 0000 */
|
||||
0026, 0005, 0045, 0013, 0014, 0015, 0016, 0017, /* 0010 */
|
||||
0020, 0021, 0022, 0023, 0074, 0075, 0062, 0046, /* 0020 */
|
||||
@@ -180,7 +187,7 @@ const u_char a2ibm_32V[] = {
|
||||
};
|
||||
|
||||
/* EBCDIC to ASCII -- POSIX and System V compatible. */
|
||||
const u_char e2a_POSIX[] = {
|
||||
u_char e2a_POSIX[] = {
|
||||
0000, 0001, 0002, 0003, 0234, 0011, 0206, 0177, /* 0000 */
|
||||
0227, 0215, 0216, 0013, 0014, 0015, 0016, 0017, /* 0010 */
|
||||
0020, 0021, 0022, 0023, 0235, 0205, 0010, 0207, /* 0020 */
|
||||
@@ -216,7 +223,7 @@ const u_char e2a_POSIX[] = {
|
||||
};
|
||||
|
||||
/* ASCII to EBCDIC -- POSIX and System V compatible. */
|
||||
const u_char a2e_POSIX[] = {
|
||||
u_char a2e_POSIX[] = {
|
||||
0000, 0001, 0002, 0003, 0067, 0055, 0056, 0057, /* 0000 */
|
||||
0026, 0005, 0045, 0013, 0014, 0015, 0016, 0017, /* 0010 */
|
||||
0020, 0021, 0022, 0023, 0074, 0075, 0062, 0046, /* 0020 */
|
||||
@@ -252,7 +259,7 @@ const u_char a2e_POSIX[] = {
|
||||
};
|
||||
|
||||
/* ASCII to IBM EBCDIC -- POSIX and System V compatible. */
|
||||
const u_char a2ibm_POSIX[] = {
|
||||
u_char a2ibm_POSIX[] = {
|
||||
0000, 0001, 0002, 0003, 0067, 0055, 0056, 0057, /* 0000 */
|
||||
0026, 0005, 0045, 0013, 0014, 0015, 0016, 0017, /* 0010 */
|
||||
0020, 0021, 0022, 0023, 0074, 0075, 0062, 0046, /* 0020 */
|
||||
|
||||
+4
-5
@@ -282,11 +282,10 @@ appended.
|
||||
.El
|
||||
.El
|
||||
.Pp
|
||||
Where sizes are specified, a decimal, octal, or hexadecimal number of
|
||||
bytes is expected.
|
||||
If the number ends with a ``b'', ``k'', ``m'', ``g'', or ``w'', the
|
||||
number is multiplied by 512, 1024 (1K), 1048576 (1M), 1073741824 (1G)
|
||||
or the number of bytes in an integer, respectively.
|
||||
Where sizes are specified, a decimal number of bytes is expected.
|
||||
If the number ends with a ``b'', ``k'', ``m'' or ``w'', the number
|
||||
is multiplied by 512, 1024 (1K), 1048576 (1M) or the number of bytes
|
||||
in an integer, respectively.
|
||||
Two or more numbers may be separated by an ``x'' to indicate a product.
|
||||
.Pp
|
||||
When finished,
|
||||
|
||||
+63
-76
@@ -51,8 +51,6 @@ static const char rcsid[] =
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/device.h>
|
||||
#include <sys/disklabel.h>
|
||||
#include <sys/mtio.h>
|
||||
|
||||
#include <ctype.h>
|
||||
@@ -76,12 +74,12 @@ static void setup __P((void));
|
||||
IO in, out; /* input/output state */
|
||||
STAT st; /* statistics */
|
||||
void (*cfunc) __P((void)); /* conversion function */
|
||||
quad_t cpy_cnt; /* # of blocks to copy */
|
||||
off_t pending = 0; /* pending seek if sparse */
|
||||
u_long cpy_cnt; /* # of blocks to copy */
|
||||
u_long pending = 0; /* pending seek if sparse */
|
||||
u_int ddflags; /* conversion options */
|
||||
size_t cbsz; /* conversion block size */
|
||||
quad_t files_cnt = 1; /* # of files to copy */
|
||||
const u_char *ctab; /* conversion table */
|
||||
u_int cbsz; /* conversion block size */
|
||||
u_int files_cnt = 1; /* # of files to copy */
|
||||
u_char *ctab; /* conversion table */
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
@@ -115,7 +113,7 @@ setup()
|
||||
in.fd = STDIN_FILENO;
|
||||
} else {
|
||||
in.fd = open(in.name, O_RDONLY, 0);
|
||||
if (in.fd == -1)
|
||||
if (in.fd < 0)
|
||||
err(1, "%s", in.name);
|
||||
}
|
||||
|
||||
@@ -137,11 +135,11 @@ setup()
|
||||
* Without read we may have a problem if output also does
|
||||
* not support seeks.
|
||||
*/
|
||||
if (out.fd == -1) {
|
||||
if (out.fd < 0) {
|
||||
out.fd = open(out.name, O_WRONLY | OFLAGS, DEFFILEMODE);
|
||||
out.flags |= NOREAD;
|
||||
}
|
||||
if (out.fd == -1)
|
||||
if (out.fd < 0)
|
||||
err(1, "%s", out.name);
|
||||
}
|
||||
|
||||
@@ -151,13 +149,14 @@ setup()
|
||||
* Allocate space for the input and output buffers. If not doing
|
||||
* record oriented I/O, only need a single buffer.
|
||||
*/
|
||||
if (!(ddflags & (C_BLOCK | C_UNBLOCK))) {
|
||||
if (!(ddflags & (C_BLOCK|C_UNBLOCK))) {
|
||||
if ((in.db = malloc(out.dbsz + in.dbsz - 1)) == NULL)
|
||||
err(1, "input buffer");
|
||||
err(1, NULL);
|
||||
out.db = in.db;
|
||||
} else if ((in.db = malloc(MAX(in.dbsz, cbsz) + cbsz)) == NULL ||
|
||||
(out.db = malloc(out.dbsz + cbsz)) == NULL)
|
||||
err(1, "output buffer");
|
||||
} else if ((in.db =
|
||||
malloc((u_int)(MAX(in.dbsz, cbsz) + cbsz))) == NULL ||
|
||||
(out.db = malloc((u_int)(out.dbsz + cbsz))) == NULL)
|
||||
err(1, NULL);
|
||||
in.dbp = in.db;
|
||||
out.dbp = out.db;
|
||||
|
||||
@@ -172,34 +171,50 @@ setup()
|
||||
* kinds of output files, tapes, for example.
|
||||
*/
|
||||
if ((ddflags & (C_OF | C_SEEK | C_NOTRUNC)) == (C_OF | C_SEEK))
|
||||
(void)ftruncate(out.fd, out.offset * out.dbsz);
|
||||
(void)ftruncate(out.fd, (off_t)out.offset * out.dbsz);
|
||||
|
||||
/*
|
||||
* If converting case at the same time as another conversion, build a
|
||||
* table that does both at once. If just converting case, use the
|
||||
* built-in tables.
|
||||
*/
|
||||
if (ddflags & (C_LCASE | C_UCASE)) {
|
||||
if (ddflags & (C_ASCII | C_EBCDIC)) {
|
||||
if (ddflags & (C_LCASE|C_UCASE))
|
||||
if (ddflags & C_ASCII)
|
||||
if (ddflags & C_LCASE) {
|
||||
for (cnt = 0; cnt <= 0377; ++cnt)
|
||||
casetab[cnt] = tolower(ctab[cnt]);
|
||||
if (isupper(ctab[cnt]))
|
||||
ctab[cnt] = tolower(ctab[cnt]);
|
||||
} else {
|
||||
for (cnt = 0; cnt <= 0377; ++cnt)
|
||||
casetab[cnt] = toupper(ctab[cnt]);
|
||||
if (islower(ctab[cnt]))
|
||||
ctab[cnt] = toupper(ctab[cnt]);
|
||||
}
|
||||
} else {
|
||||
else if (ddflags & C_EBCDIC)
|
||||
if (ddflags & C_LCASE) {
|
||||
for (cnt = 0; cnt <= 0377; ++cnt)
|
||||
casetab[cnt] = tolower(cnt);
|
||||
if (isupper(cnt))
|
||||
ctab[cnt] = ctab[tolower(cnt)];
|
||||
} else {
|
||||
for (cnt = 0; cnt <= 0377; ++cnt)
|
||||
casetab[cnt] = toupper(cnt);
|
||||
if (islower(cnt))
|
||||
ctab[cnt] = ctab[toupper(cnt)];
|
||||
}
|
||||
else {
|
||||
ctab = ddflags & C_LCASE ? u2l : l2u;
|
||||
if (ddflags & C_LCASE) {
|
||||
for (cnt = 0; cnt <= 0377; ++cnt)
|
||||
if (isupper(cnt))
|
||||
ctab[cnt] = tolower(cnt);
|
||||
else
|
||||
ctab[cnt] = cnt;
|
||||
} else {
|
||||
for (cnt = 0; cnt <= 0377; ++cnt)
|
||||
if (islower(cnt))
|
||||
ctab[cnt] = toupper(cnt);
|
||||
else
|
||||
ctab[cnt] = cnt;
|
||||
}
|
||||
}
|
||||
ctab = casetab;
|
||||
}
|
||||
|
||||
(void)gettimeofday(&tv, (struct timezone *)NULL);
|
||||
st.start = tv.tv_sec + tv.tv_usec * 1e-6;
|
||||
}
|
||||
@@ -208,59 +223,35 @@ static void
|
||||
getfdtype(io)
|
||||
IO *io;
|
||||
{
|
||||
struct stat sb;
|
||||
struct disklabel dkl;
|
||||
struct mtget mt;
|
||||
int type;
|
||||
struct stat sb;
|
||||
|
||||
if (fstat(io->fd, &sb) == -1)
|
||||
if (fstat(io->fd, &sb))
|
||||
err(1, "%s", io->name);
|
||||
if (S_ISCHR(sb.st_mode) || S_ISBLK(sb.st_mode)) {
|
||||
if (ioctl(io->fd, DIOCGDINFO, &dkl) == 0 ||
|
||||
/* XXX {,k}mem hack: This sucks. */
|
||||
(major(sb.st_rdev) == 2 &&
|
||||
(minor(sb.st_rdev) == 0 || minor(sb.st_rdev) == 1)))
|
||||
io->flags |= ISSEEK;
|
||||
else if (ioctl(io->fd, MTIOCGET, &mt) == 0)
|
||||
io->flags |= ISTAPE;
|
||||
if (S_ISCHR(sb.st_mode) && (io->flags & ISTAPE) == 0)
|
||||
io->flags |= ISCHR;
|
||||
return;
|
||||
}
|
||||
errno = 0;
|
||||
if (lseek(io->fd, (off_t)0, SEEK_CUR) == -1 && errno == ESPIPE)
|
||||
io->flags |= ISPIPE;
|
||||
else
|
||||
io->flags |= ISSEEK;
|
||||
if (S_ISCHR(sb.st_mode))
|
||||
io->flags |= ioctl(io->fd, MTIOCGET, &mt) ? ISCHR : ISTAPE;
|
||||
else if (lseek(io->fd, (off_t)0, SEEK_CUR) == -1 && errno == ESPIPE)
|
||||
io->flags |= ISPIPE; /* XXX fixed in 4.4BSD */
|
||||
}
|
||||
|
||||
static void
|
||||
dd_in()
|
||||
{
|
||||
ssize_t n;
|
||||
int n;
|
||||
|
||||
for (;;) {
|
||||
switch (cpy_cnt) {
|
||||
case -1: /* count=0 was specified */
|
||||
if (cpy_cnt && (st.in_full + st.in_part) >= cpy_cnt)
|
||||
return;
|
||||
case 0:
|
||||
break;
|
||||
default:
|
||||
if (st.in_full + st.in_part >= cpy_cnt)
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Zero the buffer first if sync; if doing block operations,
|
||||
* Zero the buffer first if sync; If doing block operations
|
||||
* use spaces.
|
||||
*/
|
||||
if (ddflags & C_SYNC) {
|
||||
if (ddflags & (C_BLOCK | C_UNBLOCK))
|
||||
if (ddflags & C_SYNC)
|
||||
if (ddflags & (C_BLOCK|C_UNBLOCK))
|
||||
memset(in.dbp, ' ', in.dbsz);
|
||||
else
|
||||
memset(in.dbp, 0, in.dbsz);
|
||||
}
|
||||
|
||||
n = read(in.fd, in.dbp, in.dbsz);
|
||||
if (n == 0) {
|
||||
@@ -269,7 +260,7 @@ dd_in()
|
||||
}
|
||||
|
||||
/* Read error. */
|
||||
if (n == -1) {
|
||||
if (n < 0) {
|
||||
/*
|
||||
* If noerror not specified, die. POSIX requires that
|
||||
* the warning message be followed by an I/O display.
|
||||
@@ -280,12 +271,12 @@ dd_in()
|
||||
summary();
|
||||
|
||||
/*
|
||||
* If it's a seekable file descriptor, seek past the
|
||||
* If it's not a tape drive or a pipe, seek past the
|
||||
* error. If your OS doesn't do the right thing for
|
||||
* raw disks this section should be modified to re-read
|
||||
* in sector size chunks.
|
||||
*/
|
||||
if (in.flags & ISSEEK &&
|
||||
if (!(in.flags & (ISPIPE|ISTAPE)) &&
|
||||
lseek(in.fd, (off_t)in.dbsz, SEEK_CUR))
|
||||
warn("%s", in.name);
|
||||
|
||||
@@ -338,7 +329,7 @@ dd_in()
|
||||
}
|
||||
|
||||
/*
|
||||
* Clean up any remaining I/O and flush output. If necessary, the output file
|
||||
* Cleanup any remaining I/O and flush output. If necesssary, output file
|
||||
* is truncated.
|
||||
*/
|
||||
static void
|
||||
@@ -351,7 +342,7 @@ dd_close()
|
||||
else if (cfunc == unblock)
|
||||
unblock_close();
|
||||
if (ddflags & C_OSYNC && out.dbcnt && out.dbcnt < out.dbsz) {
|
||||
if (ddflags & (C_BLOCK | C_UNBLOCK))
|
||||
if (ddflags & (C_BLOCK|C_UNBLOCK))
|
||||
memset(out.dbp, ' ', out.dbsz - out.dbcnt);
|
||||
else
|
||||
memset(out.dbp, 0, out.dbsz - out.dbcnt);
|
||||
@@ -365,11 +356,9 @@ void
|
||||
dd_out(force)
|
||||
int force;
|
||||
{
|
||||
u_char *outp;
|
||||
size_t cnt, i, n;
|
||||
ssize_t nw;
|
||||
static int warned;
|
||||
int sparse;
|
||||
int cnt, n, nw, i, sparse;
|
||||
u_char *outp;
|
||||
|
||||
/*
|
||||
* Write one or more blocks out. The common case is writing a full
|
||||
@@ -406,8 +395,7 @@ dd_out(force)
|
||||
if (pending != 0) {
|
||||
if (force)
|
||||
pending--;
|
||||
if (lseek(out.fd, pending, SEEK_CUR) ==
|
||||
-1)
|
||||
if (lseek (out.fd, pending, SEEK_CUR) == -1)
|
||||
err(2, "%s: seek error creating sparse file",
|
||||
out.name);
|
||||
if (force)
|
||||
@@ -439,14 +427,13 @@ dd_out(force)
|
||||
++st.out_part;
|
||||
if (nw == cnt)
|
||||
break;
|
||||
if (out.flags & ISTAPE)
|
||||
errx(1, "%s: short write on tape device",
|
||||
out.name);
|
||||
if (out.flags & ISCHR && !warned) {
|
||||
warned = 1;
|
||||
warnx("%s: short write on character device",
|
||||
out.name);
|
||||
}
|
||||
if (out.flags & ISTAPE)
|
||||
errx(1, "%s: short write on tape device", out.name);
|
||||
}
|
||||
if ((out.dbcnt -= n) < out.dbsz)
|
||||
break;
|
||||
@@ -454,6 +441,6 @@ dd_out(force)
|
||||
|
||||
/* Reassemble the output block. */
|
||||
if (out.dbcnt)
|
||||
(void)memmove(out.db, out.dbp - out.dbcnt, out.dbcnt);
|
||||
memmove(out.db, out.dbp - out.dbcnt, out.dbcnt);
|
||||
out.dbp = out.db + out.dbcnt;
|
||||
}
|
||||
+24
-26
@@ -40,39 +40,37 @@
|
||||
|
||||
/* Input/output stream state. */
|
||||
typedef struct {
|
||||
u_char *db; /* buffer address */
|
||||
u_char *dbp; /* current buffer I/O address */
|
||||
/* XXX ssize_t? */
|
||||
size_t dbcnt; /* current buffer byte count */
|
||||
size_t dbrcnt; /* last read byte count */
|
||||
size_t dbsz; /* buffer size */
|
||||
u_char *db; /* buffer address */
|
||||
u_char *dbp; /* current buffer I/O address */
|
||||
u_long dbcnt; /* current buffer byte count */
|
||||
int dbrcnt; /* last read byte count */
|
||||
u_long dbsz; /* buffer size */
|
||||
|
||||
#define ISCHR 0x01 /* character device (warn on short) */
|
||||
#define ISPIPE 0x02 /* pipe-like (not truncatable) */
|
||||
#define ISTAPE 0x04 /* tape */
|
||||
#define ISSEEK 0x08 /* valid to seek on */
|
||||
#define NOREAD 0x10 /* not readable */
|
||||
u_int flags;
|
||||
#define ISPIPE 0x02 /* pipe (not truncatable) */
|
||||
#define ISTAPE 0x04 /* tape (not seekable) */
|
||||
#define NOREAD 0x08 /* not readable */
|
||||
u_int flags;
|
||||
|
||||
char *name; /* name */
|
||||
int fd; /* file descriptor */
|
||||
off_t offset; /* # of blocks to skip */
|
||||
char *name; /* name */
|
||||
int fd; /* file descriptor */
|
||||
u_long offset; /* # of blocks to skip */
|
||||
|
||||
u_quad_t f_stats; /* # of full blocks processed */
|
||||
u_quad_t p_stats; /* # of partial blocks processed */
|
||||
u_quad_t s_stats; /* # of odd swab blocks */
|
||||
u_quad_t t_stats; /* # of truncations */
|
||||
u_long f_stats; /* # of full blocks processed */
|
||||
u_long p_stats; /* # of partial blocks processed */
|
||||
u_long s_stats; /* # of odd swab blocks */
|
||||
u_long t_stats; /* # of truncations */
|
||||
} IO;
|
||||
|
||||
typedef struct {
|
||||
u_quad_t in_full; /* # of full input blocks */
|
||||
u_quad_t in_part; /* # of partial input blocks */
|
||||
u_quad_t out_full; /* # of full output blocks */
|
||||
u_quad_t out_part; /* # of partial output blocks */
|
||||
u_quad_t trunc; /* # of truncated records */
|
||||
u_quad_t swab; /* # of odd-length swab blocks */
|
||||
u_quad_t bytes; /* # of bytes written */
|
||||
double start; /* start time of dd */
|
||||
u_long in_full; /* # of full input blocks */
|
||||
u_long in_part; /* # of partial input blocks */
|
||||
u_long out_full; /* # of full output blocks */
|
||||
u_long out_part; /* # of partial output blocks */
|
||||
u_long trunc; /* # of truncated records */
|
||||
u_long swab; /* # of odd-length swab blocks */
|
||||
u_int64_t bytes; /* # of bytes written */
|
||||
double start; /* start time of dd */
|
||||
} STAT;
|
||||
|
||||
/* Flags (in ddflags). */
|
||||
|
||||
+6
-8
@@ -57,12 +57,10 @@ void unblock_close __P((void));
|
||||
extern IO in, out;
|
||||
extern STAT st;
|
||||
extern void (*cfunc)();
|
||||
extern quad_t cpy_cnt;
|
||||
extern size_t cbsz;
|
||||
extern u_long cpy_cnt;
|
||||
extern u_int cbsz;
|
||||
extern u_int ddflags;
|
||||
extern quad_t files_cnt;
|
||||
extern const u_char *ctab;
|
||||
extern const u_char a2e_32V[], a2e_POSIX[];
|
||||
extern const u_char e2a_32V[], e2a_POSIX[];
|
||||
extern const u_char a2ibm_32V[], a2ibm_POSIX[];
|
||||
extern u_char casetab[];
|
||||
extern u_int files_cnt;
|
||||
extern u_char *ctab;
|
||||
extern u_char a2e_32V[], a2e_POSIX[], a2ibm_32V[], a2ibm_POSIX[], e2a_32V[];
|
||||
extern u_char e2a_POSIX[], l2u[], u2l[];
|
||||
+3
-3
@@ -66,16 +66,16 @@ summary()
|
||||
secs = 1e-6;
|
||||
/* Use snprintf(3) so that we don't reenter stdio(3). */
|
||||
(void)snprintf(buf, sizeof(buf),
|
||||
"%qu+%qu records in\n%qu+%qu records out\n",
|
||||
"%lu+%lu records in\n%lu+%lu records out\n",
|
||||
st.in_full, st.in_part, st.out_full, st.out_part);
|
||||
(void)write(STDERR_FILENO, buf, strlen(buf));
|
||||
if (st.swab) {
|
||||
(void)snprintf(buf, sizeof(buf), "%qu odd length swab %s\n",
|
||||
(void)snprintf(buf, sizeof(buf), "%lu odd length swab %s\n",
|
||||
st.swab, (st.swab == 1) ? "block" : "blocks");
|
||||
(void)write(STDERR_FILENO, buf, strlen(buf));
|
||||
}
|
||||
if (st.trunc) {
|
||||
(void)snprintf(buf, sizeof(buf), "%qu truncated %s\n",
|
||||
(void)snprintf(buf, sizeof(buf), "%lu truncated %s\n",
|
||||
st.trunc, (st.trunc == 1) ? "block" : "blocks");
|
||||
(void)write(STDERR_FILENO, buf, strlen(buf));
|
||||
}
|
||||
|
||||
+9
-17
@@ -47,7 +47,6 @@ static const char rcsid[] =
|
||||
#include <sys/mtio.h>
|
||||
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "dd.h"
|
||||
@@ -62,16 +61,11 @@ static const char rcsid[] =
|
||||
void
|
||||
pos_in()
|
||||
{
|
||||
off_t cnt;
|
||||
int warned;
|
||||
ssize_t nr;
|
||||
size_t bcnt;
|
||||
int bcnt, cnt, nr, warned;
|
||||
|
||||
/* If known to be seekable, try to seek on it. */
|
||||
if (in.flags & ISSEEK) {
|
||||
errno = 0;
|
||||
if (lseek(in.fd, in.offset * in.dbsz, SEEK_CUR) == -1 &&
|
||||
errno != 0)
|
||||
/* If not a character, pipe or tape device, try to seek on it. */
|
||||
if (!(in.flags & (ISCHR|ISPIPE|ISTAPE))) {
|
||||
if (lseek(in.fd, (off_t)in.offset * in.dbsz, SEEK_CUR) == -1)
|
||||
err(1, "%s", in.name);
|
||||
return;
|
||||
}
|
||||
@@ -122,8 +116,7 @@ void
|
||||
pos_out()
|
||||
{
|
||||
struct mtop t_op;
|
||||
off_t cnt;
|
||||
ssize_t n;
|
||||
int cnt, n;
|
||||
|
||||
/*
|
||||
* If not a tape, try seeking on the file. Seeking on a pipe is
|
||||
@@ -131,9 +124,8 @@ pos_out()
|
||||
* have specified the seek operand.
|
||||
*/
|
||||
if (!(out.flags & ISTAPE)) {
|
||||
errno = 0;
|
||||
if (lseek(out.fd, out.offset * out.dbsz, SEEK_CUR) == -1 &&
|
||||
errno != 0)
|
||||
if (lseek(out.fd,
|
||||
(off_t)out.offset * out.dbsz, SEEK_SET) == -1)
|
||||
err(1, "%s", out.name);
|
||||
return;
|
||||
}
|
||||
@@ -143,7 +135,7 @@ pos_out()
|
||||
t_op.mt_op = MTFSR;
|
||||
t_op.mt_count = out.offset;
|
||||
|
||||
if (ioctl(out.fd, MTIOCTOP, &t_op) == -1)
|
||||
if (ioctl(out.fd, MTIOCTOP, &t_op) < 0)
|
||||
err(1, "%s", out.name);
|
||||
return;
|
||||
}
|
||||
@@ -153,7 +145,7 @@ pos_out()
|
||||
if ((n = read(out.fd, out.db, out.dbsz)) > 0)
|
||||
continue;
|
||||
|
||||
if (n == -1)
|
||||
if (n < 0)
|
||||
err(1, "%s", out.name);
|
||||
|
||||
/*
|
||||
|
||||
@@ -8,8 +8,6 @@ BINMODE=2555
|
||||
|
||||
MOUNT= ${.CURDIR}/../../sbin/mount
|
||||
CFLAGS+= -I${MOUNT}
|
||||
LDADD+= ${LIBM}
|
||||
DPADD+= ${LIBM}
|
||||
.PATH: ${MOUNT}
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
+1
-28
@@ -40,11 +40,7 @@
|
||||
.Nd display free disk space
|
||||
.Sh SYNOPSIS
|
||||
.Nm df
|
||||
.Oo
|
||||
.Fl b | h | H | k |
|
||||
.Fl m | P
|
||||
.Oc
|
||||
.Op Fl in
|
||||
.Op Fl ikn
|
||||
.Op Fl t Ar type
|
||||
.Op Ar file | Ar filesystem ...
|
||||
.Sh DESCRIPTION
|
||||
@@ -63,19 +59,6 @@ option below).
|
||||
.Pp
|
||||
The following options are available:
|
||||
.Bl -tag -width Ds
|
||||
.It Fl b
|
||||
Use 512-byte blocks rather than the default. Note that
|
||||
this overrides the
|
||||
.Ev BLOCKSIZE
|
||||
specification from the environment.
|
||||
.It Fl H
|
||||
"Human-readable" output. Use unit suffixes: Byte, Kilobyte, Megabyte,
|
||||
Gigabyte, Terabyte and Petabyte in order to reduce the number of
|
||||
digits to three or less using base 10 for sizes.
|
||||
.It Fl h
|
||||
"Human-readable" output. Use unit suffixes: Byte, Kilobyte, Megabyte,
|
||||
Gigabyte, Terabyte and Petabyte in order to reduce the number of
|
||||
digits to three or less using base 2 for sizes.
|
||||
.It Fl i
|
||||
Include statistics on the number of free inodes.
|
||||
.It Fl k
|
||||
@@ -83,11 +66,6 @@ Use 1024-byte (1-Kbyte) blocks rather than the default. Note that
|
||||
this overrides the
|
||||
.Ev BLOCKSIZE
|
||||
specification from the environment.
|
||||
.It Fl m
|
||||
Use 1048576-byte (1-Mbyte) blocks rather than the default. Note that
|
||||
this overrides the
|
||||
.Ev BLOCKSIZE
|
||||
specification from the environment.
|
||||
.It Fl n
|
||||
Print out the previously obtained statistics from the filesystems.
|
||||
This option should be used if it is possible that one or more
|
||||
@@ -97,11 +75,6 @@ When this option is specified,
|
||||
.Nm
|
||||
will not request new statistics from the filesystems, but will respond
|
||||
with the possibly stale statistics that were previously obtained.
|
||||
.It Fl P
|
||||
Use POSIX compliant output of 512-byte blocks rather than the default.
|
||||
Note that this overrides the
|
||||
.Ev BLOCKSIZE
|
||||
specification from the environment.
|
||||
.It Fl t
|
||||
Only print out statistics for filesystems of the specified types.
|
||||
More than one type may be specified in a comma separated list.
|
||||
|
||||
+12
-133
@@ -59,55 +59,21 @@ static const char rcsid[] =
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sysexits.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define UNITS_SI 1
|
||||
#define UNITS_2 2
|
||||
|
||||
#define KILO_SZ(n) (n)
|
||||
#define MEGA_SZ(n) ((n) * (n))
|
||||
#define GIGA_SZ(n) ((n) * (n) * (n))
|
||||
#define TERA_SZ(n) ((n) * (n) * (n) * (n))
|
||||
#define PETA_SZ(n) ((n) * (n) * (n) * (n) * (n))
|
||||
|
||||
#define KILO_2_SZ (KILO_SZ(1024ULL))
|
||||
#define MEGA_2_SZ (MEGA_SZ(1024ULL))
|
||||
#define GIGA_2_SZ (GIGA_SZ(1024ULL))
|
||||
#define TERA_2_SZ (TERA_SZ(1024ULL))
|
||||
#define PETA_2_SZ (PETA_SZ(1024ULL))
|
||||
|
||||
#define KILO_SI_SZ (KILO_SZ(1000ULL))
|
||||
#define MEGA_SI_SZ (MEGA_SZ(1000ULL))
|
||||
#define GIGA_SI_SZ (GIGA_SZ(1000ULL))
|
||||
#define TERA_SI_SZ (TERA_SZ(1000ULL))
|
||||
#define PETA_SI_SZ (PETA_SZ(1000ULL))
|
||||
|
||||
unsigned long long vals_si [] = {1, KILO_SI_SZ, MEGA_SI_SZ, GIGA_SI_SZ, TERA_SI_SZ, PETA_SI_SZ};
|
||||
unsigned long long vals_base2[] = {1, KILO_2_SZ, MEGA_2_SZ, GIGA_2_SZ, TERA_2_SZ, PETA_2_SZ};
|
||||
unsigned long long *valp;
|
||||
|
||||
typedef enum { NONE, KILO, MEGA, GIGA, TERA, PETA, UNIT_MAX } unit_t;
|
||||
|
||||
int unitp [] = { NONE, KILO, MEGA, GIGA, TERA, PETA };
|
||||
|
||||
int checkvfsname __P((const char *, char **));
|
||||
char **makevfslist __P((char *));
|
||||
long regetmntinfo __P((struct statfs **, long, char **));
|
||||
int bread __P((off_t, void *, int));
|
||||
char *getmntpt __P((char *));
|
||||
void prthuman __P((struct statfs *, long));
|
||||
void prthumanval __P((double));
|
||||
void prtstat __P((struct statfs *, int));
|
||||
int ufs_df __P((char *, int));
|
||||
unit_t unit_adjust __P((double *));
|
||||
void usage __P((void));
|
||||
|
||||
int hflag, iflag, nflag;
|
||||
int iflag, nflag;
|
||||
struct ufs_args mdev;
|
||||
|
||||
int
|
||||
@@ -122,32 +88,13 @@ main(argc, argv)
|
||||
char *mntpt, *mntpath, **vfslist;
|
||||
|
||||
vfslist = NULL;
|
||||
while ((ch = getopt(argc, argv, "bHhikmnPt:")) != -1)
|
||||
while ((ch = getopt(argc, argv, "iknt:")) != -1)
|
||||
switch (ch) {
|
||||
case 'b':
|
||||
/* FALLTHROUGH */
|
||||
case 'P':
|
||||
putenv("BLOCKSIZE=512");
|
||||
hflag = 0;
|
||||
break;
|
||||
case 'H':
|
||||
hflag = UNITS_SI;
|
||||
valp = vals_si;
|
||||
break;
|
||||
case 'h':
|
||||
hflag = UNITS_2;
|
||||
valp = vals_base2;
|
||||
break;
|
||||
case 'i':
|
||||
iflag = 1;
|
||||
break;
|
||||
case 'k':
|
||||
putenv("BLOCKSIZE=1k");
|
||||
hflag = 0;
|
||||
break;
|
||||
case 'm':
|
||||
putenv("BLOCKSIZE=1m");
|
||||
hflag = 0;
|
||||
break;
|
||||
case 'n':
|
||||
nflag = 1;
|
||||
@@ -183,9 +130,8 @@ main(argc, argv)
|
||||
maxwidth = width;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < mntsize; i++) {
|
||||
for (i = 0; i < mntsize; i++)
|
||||
prtstat(&mntbuf[i], maxwidth);
|
||||
}
|
||||
exit(rv);
|
||||
}
|
||||
|
||||
@@ -297,61 +243,6 @@ regetmntinfo(mntbufp, mntsize, vfslist)
|
||||
return (j);
|
||||
}
|
||||
|
||||
/*
|
||||
* Output in "human-readable" format. Uses 3 digits max and puts
|
||||
* unit suffixes at the end. Makes output compact and easy to read,
|
||||
* especially on huge disks.
|
||||
*
|
||||
*/
|
||||
unit_t
|
||||
unit_adjust(val)
|
||||
double *val;
|
||||
{
|
||||
double abval;
|
||||
unit_t unit;
|
||||
unsigned int unit_sz;
|
||||
|
||||
abval = fabs(*val);
|
||||
|
||||
unit_sz = abval ? ilogb(abval) / 10 : 0;
|
||||
|
||||
if (unit_sz >= UNIT_MAX) {
|
||||
unit = NONE;
|
||||
} else {
|
||||
unit = unitp[unit_sz];
|
||||
*val /= (double)valp[unit_sz];
|
||||
}
|
||||
|
||||
return (unit);
|
||||
}
|
||||
|
||||
void
|
||||
prthuman(sfsp, used)
|
||||
struct statfs *sfsp;
|
||||
long used;
|
||||
{
|
||||
|
||||
prthumanval((double)sfsp->f_blocks * (double)sfsp->f_bsize);
|
||||
prthumanval((double)used * (double)sfsp->f_bsize);
|
||||
prthumanval((double)sfsp->f_bavail * (double)sfsp->f_bsize);
|
||||
}
|
||||
|
||||
void
|
||||
prthumanval(bytes)
|
||||
double bytes;
|
||||
{
|
||||
|
||||
unit_t unit;
|
||||
unit = unit_adjust(&bytes);
|
||||
|
||||
if (bytes == 0)
|
||||
(void)printf(" 0B");
|
||||
else if (bytes > 10)
|
||||
(void)printf(" %5.0f%c", bytes, "BKMGTPE"[unit]);
|
||||
else
|
||||
(void)printf(" %5.1f%c", bytes, "BKMGTPE"[unit]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert statfs returned filesystem size into BLOCKSIZE units.
|
||||
* Attempts to avoid overflow for large filesystems.
|
||||
@@ -376,16 +267,9 @@ prtstat(sfsp, maxwidth)
|
||||
if (maxwidth < 11)
|
||||
maxwidth = 11;
|
||||
if (++timesthrough == 1) {
|
||||
if (hflag) {
|
||||
header = " Size";
|
||||
headerlen = strlen(header);
|
||||
(void)printf("%-*.*s %-s Used Avail Capacity",
|
||||
maxwidth, maxwidth, "Filesystem", header);
|
||||
} else {
|
||||
header = getbsize(&headerlen, &blocksize);
|
||||
(void)printf("%-*.*s %-s Used Avail Capacity",
|
||||
maxwidth, maxwidth, "Filesystem", header);
|
||||
}
|
||||
header = getbsize(&headerlen, &blocksize);
|
||||
(void)printf("%-*.*s %s Used Avail Capacity",
|
||||
maxwidth, maxwidth, "Filesystem", header);
|
||||
if (iflag)
|
||||
(void)printf(" iused ifree %%iused");
|
||||
(void)printf(" Mounted on\n");
|
||||
@@ -393,14 +277,10 @@ prtstat(sfsp, maxwidth)
|
||||
(void)printf("%-*.*s", maxwidth, maxwidth, sfsp->f_mntfromname);
|
||||
used = sfsp->f_blocks - sfsp->f_bfree;
|
||||
availblks = sfsp->f_bavail + used;
|
||||
if (hflag) {
|
||||
prthuman(sfsp, used);
|
||||
} else {
|
||||
(void)printf(" %*ld %8ld %8ld", headerlen,
|
||||
fsbtoblk(sfsp->f_blocks, sfsp->f_bsize, blocksize),
|
||||
fsbtoblk(used, sfsp->f_bsize, blocksize),
|
||||
fsbtoblk(sfsp->f_bavail, sfsp->f_bsize, blocksize));
|
||||
}
|
||||
(void)printf(" %*ld %8ld %8ld", headerlen,
|
||||
fsbtoblk(sfsp->f_blocks, sfsp->f_bsize, blocksize),
|
||||
fsbtoblk(used, sfsp->f_bsize, blocksize),
|
||||
fsbtoblk(sfsp->f_bavail, sfsp->f_bsize, blocksize));
|
||||
(void)printf(" %5.0f%%",
|
||||
availblks == 0 ? 100.0 : (double)used / (double)availblks * 100.0);
|
||||
if (iflag) {
|
||||
@@ -496,8 +376,7 @@ bread(off, buf, cnt)
|
||||
void
|
||||
usage()
|
||||
{
|
||||
|
||||
(void)fprintf(stderr,
|
||||
"usage: df [-b | -H | -h | -k | -m | -P] [-ain] [-t type] [file | filesystem ...]\n");
|
||||
exit(EX_USAGE);
|
||||
"usage: df [-ikn] [-t type] [file | filesystem ...]\n");
|
||||
exit(1);
|
||||
}
|
||||
+1
-11
@@ -59,22 +59,12 @@ Do not print the trailing newline character. This may also be
|
||||
achieved by appending `\ec' to the end of the string, as is done
|
||||
by iBCS2 compatible systems.
|
||||
.El
|
||||
.Pp
|
||||
Some shells may provide a builtin
|
||||
.Nm
|
||||
command which is similar or identical to this utility.
|
||||
Consult the
|
||||
.Xr builtin 1
|
||||
manual page.
|
||||
.Sh DIAGNOSTICS
|
||||
The
|
||||
.Nm
|
||||
utility exits 0 on success, and >0 if an error occurs.
|
||||
.Sh SEE ALSO
|
||||
.Xr builtin 1 ,
|
||||
.Xr csh 1 ,
|
||||
.Xr printf 1 ,
|
||||
.Xr sh 1
|
||||
.Xr printf 1
|
||||
.Sh STANDARDS
|
||||
The
|
||||
.Nm
|
||||
|
||||
+6
-12
@@ -4,8 +4,7 @@
|
||||
.Os
|
||||
.Sh NAME
|
||||
.\" ed, red \- text editor
|
||||
.Nm ed ,
|
||||
.Nm red
|
||||
.Nm ed
|
||||
.Nd text editor
|
||||
.Sh SYNOPSIS
|
||||
.Nm ed
|
||||
@@ -116,8 +115,7 @@ default addresses are supplied.
|
||||
The following options are available:
|
||||
.Bl -tag -width indent
|
||||
.It Fl s
|
||||
Suppress diagnostics.
|
||||
This should be used if
|
||||
Suppress diagnostics. This should be used if
|
||||
.Nm Ns 's
|
||||
standard input is from a script.
|
||||
.It Fl x
|
||||
@@ -176,8 +174,7 @@ This means "before the first line,"
|
||||
and is legal wherever it makes sense.
|
||||
.Pp
|
||||
An address range is two addresses separated either by a comma or
|
||||
semi-colon.
|
||||
The value of the first address in a range cannot exceed the
|
||||
semi-colon. The value of the first address in a range cannot exceed the
|
||||
value of the second. If only one address is given in a range, then
|
||||
the second address is set to the given address. If an
|
||||
.Em n Ns -tuple
|
||||
@@ -455,8 +452,7 @@ The current address is set to last line entered.
|
||||
.It (.,.)d
|
||||
Delete the addressed lines from the buffer.
|
||||
If there is a line after the deleted range, then the current address is set
|
||||
to this line.
|
||||
Otherwise the current address is set to the line
|
||||
to this line. Otherwise the current address is set to the line
|
||||
before the deleted range.
|
||||
.It e Ar file
|
||||
Edit
|
||||
@@ -591,8 +587,7 @@ Print the addressed lines along with
|
||||
their line numbers. The current address is set to the last line
|
||||
printed.
|
||||
.It (.,.)p
|
||||
Print the addressed lines.
|
||||
The current address is set to the last line
|
||||
Print the addressed lines. The current address is set to the last line
|
||||
printed.
|
||||
.It P
|
||||
Toggle the command prompt on and off.
|
||||
@@ -835,8 +830,7 @@ attempts to write the buffer if the terminal hangs up
|
||||
USD:12-13
|
||||
|
||||
.Rs
|
||||
.%A B. W. Kernighan
|
||||
.%A P. J. Plauger
|
||||
.%A B. W. Kernighan and P. J. Plauger
|
||||
.%B Software Tools in Pascal
|
||||
.%O Addison-Wesley
|
||||
.%D 1981
|
||||
|
||||
+3
-5
@@ -175,9 +175,7 @@ top:
|
||||
if (read_file(*argv, 0) < 0 && !isatty(0))
|
||||
quit(2);
|
||||
else if (**argv != '!')
|
||||
if (strlcpy(old_filename, *argv, sizeof(old_filename))
|
||||
>= sizeof(old_filename))
|
||||
quit(2);
|
||||
strcpy(old_filename, *argv);
|
||||
} else if (argc) {
|
||||
fputs("?\n", stderr);
|
||||
if (**argv == '\0')
|
||||
@@ -1347,8 +1345,8 @@ strip_escapes(s)
|
||||
int i = 0;
|
||||
|
||||
REALLOC(file, filesz, MAXPATHLEN + 1, NULL);
|
||||
while (i < filesz - 1 /* Worry about a possible trailing escape */
|
||||
&& (file[i++] = (*s == '\\') ? *++s : *s))
|
||||
/* assert: no trailing escape */
|
||||
while ((file[i++] = (*s == '\\') ? *++s : *s))
|
||||
s++;
|
||||
return file;
|
||||
}
|
||||
|
||||
@@ -50,10 +50,6 @@ network initialization script
|
||||
.Pa /etc/rc.network ,
|
||||
normally run at boot
|
||||
time.
|
||||
This script uses the
|
||||
.Va hostname
|
||||
variable in
|
||||
.Pa /etc/rc.conf .
|
||||
.Pp
|
||||
Options:
|
||||
.Bl -tag -width flag
|
||||
@@ -62,8 +58,7 @@ Trim off any domain information from the printed
|
||||
name.
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr gethostname 3 ,
|
||||
.Xr rc.conf 5
|
||||
.Xr gethostname 3
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
|
||||
+9
-6
@@ -110,14 +110,17 @@ ALRM (alarm clock)
|
||||
TERM (software termination signal)
|
||||
.El
|
||||
.Pp
|
||||
Some shells may provide a builtin
|
||||
.Nm Kill
|
||||
is a built-in to
|
||||
.Xr csh 1 ;
|
||||
it allows job specifiers of the form ``%...'' as arguments
|
||||
so process id's are not as often used as
|
||||
.Nm
|
||||
command which is similar or identical to this utility.
|
||||
Consult the
|
||||
.Xr builtin 1
|
||||
manual page.
|
||||
arguments.
|
||||
See
|
||||
.Xr csh 1
|
||||
for details.
|
||||
.Sh SEE ALSO
|
||||
.Xr builtin 1 ,
|
||||
.Xr csh 1 ,
|
||||
.Xr killall 1 ,
|
||||
.Xr ps 1 ,
|
||||
|
||||
@@ -5,7 +5,4 @@ PROG= ln
|
||||
MAN1= ln.1
|
||||
MAN7= symlink.7
|
||||
|
||||
LINKS= ${BINDIR}/ln ${BINDIR}/link
|
||||
MLINKS= ln.1 link.1
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
+3
-27
@@ -39,20 +39,17 @@
|
||||
.Dt LN 1
|
||||
.Os BSD 4
|
||||
.Sh NAME
|
||||
.Nm ln ,
|
||||
.Nm link
|
||||
.Nm ln
|
||||
.Nd make links
|
||||
.Sh SYNOPSIS
|
||||
.Nm ln
|
||||
.Op Fl fsv
|
||||
.Op Fl fs
|
||||
.Ar source_file
|
||||
.Op target_file
|
||||
.Nm ln
|
||||
.Op Fl fsv
|
||||
.Op Fl fs
|
||||
.Ar source_file ...
|
||||
.Op target_dir
|
||||
.Nm link
|
||||
.Ar source_file Ar target_file
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
@@ -75,10 +72,6 @@ The options are as follows:
|
||||
Unlink any already existing file, permitting the link to occur.
|
||||
.It Fl s
|
||||
Create a symbolic link.
|
||||
.It Fl v
|
||||
Cause
|
||||
.Nm
|
||||
to be verbose, showing files as they are processed.
|
||||
.El
|
||||
.Pp
|
||||
By default,
|
||||
@@ -125,15 +118,6 @@ makes links in
|
||||
.Ar target_dir
|
||||
to all the named source files.
|
||||
The links made will have the same name as the files being linked to.
|
||||
.Pp
|
||||
When the utility is called as
|
||||
.Nm link ,
|
||||
exactly two arguments must be supplied,
|
||||
neither of which may specify a directory.
|
||||
No options may be supplied in this simple mode of operation,
|
||||
which performs a
|
||||
.Xr link 2
|
||||
operation using the two passed arguments.
|
||||
.Sh SEE ALSO
|
||||
.Xr link 2 ,
|
||||
.Xr lstat 2 ,
|
||||
@@ -141,16 +125,8 @@ operation using the two passed arguments.
|
||||
.Xr stat 2 ,
|
||||
.Xr symlink 2 ,
|
||||
.Xr symlink 7
|
||||
.Sh COMPATIBILITY
|
||||
The
|
||||
.Fl v
|
||||
option is non-standard and its use in scripts is not recommended.
|
||||
.Sh HISTORY
|
||||
An
|
||||
.Nm
|
||||
command appeared in
|
||||
.At v1 .
|
||||
The simplified
|
||||
.Nm link
|
||||
command conforms to
|
||||
.St -susv2 .
|
||||
+5
-31
@@ -57,10 +57,8 @@ static const char rcsid[] =
|
||||
|
||||
int fflag; /* Unlink existing files. */
|
||||
int sflag; /* Symbolic, not hard, link. */
|
||||
int vflag; /* Verbose output. */
|
||||
/* System link call. */
|
||||
int (*linkf) __P((const char *, const char *));
|
||||
char linkch;
|
||||
|
||||
int linkit __P((char *, char *, int));
|
||||
void usage __P((void));
|
||||
@@ -73,26 +71,9 @@ main(argc, argv)
|
||||
extern int optind;
|
||||
struct stat sb;
|
||||
int ch, exitval;
|
||||
char *p, *sourcedir;
|
||||
char *sourcedir;
|
||||
|
||||
/*
|
||||
* Test for the special case where the utility is called as
|
||||
* "link", for which the functionality provided is greatly
|
||||
* simplified.
|
||||
*/
|
||||
if ((p = rindex(argv[0], '/')) == NULL)
|
||||
p = argv[0];
|
||||
else
|
||||
++p;
|
||||
if (strcmp(p, "link") == 0) {
|
||||
if (argc == 3) {
|
||||
linkf = link;
|
||||
exit(linkit(argv[1], argv[2], 0));
|
||||
} else
|
||||
usage();
|
||||
}
|
||||
|
||||
while ((ch = getopt(argc, argv, "fsv")) != -1)
|
||||
while ((ch = getopt(argc, argv, "fs")) != -1)
|
||||
switch (ch) {
|
||||
case 'f':
|
||||
fflag = 1;
|
||||
@@ -100,9 +81,6 @@ main(argc, argv)
|
||||
case 's':
|
||||
sflag = 1;
|
||||
break;
|
||||
case 'v':
|
||||
vflag = 1;
|
||||
break;
|
||||
case '?':
|
||||
default:
|
||||
usage();
|
||||
@@ -112,7 +90,6 @@ main(argc, argv)
|
||||
argc -= optind;
|
||||
|
||||
linkf = sflag ? symlink : link;
|
||||
linkch = sflag ? '-' : '=';
|
||||
|
||||
switch(argc) {
|
||||
case 0:
|
||||
@@ -176,17 +153,14 @@ linkit(target, source, isdir)
|
||||
warn("%s", source);
|
||||
return (1);
|
||||
}
|
||||
if (vflag)
|
||||
(void)printf("%s %c> %s\n", source, linkch, target);
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
usage()
|
||||
{
|
||||
(void)fprintf(stderr, "%s\n%s\n%s\n",
|
||||
"usage: ln [-fsv] file1 file2",
|
||||
" ln [-fsv] file ... directory",
|
||||
" link file1 file2");
|
||||
(void)fprintf(stderr, "%s\n%s\n",
|
||||
"usage: ln [-fs] file1 file2",
|
||||
" ln [-fs] file ... directory");
|
||||
exit(1);
|
||||
}
|
||||
+1
-2
@@ -132,8 +132,7 @@ The
|
||||
.Bx 4.4
|
||||
system differs from historical 4BSD systems in that the system call
|
||||
.Xr chown 2
|
||||
has been changed to follow symbolic links.
|
||||
The
|
||||
has been changed to follow symbolic links. The
|
||||
.Xr lchown 2
|
||||
system call was added later when the limitations of the new
|
||||
.Xr chown 2
|
||||
|
||||
+3
-3
@@ -44,10 +44,10 @@ int statcmp __P((const FTSENT *, const FTSENT *));
|
||||
int revstatcmp __P((const FTSENT *, const FTSENT *));
|
||||
|
||||
char *flags_to_string __P((u_long, char *));
|
||||
void prcopy __P((char *, char *, int));
|
||||
void printcol __P((DISPLAY *));
|
||||
void printlong __P((DISPLAY *));
|
||||
void printscol __P((DISPLAY *));
|
||||
void usage __P((void));
|
||||
int len_octal __P((const char *, int));
|
||||
int prn_octal __P((const char *));
|
||||
int prn_printable __P((const char *));
|
||||
int len_octal __P((char *, int));
|
||||
int prn_octal __P((char *));
|
||||
+5
-10
@@ -100,8 +100,7 @@ or
|
||||
options are specified.
|
||||
.It Fl L
|
||||
If argument is a symbolic link, list the file or directory the link references
|
||||
rather than the link itself.
|
||||
This option cancels the
|
||||
rather than the link itself. This option cancels the
|
||||
.Fl P
|
||||
option.
|
||||
.It Fl P
|
||||
@@ -146,8 +145,7 @@ If the
|
||||
option is specified, print the file size allocation in kilobytes,
|
||||
not blocks. This option overrides the environment variable BLOCKSIZE.
|
||||
.It Fl l
|
||||
(The lowercase letter ``ell.'') List in long format.
|
||||
(See below.)
|
||||
(The lowercase letter ``ell.'') List in long format. (See below.)
|
||||
If the output is to a terminal, a total sum for all the file
|
||||
sizes is output on a line before the long listing.
|
||||
.It Fl o
|
||||
@@ -254,8 +252,7 @@ the numeric ID's are displayed.
|
||||
.Pp
|
||||
If the file is a character special or block special file,
|
||||
the major and minor device numbers for the file are displayed
|
||||
in the size field.
|
||||
If the file is a symbolic link the pathname of the
|
||||
in the size field. If the file is a symbolic link the pathname of the
|
||||
linked-to file is preceded by
|
||||
.Dq \-> .
|
||||
.Pp
|
||||
@@ -320,8 +317,7 @@ The file is executable or the directory is
|
||||
searchable.
|
||||
.It Sy \-
|
||||
The file is neither readable, writable, executable,
|
||||
nor set-user-ID nor set-group-ID mode, nor sticky.
|
||||
(See below.)
|
||||
nor set-user-ID nor set-group-ID mode, nor sticky. (See below.)
|
||||
.El
|
||||
.Pp
|
||||
These next two apply only to the third character in the last group
|
||||
@@ -331,8 +327,7 @@ These next two apply only to the third character in the last group
|
||||
The sticky bit is set
|
||||
(mode
|
||||
.Li 1000 ) ,
|
||||
but not execute or search permission.
|
||||
(See
|
||||
but not execute or search permission. (See
|
||||
.Xr chmod 1
|
||||
or
|
||||
.Xr sticky 8 . )
|
||||
|
||||
@@ -491,6 +491,8 @@ display(p, list)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (f_nonprint)
|
||||
prcopy(cur->fts_name, cur->fts_name, cur->fts_namelen);
|
||||
if (cur->fts_namelen > maxlen)
|
||||
maxlen = cur->fts_namelen;
|
||||
if (f_octal || f_octal_escape) {
|
||||
|
||||
@@ -48,7 +48,6 @@ extern int f_inode; /* print inode */
|
||||
extern int f_longform; /* long listing format */
|
||||
extern int f_octal; /* print unprintables in octal */
|
||||
extern int f_octal_escape; /* like f_octal but use C escapes if possible */
|
||||
extern int f_nonprint; /* show unprintables as ? */
|
||||
extern int f_sectime; /* print the real time for all files */
|
||||
extern int f_size; /* list size in short listing */
|
||||
extern int f_statustime; /* use time of last mode change */
|
||||
|
||||
+9
-19
@@ -81,21 +81,6 @@ printscol(dp)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* print name in current style
|
||||
*/
|
||||
static int
|
||||
printname(name)
|
||||
const char *name;
|
||||
{
|
||||
if (f_octal || f_octal_escape)
|
||||
return prn_octal(name);
|
||||
else if (f_nonprint)
|
||||
return prn_printable(name);
|
||||
else
|
||||
return printf("%s", name);
|
||||
}
|
||||
|
||||
void
|
||||
printlong(dp)
|
||||
DISPLAY *dp;
|
||||
@@ -142,7 +127,8 @@ printlong(dp)
|
||||
printtime(sp->st_ctime);
|
||||
else
|
||||
printtime(sp->st_mtime);
|
||||
(void)printname(p->fts_name);
|
||||
if (f_octal || f_octal_escape) (void)prn_octal(p->fts_name);
|
||||
else (void)printf("%s", p->fts_name);
|
||||
if (f_type)
|
||||
(void)printtype(sp->st_mode);
|
||||
if (S_ISLNK(sp->st_mode))
|
||||
@@ -242,7 +228,8 @@ printaname(p, inodefield, sizefield)
|
||||
if (f_size)
|
||||
chcnt += printf("%*qd ",
|
||||
(int)sizefield, howmany(sp->st_blocks, blocksize));
|
||||
chcnt += printname(p->fts_name);
|
||||
chcnt += (f_octal || f_octal_escape) ? prn_octal(p->fts_name)
|
||||
: printf("%s", p->fts_name);
|
||||
if (f_type)
|
||||
chcnt += printtype(sp->st_mode);
|
||||
return (chcnt);
|
||||
@@ -323,6 +310,9 @@ printlink(p)
|
||||
return;
|
||||
}
|
||||
path[lnklen] = '\0';
|
||||
(void)printf(" -> ");
|
||||
printname(path);
|
||||
if (f_octal || f_octal_escape) {
|
||||
(void)printf(" -> ");
|
||||
(void)prn_octal(path);
|
||||
}
|
||||
else (void)printf(" -> %s", path);
|
||||
}
|
||||
+11
-13
@@ -56,19 +56,17 @@ static const char rcsid[] =
|
||||
#include "ls.h"
|
||||
#include "extern.h"
|
||||
|
||||
int
|
||||
prn_printable(s)
|
||||
const char *s;
|
||||
void
|
||||
prcopy(src, dest, len)
|
||||
char *src, *dest;
|
||||
int len;
|
||||
{
|
||||
unsigned char c;
|
||||
int n;
|
||||
unsigned char ch;
|
||||
|
||||
for (n = 0; (c = *s) != '\0'; ++s, ++n)
|
||||
if (isprint(c))
|
||||
putchar(c);
|
||||
else
|
||||
putchar('?');
|
||||
return n;
|
||||
while (len--) {
|
||||
ch = *src++;
|
||||
*dest++ = isprint(ch) ? ch : '?';
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -86,7 +84,7 @@ prn_printable(s)
|
||||
|
||||
int
|
||||
len_octal(s, len)
|
||||
const char *s;
|
||||
char *s;
|
||||
int len;
|
||||
{
|
||||
int r = 0;
|
||||
@@ -98,7 +96,7 @@ len_octal(s, len)
|
||||
|
||||
int
|
||||
prn_octal(s)
|
||||
const char *s;
|
||||
char *s;
|
||||
{
|
||||
unsigned char ch;
|
||||
int len = 0;
|
||||
|
||||
-10
@@ -44,11 +44,9 @@
|
||||
.Sh SYNOPSIS
|
||||
.Nm mv
|
||||
.Op Fl f | Fl i
|
||||
.Op Fl v
|
||||
.Ar source target
|
||||
.Nm mv
|
||||
.Op Fl f | Fl i
|
||||
.Op Fl v
|
||||
.Ar source ... directory
|
||||
.Sh DESCRIPTION
|
||||
In its first form, the
|
||||
@@ -97,10 +95,6 @@ the move is attempted.
|
||||
option overrides any previous
|
||||
.Fl f
|
||||
options.)
|
||||
.It Fl v
|
||||
Cause
|
||||
.Nm
|
||||
to be verbose, showing files after they are moved.
|
||||
.El
|
||||
.Pp
|
||||
It is an error for either the
|
||||
@@ -136,10 +130,6 @@ utility exits 0 on success, and >0 if an error occurs.
|
||||
.Xr cp 1 ,
|
||||
.Xr rm 1 ,
|
||||
.Xr symlink 7
|
||||
.Sh COMPATIBILITY
|
||||
The
|
||||
.Fl v
|
||||
option is non-standard and its use in scripts is not recommended.
|
||||
.Sh STANDARDS
|
||||
The
|
||||
.Nm
|
||||
|
||||
+8
-29
@@ -60,12 +60,11 @@ static const char rcsid[] =
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sysexits.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "pathnames.h"
|
||||
|
||||
int fflg, iflg, vflg;
|
||||
int fflg, iflg;
|
||||
|
||||
int copy __P((char *, char *));
|
||||
int do_move __P((char *, char *));
|
||||
@@ -83,7 +82,7 @@ main(argc, argv)
|
||||
int ch;
|
||||
char path[MAXPATHLEN];
|
||||
|
||||
while ((ch = getopt(argc, argv, "fiv")) != -1)
|
||||
while ((ch = getopt(argc, argv, "fi")) != -1)
|
||||
switch (ch) {
|
||||
case 'i':
|
||||
iflg = 1;
|
||||
@@ -93,9 +92,6 @@ main(argc, argv)
|
||||
fflg = 1;
|
||||
iflg = 0;
|
||||
break;
|
||||
case 'v':
|
||||
vflg = 1;
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
}
|
||||
@@ -192,11 +188,8 @@ do_move(from, to)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!rename(from, to)) {
|
||||
if (vflg)
|
||||
printf("%s -> %s\n", from, to);
|
||||
if (!rename(from, to))
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (errno == EXDEV) {
|
||||
struct statfs sfs;
|
||||
@@ -221,7 +214,7 @@ do_move(from, to)
|
||||
* it's a regular file, do the copy internally; otherwise, use
|
||||
* cp and rm.
|
||||
*/
|
||||
if (lstat(from, &sb)) {
|
||||
if (stat(from, &sb)) {
|
||||
warn("%s", from);
|
||||
return (1);
|
||||
}
|
||||
@@ -290,17 +283,6 @@ err: if (unlink(to))
|
||||
}
|
||||
if (fchmod(to_fd, sbp->st_mode))
|
||||
warn("%s: set mode (was: 0%03o)", to, oldmode);
|
||||
/*
|
||||
* XXX
|
||||
* NFS doesn't support chflags; ignore errors unless there's reason
|
||||
* to believe we're losing bits. (Note, this still won't be right
|
||||
* if the server supports flags and we were trying to *remove* flags
|
||||
* on a file that we copied, i.e., that we didn't create.)
|
||||
*/
|
||||
errno = 0;
|
||||
if (fchflags(to_fd, sbp->st_flags))
|
||||
if (errno != EOPNOTSUPP || sbp->st_flags != 0)
|
||||
warn("%s: set flags (was: 0%07o)", to, sbp->st_flags);
|
||||
|
||||
tval[0].tv_sec = sbp->st_atime;
|
||||
tval[1].tv_sec = sbp->st_mtime;
|
||||
@@ -317,8 +299,6 @@ err: if (unlink(to))
|
||||
warn("%s: remove", from);
|
||||
return (1);
|
||||
}
|
||||
if (vflg)
|
||||
printf("%s -> %s\n", from, to);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -329,7 +309,7 @@ copy(from, to)
|
||||
int pid, status;
|
||||
|
||||
if ((pid = fork()) == 0) {
|
||||
execl(_PATH_CP, "mv", vflg ? "-PRpv" : "-PRp", from, to, NULL);
|
||||
execl(_PATH_CP, "mv", "-PRp", from, to, NULL);
|
||||
warn("%s", _PATH_CP);
|
||||
_exit(1);
|
||||
}
|
||||
@@ -370,9 +350,8 @@ copy(from, to)
|
||||
void
|
||||
usage()
|
||||
{
|
||||
|
||||
(void)fprintf(stderr, "%s\n%s\n",
|
||||
"usage: mv [-f | -i] [-v] source target",
|
||||
" mv [-f | -i] [-v] source ... directory");
|
||||
exit(EX_USAGE);
|
||||
"usage: mv [-f | -i] source target",
|
||||
" mv [-f | -i] source ... directory");
|
||||
exit(1);
|
||||
}
|
||||
+2
-4
@@ -480,8 +480,7 @@ cannot be opened for reading and writing.
|
||||
.It Fl k
|
||||
Do not overwrite existing files.
|
||||
.It Fl l
|
||||
Link files.
|
||||
(The letter ell).
|
||||
Link files. (The letter ell).
|
||||
In the
|
||||
.Em copy
|
||||
mode (
|
||||
@@ -624,8 +623,7 @@ The optional trailing
|
||||
.Cm g
|
||||
continues to apply the substitution expression to the pathname substring
|
||||
which starts with the first character following the end of the last successful
|
||||
substitution.
|
||||
The first unsuccessful substitution stops the operation of the
|
||||
substitution. The first unsuccessful substitution stops the operation of the
|
||||
.Cm g
|
||||
option.
|
||||
The optional trailing
|
||||
|
||||
+1
-1
@@ -358,7 +358,7 @@ main(argc, argv)
|
||||
*/
|
||||
printheader();
|
||||
if (nentries == 0)
|
||||
exit(1);
|
||||
exit(0);
|
||||
/*
|
||||
* sort proc list
|
||||
*/
|
||||
|
||||
+3
-13
@@ -47,13 +47,6 @@
|
||||
.Nm Pwd
|
||||
writes the absolute pathname of the current working directory to
|
||||
the standard output.
|
||||
.Pp
|
||||
Some shells may provide a builtin
|
||||
.Nm
|
||||
command which is similar or identical to this utility.
|
||||
Consult the
|
||||
.Xr builtin 1
|
||||
manual page.
|
||||
.Sh DIAGNOSTICS
|
||||
The
|
||||
.Nm
|
||||
@@ -65,17 +58,14 @@ utility is expected to be
|
||||
.St -p1003.2
|
||||
compatible.
|
||||
.Sh SEE ALSO
|
||||
.Xr builtin 1 ,
|
||||
.Xr cd 1 ,
|
||||
.Xr csh 1 ,
|
||||
.Xr getcwd 3 ,
|
||||
.Xr sh 1
|
||||
.Xr getcwd 3
|
||||
.Sh BUGS
|
||||
In
|
||||
.Xr csh 1
|
||||
the command
|
||||
.Ic dirs
|
||||
is always faster because it is built into that shell.
|
||||
However, it can give a different answer in the rare case
|
||||
is always faster (although it can give a different answer in the rare case
|
||||
that the current directory or a containing directory was moved after
|
||||
the shell descended into it.
|
||||
the shell descended into it).
|
||||
+4
-9
@@ -55,9 +55,7 @@ copies files between machines. Each
|
||||
or
|
||||
.Ar directory
|
||||
argument is either a remote file name of the
|
||||
form
|
||||
.Dq rname@rhost:path ,
|
||||
or a local file name (containing no `:' characters,
|
||||
form ``rname@rhost:path'', or a local file name (containing no `:' characters,
|
||||
or a `/' before any `:'s).
|
||||
.Pp
|
||||
The following options are available:
|
||||
@@ -71,7 +69,7 @@ to obtain tickets
|
||||
for the remote host in realm
|
||||
.Ar realm
|
||||
instead of the remote host's realm as determined by
|
||||
.Xr krb_realmofhost 3 .
|
||||
.Xr krb_realmofhost 3 .
|
||||
.It Fl p
|
||||
Cause
|
||||
.Nm
|
||||
@@ -131,9 +129,7 @@ configure authentication services
|
||||
.Xr cp 1 ,
|
||||
.Xr ftp 1 ,
|
||||
.Xr rlogin 1 ,
|
||||
.Xr rsh 1 ,
|
||||
.Xr auth.conf 5 ,
|
||||
.Xr hosts.equiv 5 .
|
||||
.Xr rsh 1
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
@@ -156,8 +152,7 @@ or
|
||||
file on the remote host.
|
||||
.Pp
|
||||
The destination user and hostname may have to be specified as
|
||||
.Dq rhost.rname
|
||||
when the destination machine is running the
|
||||
``rhost.rname'' when the destination machine is running the
|
||||
.Bx 4.2
|
||||
version of
|
||||
.Nm Ns .
|
||||
@@ -4,9 +4,6 @@
|
||||
PROG= rm
|
||||
SRCS= rm.c stat_flags.c
|
||||
|
||||
LINKS= ${BINDIR}/rm ${BINDIR}/unlink
|
||||
MLINKS= rm.1 unlink.1
|
||||
|
||||
.PATH: ${.CURDIR}/../ls
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
+3
-29
@@ -39,15 +39,12 @@
|
||||
.Dt RM 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm rm ,
|
||||
.Nm unlink
|
||||
.Nm rm
|
||||
.Nd remove directory entries
|
||||
.Sh SYNOPSIS
|
||||
.Nm rm
|
||||
.Op Fl dfiPRrvW
|
||||
.Op Fl dfiPRrW
|
||||
.Ar file ...
|
||||
.Nm unlink
|
||||
.Ar file
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
@@ -102,8 +99,6 @@ that directory is skipped.
|
||||
.It Fl r
|
||||
Equivalent to
|
||||
.Fl R .
|
||||
.It Fl v
|
||||
Be verbose when deleting files, showing them as they are removed.
|
||||
.It Fl W
|
||||
Attempt to undelete the named files.
|
||||
Currently, this option can only be used to recover
|
||||
@@ -114,20 +109,7 @@ The
|
||||
.Nm
|
||||
utility removes symbolic links, not the files referenced by the links.
|
||||
.Pp
|
||||
It is an error to attempt to remove the files
|
||||
.Dq \&.
|
||||
or
|
||||
.Dq .. .
|
||||
.Pp
|
||||
When the utility is called as
|
||||
.Nm unlink ,
|
||||
only one argument,
|
||||
which must not be a directory,
|
||||
may be supplied.
|
||||
No options may be supplied in this simple mode of operation,
|
||||
which performs an
|
||||
.Xr unlink 2
|
||||
operation on the passed argument.
|
||||
It is an error to attempt to remove the files ``.'' and ``..''.
|
||||
.Pp
|
||||
The
|
||||
.Nm
|
||||
@@ -179,9 +161,6 @@ utility differs from historical implementations in that the
|
||||
.Fl f
|
||||
option only masks attempts to remove non-existent files instead of
|
||||
masking a large variety of errors.
|
||||
The
|
||||
.Fl v
|
||||
option is non-standard and its use in scripts is not recommended.
|
||||
.Pp
|
||||
Also, historical
|
||||
.Bx
|
||||
@@ -206,11 +185,6 @@ option if such behavior is desired. This follows the historical
|
||||
behavior of
|
||||
.Nm
|
||||
with respect to directories.
|
||||
.Pp
|
||||
The simplified
|
||||
.Nm unlink
|
||||
command conforms to
|
||||
.St -susv2 .
|
||||
.Sh HISTORY
|
||||
A
|
||||
.Nm
|
||||
|
||||
+15
-67
@@ -48,8 +48,6 @@ static const char rcsid[] =
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/mount.h>
|
||||
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
@@ -58,12 +56,11 @@ static const char rcsid[] =
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sysexits.h>
|
||||
#include <unistd.h>
|
||||
|
||||
extern char *flags_to_string __P((u_long, char *));
|
||||
|
||||
int dflag, eval, fflag, iflag, Pflag, vflag, Wflag, stdin_ok;
|
||||
int dflag, eval, fflag, iflag, Pflag, Wflag, stdin_ok;
|
||||
uid_t uid;
|
||||
|
||||
int check __P((char *, char *, struct stat *));
|
||||
@@ -86,27 +83,9 @@ main(argc, argv)
|
||||
char *argv[];
|
||||
{
|
||||
int ch, rflag;
|
||||
char *p;
|
||||
|
||||
/*
|
||||
* Test for the special case where the utility is called as
|
||||
* "unlink", for which the functionality provided is greatly
|
||||
* simplified.
|
||||
*/
|
||||
if ((p = rindex(argv[0], '/')) == NULL)
|
||||
p = argv[0];
|
||||
else
|
||||
++p;
|
||||
if (strcmp(p, "unlink") == 0) {
|
||||
if (argc == 2) {
|
||||
rm_file(&argv[1]);
|
||||
exit(eval);
|
||||
} else
|
||||
usage();
|
||||
}
|
||||
|
||||
Pflag = rflag = 0;
|
||||
while ((ch = getopt(argc, argv, "dfiPRrvW")) != -1)
|
||||
while ((ch = getopt(argc, argv, "dfiPRrW")) != -1)
|
||||
switch(ch) {
|
||||
case 'd':
|
||||
dflag = 1;
|
||||
@@ -126,9 +105,6 @@ main(argc, argv)
|
||||
case 'r': /* Compatibility. */
|
||||
rflag = 1;
|
||||
break;
|
||||
case 'v':
|
||||
vflag = 1;
|
||||
break;
|
||||
case 'W':
|
||||
Wflag = 1;
|
||||
break;
|
||||
@@ -243,7 +219,7 @@ rm_tree(argv)
|
||||
!(p->fts_statp->st_flags & (SF_APPEND|SF_IMMUTABLE)))
|
||||
rval = chflags(p->fts_accpath,
|
||||
p->fts_statp->st_flags &= ~(UF_APPEND|UF_IMMUTABLE));
|
||||
if (rval == 0) {
|
||||
if (!rval) {
|
||||
/*
|
||||
* If we can't read or search the directory, may still be
|
||||
* able to remove it. Don't print out the un{read,search}able
|
||||
@@ -252,35 +228,21 @@ rm_tree(argv)
|
||||
switch (p->fts_info) {
|
||||
case FTS_DP:
|
||||
case FTS_DNR:
|
||||
rval = rmdir(p->fts_accpath);
|
||||
if (rval == 0 || (fflag && errno == ENOENT)) {
|
||||
if (rval == 0 && vflag)
|
||||
(void)printf("%s\n",
|
||||
p->fts_accpath);
|
||||
if (!rmdir(p->fts_accpath) || (fflag && errno == ENOENT))
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
|
||||
case FTS_W:
|
||||
rval = undelete(p->fts_accpath);
|
||||
if (rval == 0 && (fflag && errno == ENOENT)) {
|
||||
if (vflag)
|
||||
(void)printf("%s\n",
|
||||
p->fts_accpath);
|
||||
if (!undelete(p->fts_accpath) ||
|
||||
(fflag && errno == ENOENT))
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
if (Pflag)
|
||||
rm_overwrite(p->fts_accpath, NULL);
|
||||
rval = unlink(p->fts_accpath);
|
||||
if (rval == 0 || (fflag && errno == ENOENT)) {
|
||||
if (rval == 0 && vflag)
|
||||
(void)printf("%s\n",
|
||||
p->fts_accpath);
|
||||
if (!unlink(p->fts_accpath) || (fflag && errno == ENOENT))
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
err:
|
||||
@@ -333,7 +295,7 @@ rm_file(argv)
|
||||
(sb.st_flags & (UF_APPEND|UF_IMMUTABLE)) &&
|
||||
!(sb.st_flags & (SF_APPEND|SF_IMMUTABLE)))
|
||||
rval = chflags(f, sb.st_flags & ~(UF_APPEND|UF_IMMUTABLE));
|
||||
if (rval == 0) {
|
||||
if (!rval) {
|
||||
if (S_ISWHT(sb.st_mode))
|
||||
rval = undelete(f);
|
||||
else if (S_ISDIR(sb.st_mode))
|
||||
@@ -348,8 +310,6 @@ rm_file(argv)
|
||||
warn("%s", f);
|
||||
eval = 1;
|
||||
}
|
||||
if (vflag && rval == 0)
|
||||
(void)printf("%s\n", f);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -370,10 +330,9 @@ rm_overwrite(file, sbp)
|
||||
struct stat *sbp;
|
||||
{
|
||||
struct stat sb;
|
||||
struct statfs fsb;
|
||||
off_t len;
|
||||
int bsize, fd, wlen;
|
||||
char *buf = NULL;
|
||||
int fd, wlen;
|
||||
char buf[8 * 1024];
|
||||
|
||||
fd = -1;
|
||||
if (sbp == NULL) {
|
||||
@@ -385,16 +344,11 @@ rm_overwrite(file, sbp)
|
||||
return;
|
||||
if ((fd = open(file, O_WRONLY, 0)) == -1)
|
||||
goto err;
|
||||
if (fstatfs(fd, &fsb) == -1)
|
||||
goto err;
|
||||
bsize = MAX(fsb.f_iosize, 1024);
|
||||
if ((buf = malloc(bsize)) == NULL)
|
||||
err(1, "malloc");
|
||||
|
||||
#define PASS(byte) { \
|
||||
memset(buf, byte, bsize); \
|
||||
memset(buf, byte, sizeof(buf)); \
|
||||
for (len = sbp->st_size; len > 0; len -= wlen) { \
|
||||
wlen = len < bsize ? len : bsize; \
|
||||
wlen = len < sizeof(buf) ? len : sizeof(buf); \
|
||||
if (write(fd, buf, wlen) != wlen) \
|
||||
goto err; \
|
||||
} \
|
||||
@@ -406,14 +360,10 @@ rm_overwrite(file, sbp)
|
||||
if (fsync(fd) || lseek(fd, (off_t)0, SEEK_SET))
|
||||
goto err;
|
||||
PASS(0xff);
|
||||
if (!fsync(fd) && !close(fd)) {
|
||||
free(buf);
|
||||
if (!fsync(fd) && !close(fd))
|
||||
return;
|
||||
}
|
||||
|
||||
err: eval = 1;
|
||||
if (buf)
|
||||
free(buf);
|
||||
warn("%s", file);
|
||||
}
|
||||
|
||||
@@ -490,8 +440,6 @@ void
|
||||
usage()
|
||||
{
|
||||
|
||||
(void)fprintf(stderr, "%s\n%s\n",
|
||||
"usage: rm [-f | -i] [-dPRrvW] file ...",
|
||||
" unlink file");
|
||||
exit(EX_USAGE);
|
||||
(void)fprintf(stderr, "usage: rm [-f | -i] [-dPRrW] file ...\n");
|
||||
exit(1);
|
||||
}
|
||||
@@ -10,10 +10,6 @@ GENSRCS= builtins.c init.c nodes.c syntax.c
|
||||
GENHDRS= builtins.h nodes.h syntax.h token.h y.tab.h
|
||||
SRCS= ${SHSRCS} ${GENSRCS} ${GENHDRS} y.tab.h
|
||||
|
||||
# MLINKS for Shell built in commands for which there are no userland
|
||||
# utilities of the same name are handled with the associated manpage,
|
||||
# builtin.1 in share/man/man1/.
|
||||
|
||||
DPADD+= ${LIBL} ${LIBEDIT} ${LIBTERMCAP}
|
||||
LDADD+= -ll -ledit -ltermcap
|
||||
|
||||
|
||||
@@ -109,7 +109,6 @@ setalias(name, val)
|
||||
ap->val[len+1] = '\0';
|
||||
}
|
||||
#endif
|
||||
ap->flag = 0;
|
||||
ap->next = *app;
|
||||
*app = ap;
|
||||
INTON;
|
||||
|
||||
+1
-1
@@ -342,7 +342,7 @@ getpwd()
|
||||
|
||||
INTOFF;
|
||||
if (pipe(pip) < 0)
|
||||
error("Pipe call failed: %s", strerror(errno));
|
||||
error("Pipe call failed");
|
||||
jp = makejob((union node *)NULL, 1);
|
||||
if (forkshell(jp, (union node *)NULL, FORK_NOJOB) == 0) {
|
||||
(void) close(pip[0]);
|
||||
|
||||
@@ -51,7 +51,6 @@ static const char rcsid[] =
|
||||
#include "options.h"
|
||||
#include "output.h"
|
||||
#include "error.h"
|
||||
#include "nodes.h" /* show.h needs nodes.h */
|
||||
#include "show.h"
|
||||
#include "trap.h"
|
||||
#include <signal.h>
|
||||
|
||||
+6
-41
@@ -45,7 +45,6 @@ static const char rcsid[] =
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h> /* For WIFSIGNALED(status) */
|
||||
#include <errno.h>
|
||||
|
||||
/*
|
||||
* Evaluate a command.
|
||||
@@ -276,14 +275,7 @@ evaltree(n, flags)
|
||||
out:
|
||||
if (pendingsigs)
|
||||
dotrap();
|
||||
/*
|
||||
* XXX - Like "!(n->type == NSEMI)", more types will probably
|
||||
* need to be excluded from this test. It's probably better
|
||||
* to set or unset EV_TESTED in the loop above than to bloat
|
||||
* the conditional here.
|
||||
*/
|
||||
if ((flags & EV_EXIT) || (eflag && exitstatus
|
||||
&& !(flags & EV_TESTED) && !(n->type == NSEMI)))
|
||||
if ((flags & EV_EXIT) || (eflag && exitstatus && !(flags & EV_TESTED)))
|
||||
exitshell(exitstatus);
|
||||
}
|
||||
|
||||
@@ -489,7 +481,7 @@ evalpipe(n)
|
||||
if (lp->next) {
|
||||
if (pipe(pip) < 0) {
|
||||
close(prevfd);
|
||||
error("Pipe call failed: %s", strerror(errno));
|
||||
error("Pipe call failed");
|
||||
}
|
||||
}
|
||||
if (forkshell(jp, lp->n, n->npipe.backgnd) == 0) {
|
||||
@@ -500,8 +492,7 @@ evalpipe(n)
|
||||
close(prevfd);
|
||||
}
|
||||
if (pip[1] >= 0) {
|
||||
if (!(prevfd >= 0 && pip[0] == 0))
|
||||
close(pip[0]);
|
||||
close(pip[0]);
|
||||
if (pip[1] != 1) {
|
||||
close(1);
|
||||
copyfd(pip[1], 1);
|
||||
@@ -557,7 +548,7 @@ evalbackcmd(n, result)
|
||||
} else {
|
||||
exitstatus = 0;
|
||||
if (pipe(pip) < 0)
|
||||
error("Pipe call failed: %s", strerror(errno));
|
||||
error("Pipe call failed");
|
||||
jp = makejob(n, 1);
|
||||
if (forkshell(jp, n, FORK_NOJOB) == 0) {
|
||||
FORCEINTON;
|
||||
@@ -612,14 +603,12 @@ evalcommand(cmd, flags, backcmd)
|
||||
volatile int e;
|
||||
char *lastarg;
|
||||
int realstatus;
|
||||
int do_clearcmdentry;
|
||||
#if __GNUC__
|
||||
/* Avoid longjmp clobbering */
|
||||
(void) &argv;
|
||||
(void) &argc;
|
||||
(void) &lastarg;
|
||||
(void) &flags;
|
||||
(void) &do_clearcmdentry;
|
||||
#endif
|
||||
|
||||
/* First expand the arguments. */
|
||||
@@ -628,7 +617,6 @@ evalcommand(cmd, flags, backcmd)
|
||||
arglist.lastp = &arglist.list;
|
||||
varlist.lastp = &varlist.list;
|
||||
varflag = 1;
|
||||
do_clearcmdentry = 0;
|
||||
oexitstatus = exitstatus;
|
||||
exitstatus = 0;
|
||||
for (argp = cmd->ncmd.args ; argp ; argp = argp->narg.next) {
|
||||
@@ -691,29 +679,8 @@ evalcommand(cmd, flags, backcmd)
|
||||
* is present
|
||||
*/
|
||||
for (sp = varlist.list ; sp ; sp = sp->next)
|
||||
if (strncmp(sp->text, PATH, sizeof(PATH) - 1) == 0) {
|
||||
if (strncmp(sp->text, PATH, sizeof(PATH) - 1) == 0)
|
||||
path = sp->text + sizeof(PATH) - 1;
|
||||
/*
|
||||
* On `PATH=... command`, we need to make
|
||||
* sure that the command isn't using the
|
||||
* non-updated hash table of the outer PATH
|
||||
* setting and we need to make sure that
|
||||
* the hash table isn't filled with items
|
||||
* from the temporary setting.
|
||||
*
|
||||
* It would be better to forbit using and
|
||||
* updating the table while this command
|
||||
* runs, by the command finding mechanism
|
||||
* is heavily integrated with hash handling,
|
||||
* so we just delete the hash before and after
|
||||
* the command runs. Partly deleting like
|
||||
* changepatch() does doesn't seem worth the
|
||||
* bookinging effort, since most such runs add
|
||||
* diretories in front of the new PATH.
|
||||
*/
|
||||
clearcmdentry(0);
|
||||
do_clearcmdentry = 1;
|
||||
}
|
||||
|
||||
find_command(argv[0], &cmdentry, 1, path);
|
||||
if (cmdentry.cmdtype == CMDUNKNOWN) { /* command not found */
|
||||
@@ -753,7 +720,7 @@ evalcommand(cmd, flags, backcmd)
|
||||
if (flags & EV_BACKCMD) {
|
||||
mode = FORK_NOJOB;
|
||||
if (pipe(pip) < 0)
|
||||
error("Pipe call failed: %s", strerror(errno));
|
||||
error("Pipe call failed");
|
||||
}
|
||||
if (forkshell(jp, cmd, mode) != 0)
|
||||
goto parent; /* at end of routine */
|
||||
@@ -911,8 +878,6 @@ parent: /* parent process gets here (if we forked) */
|
||||
out:
|
||||
if (lastarg)
|
||||
setvar("_", lastarg, 0);
|
||||
if (do_clearcmdentry)
|
||||
clearcmdentry(0);
|
||||
popstackmark(&smark);
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -104,6 +104,7 @@ STATIC void tryexec __P((char *, char **, char **));
|
||||
STATIC void execinterp __P((char **, char **));
|
||||
#endif
|
||||
STATIC void printentry __P((struct tblentry *, int));
|
||||
STATIC void clearcmdentry __P((int));
|
||||
STATIC struct tblentry *cmdlookup __P((char *, int));
|
||||
STATIC void delete_cmd_entry __P((void));
|
||||
|
||||
@@ -639,7 +640,7 @@ changepath(newval)
|
||||
* PATH which has changed.
|
||||
*/
|
||||
|
||||
void
|
||||
STATIC void
|
||||
clearcmdentry(firstchange)
|
||||
int firstchange;
|
||||
{
|
||||
|
||||
@@ -69,4 +69,3 @@ void addcmdentry __P((char *, struct cmdentry *));
|
||||
void defun __P((char *, union node *));
|
||||
int unsetfunc __P((char *));
|
||||
int typecmd __P((int, char **));
|
||||
void clearcmdentry __P((int));
|
||||
+4
-5
@@ -315,7 +315,7 @@ done:
|
||||
goto lose;
|
||||
*p = c;
|
||||
while ((c = *home++) != '\0') {
|
||||
if (quotes && c >= 0 && SQSYNTAX[(int)c] == CCTL)
|
||||
if (quotes && SQSYNTAX[c] == CCTL)
|
||||
STPUTC(CTLESC, expdest);
|
||||
STPUTC(c, expdest);
|
||||
}
|
||||
@@ -478,7 +478,7 @@ expbackq(cmd, quoted, flag)
|
||||
}
|
||||
lastc = *p++;
|
||||
if (lastc != '\0') {
|
||||
if (quotes && lastc >= 0 && syntax[(int)lastc] == CCTL)
|
||||
if (quotes && syntax[lastc] == CCTL)
|
||||
STPUTC(CTLESC, dest);
|
||||
STPUTC(lastc, dest);
|
||||
}
|
||||
@@ -694,8 +694,7 @@ again: /* jump here after setting a variable with ${var=text} */
|
||||
}
|
||||
else {
|
||||
while (*val) {
|
||||
if (quotes && *val >= 0 &&
|
||||
syntax[(int)*val] == CCTL)
|
||||
if (quotes && syntax[*val] == CCTL)
|
||||
STPUTC(CTLESC, expdest);
|
||||
STPUTC(*val++, expdest);
|
||||
}
|
||||
@@ -866,7 +865,7 @@ varvalue(name, quoted, allow_split)
|
||||
if (allow_split) { \
|
||||
syntax = quoted? DQSYNTAX : BASESYNTAX; \
|
||||
while (*p) { \
|
||||
if (*p >= 0 && syntax[(int)*p] == CCTL) \
|
||||
if (syntax[*p] == CCTL) \
|
||||
STPUTC(CTLESC, expdest); \
|
||||
STPUTC(*p++, expdest); \
|
||||
} \
|
||||
|
||||
+2
-1
@@ -232,6 +232,7 @@ preadbuffer()
|
||||
char *p, *q;
|
||||
int more;
|
||||
int something;
|
||||
extern EditLine *el;
|
||||
char savec;
|
||||
|
||||
if (parsefile->strpush) {
|
||||
@@ -383,7 +384,7 @@ setinputfile(fname, push)
|
||||
|
||||
INTOFF;
|
||||
if ((fd = open(fname, O_RDONLY)) < 0)
|
||||
error("Can't open %s: %s", fname, strerror(errno));
|
||||
error("Can't open %s", fname);
|
||||
if (fd < 10) {
|
||||
fd2 = copyfd(fd, 10);
|
||||
close(fd);
|
||||
|
||||
+3
-5
@@ -594,7 +594,7 @@ forkshell(jp, n, mode)
|
||||
if (pid == -1) {
|
||||
TRACE(("Fork failed, errno=%d\n", errno));
|
||||
INTON;
|
||||
error("Cannot fork: %s", strerror(errno));
|
||||
error("Cannot fork");
|
||||
}
|
||||
if (pid == 0) {
|
||||
struct job *p;
|
||||
@@ -636,8 +636,7 @@ forkshell(jp, n, mode)
|
||||
! fd0_redirected_p ()) {
|
||||
close(0);
|
||||
if (open("/dev/null", O_RDONLY) != 0)
|
||||
error("Can't open /dev/null: %s",
|
||||
strerror(errno));
|
||||
error("Can't open /dev/null");
|
||||
}
|
||||
}
|
||||
#else
|
||||
@@ -648,8 +647,7 @@ forkshell(jp, n, mode)
|
||||
! fd0_redirected_p ()) {
|
||||
close(0);
|
||||
if (open("/dev/null", O_RDONLY) != 0)
|
||||
error("Can't open /dev/null: %s",
|
||||
strerror(errno));
|
||||
error("Can't open /dev/null");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
+1
-1
@@ -300,7 +300,7 @@ readcmdfile(name)
|
||||
if ((fd = open(name, O_RDONLY)) >= 0)
|
||||
setinputfd(fd, 1);
|
||||
else
|
||||
error("Can't open %s: %s", name, strerror(errno));
|
||||
error("Can't open %s", name);
|
||||
INTON;
|
||||
cmdloop(0);
|
||||
popfile();
|
||||
|
||||
@@ -187,6 +187,10 @@ popstackmark(mark)
|
||||
|
||||
INTOFF;
|
||||
while (stackp != mark->stackp) {
|
||||
if (stackp == NULL) {
|
||||
write(2, "Oops, stackp deleted\n", 21);
|
||||
abort();
|
||||
}
|
||||
sp = stackp;
|
||||
stackp = sp->prev;
|
||||
ckfree(sp);
|
||||
|
||||
+1
-4
@@ -348,9 +348,6 @@ static const struct limits limits[] = {
|
||||
#endif
|
||||
#ifdef RLIMIT_SWAP
|
||||
{ "swap limit", "kbytes", RLIMIT_SWAP, 1024, 'w' },
|
||||
#endif
|
||||
#ifdef RLIMIT_SBSIZE
|
||||
{ "sbsize", "bytes", RLIMIT_SBSIZE, 1, 'b' },
|
||||
#endif
|
||||
{ (char *) 0, (char *)0, 0, 0, '\0' }
|
||||
};
|
||||
@@ -370,7 +367,7 @@ ulimitcmd(argc, argv)
|
||||
struct rlimit limit;
|
||||
|
||||
what = 'f';
|
||||
while ((optc = nextopt("HSatfdsmcnulb")) != '\0')
|
||||
while ((optc = nextopt("HSatfdsmcnul")) != '\0')
|
||||
switch (optc) {
|
||||
case 'H':
|
||||
how = HARD;
|
||||
|
||||
+1
-2
@@ -66,7 +66,6 @@ static const char rcsid[] =
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
/*
|
||||
@@ -479,7 +478,7 @@ ckfopen(file, mode)
|
||||
FILE *fp;
|
||||
|
||||
if ((fp = fopen(file, mode)) == NULL) {
|
||||
fprintf(stderr, "Can't open %s: %s\n", file, strerror(errno));
|
||||
fprintf(stderr, "Can't open %s\n", file);
|
||||
exit(2);
|
||||
}
|
||||
return fp;
|
||||
|
||||
+3
-4
@@ -56,7 +56,6 @@ static const char rcsid[] =
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#ifdef __STDC__
|
||||
#include <stdarg.h>
|
||||
#else
|
||||
@@ -124,7 +123,7 @@ main(argc, argv)
|
||||
if (argc != 3)
|
||||
error("usage: mknodes file");
|
||||
if ((infp = fopen(argv[1], "r")) == NULL)
|
||||
error("Can't open %s: %s", argv[1], strerror(errno));
|
||||
error("Can't open %s", argv[1]);
|
||||
while (readline()) {
|
||||
if (line[0] == ' ' || line[0] == '\t')
|
||||
parsefield();
|
||||
@@ -233,9 +232,9 @@ output(file)
|
||||
char *p;
|
||||
|
||||
if ((patfile = fopen(file, "r")) == NULL)
|
||||
error("Can't open %s: %s", file, strerror(errno));
|
||||
error("Can't open %s", file);
|
||||
if ((hfile = fopen("nodes.h", "w")) == NULL)
|
||||
error("Can't create nodes.h: %s", strerror(errno));
|
||||
error("Can't create nodes.h");
|
||||
if ((cfile = fopen("nodes.c", "w")) == NULL)
|
||||
error("Can't create nodes.c");
|
||||
fputs(writer, hfile);
|
||||
|
||||
+1
-1
@@ -350,7 +350,7 @@ print(name)
|
||||
*/
|
||||
|
||||
static char *macro[] = {
|
||||
"#define is_digit(c)\t((c >= 0 && is_type+SYNBASE)[c] & ISDIGIT)",
|
||||
"#define is_digit(c)\t((is_type+SYNBASE)[c] & ISDIGIT)",
|
||||
"#define is_alpha(c)\t((c) != PEOF && ((c) < CTLESC || (c) > CTLENDARI) && isalpha((unsigned char) (c)))",
|
||||
"#define is_name(c)\t((c) != PEOF && ((c) < CTLESC || (c) > CTLENDARI) && ((c) == '_' || isalpha((unsigned char) (c))))",
|
||||
"#define is_in_name(c)\t((c) != PEOF && ((c) < CTLESC || (c) > CTLENDARI) && ((c) == '_' || isalnum((unsigned char) (c))))",
|
||||
|
||||
+6
-15
@@ -868,7 +868,6 @@ readtoken1(firstc, syntax, eofmark, striptabs)
|
||||
int parenlevel; /* levels of parens in arithmetic */
|
||||
int oldstyle;
|
||||
char const *prevsyntax; /* syntax before arithmetic */
|
||||
int synentry;
|
||||
#if __GNUC__
|
||||
/* Avoid longjmp clobbering */
|
||||
(void) &out;
|
||||
@@ -880,7 +879,6 @@ readtoken1(firstc, syntax, eofmark, striptabs)
|
||||
(void) &oldstyle;
|
||||
(void) &prevsyntax;
|
||||
(void) &syntax;
|
||||
(void) &synentry;
|
||||
#endif
|
||||
|
||||
startlinno = plinno;
|
||||
@@ -908,13 +906,7 @@ readtoken1(firstc, syntax, eofmark, striptabs)
|
||||
CHECKEND(); /* set c to PEOF if at end of here document */
|
||||
for (;;) { /* until end of line or end of word */
|
||||
CHECKSTRSPACE(3, out); /* permit 3 calls to USTPUTC */
|
||||
|
||||
if (c < 0 && c != PEOF)
|
||||
synentry = CWORD;
|
||||
else
|
||||
synentry = syntax[c];
|
||||
|
||||
switch(synentry) {
|
||||
switch(syntax[c]) {
|
||||
case CNL: /* '\n' */
|
||||
if (syntax == BASESYNTAX)
|
||||
goto endword; /* exit outer loop */
|
||||
@@ -945,11 +937,10 @@ readtoken1(firstc, syntax, eofmark, striptabs)
|
||||
else
|
||||
setprompt(0);
|
||||
} else {
|
||||
if (dblquote && c != '\\' &&
|
||||
c != '`' && c != '$' &&
|
||||
(c != '"' || eofmark != NULL))
|
||||
if (dblquote && c != '\\' && c != '`' && c != '$'
|
||||
&& (c != '"' || eofmark != NULL))
|
||||
USTPUTC('\\', out);
|
||||
if (c >= 0 && SQSYNTAX[c] == CCTL)
|
||||
if (SQSYNTAX[c] == CCTL)
|
||||
USTPUTC(CTLESC, out);
|
||||
else if (eofmark == NULL)
|
||||
USTPUTC(CTLQUOTEMARK, out);
|
||||
@@ -1248,7 +1239,7 @@ badsub: synerror("Bad substitution");
|
||||
} else {
|
||||
pungetc();
|
||||
}
|
||||
if (subtype != VSLENGTH && (dblquote || arinest))
|
||||
if (dblquote || arinest)
|
||||
flags |= VSQUOTE;
|
||||
*(stackblock() + typeloc) = subtype | flags;
|
||||
if (subtype != VSNORMAL)
|
||||
@@ -1466,7 +1457,7 @@ noexpand(text)
|
||||
continue;
|
||||
if (c == CTLESC)
|
||||
p++;
|
||||
else if (c >= 0 && BASESYNTAX[(int)c] == CCTL)
|
||||
else if (BASESYNTAX[c] == CCTL)
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
|
||||
+1
-1
@@ -246,7 +246,7 @@ openhere(redir)
|
||||
int len = 0;
|
||||
|
||||
if (pipe(pip) < 0)
|
||||
error("Pipe call failed: %s", strerror(errno));
|
||||
error("Pipe call failed");
|
||||
if (redir->type == NHERE) {
|
||||
len = strlen(redir->nhere.doc->narg.text);
|
||||
if (len <= PIPESIZE) {
|
||||
|
||||
+569
-1036
File diff suppressed because it is too large.
Load diff
+1
-1
@@ -420,7 +420,7 @@ opentrace() {
|
||||
scopy("./trace", s);
|
||||
#endif /* not_this_way */
|
||||
if ((tracefile = fopen(s, "a")) == NULL) {
|
||||
fprintf(stderr, "Can't open %s: %s\n", s, strerror(errno));
|
||||
fprintf(stderr, "Can't open %s\n", s);
|
||||
return;
|
||||
}
|
||||
#ifdef O_APPEND
|
||||
|
||||
+15
-23
@@ -42,7 +42,7 @@
|
||||
.Nm sleep
|
||||
.Nd suspend execution for an interval of time
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Nm sleep
|
||||
.Ar seconds
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
@@ -50,34 +50,25 @@ The
|
||||
command
|
||||
suspends execution for a minimum of
|
||||
.Ar seconds .
|
||||
.Nm Sleep
|
||||
is used to schedule the execution of other commands (see
|
||||
.Sx EXAMPLES
|
||||
below).
|
||||
.Pp
|
||||
If the
|
||||
.Nm
|
||||
command receives a signal, it takes the standard action.
|
||||
.Sh IMPLEMENTATION NOTES
|
||||
The
|
||||
.Dv SIGALRM
|
||||
signal is not handled specially by this implementation.
|
||||
.Pp
|
||||
The
|
||||
.Nm
|
||||
command will accept and honor a non-integer number of specified seconds
|
||||
.Po
|
||||
with a
|
||||
.Ql \&.
|
||||
character as a decimal point
|
||||
.Pc .
|
||||
.Bf Sy
|
||||
This is a non-portable extension, and its use will nearly guarantee that
|
||||
a shell script will not execute properly on another system.
|
||||
.Ef
|
||||
command
|
||||
receives a SIGALRM signal, it terminates normally with a zero exit status,
|
||||
for any other signal it takes the standard action.
|
||||
.Sh DIAGNOSTICS
|
||||
The
|
||||
.Nm
|
||||
utility exits with one of the following values:
|
||||
.Bl -tag -width flag
|
||||
.It Li \&0
|
||||
On successful completion.
|
||||
On successful completion, or if the signal
|
||||
.Dv SIGALRM
|
||||
was received.
|
||||
.It Li \&>\&0
|
||||
An error occurred.
|
||||
.El
|
||||
@@ -89,8 +80,7 @@ number seconds later:
|
||||
.Dl (sleep 1800; sh command_file >& errors)&
|
||||
.Pp
|
||||
This incantation would wait a half hour before
|
||||
running the script command_file.
|
||||
(See the
|
||||
running the script command_file. (See the
|
||||
.Xr at 1
|
||||
utility.)
|
||||
.Pp
|
||||
@@ -121,7 +111,9 @@ when the file is found, then another portion processing
|
||||
is done courteously by sleeping for 70 seconds in between each
|
||||
awk job.
|
||||
.Sh SEE ALSO
|
||||
.Xr nanosleep 2 ,
|
||||
.Xr at 1 ,
|
||||
.Xr setitimer 2 ,
|
||||
.Xr alarm 3 ,
|
||||
.Xr sleep 3
|
||||
.Sh STANDARDS
|
||||
The
|
||||
|
||||
+4
-56
@@ -45,11 +45,8 @@ static const char rcsid[] =
|
||||
"$FreeBSD$";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
void usage __P((void));
|
||||
@@ -59,71 +56,22 @@ main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
struct timespec time_to_sleep;
|
||||
long l;
|
||||
int ch, neg;
|
||||
char *p;
|
||||
int ch, secs;
|
||||
|
||||
while ((ch = getopt(argc, argv, "")) != -1)
|
||||
switch(ch) {
|
||||
case '?':
|
||||
default:
|
||||
usage();
|
||||
/* NOTREACHED */
|
||||
}
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
if (argc != 1) {
|
||||
if (argc != 1)
|
||||
usage();
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
p = argv[0];
|
||||
|
||||
/* Skip over leading whitespaces. */
|
||||
while (isspace((unsigned char)*p))
|
||||
++p;
|
||||
|
||||
/* Check for optional `+' or `-' sign. */
|
||||
neg = 0;
|
||||
if (*p == '-') {
|
||||
neg = 1;
|
||||
++p;
|
||||
}
|
||||
else if (*p == '+')
|
||||
++p;
|
||||
|
||||
/* Calculate seconds. */
|
||||
if (isdigit((unsigned char)*p)) {
|
||||
l = strtol(p, &p, 10);
|
||||
if (l > INT_MAX) {
|
||||
/*
|
||||
* Avoid overflow when `seconds' is huge. This assumes
|
||||
* that the maximum value for a time_t is >= INT_MAX.
|
||||
*/
|
||||
l = INT_MAX;
|
||||
}
|
||||
} else
|
||||
l = 0;
|
||||
time_to_sleep.tv_sec = (time_t)l;
|
||||
|
||||
/* Calculate nanoseconds. */
|
||||
time_to_sleep.tv_nsec = 0;
|
||||
|
||||
if (*p == '.') { /* Decimal point. */
|
||||
l = 100000000L;
|
||||
do {
|
||||
if (isdigit((unsigned char)*++p))
|
||||
time_to_sleep.tv_nsec += (*p - '0') * l;
|
||||
else
|
||||
break;
|
||||
} while (l /= 10);
|
||||
}
|
||||
|
||||
if (!neg && (time_to_sleep.tv_sec > 0 || time_to_sleep.tv_nsec > 0))
|
||||
(void)nanosleep(&time_to_sleep, (struct timespec *)NULL);
|
||||
|
||||
if ((secs = atoi(*argv)) > 0)
|
||||
(void)sleep(secs);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
+2
-4
@@ -313,8 +313,7 @@ If
|
||||
is set, echo control characters as ^X. Otherwise control characters
|
||||
echo as themselves.
|
||||
.It Cm echoprt Pq Fl echoprt
|
||||
For printing terminals.
|
||||
If set, echo erased characters backwards within ``\\''
|
||||
For printing terminals. If set, echo erased characters backwards within ``\\''
|
||||
and ``/''. Otherwise, disable this feature.
|
||||
.It Cm noflsh Pq Fl noflsh
|
||||
Disable (enable) flush after
|
||||
@@ -468,8 +467,7 @@ performed by either the terminal hardware or by the remote side connected
|
||||
to a pty.
|
||||
.It Cm raw Pq Fl raw
|
||||
If set, change the modes of the terminal so that no input or output processing
|
||||
is performed.
|
||||
If unset, change the modes of the terminal to some reasonable
|
||||
is performed. If unset, change the modes of the terminal to some reasonable
|
||||
state that performs input and output processing. Note that since the
|
||||
terminal driver no longer has a single
|
||||
.Dv RAW
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
# $FreeBSD$
|
||||
|
||||
PROG= test
|
||||
SRCS= test.c operators.c
|
||||
LINKS= ${BINDIR}/test ${BINDIR}/[
|
||||
MLINKS= test.1 '[.1'
|
||||
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
/*-
|
||||
* Copyright (c) 1990, 1993
|
||||
* Copyright (c) 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* Chris Torek.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
@@ -32,80 +29,137 @@
|
||||
* 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.
|
||||
*
|
||||
* From: static char sccsid[] = "@(#)strtoul.c 8.1 (Berkeley) 6/4/93";
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/ctype.h>
|
||||
#include <machine/limits.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)operators.c 8.3 (Berkeley) 4/2/94";
|
||||
#endif
|
||||
static const char rcsid[] =
|
||||
"$FreeBSD$";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
* Convert a string to an unsigned long integer.
|
||||
*
|
||||
* Ignores `locale' stuff. Assumes that the upper and lower case
|
||||
* alphabets and digits are each contiguous.
|
||||
* Operators used in the test command.
|
||||
*/
|
||||
unsigned long
|
||||
strtoul(nptr, endptr, base)
|
||||
const char *nptr;
|
||||
char **endptr;
|
||||
int base;
|
||||
{
|
||||
const char *s = nptr;
|
||||
unsigned long acc;
|
||||
unsigned char c;
|
||||
unsigned long cutoff;
|
||||
int neg = 0, any, cutlim;
|
||||
|
||||
/*
|
||||
* See strtol for comments as to the logic used.
|
||||
*/
|
||||
do {
|
||||
c = *s++;
|
||||
} while (isspace(c));
|
||||
if (c == '-') {
|
||||
neg = 1;
|
||||
c = *s++;
|
||||
} else if (c == '+')
|
||||
c = *s++;
|
||||
if ((base == 0 || base == 16) &&
|
||||
c == '0' && (*s == 'x' || *s == 'X')) {
|
||||
c = s[1];
|
||||
s += 2;
|
||||
base = 16;
|
||||
}
|
||||
if (base == 0)
|
||||
base = c == '0' ? 8 : 10;
|
||||
cutoff = (unsigned long)ULONG_MAX / (unsigned long)base;
|
||||
cutlim = (unsigned long)ULONG_MAX % (unsigned long)base;
|
||||
for (acc = 0, any = 0;; c = *s++) {
|
||||
if (!isascii(c))
|
||||
break;
|
||||
if (isdigit(c))
|
||||
c -= '0';
|
||||
else if (isalpha(c))
|
||||
c -= isupper(c) ? 'A' - 10 : 'a' - 10;
|
||||
else
|
||||
break;
|
||||
if (c >= base)
|
||||
break;
|
||||
if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
|
||||
any = -1;
|
||||
else {
|
||||
any = 1;
|
||||
acc *= base;
|
||||
acc += c;
|
||||
}
|
||||
}
|
||||
if (any < 0) {
|
||||
acc = ULONG_MAX;
|
||||
} else if (neg)
|
||||
acc = -acc;
|
||||
if (endptr != 0)
|
||||
*((const char **)endptr) = any ? s - 1 : nptr;
|
||||
return (acc);
|
||||
}
|
||||
#include <stdio.h>
|
||||
|
||||
#include "operators.h"
|
||||
|
||||
const char *const unary_op[] = {
|
||||
"!",
|
||||
"-b",
|
||||
"-c",
|
||||
"-d",
|
||||
"-e",
|
||||
"-f",
|
||||
"-g",
|
||||
"-h",
|
||||
"-k",
|
||||
"-n",
|
||||
"-p",
|
||||
"-r",
|
||||
"-s",
|
||||
"-t",
|
||||
"-u",
|
||||
"-w",
|
||||
"-x",
|
||||
"-z",
|
||||
"-S",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char *const binary_op[] = {
|
||||
"-o",
|
||||
"|",
|
||||
"-a",
|
||||
"&",
|
||||
"=",
|
||||
"!=",
|
||||
"-eq",
|
||||
"-ne",
|
||||
"-gt",
|
||||
"-lt",
|
||||
"-le",
|
||||
"-ge",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char *const andor_op[] = {
|
||||
"-o",
|
||||
"|",
|
||||
"-a",
|
||||
"&",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
|
||||
const char op_priority[] = {
|
||||
3,
|
||||
12,
|
||||
12,
|
||||
12,
|
||||
12,
|
||||
12,
|
||||
12,
|
||||
12,
|
||||
12,
|
||||
12,
|
||||
12,
|
||||
12,
|
||||
12,
|
||||
12,
|
||||
12,
|
||||
12,
|
||||
12,
|
||||
12,
|
||||
12,
|
||||
1,
|
||||
1,
|
||||
2,
|
||||
2,
|
||||
4,
|
||||
4,
|
||||
4,
|
||||
4,
|
||||
4,
|
||||
4,
|
||||
4,
|
||||
4,
|
||||
};
|
||||
|
||||
const char op_argflag[] = {
|
||||
0,
|
||||
OP_FILE,
|
||||
OP_FILE,
|
||||
OP_FILE,
|
||||
OP_FILE,
|
||||
OP_FILE,
|
||||
OP_FILE,
|
||||
OP_FILE,
|
||||
OP_FILE,
|
||||
OP_STRING,
|
||||
OP_FILE,
|
||||
OP_FILE,
|
||||
OP_FILE,
|
||||
OP_INT,
|
||||
OP_FILE,
|
||||
OP_FILE,
|
||||
OP_FILE,
|
||||
OP_STRING,
|
||||
OP_FILE,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
OP_STRING,
|
||||
OP_STRING,
|
||||
OP_INT,
|
||||
OP_INT,
|
||||
OP_INT,
|
||||
OP_INT,
|
||||
OP_INT,
|
||||
OP_INT,
|
||||
};
|
||||
@@ -1,11 +1,6 @@
|
||||
/*-
|
||||
* Copyright (c) 1982, 1988, 1991, 1993
|
||||
* Copyright (c) 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
* (c) UNIX System Laboratories, Inc.
|
||||
* All or some portions of this file are derived from material licensed
|
||||
* to the University of California by American Telephone and Telegraph
|
||||
* Co. or Unix System Laboratories, Inc. and are reproduced herein with
|
||||
* the permission of UNIX System Laboratories, Inc.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -35,26 +30,51 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)operators.h 8.3 (Berkeley) 4/2/94
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _SYS_CTYPE_H_
|
||||
#define _SYS_CTYPE_H_
|
||||
#define NOT 0
|
||||
#define ISBLOCK 1
|
||||
#define ISCHAR 2
|
||||
#define ISDIR 3
|
||||
#define ISEXIST 4
|
||||
#define ISFILE 5
|
||||
#define ISSETGID 6
|
||||
#define ISSYMLINK 7
|
||||
#define ISSTICKY 8
|
||||
#define STRLEN 9
|
||||
#define ISFIFO 10
|
||||
#define ISREAD 11
|
||||
#define ISSIZE 12
|
||||
#define ISTTY 13
|
||||
#define ISSETUID 14
|
||||
#define ISWRITE 15
|
||||
#define ISEXEC 16
|
||||
#define NULSTR 17
|
||||
#define ISSOCK 18
|
||||
|
||||
#ifdef KERNEL
|
||||
#define FIRST_BINARY_OP 19
|
||||
#define OR1 FIRST_BINARY_OP
|
||||
#define OR2 (FIRST_BINARY_OP + 1)
|
||||
#define AND1 (FIRST_BINARY_OP + 2)
|
||||
#define AND2 (FIRST_BINARY_OP + 3)
|
||||
#define STREQ (FIRST_BINARY_OP + 4)
|
||||
#define STRNE (FIRST_BINARY_OP + 5)
|
||||
#define EQ (FIRST_BINARY_OP + 6)
|
||||
#define NE (FIRST_BINARY_OP + 7)
|
||||
#define GT (FIRST_BINARY_OP + 8)
|
||||
#define LT (FIRST_BINARY_OP + 9)
|
||||
#define LE (FIRST_BINARY_OP + 10)
|
||||
#define GE (FIRST_BINARY_OP + 11)
|
||||
|
||||
#define isspace(c) ((c) == ' ' || ((c) >= '\t' && (c) <= '\r'))
|
||||
#define isascii(c) (((c) & ~0x7f) == 0)
|
||||
#define isupper(c) ((c) >= 'A' && (c) <= 'Z')
|
||||
#define islower(c) ((c) >= 'a' && (c) <= 'z')
|
||||
#define isalpha(c) (isupper(c) || islower(c))
|
||||
#define isdigit(c) ((c) >= '0' && (c) <= '9')
|
||||
#define isxdigit(c) (isdigit(c) \
|
||||
|| ((c) >= 'A' && (c) <= 'F') \
|
||||
|| ((c) >= 'a' && (c) <= 'f'))
|
||||
|
||||
#define toupper(c) ((c) - 0x20 * (((c) >= 'a') && ((c) <= 'z')))
|
||||
#define tolower(c) ((c) + 0x20 * (((c) >= 'A') && ((c) <= 'Z')))
|
||||
#define OP_INT 1 /* arguments to operator are integer */
|
||||
#define OP_STRING 2 /* arguments to operator are string */
|
||||
#define OP_FILE 3 /* argument is a file name */
|
||||
|
||||
#endif /* KERNEL */
|
||||
#endif /* !_SYS_CTYPE_H_ */
|
||||
extern const char *const unary_op[];
|
||||
extern const char *const binary_op[];
|
||||
extern const char *const andor_op[];
|
||||
extern const char op_priority[];
|
||||
extern const char op_argflag[];
|
||||
+17
-73
@@ -39,17 +39,14 @@
|
||||
.Dt TEST 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm test ,
|
||||
.Nm \&[
|
||||
.Nm test
|
||||
.Nd condition evaluation utility
|
||||
.Sh SYNOPSIS
|
||||
.Nm test
|
||||
.Ar expression
|
||||
.Nm [
|
||||
.Ar expression Cm ]
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm test
|
||||
.Nm
|
||||
utility evaluates the expression and, if it evaluates
|
||||
to true, returns a zero (true) exit status; otherwise
|
||||
it returns 1 (false).
|
||||
@@ -57,11 +54,11 @@ If there is no expression, test also
|
||||
returns 1 (false).
|
||||
.Pp
|
||||
All operators and flags are separate arguments to the
|
||||
.Nm test
|
||||
.Nm
|
||||
utility.
|
||||
.Pp
|
||||
The following primaries are used to construct expression:
|
||||
.Bl -tag -width Ar
|
||||
.Bl -tag -width indent
|
||||
.It Fl b Ar file
|
||||
True if
|
||||
.Ar file
|
||||
@@ -93,15 +90,6 @@ is set.
|
||||
True if
|
||||
.Ar file
|
||||
exists and is a symbolic link.
|
||||
This operator is retained for compatibility with previous versions of
|
||||
this program.
|
||||
Do not rely on its existence; use
|
||||
.Fl L
|
||||
instead.
|
||||
.It Fl k Ar file
|
||||
True if
|
||||
.Ar file
|
||||
exists and its sticky bit is set.
|
||||
.It Fl n Ar string
|
||||
True if the length of
|
||||
.Ar string
|
||||
@@ -111,20 +99,25 @@ True if
|
||||
.Ar file
|
||||
is a named pipe
|
||||
.Po Tn FIFO Pc .
|
||||
.It Fl S Ar file
|
||||
True if
|
||||
.Ar file
|
||||
is a socket.
|
||||
.It Fl r Ar file
|
||||
True if
|
||||
.Ar file
|
||||
.Ar file
|
||||
exists and is readable.
|
||||
.It Fl s Ar file
|
||||
True if
|
||||
.Ar file
|
||||
exists and has a size greater
|
||||
than zero.
|
||||
.It Fl t Op Ar file_descriptor
|
||||
.It Fl t Ar [file_descriptor]
|
||||
True if the file whose file descriptor number
|
||||
is
|
||||
.Ar file_descriptor
|
||||
is open and is associated with a terminal.
|
||||
(default 1) is open and is
|
||||
associated with a terminal.
|
||||
.It Fl u Ar file
|
||||
True if
|
||||
.Ar file
|
||||
@@ -153,38 +146,6 @@ can be searched.
|
||||
True if the length of
|
||||
.Ar string
|
||||
is zero.
|
||||
.It Fl L Ar file
|
||||
True if
|
||||
.Ar file
|
||||
exists and is a symbolic link.
|
||||
.It Fl O Ar file
|
||||
True if
|
||||
.Ar file
|
||||
exists and its owner matches the effective user id of this process.
|
||||
.It Fl G Ar file
|
||||
True if
|
||||
.Ar file
|
||||
exists and its group matches the effective group id of this process.
|
||||
.It Fl S Ar file
|
||||
True if
|
||||
.Ar file
|
||||
exists and is a socket.
|
||||
.It Ar file1 Fl nt Ar file2
|
||||
True if
|
||||
.Ar file1
|
||||
exists and is newer than
|
||||
.Ar file2 .
|
||||
.It Ar file1 Fl ot Ar file2
|
||||
True if
|
||||
.Ar file1
|
||||
exists and is older than
|
||||
.Ar file2 .
|
||||
.It Ar file1 Fl ef Ar file2
|
||||
True if
|
||||
.Ar file1
|
||||
and
|
||||
.Ar file2
|
||||
exist and refer to the same file.
|
||||
.It Ar string
|
||||
True if
|
||||
.Ar string
|
||||
@@ -202,23 +163,6 @@ True if the strings
|
||||
and
|
||||
.Ar \&s\&2
|
||||
are not identical.
|
||||
.It Ar \&s\&1 Cm \&< Ar \&s\&2
|
||||
True if string
|
||||
.Ar \&s\&1
|
||||
comes before
|
||||
.Ar \&s\&2
|
||||
based on the ASCII value of their characters.
|
||||
.It Ar \&s\&1 Cm \&> Ar \&s\&2
|
||||
True if string
|
||||
.Ar \&s\&1
|
||||
comes after
|
||||
.Ar \&s\&2
|
||||
based on the ASCII value of their characters.
|
||||
.It Ar \&s\&1
|
||||
True if
|
||||
.Ar \&s\&1
|
||||
is not the null
|
||||
string.
|
||||
.It Ar \&n\&1 Fl \&eq Ar \&n\&2
|
||||
True if the integers
|
||||
.Ar \&n\&1
|
||||
@@ -288,7 +232,7 @@ operator has higher precedence than the
|
||||
operator.
|
||||
.Sh GRAMMAR AMBIGUITY
|
||||
The
|
||||
.Nm test
|
||||
.Nm
|
||||
grammar is inherently ambiguous. In order to assure a degree of consistency,
|
||||
the cases described in the
|
||||
.St -p1003.2 ,
|
||||
@@ -298,7 +242,7 @@ standards document. All other cases are subject to the ambiguity in the
|
||||
command semantics.
|
||||
.Sh RETURN VALUES
|
||||
The
|
||||
.Nm test
|
||||
.Nm
|
||||
utility exits with one of the following values:
|
||||
.Bl -tag -width Ds
|
||||
.It 0
|
||||
@@ -314,7 +258,7 @@ An error occurred.
|
||||
.Xr sh 1
|
||||
.Sh STANDARDS
|
||||
The
|
||||
.Nm test
|
||||
utility implements a superset of the
|
||||
.Nm
|
||||
function is expected to be
|
||||
.St -p1003.2
|
||||
specification.
|
||||
compatible.
|
||||
+543
-428
File diff suppressed because it is too large.
Load diff
@@ -32,10 +32,6 @@ for hesiod zone files. Always use /etc/amd.conf if exists.
|
||||
|
||||
August 8, 1998: add detection support for NFS V.3 for NetBSD 1.3F.
|
||||
|
||||
February 1, 1998: fixes for NetBSD to better detect its features.
|
||||
|
||||
September 4, 1999: assorted fixes for NetBSD 1.4+.
|
||||
|
||||
* Hannes Reinecke <[email protected]>
|
||||
|
||||
Back in 1995, contributed code for linux. A new parser for file system
|
||||
@@ -116,15 +112,6 @@ February 24, 1998: lots of patches for ultrix 4.3 port.
|
||||
|
||||
February 28, 1998: lots of documentation fixes!
|
||||
|
||||
January 8, 1999: texi fixes, and more Ultrix 4.3 fixes, among others.
|
||||
|
||||
January 11, 1999: hesiod_isup function. Fix format errors in dlog/plog.
|
||||
Remove obsolete or unnecessary files/macros. Don't report disabled file
|
||||
systems. More misc fixes.
|
||||
|
||||
February 3, 1998: don't start autofs listener unless autofs maps were in
|
||||
use.
|
||||
|
||||
* Jason Thorpe <[email protected]>
|
||||
|
||||
August 25, 1997: make amd work when talking to NIS+ servers in NIS
|
||||
@@ -167,8 +154,6 @@ November 5, 1997: NFS v.3 support for AIX 4.2.1, which does *not* include
|
||||
headers for this. Bill had to guess at the right structures, field names,
|
||||
sizes, alignment, etc.
|
||||
|
||||
January 15, 1999: small ldap bug fixes.
|
||||
|
||||
* Stefan Vogel <[email protected]>
|
||||
|
||||
November 14, 1997: typo in the subscription instructions to amd-dev.
|
||||
@@ -217,8 +202,6 @@ April 20, 1998: allow arbitrary number of interfaces in wire listing.
|
||||
September 4, 1998: bug fix to avoid overrunning hostname buffer, and minor
|
||||
amd.conf man page typo correction.
|
||||
|
||||
September 22, 1999: use more secure vsnprintf in real_plog().
|
||||
|
||||
* Danny Rathjens <[email protected]>
|
||||
|
||||
October 29, 1998: swap arguments to kill(2) in amd.c.
|
||||
@@ -232,45 +215,3 @@ of a looked up entry before unmounting it.
|
||||
* Douglas K. Rand" <[email protected]>
|
||||
|
||||
December 3, 1998: case insensitive host name match for nfsl.
|
||||
|
||||
* David Wolfskill <[email protected]>
|
||||
January 28, 1999: don't turn on/off noconn option if it was already in that
|
||||
state.
|
||||
|
||||
* Jeffrey C Honig <[email protected]>
|
||||
March 14, 1999: clean up more autogenerated files upon "make distclean".
|
||||
|
||||
March 15, 1999: avoid overly verbose NIS warning even on systems that don't
|
||||
run NIS. On BSD systems, wire.c uses getifaddrs(), sysctl(), IRS routines,
|
||||
and more fixes. Numerous IP packet security fixes.
|
||||
|
||||
March 16, 1999: documentation typos. new cdfs options. ufs structure
|
||||
detection for bsdi4.
|
||||
|
||||
September 17, 1999: fixes to expn.
|
||||
|
||||
* Paul Balyoz <[email protected]>
|
||||
March 26, 1999: ensure lostaltmail displays Y2K compliant dates.
|
||||
|
||||
* Jon Peatfield <[email protected]>
|
||||
March 30, 1999: turn off incomplete NFS V.3 support in HPUX 10.20.
|
||||
|
||||
September 22, 1999: safe reloading of maps without first clearing old
|
||||
copies, and using cached copies if map failed to reload.
|
||||
|
||||
* Peter Breitenlohner <[email protected]>
|
||||
July 24, 1999: patch for linux 2.2.x to work with older libc5 systems, and
|
||||
nis_isup mis-logic fixes.
|
||||
|
||||
* Dale Talcott <[email protected]>
|
||||
July 26, 1999: added NFS3 support for AIX mounting.
|
||||
|
||||
* Christophe Kalt <[email protected]>
|
||||
July 14, 1999: add netgrpd() syntax function which uses FQHN.
|
||||
|
||||
* Andrew J. Korty <[email protected]>
|
||||
September 5, 1999: pawd works for type:=nfsl.
|
||||
|
||||
* Nick Williams <[email protected]>
|
||||
September 1, 1999: bug fix for incorrect symlinks when two locations are
|
||||
requested simultaneously.
|
||||
+6
-42
@@ -5,7 +5,7 @@
|
||||
|
||||
(1) mips-sgi-irix*
|
||||
|
||||
[1A] known to have flaky NFS V.3 and TCP. Amd tends to hang or spin
|
||||
[1A] known to have flakey NFS V.3 and TCP. Amd tends to hang or spin
|
||||
infinitely after a few hours or days of use. Users must install recommended
|
||||
patches from vendor. Patches help, but not all the time. Otherwise avoid
|
||||
using NFS V.3 and TCP on these systems, by setting
|
||||
@@ -14,12 +14,9 @@ using NFS V.3 and TCP on these systems, by setting
|
||||
|
||||
[1B] yp_all() leaks a file descriptor. Eventually amd runs out of file
|
||||
descriptors and hangs. Am-utils circumvents this by using its own version
|
||||
of yp_all which uses udp and iterates over NIS maps. The latter isn't as
|
||||
of yp_all which uses udp and iterats over NIS maps. The latter isn't as
|
||||
reliable as yp_all() which uses TCP, but it is better than hanging.
|
||||
|
||||
(I have some reports that older version of hpux-9, with older libc, also
|
||||
leak file descriptors.)
|
||||
|
||||
|
||||
(2) alpha-unknown-linux-gnu (RedHat Linux 4.2)
|
||||
|
||||
@@ -39,35 +36,12 @@ main()
|
||||
exit(0);
|
||||
}
|
||||
|
||||
It is possible that sufficiently newer version of libc for RH4.2 fix this
|
||||
problem.
|
||||
|
||||
|
||||
(3) mips-dec-ultrix4.3
|
||||
|
||||
Rainer Orth <[email protected]> reports
|
||||
|
||||
[3A] One needs the Kernel Config Files (UDTBIN430) subset installed to
|
||||
compile am-utils, otherwise essential header files (net/if.h, net/route.h,
|
||||
rpcsvc/mount.h, rpcsvc/yp_prot.h, rpcsvc/ypclnt.h, sys/proc.h) are
|
||||
missing.
|
||||
|
||||
[3B] It's probably impossible to build am-utils with DEC C on Ultrix V4.3.
|
||||
This compiler is pseudo-ANSI only. Maybe the new ANSI C compiler in V4.3A
|
||||
and beyond will do. I successfully used gcc 2.8.1.
|
||||
|
||||
[3C] You need to build against a recent libhesiod (I used 3.0.2) and
|
||||
libresolv/lib44bsd (I used BIND 4.9.5-P1). The resolver routines in
|
||||
libc seem to cause random memory corruption. It is necessary to specify
|
||||
LIBS=-l44bsd. lib44bsd is a helper library of libresolv used to supply
|
||||
functions like strdup which are missing on the host system. This isn't
|
||||
currently autoconfiscated.
|
||||
|
||||
[3D] You need to configure with CONFIG_SHELL=/bin/sh5 /bin/sh5 buildall;
|
||||
/bin/sh cannot handle the shell functions used in buildall and is both
|
||||
buggy and slow.
|
||||
|
||||
[3E] At least the gcc 2.7.0 fixincludes-mangled <sys/utsname.h> needs a
|
||||
[3A] At least the gcc 2.7.0 fixincludes-mangled <sys/utsname.h> needs a
|
||||
forward declaration of struct utsname to avoid lots of gcc warnings:
|
||||
|
||||
RCS file: RCS/utsname.h,v
|
||||
@@ -84,6 +58,9 @@ diff -u -r1.1 utsname.h
|
||||
#endif
|
||||
#define __SYS_NMLN 32
|
||||
|
||||
[3B] It autoconfigures and compiles cleanly, but currently hangs after a
|
||||
couple of hours without leaving any traces in the syslog output.
|
||||
|
||||
|
||||
(4) powerpc-ibm-aix4.2.1.0
|
||||
|
||||
@@ -113,16 +90,3 @@ but it is not yet in the glibc-2.0.7-19 RPM.
|
||||
A bug in libc results in an amq binary that doesn't work; amq -v dumps core
|
||||
in xdr_string. There is no known fix (source code or vendor patch) at this
|
||||
time. (Please let amd-dev know if you know of a fix.)
|
||||
|
||||
|
||||
(7) *-aix4.3.2.0
|
||||
|
||||
The plock() function appears to fail with ENOMEM (Not Enough Space). When
|
||||
it fails, it consumes a lot of memory. This appears to be an AIX bug. I
|
||||
think plock returns an error code, but it partially succeeds to lock some
|
||||
pages, thus increasing memory consumption. When partial failures occur, it
|
||||
is possible that AIX fails to unlock those pages it did lock. Solution:
|
||||
turn off usage of plock on AIX. Put plock=no in your amd.conf file (which
|
||||
is the default if you do nothing).
|
||||
|
||||
Erez.
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 1997-1999 Erez Zadok
|
||||
Copyright (c) 1997-1998 Erez Zadok
|
||||
Copyright (c) 1989 Jan-Simon Pendry
|
||||
Copyright (c) 1989 Imperial College of Science, Technology & Medicine
|
||||
Copyright (c) 1989 The Regents of the University of California.
|
||||
|
||||
+9
-2811
File diff suppressed because it is too large.
Load diff
@@ -10,7 +10,6 @@ SYSTEM AUTOCONF COMPILE RUN SHLIB
|
||||
alpha-dec-osf2.1 ezk ezk ezk !ezk
|
||||
alpha-dec-osf4.0 ezk ezk dsr[3] ezk
|
||||
alphaev5-unknown-linux-gnu ezk ezk finkel ezk
|
||||
alphaev5-unknown-linux-gnu-rh5.2 ezk ezk ezk ezk
|
||||
hppa1.0-hp-hpux11.00 ezk ezk ezk
|
||||
hppa1.1-hp-hpux10.10 ezk ezk ezk ezk
|
||||
hppa1.1-hp-hpux10.20 ezk ezk ezk ezk
|
||||
@@ -22,7 +21,6 @@ i386-pc-bsdi2.1 ezk ezk ezk !ezk
|
||||
i386-pc-bsdi3.0 ezk ezk ezk !ezk
|
||||
i386-pc-bsdi3.1 ezk ezk ezk !ezk
|
||||
i386-pc-bsdi4.0 ezk ezk ezk ezk
|
||||
i386-pc-bsdi4.0.1 ezk ezk ezk ezk
|
||||
i386-pc-solaris2.5.1 ezk ezk ezk ezk
|
||||
i386-pc-solaris2.6 ezk ezk ezk ezk
|
||||
i386-pc-solaris2.7 ezk ezk ezk ezk
|
||||
@@ -32,36 +30,21 @@ i386-unknown-freebsd2.2.6 ezk ezk ezk ezk
|
||||
i386-unknown-freebsd2.2.7 ezk ezk ezk ezk
|
||||
i386-unknown-freebsd2.2.8 ezk ezk ezk ezk
|
||||
i386-unknown-freebsd3.0 ezk ezk ezk ezk
|
||||
i386-unknown-freebsdelf3.0 ezk ezk ezk ezk
|
||||
i386-unknown-freebsdelf3.1 ezk ezk ezk ezk
|
||||
i386-unknown-freebsdelf3.2 ezk ezk ezk ezk
|
||||
i386-unknown-freebsdelf3.3 ezk ezk ezk ezk
|
||||
i386-unknown-freebsdelf4.0 ezk ezk ezk ezk
|
||||
i386-unknown-netbsd1.2.1 ezk ezk ezk ezk
|
||||
i386-unknown-netbsd1.3 ezk ezk ezk ezk
|
||||
i386-unknown-netbsd1.3.1 ezk ezk ezk ezk
|
||||
i386-unknown-netbsd1.3.2 ezk ezk ezk ezk
|
||||
i386-unknown-netbsd1.3.3 ezk ezk ezk ezk
|
||||
i386-unknown-netbsd1.4 ezk ezk ezk ezk
|
||||
i386-unknown-openbsd2.1 ezk ezk ezk ezk
|
||||
i386-unknown-openbsd2.2 ezk ezk ezk ezk
|
||||
i386-unknown-openbsd2.3 ezk ezk ezk ezk
|
||||
i386-unknown-openbsd2.4 ezk ezk ezk ezk
|
||||
i386-unknown-openbsd2.5 ezk ezk ezk ezk
|
||||
i486-ncr-sysv4.3.03 ezk ezk ezk
|
||||
i486-pc-linux-gnu-rh6.0 ezk ezk ezk ezk
|
||||
i486-pc-linux-gnulibc1 ezk ezk ezk ezk
|
||||
i486-pc-linux-gnulibc1-rh4.2 ezk ezk ezk ezk
|
||||
i486-pc-linux-gnuoldld ezk ezk ezk ezk
|
||||
i586-pc-linux-gnu ezk ezk ezk ezk
|
||||
i586-pc-linux-gnu-rh5.2 ezk ezk ezk ezk
|
||||
i586-pc-linux-gnu-rh6.0 ezk ezk ezk ezk
|
||||
i586-pc-linux-gnu-rh6.1 ezk ezk ezk ezk
|
||||
i586-pc-linux-gnulibc1 ezk ezk ezk ezk
|
||||
i586-pc-linux-gnulibc1-rh4.2 ezk ezk ezk ezk
|
||||
i686-pc-linux-gnu ezk ezk ezk ezk
|
||||
i686-pc-linux-gnu-rh5.2 ezk ezk ezk ezk
|
||||
i686-pc-linux-gnu-rh6.0 ezk ezk ezk ezk
|
||||
i686-pc-linux-gnulibc ezk ezk ezk ezk
|
||||
i686-pc-linux-gnulibc1 ezk ezk ezk ezk
|
||||
m68k-hp-hpux9.00 ezk[4] ezk[4] nrh/ezk
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Begin3
|
||||
Title: am-utils
|
||||
Version: 6.0.1
|
||||
Entered-date: 08SEP99
|
||||
Version: 6.0
|
||||
Entered-date: 01JAN99
|
||||
Description: BSD Automounter Utilities
|
||||
Replaces the old amd-upl102. Offers NFS V3 support, many
|
||||
new features, and numerous ports. The home page for
|
||||
@@ -10,9 +10,9 @@ Keywords: amd amq hlfsd fsinfo wire-test fixmount mk-amd-map automount
|
||||
Author: [email protected] (Erez Zadok)
|
||||
Maintained-by: [email protected] (Erez Zadok)
|
||||
Primary-site: shekel.mcl.cs.columbia.edu /pub/am-utils
|
||||
1.3MB am-utils-6.0.1.tar.gz
|
||||
1.3MB am-utils.tar.gz
|
||||
1.3MB am-utils-snapshot.tar.gz
|
||||
1.6MB am-utils-6.0.tar.gz
|
||||
1.6MB am-utils.tar.gz
|
||||
1.6MB am-utils-snapshot.tar.gz
|
||||
Alternate-site: http://www.cs.columbia.edu/~ezk/am-utils/mirrors.html
|
||||
Original-site: ftp.cs.columbia.edu /pub/amd
|
||||
Platforms: all modern Unix systems
|
||||
|
||||
+4
-8
@@ -12,12 +12,11 @@ U.S.A:
|
||||
ftp://shekel.mcl.cs.columbia.edu/pub/am-utils
|
||||
Maintainer: [email protected]
|
||||
Minnesota:
|
||||
ftp://ftp.cs.umn.edu/pub/am-utils
|
||||
ftp://ftp.cs.umn.edu/pub/AMD
|
||||
Maintainer: [email protected]
|
||||
Virginia (Newport News):
|
||||
ftp://ftp.ferginc.com/pub/unix/am-utils
|
||||
ftp://www.ferginc.com/pub/unix/am-utils
|
||||
Maintainer: [email protected]
|
||||
Avoid for now: empty directory
|
||||
Ohio (Kent State University):
|
||||
ftp://info.mcs.kent.edu/pub/am-utils
|
||||
Maintainer: [email protected]
|
||||
@@ -26,14 +25,11 @@ Europe:
|
||||
Germany:
|
||||
ftp://ftp.fu-berlin.de/pub/unix/network/am-utils
|
||||
Maintainer: [email protected]
|
||||
Germany:
|
||||
ftp://ftp.tu-darmstadt.de/pub/networking/filesystems/am-utils/
|
||||
Maintainer: [email protected]
|
||||
Sweden:
|
||||
ftp://ftp.sunet.se/pub/unix/admin/am-utils
|
||||
Maintainer: [email protected]
|
||||
Sweden (Stockholm University, Math Depat):
|
||||
ftp://mirror.matematik.su.se/pub/am-utils
|
||||
Sweden:
|
||||
ftp://ftp.matematik.su.se/pub/mirrors/shekel.mcl.cs.columbia.edu/pub/am-utils
|
||||
Maintainer: [email protected]
|
||||
UK:
|
||||
ftp://sunsite.org.uk/packages/am-utils
|
||||
|
||||
@@ -1,89 +1,3 @@
|
||||
# -*- text -*-
|
||||
|
||||
*** Notes specific to am-utils version 6.0.2:
|
||||
|
||||
- safe map reloads: when a map needs to be reloaded, it is reloaded into a
|
||||
temporary copy first. Only if the reload was completely successful, Amd
|
||||
discards the old map and uses the new one. Otherwise Amd continues to use
|
||||
the old maps. This should help a lot with transient NIS problems.
|
||||
|
||||
- amq -f now also forces a (safe) map reload, but only if the timestamp on
|
||||
the maps was updated.
|
||||
|
||||
- two new selector variables: ${vendor} and ${full_os}, which are the same
|
||||
as the output seen in "amd -v".
|
||||
|
||||
- documentation fixes and updates
|
||||
|
||||
- updated or minor new ports:
|
||||
i386-unknown-freebsdelf3.3
|
||||
|
||||
- support 'ignore' flags (automntfs) in bsdi-4.1
|
||||
|
||||
- bugs fixed:
|
||||
expn.pl uses correct sockaddr_in() not, pack()
|
||||
make sure configure --enable-*args take an argument
|
||||
don't busy-loop trying to rebind to ldap servers
|
||||
use vsnprintf, not vsprintf (security)
|
||||
|
||||
*** Notes specific to am-utils version 6.0.1:
|
||||
|
||||
- updated or minor new ports:
|
||||
i386-pc-bsdi4.0.1
|
||||
i386-unknown-freebsdelf3.0
|
||||
i386-unknown-freebsdelf3.1
|
||||
i386-unknown-freebsdelf3.2
|
||||
i386-unknown-freebsdelf4.0
|
||||
i386-unknown-netbsd1.4
|
||||
i386-unknown-openbsd2.5
|
||||
powerpc-unknown-linux-gnu
|
||||
|
||||
- automount2amd added, a new script to convert Sun automount maps to Amd maps
|
||||
|
||||
- new map function netgrpd(ARG), same as netgrp() but matches FQHN
|
||||
|
||||
- 'ignore' is a generic mount option
|
||||
|
||||
- hesiod info service isup() function to check if service is up
|
||||
|
||||
- more Y2K fixes (see README.y2k for the full story)
|
||||
|
||||
- using alloca.c on systems that don't have it (hpux9 with /bin/cc)
|
||||
|
||||
- configure script reduced in size by using M4/sh loops instead of repeated
|
||||
entries
|
||||
|
||||
- documentation updates
|
||||
|
||||
- too many bugs fixed to list here:
|
||||
'addopts' option works with 'remopts' as well as 'opts'
|
||||
AIX can perform NFS V.3 mounts explicitly
|
||||
NIS is_up fixed, especially for NIS+ running in compatibility mode
|
||||
amd -v incorrectly listing file systems that don't really work
|
||||
amd's own mounts use reserved ports if possible
|
||||
browsable directories works for Linux 2.3 (NFS cookies)
|
||||
bsd44 systems check for isofs flags
|
||||
bsd44 systems check for new options: norrio, gens, and extatt
|
||||
buildall works better on Ultrix's /bin/sh
|
||||
compile and build on Linux kernels 2.2 and newer
|
||||
compile and build on RedHat Linux 6.0 (glibc 2.1)
|
||||
compile and build on Solaris 7 (with or without vendor LDAP)
|
||||
completely eliminate all of amd's amq -M code, when not enabled
|
||||
correctly interpret failure code of unmount of type:=program
|
||||
don't create autofs listener service unless used
|
||||
don't list or process amq's -M option unless feature was turned on
|
||||
don't turn on/off noconn option if it was already in that state
|
||||
ldap info service: don't strcmp null strings
|
||||
lostaltmail correctly sets struct sockaddr_in
|
||||
make sure Linux systems have configured kernel headers
|
||||
test for bsize/namlen fields in nfs_args (linux mount versions 2/3)
|
||||
turn off broken NFS V.3 support for HPUX
|
||||
use getifaddrs() on bsd44 systems makes wire.c more reliable
|
||||
use matching NFS rsize/wsize on Linux 2.0 and 2.[123] kernels.
|
||||
verify that RPC requests come from reserved, privileged local ports
|
||||
warn when Linux kernel headers mismatch with running kernel
|
||||
pawd works for type:=nfsl too
|
||||
|
||||
*** Notes specific to am-utils version 6.0:
|
||||
|
||||
- updated or minor new ports:
|
||||
|
||||
@@ -12,17 +12,6 @@ the ctime(3) call.
|
||||
However, on Friday, September 18th 1998, Matthew Crosby <[email protected]>
|
||||
reported that they evaluated 6.0a16 and found it to be compliant.
|
||||
|
||||
On March 26, 1999, Paul Balyoz <[email protected]> submitted a
|
||||
patch to lostaltmail which makes it print Y2K compliant dates. He used a
|
||||
code scanner and manually "eyeballed" the code and could not find any more
|
||||
problems. Paul's patch is included in am-utils-6.0.1s7 and newer versions.
|
||||
Paul also said that other 2-digit years used in am-utils are "harmless."
|
||||
|
||||
|
||||
NOTE: NONE OF THE PERSONS MENTIONED HERE, AUTHOR INCLUDED, ARE WILLING TO
|
||||
CERTIFY AM-UTILS AS Y2K COMPLIANT. USE AT YOUR OWN RISK.
|
||||
|
||||
---
|
||||
Erez Zadok.
|
||||
Maintainer, am-utils package and AMD-DEV list.
|
||||
Email: [email protected]
|
||||
|
||||
+10
-27
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997-1999 Erez Zadok
|
||||
* Copyright (c) 1997-1998 Erez Zadok
|
||||
* Copyright (c) 1989 Jan-Simon Pendry
|
||||
* Copyright (c) 1989 Imperial College of Science, Technology & Medicine
|
||||
* Copyright (c) 1989 The Regents of the University of California.
|
||||
@@ -38,7 +38,7 @@
|
||||
*
|
||||
* %W% (Berkeley) %G%
|
||||
*
|
||||
* $Id: am_ops.c,v 1.4 1999/03/13 17:03:26 ezk Exp $
|
||||
* $Id: am_ops.c,v 1.2 1998/12/27 06:24:45 ezk Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -164,7 +164,7 @@ ops_showamfstypes(char *buf)
|
||||
if (ap[1])
|
||||
strcat(buf, ", ");
|
||||
l += strlen((*ap)->fs_type) + 2;
|
||||
if (l > 62) {
|
||||
if (l > 60) {
|
||||
l = 0;
|
||||
strcat(buf, "\n ");
|
||||
}
|
||||
@@ -413,32 +413,15 @@ ops_match(am_opts *fo, char *key, char *g_key, char *path, char *keym, char *map
|
||||
|
||||
/*
|
||||
* If addopts option was used, then append it to the
|
||||
* current options and remote mount options.
|
||||
* current options.
|
||||
*/
|
||||
if (fo->opt_addopts) {
|
||||
if (STREQ(fo->opt_opts, fo->opt_remopts)) {
|
||||
/* optimize things for the common case where opts==remopts */
|
||||
char *mergedstr;
|
||||
mergedstr = merge_opts(fo->opt_opts, fo->opt_addopts);
|
||||
plog(XLOG_USER, "merge rem/opts \"%s\" add \"%s\" => \"%s\"",
|
||||
fo->opt_opts, fo->opt_addopts, mergedstr);
|
||||
XFREE(fo->opt_opts);
|
||||
XFREE(fo->opt_remopts);
|
||||
fo->opt_opts = mergedstr;
|
||||
fo->opt_remopts = strdup(mergedstr);
|
||||
} else {
|
||||
char *mergedstr, *remmergedstr;
|
||||
mergedstr = merge_opts(fo->opt_opts, fo->opt_addopts);
|
||||
plog(XLOG_USER, "merge opts \"%s\" add \"%s\" => \"%s\"",
|
||||
fo->opt_opts, fo->opt_addopts, mergedstr);
|
||||
XFREE(fo->opt_opts);
|
||||
fo->opt_opts = mergedstr;
|
||||
remmergedstr = merge_opts(fo->opt_remopts, fo->opt_addopts);
|
||||
plog(XLOG_USER, "merge remopts \"%s\" add \"%s\" => \"%s\"",
|
||||
fo->opt_remopts, fo->opt_addopts, remmergedstr);
|
||||
XFREE(fo->opt_remopts);
|
||||
fo->opt_remopts = remmergedstr;
|
||||
}
|
||||
char *mergedstr;
|
||||
mergedstr = merge_opts(fo->opt_opts, fo->opt_addopts);
|
||||
plog(XLOG_USER, "merge opts \"%s\" add \"%s\" => \"%s\"",
|
||||
fo->opt_opts, fo->opt_addopts, mergedstr);
|
||||
XFREE(fo->opt_opts);
|
||||
fo->opt_opts = mergedstr;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+10
-19
@@ -1,5 +1,5 @@
|
||||
.\"
|
||||
.\" Copyright (c) 1997-1999 Erez Zadok
|
||||
.\" Copyright (c) 1997-1998 Erez Zadok
|
||||
.\" Copyright (c) 1989 Jan-Simon Pendry
|
||||
.\" Copyright (c) 1989 Imperial College of Science, Technology & Medicine
|
||||
.\" Copyright (c) 1989 The Regents of the University of California.
|
||||
@@ -38,8 +38,7 @@
|
||||
.\"
|
||||
.\" %W% (Berkeley) %G%
|
||||
.\"
|
||||
.\" $Id: amd.8,v 1.3 1999/09/30 21:01:29 ezk Exp $
|
||||
.\" $FreeBSD$
|
||||
.\" $Id: amd.8,v 1.2 1998/09/05 05:52:24 obrien Exp $
|
||||
.\"
|
||||
.Dd April 19, 1994
|
||||
.Dt AMD 8
|
||||
@@ -60,7 +59,7 @@
|
||||
.Ek
|
||||
.Op Fl l Ar logfile
|
||||
.Op Fl o Ar op_sys_ver
|
||||
.Op Fl t Ar timeout.retransmit
|
||||
.Op Fl t Ar interval.interval
|
||||
.Bk -words
|
||||
.Op Fl w Ar interval
|
||||
.Ek
|
||||
@@ -175,21 +174,13 @@ been auto-mounted,
|
||||
.Nm amd
|
||||
.Em inherits
|
||||
it.
|
||||
.It Fl t Ar timeout.retransmit
|
||||
Specify the NFS timeout
|
||||
.It Fl t Ar interval.interval
|
||||
Specify the
|
||||
.Ar interval ,
|
||||
in tenths of a second, between
|
||||
.Tn NFS/RPC
|
||||
retries (for UDP only). The default
|
||||
is 0.8 seconds. The second value alters the restransmit counter, which
|
||||
defaults to 11 retransmissions. Both of these values are used by the kernel
|
||||
to communicate with amd. Useful defaults are supplied if either or both
|
||||
values are missing.
|
||||
.Pp
|
||||
Amd relies on the kernel RPC retransmit mechanism to trigger mount retries.
|
||||
The values of these parameters change the overall retry interval. Too long
|
||||
an interval gives poor interactive response; too short an interval causes
|
||||
excessive retries.
|
||||
.Tn NFS/RPC/UDP
|
||||
retries. The default is 0.8 seconds. The second values alters the retransmit
|
||||
counter. Useful defaults are supplied if either or both values are missing.
|
||||
.It Fl v
|
||||
Version. Displays version and configuration information on standard error.
|
||||
.It Fl w Ar interval
|
||||
@@ -335,8 +326,8 @@ Department of Computing, Imperial College, London, UK.
|
||||
Department of Computer Science, Columbia University,
|
||||
New York, USA.
|
||||
.Pp
|
||||
Other authors and contributors to am-utils are listed in the
|
||||
.Pa AUTHORS
|
||||
.An Other authors and contributors to am-utils are listed in the
|
||||
.Nm AUTHORS
|
||||
file distributed with am-utils.
|
||||
.Sh HISTORY
|
||||
The
|
||||
|
||||
+15
-21
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997-1999 Erez Zadok
|
||||
* Copyright (c) 1997-1998 Erez Zadok
|
||||
* Copyright (c) 1989 Jan-Simon Pendry
|
||||
* Copyright (c) 1989 Imperial College of Science, Technology & Medicine
|
||||
* Copyright (c) 1989 The Regents of the University of California.
|
||||
@@ -38,8 +38,7 @@
|
||||
*
|
||||
* %W% (Berkeley) %G%
|
||||
*
|
||||
* $Id: amd.c,v 1.6 1999/09/30 21:01:29 ezk Exp $
|
||||
* $FreeBSD$
|
||||
* $Id: amd.c,v 1.3 1998/11/14 03:13:19 obrien Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -56,7 +55,13 @@
|
||||
struct amu_global_options gopt; /* where global options are stored */
|
||||
|
||||
char pid_fsname[16 + MAXHOSTNAMELEN]; /* "kiska.southseas.nz:(pid%d)" */
|
||||
#if 0
|
||||
char *progname; /* "amd" */
|
||||
#endif
|
||||
char *hostdomain = "unknown.domain";
|
||||
#if 0
|
||||
char hostname[MAXHOSTNAMELEN + 1] = "localhost"; /* Hostname */
|
||||
#endif
|
||||
char hostd[2 * MAXHOSTNAMELEN + 1]; /* Host+domain */
|
||||
char *endian = ARCH_ENDIAN; /* Big or Little endian */
|
||||
char *cpu = HOST_CPU; /* CPU type */
|
||||
@@ -68,6 +73,11 @@ int orig_umask = 022;
|
||||
int select_intr_valid;
|
||||
|
||||
jmp_buf select_intr;
|
||||
#if 0
|
||||
pid_t mypid; /* Current process id */
|
||||
serv_state amd_state;
|
||||
int foreground = 1; /* This is the top-level server */
|
||||
#endif
|
||||
struct amd_stats amd_stats; /* Server statistics */
|
||||
struct in_addr myipaddr; /* (An) IP address of this host */
|
||||
time_t do_mapc_reload = 0; /* mapc_reload() call required? */
|
||||
@@ -249,12 +259,6 @@ init_global_options(void)
|
||||
/* OS version */
|
||||
gopt.op_sys_ver = HOST_OS_VERSION;
|
||||
|
||||
/* full OS name and version */
|
||||
gopt.op_sys_full = HOST_OS;
|
||||
|
||||
/* OS version */
|
||||
gopt.op_sys_vendor = HOST_VENDOR;
|
||||
|
||||
/* pid file */
|
||||
gopt.pid_file = "/dev/stdout";
|
||||
|
||||
@@ -486,7 +490,7 @@ main(int argc, char *argv[])
|
||||
* can mount the automounter.
|
||||
*/
|
||||
amu_get_myaddress(&myipaddr);
|
||||
plog(XLOG_INFO, "My ip addr is %s", inet_ntoa(myipaddr));
|
||||
plog(XLOG_INFO, "My ip addr is 0x%x", htonl(myipaddr.s_addr));
|
||||
|
||||
/* avoid hanging on other NFS servers if started elsewhere */
|
||||
if (chdir("/") < 0)
|
||||
@@ -496,7 +500,7 @@ main(int argc, char *argv[])
|
||||
* Now check we are root.
|
||||
*/
|
||||
if (geteuid() != 0) {
|
||||
plog(XLOG_FATAL, "Must be root to mount filesystems (euid = %ld)", (long) geteuid());
|
||||
plog(XLOG_FATAL, "Must be root to mount filesystems (euid = %d)", geteuid());
|
||||
going_down(1);
|
||||
}
|
||||
|
||||
@@ -505,16 +509,6 @@ main(int argc, char *argv[])
|
||||
*/
|
||||
#ifdef HAVE_PLOCK
|
||||
if (gopt.flags & CFM_PROCESS_LOCK) {
|
||||
# ifdef _AIX
|
||||
/*
|
||||
* On AIX you must lower the stack size using ulimit() before calling
|
||||
* plock. Otherwise plock will reserve a lot of memory space based on
|
||||
* your maximum stack size limit. Since it is not easily possible to
|
||||
* tell what should the limit be, I print a warning before calling
|
||||
* plock(). See the manual pages for ulimit(1,3,4) on your AIX system.
|
||||
*/
|
||||
plog(XLOG_WARNING, "AIX: may need to lower stack size using ulimit(3) before calling plock");
|
||||
# endif /* _AIX */
|
||||
if (plock(PROCLOCK) != 0) {
|
||||
plog(XLOG_WARNING, "Couldn't lock process text and data segment in memory: %m");
|
||||
} else {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997-1999 Erez Zadok
|
||||
* Copyright (c) 1997-1998 Erez Zadok
|
||||
* Copyright (c) 1990 Jan-Simon Pendry
|
||||
* Copyright (c) 1990 Imperial College of Science, Technology & Medicine
|
||||
* Copyright (c) 1990 The Regents of the University of California.
|
||||
@@ -38,7 +38,7 @@
|
||||
*
|
||||
* %W% (Berkeley) %G%
|
||||
*
|
||||
* $Id: amd.h,v 1.4 1999/09/30 21:01:29 ezk Exp $
|
||||
* $Id: amd.h,v 1.1.1.1 1998/11/05 02:04:51 ezk Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -106,10 +106,8 @@ struct amu_global_options {
|
||||
char *cluster; /* cluster name */
|
||||
char *karch; /* kernel architecture */
|
||||
char *logfile; /* amd log file */
|
||||
char *op_sys; /* operating system name ${os} */
|
||||
char *op_sys_ver; /* OS version ${osver} */
|
||||
char *op_sys_full; /* full OS name ${full_os} */
|
||||
char *op_sys_vendor; /* name of OS vendor ${vendor} */
|
||||
char *op_sys; /* operating system name */
|
||||
char *op_sys_ver; /* OS version */
|
||||
char *pid_file; /* PID file */
|
||||
char *sub_domain; /* local domain */
|
||||
char *map_options; /* global map options */
|
||||
@@ -165,7 +163,6 @@ struct mnt_map {
|
||||
short flags; /* Allocation flags */
|
||||
short alloc; /* Allocation mode */
|
||||
time_t modify; /* Modify time of map */
|
||||
u_int reloads; /* Number of times map was reloaded */
|
||||
char *map_name; /* Name of this map */
|
||||
char *wildcard; /* Wildcard value */
|
||||
reload_fn *reload; /* Function to be used for reloads */
|
||||
@@ -283,7 +280,6 @@ extern bool_t xdr_mountres3(XDR *xdrs, mountres3 *objp);
|
||||
#ifdef HAVE_FS_AUTOFS
|
||||
extern SVCXPRT *autofsxprt;
|
||||
extern u_short autofs_port;
|
||||
extern int amd_use_autofs;
|
||||
|
||||
extern int autofs_mount(am_node *mp);
|
||||
extern int autofs_umount(am_node *mp);
|
||||
|
||||
+78
-87
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997-1999 Erez Zadok
|
||||
* Copyright (c) 1997-1998 Erez Zadok
|
||||
* Copyright (c) 1990 Jan-Simon Pendry
|
||||
* Copyright (c) 1990 Imperial College of Science, Technology & Medicine
|
||||
* Copyright (c) 1990 The Regents of the University of California.
|
||||
@@ -38,7 +38,7 @@
|
||||
*
|
||||
* %W% (Berkeley) %G%
|
||||
*
|
||||
* $Id: amfs_auto.c,v 1.5 1999/09/30 21:01:29 ezk Exp $
|
||||
* $Id: amfs_auto.c,v 1.1.1.1 1998/11/05 02:04:46 ezk Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -60,13 +60,12 @@
|
||||
/* DEVELOPERS: turn this on for special debugging of readdir code */
|
||||
#undef DEBUG_READDIR
|
||||
|
||||
#define DOT_DOT_COOKIE (u_int) 1
|
||||
|
||||
/****************************************************************************
|
||||
*** STRUCTURES ***
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
*** FORWARD DEFINITIONS ***
|
||||
****************************************************************************/
|
||||
@@ -449,59 +448,59 @@ try_mount(voidp mvp)
|
||||
* Pick a file system to try mounting and
|
||||
* do that in the background if necessary
|
||||
*
|
||||
For each location:
|
||||
if it is new -defaults then
|
||||
extract and process
|
||||
continue;
|
||||
fi
|
||||
if it is a cut then
|
||||
if a location has been tried then
|
||||
break;
|
||||
fi
|
||||
continue;
|
||||
fi
|
||||
parse mount location
|
||||
discard previous mount location if required
|
||||
find matching mounted filesystem
|
||||
if not applicable then
|
||||
this_error = No such file or directory
|
||||
continue
|
||||
fi
|
||||
if the filesystem failed to be mounted then
|
||||
this_error = error from filesystem
|
||||
elif the filesystem is mounting or unmounting then
|
||||
this_error = -1
|
||||
elif the fileserver is down then
|
||||
this_error = -1
|
||||
elif the filesystem is already mounted
|
||||
this_error = 0
|
||||
break
|
||||
fi
|
||||
if no error on this mount then
|
||||
this_error = initialize mount point
|
||||
fi
|
||||
if no error on this mount and mount is delayed then
|
||||
this_error = -1
|
||||
fi
|
||||
if this_error < 0 then
|
||||
retry = true
|
||||
fi
|
||||
if no error on this mount then
|
||||
make mount point if required
|
||||
fi
|
||||
if no error on this mount then
|
||||
if mount in background then
|
||||
run mount in background
|
||||
return -1
|
||||
else
|
||||
this_error = mount in foreground
|
||||
fi
|
||||
fi
|
||||
if an error occurred on this mount then
|
||||
update stats
|
||||
save error in mount point
|
||||
fi
|
||||
endfor
|
||||
For each location:
|
||||
if it is new -defaults then
|
||||
extract and process
|
||||
continue;
|
||||
fi
|
||||
if it is a cut then
|
||||
if a location has been tried then
|
||||
break;
|
||||
fi
|
||||
continue;
|
||||
fi
|
||||
parse mount location
|
||||
discard previous mount location if required
|
||||
find matching mounted filesystem
|
||||
if not applicable then
|
||||
this_error = No such file or directory
|
||||
continue
|
||||
fi
|
||||
if the filesystem failed to be mounted then
|
||||
this_error = error from filesystem
|
||||
elif the filesystem is mounting or unmounting then
|
||||
this_error = -1
|
||||
elif the fileserver is down then
|
||||
this_error = -1
|
||||
elif the filesystem is already mounted
|
||||
this_error = 0
|
||||
break
|
||||
fi
|
||||
if no error on this mount then
|
||||
this_error = initialize mount point
|
||||
fi
|
||||
if no error on this mount and mount is delayed then
|
||||
this_error = -1
|
||||
fi
|
||||
if this_error < 0 then
|
||||
retry = true
|
||||
fi
|
||||
if no error on this mount then
|
||||
make mount point if required
|
||||
fi
|
||||
if no error on this mount then
|
||||
if mount in background then
|
||||
run mount in background
|
||||
return -1
|
||||
else
|
||||
this_error = mount in foreground
|
||||
fi
|
||||
fi
|
||||
if an error occurred on this mount then
|
||||
update stats
|
||||
save error in mount point
|
||||
fi
|
||||
endfor
|
||||
*/
|
||||
static int
|
||||
amfs_auto_bgmount(struct continuation * cp, int mpe)
|
||||
@@ -610,8 +609,8 @@ amfs_auto_bgmount(struct continuation * cp, int mpe)
|
||||
* Don't try logging the string from mf, since it may be bad!
|
||||
*/
|
||||
if (cp->fs_opts.opt_fs != mf->mf_fo->opt_fs)
|
||||
plog(XLOG_ERROR, "use %s instead of 0x%lx",
|
||||
cp->fs_opts.opt_fs, (unsigned long) mf->mf_fo->opt_fs);
|
||||
plog(XLOG_ERROR, "use %s instead of 0x%x",
|
||||
cp->fs_opts.opt_fs, mf->mf_fo->opt_fs);
|
||||
|
||||
mp->am_link = str3cat((char *) 0,
|
||||
cp->fs_opts.opt_fs, "/", link_dir);
|
||||
@@ -696,7 +695,7 @@ amfs_auto_bgmount(struct continuation * cp, int mpe)
|
||||
int i = atoi(mf->mf_fo->opt_delay);
|
||||
if (i > 0 && clocktime() < (cp->start + i)) {
|
||||
#ifdef DEBUG
|
||||
dlog("Mount of %s delayed by %lds", mf->mf_mount, (long) (i - clocktime() + cp->start));
|
||||
dlog("Mount of %s delayed by %ds", mf->mf_mount, i - clocktime() + cp->start);
|
||||
#endif /* DEBUG */
|
||||
this_error = -1;
|
||||
}
|
||||
@@ -706,10 +705,6 @@ amfs_auto_bgmount(struct continuation * cp, int mpe)
|
||||
if (!mf_retry)
|
||||
mf_retry = dup_mntfs(mf);
|
||||
cp->retry = TRUE;
|
||||
#ifdef DEBUG
|
||||
dlog("will retry ...\n");
|
||||
#endif /* DEBUG */
|
||||
break;
|
||||
}
|
||||
|
||||
if (!this_error) {
|
||||
@@ -769,9 +764,8 @@ amfs_auto_bgmount(struct continuation * cp, int mpe)
|
||||
* Rewind the location vector and
|
||||
* reset the default options.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
dlog("(skipping rewind)\n");
|
||||
#endif /* DEBUG */
|
||||
cp->ivec = cp->xivec;
|
||||
cp->def_opts = strealloc(cp->def_opts, cp->auto_opts);
|
||||
/*
|
||||
* Arrange that amfs_auto_bgmount is called
|
||||
* after anything else happens.
|
||||
@@ -998,7 +992,7 @@ amfs_auto_lookuppn(am_node *mp, char *fname, int *error_return, int op)
|
||||
if (error) {
|
||||
#ifdef DEBUG
|
||||
errno = error; /* XXX */
|
||||
dlog("Returning error: %m");
|
||||
dlog("Returning error: %m", error);
|
||||
#endif /* DEBUG */
|
||||
XFREE(fname);
|
||||
ereturn(error);
|
||||
@@ -1327,7 +1321,7 @@ amfs_auto_readdir(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsentry *ep, i
|
||||
* fairly unbelievable) then tough.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
dlog("amfs_auto_readdir: default search");
|
||||
dlog("default search");
|
||||
#endif /* DEBUG */
|
||||
/*
|
||||
* Check for enough room. This is extremely approximate but is more
|
||||
@@ -1356,7 +1350,8 @@ amfs_auto_readdir(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsentry *ep, i
|
||||
ep[1].ne_fileid = mp->am_gen;
|
||||
ep[1].ne_name = "..";
|
||||
ep[1].ne_nextentry = 0;
|
||||
*(u_int *) ep[1].ne_cookie = (xp ? xp->am_gen : DOT_DOT_COOKIE);
|
||||
*(u_int *) ep[1].ne_cookie =
|
||||
xp ? xp->am_gen : ~(u_int) 0;
|
||||
|
||||
if (!xp)
|
||||
dp->dl_eof = TRUE; /* by default assume readdir done */
|
||||
@@ -1364,12 +1359,12 @@ amfs_auto_readdir(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsentry *ep, i
|
||||
return 0;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
dlog("amfs_auto_readdir: real child");
|
||||
dlog("real child");
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (gen == DOT_DOT_COOKIE) {
|
||||
if (gen == ~(u_int) 0) {
|
||||
#ifdef DEBUG
|
||||
dlog("amfs_auto_readdir: End of readdir in %s", mp->am_path);
|
||||
dlog("End of readdir in %s", mp->am_path);
|
||||
#endif /* DEBUG */
|
||||
dp->dl_eof = TRUE;
|
||||
dp->dl_entries = 0;
|
||||
@@ -1384,7 +1379,6 @@ amfs_auto_readdir(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsentry *ep, i
|
||||
if (xp) {
|
||||
int nbytes = count / 2; /* conservative */
|
||||
int todo = MAX_READDIR_ENTRIES;
|
||||
|
||||
dp->dl_entries = ep;
|
||||
do {
|
||||
am_node *xp_next = next_nonerror_node(xp->am_osib);
|
||||
@@ -1392,7 +1386,7 @@ amfs_auto_readdir(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsentry *ep, i
|
||||
if (xp_next) {
|
||||
*(u_int *) ep->ne_cookie = xp_next->am_gen;
|
||||
} else {
|
||||
*(u_int *) ep->ne_cookie = DOT_DOT_COOKIE;
|
||||
*(u_int *) ep->ne_cookie = ~(u_int) 0;
|
||||
dp->dl_eof = TRUE;
|
||||
}
|
||||
|
||||
@@ -1450,7 +1444,7 @@ amfs_auto_readdir_browsable(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsen
|
||||
* fairly unbelievable) then tough.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
dlog("amfs_auto_readdir_browsable: default search");
|
||||
dlog("default search");
|
||||
#endif /* DEBUG */
|
||||
/*
|
||||
* Check for enough room. This is extremely approximate but is more
|
||||
@@ -1490,7 +1484,7 @@ amfs_auto_readdir_browsable(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsen
|
||||
ep[1].ne_fileid = mp->am_gen;
|
||||
ep[1].ne_name = "..";
|
||||
ep[1].ne_nextentry = 0;
|
||||
*(u_int *) ep[1].ne_cookie = DOT_DOT_COOKIE;
|
||||
*(u_int *) ep[1].ne_cookie = ~(u_int) 0;
|
||||
|
||||
/*
|
||||
* If map is browsable, call a function make_entry_chain() to construct
|
||||
@@ -1502,7 +1496,8 @@ amfs_auto_readdir_browsable(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsen
|
||||
if (!te)
|
||||
return 0;
|
||||
#ifdef DEBUG_READDIR
|
||||
for (j=0,ne=te; ne; ne=ne->ne_nextentry)
|
||||
j = 0;
|
||||
for (ne=te; ne; ne=ne->ne_nextentry)
|
||||
plog(XLOG_INFO, "gen1 key %4d \"%s\"", j++, ne->ne_name);
|
||||
#endif /* DEBUG_READDIR */
|
||||
|
||||
@@ -1523,23 +1518,19 @@ amfs_auto_readdir_browsable(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsen
|
||||
}
|
||||
ep[1].ne_nextentry = te; /* append this chunk of "te" chain */
|
||||
#ifdef DEBUG_READDIR
|
||||
for (j=0,ne=te; ne; ne=ne->ne_nextentry)
|
||||
for (ne=te; ne; ne=ne->ne_nextentry)
|
||||
plog(XLOG_INFO, "gen2 key %4d \"%s\"", j++, ne->ne_name);
|
||||
for (j=0,ne=ep; ne; ne=ne->ne_nextentry)
|
||||
plog(XLOG_INFO, "gen2+ key %4d \"%s\" fi=%d ck=%d",
|
||||
j++, ne->ne_name, ne->ne_fileid, *(u_int *)ne->ne_cookie);
|
||||
plog(XLOG_INFO, "EOF is %d", dp->dl_eof);
|
||||
#endif /* DEBUG_READDIR */
|
||||
return 0;
|
||||
} /* end of "if (gen == 0)" statement */
|
||||
|
||||
#ifdef DEBUG
|
||||
dlog("amfs_auto_readdir_browsable: real child");
|
||||
dlog("real child");
|
||||
#endif /* DEBUG */
|
||||
|
||||
if (gen == DOT_DOT_COOKIE) {
|
||||
if (gen == ~(u_int) 0) {
|
||||
#ifdef DEBUG
|
||||
dlog("amfs_auto_readdir_browsable: End of readdir in %s", mp->am_path);
|
||||
dlog("End of readdir in %s", mp->am_path);
|
||||
#endif /* DEBUG */
|
||||
dp->dl_eof = TRUE;
|
||||
dp->dl_entries = 0;
|
||||
@@ -1581,7 +1572,7 @@ amfs_auto_readdir_browsable(am_node *mp, nfscookie cookie, nfsdirlist *dp, nfsen
|
||||
dp->dl_entries = ep;
|
||||
#ifdef DEBUG_READDIR
|
||||
plog(XLOG_INFO, "dl_entries=0x%x, te_next=0x%x, dl_eof=%d",
|
||||
(int) dp->dl_entries, (int) te_next, dp->dl_eof);
|
||||
dp->dl_entries, te_next, dp->dl_eof);
|
||||
for (ne=te; ne; ne=ne->ne_nextentry)
|
||||
plog(XLOG_INFO, "gen3 key %4d \"%s\"", j++, ne->ne_name);
|
||||
#endif /* DEBUG_READDIR */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997-1999 Erez Zadok
|
||||
* Copyright (c) 1997-1998 Erez Zadok
|
||||
* Copyright (c) 1990 Jan-Simon Pendry
|
||||
* Copyright (c) 1990 Imperial College of Science, Technology & Medicine
|
||||
* Copyright (c) 1990 The Regents of the University of California.
|
||||
@@ -38,7 +38,7 @@
|
||||
*
|
||||
* %W% (Berkeley) %G%
|
||||
*
|
||||
* $Id: amfs_direct.c,v 1.2 1999/01/10 21:53:41 ezk Exp $
|
||||
* $Id: amfs_direct.c,v 1.1.1.1 1998/11/05 02:04:46 ezk Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997-1999 Erez Zadok
|
||||
* Copyright (c) 1997-1998 Erez Zadok
|
||||
* Copyright (c) 1989 Jan-Simon Pendry
|
||||
* Copyright (c) 1989 Imperial College of Science, Technology & Medicine
|
||||
* Copyright (c) 1989 The Regents of the University of California.
|
||||
@@ -38,7 +38,7 @@
|
||||
*
|
||||
* %W% (Berkeley) %G%
|
||||
*
|
||||
* $Id: amfs_error.c,v 1.2 1999/01/10 21:53:41 ezk Exp $
|
||||
* $Id: amfs_error.c,v 1.1.1.1 1998/11/05 02:04:46 ezk Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
Loaded 100 of 4193 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user