]> Zhao Yanbai Git Server - minix.git/commitdiff
Importing bin/ln 80/280/2
authorLionel Sambuc <lionel@minix3.org>
Wed, 30 Jan 2013 18:04:17 +0000 (19:04 +0100)
committerLionel Sambuc <lionel@minix3.org>
Fri, 1 Feb 2013 10:41:48 +0000 (11:41 +0100)
Change-Id: I318e79f2d02dcff10bda8af335d286a78be5c5a2

bin/Makefile
bin/ln/Makefile [new file with mode: 0644]
bin/ln/ln.1 [new file with mode: 0644]
bin/ln/ln.c [new file with mode: 0644]
commands/cp/Makefile
docs/UPDATING
releasetools/nbsd_ports

index 18c762def386b209f4be373133a47dfc4015df90..0e632bdfc9452c435a1c49fc84fb25569d6c68a6 100644 (file)
@@ -1,7 +1,7 @@
 #      $NetBSD: Makefile,v 1.22 2007/12/31 15:31:24 ad Exp $
 #      @(#)Makefile    8.1 (Berkeley) 5/31/93
 
-SUBDIR=        cat date echo ed expr kill \
+SUBDIR=        cat date echo ed expr kill ln \
        mkdir pax pwd rm rmdir test
 
 .include <bsd.subdir.mk>
diff --git a/bin/ln/Makefile b/bin/ln/Makefile
new file mode 100644 (file)
index 0000000..53e91d0
--- /dev/null
@@ -0,0 +1,7 @@
+#      $NetBSD: Makefile,v 1.10 1999/09/27 17:44:50 jdolecek Exp $
+#      @(#)Makefile    8.2 (Berkeley) 5/31/93
+
+PROG=  ln
+MAN=   ln.1
+
+.include <bsd.prog.mk>
diff --git a/bin/ln/ln.1 b/bin/ln/ln.1
new file mode 100644 (file)
index 0000000..3688970
--- /dev/null
@@ -0,0 +1,173 @@
+.\"    $NetBSD: ln.1,v 1.25 2012/03/22 07:58:17 wiz Exp $
+.\"
+.\" Copyright (c) 1980, 1990, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)ln.1        8.2 (Berkeley) 12/30/93
+.\"
+.Dd October 29, 2007
+.Dt LN 1
+.Os
+.Sh NAME
+.Nm ln
+.Nd make links
+.Sh SYNOPSIS
+.Nm
+.Op Fl fhinsv
+.Ar source_file
+.Op Ar target_file
+.Nm
+.Op Fl fhinsv
+.Ar source_file ... target_dir
+.Sh DESCRIPTION
+The
+.Nm
+utility creates a new directory entry (linked file) which has the
+same modes as the original file.
+It is useful for maintaining multiple copies of a file in many places
+at once without using up storage for the
+.Dq copies ;
+instead, a link
+.Dq points
+to the original copy.
+There are two types of links: hard links and symbolic links.
+How a link
+.Dq points
+to a file is one of the differences between a hard or symbolic link.
+.Pp
+The options are as follows:
+.Bl -tag -width flag
+.It Fl f
+Unlink any already existing file, permitting the link to occur.
+.It Fl h
+If the
+.Ar target_file
+or
+.Ar target_dir
+is a symbolic link, do not follow it.
+This is most useful with the
+.Fl f
+option, to replace a symlink which may point to a directory.
+.It Fl i
+Cause
+.Nm
+to write a prompt to standard error if the target file exists.
+If the response from the standard input begins with the character
+.Sq Li y
+or
+.Sq Li Y ,
+then unlink the target file so that the link may occur.
+Otherwise, do not attempt the link.
+(The
+.Fl i
+option overrides any previous
+.Fl f
+options.)
+.It Fl n
+Same as
+.Fl h ,
+for compatibility with other
+.Nm
+implementations, namely GNU coreutils.
+.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
+.Nm
+makes
+.Em hard
+links.
+A hard link to a file is indistinguishable from the original directory entry;
+any changes to a file are effective independent of the name used to reference
+the file.
+Hard links may not normally refer to directories and may not span file systems.
+.Pp
+A symbolic link contains the name of the file to
+which it is linked.
+The referenced file is used when an
+.Xr open 2
+operation is performed on the link.
+A
+.Xr stat 2
+on a symbolic link will return the linked-to file; an
+.Xr lstat 2
+must be done to obtain information about the link.
+The
+.Xr readlink 2
+call may be used to read the contents of a symbolic link.
+Symbolic links may span file systems and may refer to directories.
+.Pp
+Given one or two arguments,
+.Nm
+creates a link to an existing file
+.Ar source_file  .
+If
+.Ar target_file
+is given, the link has that name;
+.Ar target_file
+may also be a directory in which to place the link;
+otherwise it is placed in the current directory.
+If only the directory is specified, the link will be made
+to the last component of
+.Ar source_file  .
+.Pp
+Given more than two arguments,
+.Nm
+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.
+.Sh SEE ALSO
+.Xr link 2 ,
+.Xr lstat 2 ,
+.Xr readlink 2 ,
+.Xr stat 2 ,
+.Xr symlink 2 ,
+.Xr symlink 7
+.Sh STANDARDS
+The
+.Nm
+utility conforms to
+.St -p1003.2-92 .
+.Pp
+The
+.Fl v
+option is an extension to
+.St -p1003.2-92 .
+.Sh HISTORY
+A
+.Nm
+utility appeared in
+.At v6 .
diff --git a/bin/ln/ln.c b/bin/ln/ln.c
new file mode 100644 (file)
index 0000000..9127477
--- /dev/null
@@ -0,0 +1,230 @@
+/* $NetBSD: ln.c,v 1.35 2011/08/29 14:38:30 joerg Exp $ */
+
+/*
+ * Copyright (c) 1987, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1987, 1993, 1994\
+ The Regents of the University of California.  All rights reserved.");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)ln.c       8.2 (Berkeley) 3/31/94";
+#else
+__RCSID("$NetBSD: ln.c,v 1.35 2011/08/29 14:38:30 joerg Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/stat.h>
+
+#include <err.h>
+#include <errno.h>
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+static int     fflag;                          /* Unlink existing files. */
+static int     hflag;                          /* Check new name for symlink first. */
+static int     iflag;                          /* Interactive mode. */
+static int     sflag;                          /* Symbolic, not hard, link. */
+static int     vflag;                          /* Verbose output */
+
+                                       /* System link call. */
+static int (*linkf)(const char *, const char *);
+static char   linkch;
+
+static int     linkit(const char *, const char *, int);
+__dead static void     usage(void);
+
+int
+main(int argc, char *argv[])
+{
+       struct stat sb;
+       int ch, exitval;
+       char *sourcedir;
+
+       setprogname(argv[0]);
+       (void)setlocale(LC_ALL, "");
+
+       while ((ch = getopt(argc, argv, "fhinsv")) != -1)
+               switch (ch) {
+               case 'f':
+                       fflag = 1;
+                       iflag = 0;
+                       break;
+               case 'h':
+               case 'n':
+                       hflag = 1;
+                       break;
+               case 'i':
+                       iflag = 1;
+                       fflag = 0;
+                       break;
+               case 's':
+                       sflag = 1;
+                       break;
+               case 'v':               
+                       vflag = 1;
+                       break;
+               case '?':
+               default:
+                       usage();
+                       /* NOTREACHED */
+               }
+
+       argv += optind;
+       argc -= optind;
+
+       if (sflag) {
+               linkf  = symlink;
+               linkch = '-';
+       } else {
+               linkf  = link;
+               linkch = '=';
+       }
+
+       switch(argc) {
+       case 0:
+               usage();
+               /* NOTREACHED */
+       case 1:                         /* ln target */
+               exit(linkit(argv[0], ".", 1));
+               /* NOTREACHED */
+       case 2:                         /* ln target source */
+               exit(linkit(argv[0], argv[1], 0));
+               /* NOTREACHED */
+       }
+
+                                       /* ln target1 target2 directory */
+       sourcedir = argv[argc - 1];
+       if (hflag && lstat(sourcedir, &sb) == 0 && S_ISLNK(sb.st_mode)) {
+               /* we were asked not to follow symlinks, but found one at
+                  the target--simulate "not a directory" error */
+               errno = ENOTDIR;
+               err(EXIT_FAILURE, "%s", sourcedir);
+               /* NOTREACHED */
+       }
+       if (stat(sourcedir, &sb)) {
+               err(EXIT_FAILURE, "%s", sourcedir);
+               /* NOTREACHED */
+       }
+       if (!S_ISDIR(sb.st_mode)) {
+               usage();
+               /* NOTREACHED */
+       }
+       for (exitval = 0; *argv != sourcedir; ++argv)
+               exitval |= linkit(*argv, sourcedir, 1);
+       exit(exitval);
+       /* NOTREACHED */
+}
+
+static int
+linkit(const char *target, const char *source, int isdir)
+{
+       struct stat sb;
+       const char *p;
+       char path[MAXPATHLEN];
+       int ch, exists, first;
+
+       if (!sflag) {
+               /* If target doesn't exist, quit now. */
+               if (stat(target, &sb)) {
+                       warn("%s", target);
+                       return (1);
+               }
+       }
+
+       /* If the source is a directory (and not a symlink if hflag),
+          append the target's name. */
+       if (isdir ||
+           (!lstat(source, &sb) && S_ISDIR(sb.st_mode)) ||
+           (!hflag && !stat(source, &sb) && S_ISDIR(sb.st_mode))) {
+               if ((p = strrchr(target, '/')) == NULL)
+                       p = target;
+               else
+                       ++p;
+               (void)snprintf(path, sizeof(path), "%s/%s", source, p);
+               source = path;
+       }
+
+       exists = !lstat(source, &sb);
+
+       /*
+        * If the file exists, then unlink it forcibly if -f was specified
+        * and interactively if -i was specified.
+        */
+       if (fflag && exists) {
+               if (unlink(source)) {
+                       warn("%s", source);
+                       return (1);
+               }
+       } else if (iflag && exists) {
+               fflush(stdout);
+               (void)fprintf(stderr, "replace %s? ", source);
+
+               first = ch = getchar();
+               while (ch != '\n' && ch != EOF)
+                       ch = getchar();
+               if (first != 'y' && first != 'Y') {
+                       (void)fprintf(stderr, "not replaced\n");
+                       return (1);
+               }
+
+               if (unlink(source)) {
+                       warn("%s", source);
+                       return (1);
+               }
+       }
+
+       /* Attempt the link. */
+       if ((*linkf)(target, source)) {
+               warn("%s", source);
+               return (1);
+       }
+       if (vflag)
+               (void)printf("%s %c> %s\n", source, linkch, target);
+
+       return (0);
+}
+
+static void
+usage(void)
+{
+
+       (void)fprintf(stderr,
+           "usage:\t%s [-fhinsv] file1 file2\n\t%s [-fhinsv] file ... directory\n",
+           getprogname(), getprogname());
+       exit(1);
+       /* NOTREACHED */
+}
index f9e26976179c42c42b0f6216692468a373db28eb..90cfc1efb60ca4cc2256f988b331a21eb7b33d9c 100644 (file)
@@ -5,7 +5,6 @@ BINDIR= /bin
 MAN=
 
 LINKS+=      ${BINDIR}/cp ${BINDIR}/mv
-LINKS+=      ${BINDIR}/cp ${BINDIR}/ln
 LINKS+=      ${BINDIR}/cp ${BINDIR}/clone
 LINKS+=      ${BINDIR}/cp ${BINDIR}/cpdir
 
index 04f49e13a25eab25f6e3738fe11ab92e76c4bbf2..85235515111a43c44897ff6d56f168365c04c00f 100644 (file)
@@ -1,3 +1,16 @@
+20130201:
+       Replace our native ln with NetBSD version.
+
+       As our native ln is a hard link to cp, simply overwriting ln with
+       the new version would cause mv, cp, etc to stop working.
+
+       Do this BEFORE a 'make build':
+
+       # rm /bin/ln
+       # cp /bin/cp /bin/ln
+
+       Then 'make build' as usual.
+
 20130130:
        With the shell update, and following update of 'test', some
        modifications are needed in .profile and .ashrc.
index cac8569695670d9066126eb216ad02e46feb40ec..c08df40d54d849e0f7421760e0277f834654931f 100644 (file)
@@ -12,6 +12,7 @@
 2012/01/16 18:47:57,bin/ed
 2012/10/17 12:00:00,bin/expr
 2012/10/17 12:00:00,bin/kill
+2012/10/17 12:00:00,bin/ln
 2012/10/17 12:00:00,bin/Makefile
 2012/10/17 12:00:00,bin/Makefile.inc
 2008/07/20 00:52:40,bin/mkdir