dnl CF_LINK_FUNCS version: 14 updated: 2024/12/14 16:09:34
dnl -------------
dnl Most Unix systems have both link and symlink, a few don't have symlink.
dnl A few non-Unix systems implement symlink, but not link.
dnl A few non-systems implement neither (or have nonfunctional versions).
dnl
dnl This allows for a 2-second difference in modification times to allow for
dnl some marginal NFS implementations.
AC_DEFUN([CF_LINK_FUNCS],
[
AC_CHECK_HEADERS( \
unistd.h \
)
AC_CHECK_FUNCS( \
	remove \
	unlink )

if test "$cross_compiling" = yes ; then
	AC_CHECK_FUNCS( \
		link \
		symlink )
else
	AC_CACHE_CHECK(if link/symlink functions work,cf_cv_link_funcs,[
		cf_cv_link_funcs=
		for cf_func in link symlink ; do
			AC_TRY_RUN([
$ac_includes_default

int main(void)
{
	int fail = 0;
	char src[] = "conftest.tmp";
	char dst[] = "conftest.chk";
	struct stat src_sb, dst_sb;
	FILE *fp = fopen(src, "w");
	if (fp == NULL) { fail = 3; } else {
		fclose(fp); stat(src, &src_sb);
		if ($cf_func(src, dst) < 0) {
			fail = 1;
		} else if (stat(dst, &dst_sb) < 0) {
			fail = 2;
		} else {
			long diff = (dst_sb.st_mtime - src_sb.st_mtime);
			if (diff < 0) diff = -diff;
			if (diff > 2) fail = 3;
		}
	}
#ifdef HAVE_UNLINK
	unlink(dst); unlink(src);
#else
	remove(dst); remove(src);
#endif
	${cf_cv_main_return:-return} (fail);
}
			],[
			cf_cv_link_funcs="$cf_cv_link_funcs $cf_func"
			eval 'ac_cv_func_'$cf_func'=yes'],[
			eval 'ac_cv_func_'$cf_func'=no'],[
			eval 'ac_cv_func_'$cf_func'=error'])
		done
		test -z "$cf_cv_link_funcs" && cf_cv_link_funcs=no
	])
	test "$ac_cv_func_link"    = yes && AC_DEFINE(HAVE_LINK,1,[Define to 1 if we have link() function])
	test "$ac_cv_func_symlink" = yes && AC_DEFINE(HAVE_SYMLINK,1,[Define to 1 if we have symlink() function])
fi
])dnl
