os161-1.99
 All Data Structures
ln.c
00001 /*
00002  * Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009
00003  *      The President and Fellows of Harvard College.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. Neither the name of the University nor the names of its contributors
00014  *    may be used to endorse or promote products derived from this software
00015  *    without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND
00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE
00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00027  * SUCH DAMAGE.
00028  */
00029 
00030 #include <unistd.h>
00031 #include <stdlib.h>
00032 #include <string.h>
00033 #include <err.h>
00034 
00035 /*
00036  * ln - hardlink or symlink files
00037  *
00038  * Usage: ln oldfile newfile
00039  *        ln -s symlinkcontents symlinkfile
00040  */
00041 
00042 
00043 /*
00044  * Create a symlink with filename PATH that contains text TEXT.
00045  * When fed to ls -l, this produces something that looks like
00046  *
00047  * lrwxrwxrwx  [stuff]   PATH -> TEXT
00048  */
00049 static
00050 void
00051 dosymlink(const char *text, const char *path)
00052 {
00053         if (symlink(text, path)) {
00054                 err(1, "%s", path);
00055         }
00056 }
00057 
00058 /*
00059  * Create a hard link such that NEWFILE names the same file as
00060  * OLDFILE. Since it's a hard link, the two names for the file
00061  * are equal; both are the "real" file.
00062  */
00063 static
00064 void
00065 dohardlink(const char *oldfile, const char *newfile)
00066 {
00067         if (link(oldfile, newfile)) {
00068                 err(1, "%s or %s", oldfile, newfile);
00069                 exit(1);
00070         }
00071 }
00072 
00073 int
00074 main(int argc, char *argv[])
00075 {
00076         /*
00077          * Just do whatever was asked for.
00078          *
00079          * We don't allow the Unix model where you can do
00080          *    ln [-s] file1 file2 file3 destination-directory
00081          */
00082         if (argc==4 && !strcmp(argv[1], "-s")) {
00083                 dosymlink(argv[2], argv[3]);
00084         }
00085         else if (argc==3) {
00086                 dohardlink(argv[1], argv[2]);
00087         }
00088         else {
00089                 warnx("Usage: ln oldfile newfile");
00090                 errx(1, "       ln -s symlinkcontents symlinkfile\n");
00091         }
00092         return 0;
00093 }
 All Data Structures