diff --git a/acinclude.m4 b/acinclude.m4 index 36211b6fe3..b1ba299f01 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -405,6 +405,7 @@ case $system in SOLARIS_UFSVFS_HAS_DQRWLOCK SOLARIS_FS_HAS_FS_ROLLED SOLARIS_SOLOOKUP_TAKES_SOCKPARAMS + SOLARIS_HAVE_VN_RENAMEPATH ;; *-sunos*) MKAFS_OSTYPE=SUNOS diff --git a/src/afs/SOLARIS/osi_vnodeops.c b/src/afs/SOLARIS/osi_vnodeops.c index 2d71f97c6c..9f9915775b 100644 --- a/src/afs/SOLARIS/osi_vnodeops.c +++ b/src/afs/SOLARIS/osi_vnodeops.c @@ -1558,7 +1558,7 @@ gafs_rename(struct vcache *aodp, char *aname1, if (avcp) { struct vnode *vp = AFSTOV(avcp), *pvp = AFSTOV(andp); -# ifdef AFS_SUN511_ENV +# ifdef HAVE_VN_RENAMEPATH vn_renamepath(pvp, vp, aname2, strlen(aname2)); # else mutex_enter(&vp->v_lock); @@ -1568,7 +1568,7 @@ gafs_rename(struct vcache *aodp, char *aname1, } mutex_exit(&vp->v_lock); vn_setpath(afs_globalVp, pvp, vp, aname2, strlen(aname2)); -# endif /* !AFS_SUN511_ENV */ +# endif /* !HAVE_VN_RENAMEPATH */ AFS_RELE(avcp); } diff --git a/src/cf/solaris-renamepath.m4 b/src/cf/solaris-renamepath.m4 new file mode 100644 index 0000000000..6ae7fe2071 --- /dev/null +++ b/src/cf/solaris-renamepath.m4 @@ -0,0 +1,35 @@ +dnl This checks for the existence of the vn_renamepath function, added in +dnl Solaris 11 and Solaris 10u8. +dnl +dnl Just trying to use the function is not sufficient for a configure test, +dnl since using an undeclared function is just a warning, and we want an error. +dnl Rather than try to rely on making warnings generate errors (which may +dnl change depending on what compiler version we're using, or in the future +dnl different compilers entirely), we detect the function by declaring an +dnl incompatible prototype. If that successfully compiles, vn_renamepath +dnl does not exist in the system headers, so we know it's not there. If it +dnl fails, we try to compile again without the incompatible prototype, to +dnl make sure we didn't fail for some other reason. If that succeeds, we know +dnl we have vn_renamepath available; if it fails, something else is wrong and +dnl we just try to proceed, assuming we don't have it. +dnl +AC_DEFUN([SOLARIS_HAVE_VN_RENAMEPATH], + + [AC_CACHE_CHECK([for vn_renamepath], + [ac_cv_solaris_have_vn_renamepath], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#define _KERNEL + #include ]], + [[void vn_renamepath(void);]])], + [ac_cv_solaris_have_vn_renamepath=no], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#define _KERNEL + #include ]])], + [ac_cv_solaris_have_vn_renamepath=yes], + [ac_cv_solaris_have_vn_renamepath=no])])]) + + AS_IF([test "x$ac_cv_solaris_have_vn_renamepath" = "xyes"], + [AC_DEFINE([HAVE_VN_RENAMEPATH], [1], + [define if the function vn_renamepath exists])])])