From 156ee39478bd361111d80ae349ecadab04fa5afb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Thu, 20 Oct 2005 14:52:18 +0000 Subject: [PATCH] (k_hasafs_recheck): new function, allow rechecking if AFS client have started now, internaly it resets the internal state from k_hasafs() and retry retry the probing. The problem with calling k_hasaf() is that is plays around with signals, and that cases problem for some systems/applications. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@16199 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/kafs/afssys.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/lib/kafs/afssys.c b/lib/kafs/afssys.c index 9b1e85a98..d3a6dab31 100644 --- a/lib/kafs/afssys.c +++ b/lib/kafs/afssys.c @@ -164,11 +164,38 @@ map_syscall_name_to_number (const char *str, int *res) static int try_ioctlpath(const char *path, int entrypoint) { - int fd; + int fd, ret, saved_errno; + fd = open(path, O_RDWR); if (fd < 0) return 1; + switch (entrypoint) { + case LINUX_PROC_POINT: { + struct procdata data = { 0, 0, 0, 0, AFSCALL_PIOCTL }; + data.param2 = (unsigned long)VIOCGETTOK; + ret = ioctl(fd, VIOC_SYSCALL_PROC, &data); + break; + } + case MACOS_DEV_POINT: { + struct devdata data = { AFSCALL_PIOCTL, 0, 0, 0, 0, 0, 0, 0 }; + data.param2 = (unsigned long)VIOCGETTOK; + ret = ioctl(fd, VIOC_SYSCALL_DEV, &data); + break; + } + default: + abort(); + } + saved_errno = errno; close(fd); + /* + * Be quite liberal in what error are ok, the first is the one + * that should trigger given that params is NULL. + */ + if (ret && + (saved_errno != EFAULT && + saved_errno != EDOM && + saved_errno != ENOTCONN)) + return 1; afs_ioctlpath = strdup(path); if (afs_ioctlpath == NULL) return 1; @@ -545,3 +572,10 @@ done: errno = saved_errno; return afs_entry_point != NO_ENTRY_POINT; } + +int +k_hasafs_recheck(void) +{ + afs_entry_point = UNKNOWN_ENTRY_POINT; + return k_hasafs(); +}