bin/ln/ln.c
static int
linkit(const char *target, const char *source, int isdir)
{
	struct stat sb;
	const char *p;
	int ch, exists, first;
	char path[PATH_MAX];

	if (!sflag) {
		/* If target doesn't exist, quit now. */
		if (stat(target, &sb) != 0) {
			warn("%s", target);
			return (1);
		}
		/* Only symbolic links to directories. */
		if (S_ISDIR(sb.st_mode)) {
			errno = EISDIR;
			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) == 0 && S_ISDIR(sb.st_mode)) ||
	    (!hflag && stat(source, &sb) == 0 && S_ISDIR(sb.st_mode))) {
		if ((p = strrchr(target, '/')) == NULL)
			p = target;
		else
			++p;
		if (snprintf(path, sizeof(path), "%s/%s", source, p) >=
		    (int)sizeof(path)) {
			errno = ENAMETOOLONG;
			warn("%s", target);
			return (1);
		}
		source = path;
	}

	exists = (lstat(source, &sb) == 0);
	/*
	 * If doing hard links and the source (destination) exists and it
	 * actually is the same file like the target (existing file), we
	 * complain that the files are identical.  If -f is specified, we
	 * accept the job as already done and return with success.
	 */
	if (exists && !sflag) {
		struct stat tsb;

		if (stat(target, &tsb) != 0) {
			warn("%s: disappeared", target);
			return (1);
		}

		if (tsb.st_dev == sb.st_dev && tsb.st_ino == sb.st_ino) {
			warnx("%s and %s are identical (not linked).", target, source);
			if (fflag)
				return (0);
			else
				return (1);
		}
	}
	/*
	 * If the file exists, then unlink it forcibly if -f was specified
	 * and interactively if -i was specified.
	 */
	if (fflag && exists) {
		if (unlink(source) != 0) {
			warn("%s", source);
			return (1);
		}
	} else if (iflag && exists) {
		fflush(stdout);
		fprintf(stderr, "replace %s? ", source);

		first = ch = getchar();
		while(ch != '\n' && ch != EOF)
			ch = getchar();
		if (first != 'y' && first != 'Y') {
			fprintf(stderr, "not replaced\n");
			return (1);
		}

		if (unlink(source) != 0) {
			warn("%s", source);
			return (1);
		}
	}

	/* Attempt the link. */
	if ((*linkf)(target, source) != 0) {
		warn("%s", source);
		return (1);
	}
	if (vflag)
		printf("%s %c> %s\n", source, linkch, target);
	return (0);
}
/*
 * Nomenclature warning!
 *
 * In this source "target" and "source" are used the opposite way they
 * are used in the ln(1) manual.  Here "target" is the existing file and
 * "source" specifies the to-be-created link to "target".
 */
Nomenclature warning.
In this source "target" and "source" are used the opposite way they
are used in the ln(1) manual.
Nomenclature warning . In this source " target " and " source " are used the opposite way they are used in the ln ( 1 ) manual .
static int
linkit(const char *target, const char *source, int isdir)
{
	struct stat sb;
	const char *p;
	int ch, exists, first;
	char path[PATH_MAX];
	if (!sflag) {
		if (stat(target, &sb) != 0) {
			warn("%s", target);
			return (1);
		}
		if (S_ISDIR(sb.st_mode)) {
			errno = EISDIR;
			warn("%s", target);
			return (1);
		}
	}
	if (isdir ||
	    (lstat(source, &sb) == 0 && S_ISDIR(sb.st_mode)) ||
	    (!hflag && stat(source, &sb) == 0 && S_ISDIR(sb.st_mode))) {
		if ((p = strrchr(target, '/')) == NULL)
			p = target;
		else
			++p;
		if (snprintf(path, sizeof(path), "%s/%s", source, p) >=
		    (int)sizeof(path)) {
			errno = ENAMETOOLONG;
			warn("%s", target);
			return (1);
		}
		source = path;
	}
	exists = (lstat(source, &sb) == 0);
	if (exists && !sflag) {
		struct stat tsb;
		if (stat(target, &tsb) != 0) {
			warn("%s: disappeared", target);
			return (1);
		}
		if (tsb.st_dev == sb.st_dev && tsb.st_ino == sb.st_ino) {
			warnx("%s and %s are identical (not linked).", target, source);
			if (fflag)
				return (0);
			else
				return (1);
		}
	}
	if (fflag && exists) {
		if (unlink(source) != 0) {
			warn("%s", source);
			return (1);
		}
	} else if (iflag && exists) {
		fflush(stdout);
		fprintf(stderr, "replace %s? ", source);
		first = ch = getchar();
		while(ch != '\n' && ch != EOF)
			ch = getchar();
		if (first != 'y' && first != 'Y') {
			fprintf(stderr, "not replaced\n");
			return (1);
		}
		if (unlink(source) != 0) {
			warn("%s", source);
			return (1);
		}
	}
	if ((*linkf)(target, source) != 0) {
		warn("%s", source);
		return (1);
	}
	if (vflag)
		printf("%s %c> %s\n", source, linkch, target);
	return (0);
}
static int linkit ( const char * target , const char * source , int isdir ) { struct stat sb ; const char * p ; int ch , exists , first ; char path [ PATH_MAX ] ; if ( ! sflag ) { if ( stat ( target , & sb ) != 0 ) { warn ( " " , target ) ; return ( 1 ) ; } if ( S_ISDIR ( sb . st_mode ) ) { errno = EISDIR ; warn ( " " , target ) ; return ( 1 ) ; } } if ( isdir || ( lstat ( source , & sb ) == 0 && S_ISDIR ( sb . st_mode ) ) || ( ! hflag && stat ( source , & sb ) == 0 && S_ISDIR ( sb . st_mode ) ) ) { if ( ( p = strrchr ( target , ' ' ) ) == NULL ) p = target ; else ++ p ; if ( snprintf ( path , sizeof ( path ) , " " , source , p ) >= ( int ) sizeof ( path ) ) { errno = ENAMETOOLONG ; warn ( " " , target ) ; return ( 1 ) ; } source = path ; } exists = ( lstat ( source , & sb ) == 0 ) ; if ( exists && ! sflag ) { struct stat tsb ; if ( stat ( target , & tsb ) != 0 ) { warn ( " " , target ) ; return ( 1 ) ; } if ( tsb . st_dev == sb . st_dev && tsb . st_ino == sb . st_ino ) { warnx ( " " , target , source ) ; if ( fflag ) return ( 0 ) ; else return ( 1 ) ; } } if ( fflag && exists ) { if ( unlink ( source ) != 0 ) { warn ( " " , source ) ; return ( 1 ) ; } } else if ( iflag && exists ) { fflush ( stdout ) ; fprintf ( stderr , " " , source ) ; first = ch = getchar ( ) ; while ( ch != ' \n ' && ch != EOF ) ch = getchar ( ) ; if ( first != ' ' && first != ' ' ) { fprintf ( stderr , " \n " ) ; return ( 1 ) ; } if ( unlink ( source ) != 0 ) { warn ( " " , source ) ; return ( 1 ) ; } } if ( ( * linkf ) ( target , source ) != 0 ) { warn ( " " , source ) ; return ( 1 ) ; } if ( vflag ) printf ( " \n " , source , linkch , target ) ; return ( 0 ) ; }
Nomenclature warning!
Nomenclature warning!
/* If target doesn't exist, quit now. */ /* Only symbolic links to directories. */ /*
	 * If the source is a directory (and not a symlink if hflag),
	 * append the target's name.
	 */ /*
	 * If doing hard links and the source (destination) exists and it
	 * actually is the same file like the target (existing file), we
	 * complain that the files are identical.  If -f is specified, we
	 * accept the job as already done and return with success.
	 */ /*
	 * If the file exists, then unlink it forcibly if -f was specified
	 * and interactively if -i was specified.
	 */ /* Attempt the link. */