DataMuseum.dk

Presents historical artifacts from the history of:

Commodore CBM-900

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Commodore CBM-900

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦e02aef81e⟧ TextFile

    Length: 1511 (0x5e7)
    Types: TextFile
    Notes: UNIX file
    Names: »ln.c«

Derivation

└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
    └─⟦f4b8d8c84⟧ UNIX V7 Filesystem
        └─ ⟦this⟧ »cmd/ln.c« 

TextFile

/*
 * Make a link
 */

#include <stdio.h>
#include <stat.h>
#include <errno.h>

struct	stat	sb;
char	namebuf[200];
char	usemsg[] = "\
Usage: ln [-f] oldfile [newlink]\n\
       ln [-f] name ... dir\n\
";

int	fflag;
extern	int	errno;

main(argc, argv)
char *argv[];
{
	register int i;
	register int estat = 0;
	char *lname;

	if (argc>2 && *argv[1]=='-') {
		if (argv[1][1]=='f' && argv[1][2]=='\0')
			fflag = 1;
		else
			usage();
		argc--;
		argv++;
	}
	if (argc < 2)
		usage();
	lname = argv[argc-1];
	if (stat(lname, &sb)>=0 && (sb.st_mode&S_IFMT)==S_IFDIR)
		for (i=1; i<argc-1; i++)
			estat |= lndir(argv[i], lname);
	else {
		if (argc > 3)
			usage();
		if (argc == 2)
			estat = lndir(argv[1], ".");
		else
			estat = ln(argv[1], argv[2]);
	}
	exit(estat);
}

/*
 * Do the link and
 * check for errors.
 * Remove the file and try again
 * if the `-f' is specified.
 */
ln(n1, n2)
char *n1, *n2;
{
	if (link(n1, n2) < 0) {
		if (fflag && errno==EEXIST) {
			if (stat(n2, &sb) >= 0
			 && (sb.st_mode&S_IFMT) != S_IFDIR
			 && unlink(n2) >= 0
			 && link(n1, n2) >= 0)
				return (0);
		}
		perror("link");
		return (1);
	}
	return (0);
}

/*
 * Do a link into a directory.
 * Generate a name.
 */
lndir(n1, n2)
char *n1, *n2;
{
	register char *rp, *sp, *cp;

	for (sp = rp = n1; *rp != '\0'; )
		if (*rp++ == '/')
			sp = rp;
	for (cp=namebuf, rp=n2; *rp != '\0'; )
		*cp++ = *rp++;
	*cp++ = '/';
	while (*cp++ = *sp++)
		;
	return (ln(n1, namebuf));
}

usage()
{
	fprintf(stderr, usemsg);
	exit(1);
}