Annotation of researchv9/cmd/ln.c, revision 1.1

1.1     ! root        1: static char sccsid[] = "@(#)ln.c 4.3 3/31/82";
        !             2: /*
        !             3:  * ln
        !             4:  */
        !             5: #include <stdio.h>
        !             6: #include <sys/types.h>
        !             7: #include <sys/stat.h>
        !             8: 
        !             9: struct stat stb;
        !            10: int    fflag;
        !            11: int    sflag;
        !            12: char   name[BUFSIZ];
        !            13: char   *rindex();
        !            14: 
        !            15: main(argc, argv)
        !            16:        int argc;
        !            17:        register char **argv;
        !            18: {
        !            19:        register int i, r;
        !            20: 
        !            21:        argc--, argv++;
        !            22: again:
        !            23:        if (argc && strcmp(argv[0], "-f") == 0) {
        !            24:                fflag++;
        !            25:                argv++;
        !            26:                argc--;
        !            27:        }
        !            28:        if (argc && strcmp(argv[0], "-s") == 0) {
        !            29:                sflag++;
        !            30:                argv++;
        !            31:                argc--;
        !            32:        }
        !            33:        if (argc == 0) 
        !            34:                goto usage;
        !            35:        else if (argc == 1) {
        !            36:                argv[argc] = ".";
        !            37:                argc++;
        !            38:        }
        !            39:        if (sflag == 0 && argc > 2) {
        !            40:                if (stat(argv[argc-1], &stb) < 0)
        !            41:                        goto usage;
        !            42:                if ((stb.st_mode&S_IFMT) != S_IFDIR) 
        !            43:                        goto usage;
        !            44:        }
        !            45:        r = 0;
        !            46:        for(i = 0; i < argc-1; i++)
        !            47:                r |= linkit(argv[i], argv[argc-1]);
        !            48:        exit(r);
        !            49: usage:
        !            50:        fprintf(stderr, "Usage: ln [ -s ] f1\nor: ln [ -s ] f1 f2\nln [ -s ] f1 ... fn d2\n");
        !            51:        exit(1);
        !            52: }
        !            53: 
        !            54: int    link(), symlink();
        !            55: 
        !            56: linkit(from, to)
        !            57:        char *from, *to;
        !            58: {
        !            59:        char *tail;
        !            60:        int (*linkf)() = sflag ? symlink : link;
        !            61: 
        !            62:        /* is target a directory? */
        !            63:        if (sflag == 0 && fflag == 0 && stat(from, &stb) >= 0
        !            64:            && (stb.st_mode&S_IFMT) == S_IFDIR) {
        !            65:                fprintf(stderr, "ln: %s is a directory\n", from);
        !            66:                return (1);
        !            67:        }
        !            68:        if (stat(to, &stb) >= 0 && (stb.st_mode&S_IFMT) == S_IFDIR) {
        !            69:                tail = rindex(from, '/');
        !            70:                if (tail == 0)
        !            71:                        tail = from;
        !            72:                else
        !            73:                        tail++;
        !            74:                sprintf(name, "%s/%s", to, tail);
        !            75:                to = name;
        !            76:        }
        !            77:        if ((*linkf)(from, to) < 0) {
        !            78:                lnerror(from, to);
        !            79:                return (1);
        !            80:        }
        !            81:        return (0);
        !            82: }
        !            83: 
        !            84: lnerror(from, to)
        !            85: char *from, *to;
        !            86: {
        !            87:        char buf[BUFSIZ];
        !            88: 
        !            89:        sprintf(buf, "ln %s %s", from, to);
        !            90:        perror(buf);
        !            91: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.