Compare commits

..
Author SHA1 Message Date
cvs2svn e5eb97b547 This commit was manufactured by cvs2svn to create tag
'RELENG_3_3_0_RELEASE'.
1999-09-16 08:26:13 +00:00
4193 changed files with 170344 additions and 384680 deletions

No files matched your search

+2 -5
View File
@@ -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
+1 -1
View File
@@ -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
+134 -3
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
+2 -4
View File
@@ -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
+1 -2
View File
@@ -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
+1 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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:
-2
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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);
/*
-2
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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;
}
+1 -6
View 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
View File
@@ -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 ,
-3
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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 . )
+2
View File
@@ -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) {
-1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -358,7 +358,7 @@ main(argc, argv)
*/
printheader();
if (nentries == 0)
exit(1);
exit(0);
/*
* sort proc list
*/
+3 -13
View File
@@ -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
View File
@@ -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 .
-3
View File
@@ -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
View File
@@ -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
View File
@@ -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);
}
-4
View File
@@ -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
-1
View File
@@ -109,7 +109,6 @@ setalias(name, val)
ap->val[len+1] = '\0';
}
#endif
ap->flag = 0;
ap->next = *app;
*app = ap;
INTON;
+1 -1
View File
@@ -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]);
-1
View File
@@ -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
View File
@@ -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
View File
@@ -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;
{
-1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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();
+4
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
+1
View File
@@ -2,6 +2,7 @@
# $FreeBSD$
PROG= test
SRCS= test.c operators.c
LINKS= ${BINDIR}/test ${BINDIR}/[
MLINKS= test.1 '[.1'
+129 -75
View File
@@ -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,
};
+42 -22
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because it is too large. Load diff
-59
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because it is too large. Load diff
-17
View File
@@ -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
+5 -5
View File
@@ -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
View File
@@ -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
-86
View File
@@ -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:
-11
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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 {
+4 -8
View File
@@ -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
View File
@@ -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 */
+2 -2
View File
@@ -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 $
*
*/
+2 -2
View File
@@ -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