rewrite and add support for environment variable AFS_SYSCALL
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@5039 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -50,8 +50,12 @@ static int (*Setpag)(void); | ||||
|  | ||||
| #include "dlfcn.h" | ||||
|  | ||||
| /* | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| static int | ||||
| aix_setup(void) | ||||
| try_aix(void) | ||||
| { | ||||
| #ifdef STATIC_AFS_SYSCALLS | ||||
|     Pioctl = aix_pioctl; | ||||
| @@ -75,12 +79,14 @@ aix_setup(void) | ||||
| 	    else if (errno != ENOENT) | ||||
| 		warn("%s", path); | ||||
| 	} | ||||
| 	return; | ||||
| 	return 1; | ||||
|     } | ||||
|     Setpag = (int (*)(void))dlsym(ptr, "aix_setpag"); | ||||
|     Pioctl = (int (*)(char*, int,  | ||||
| 		      struct ViceIoctl*, int))dlsym(ptr, "aix_pioctl"); | ||||
| #endif | ||||
|     afs_entry_point = AIX_ENTRY_POINTS; | ||||
|     return 0; | ||||
| } | ||||
| #endif /* _AIX */ | ||||
|  | ||||
| @@ -191,16 +197,62 @@ SIGSYS_handler(int sig) | ||||
|  | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Try to see if `syscall' is a pioctl.  Return 0 iff succesful. | ||||
|  */ | ||||
|  | ||||
| static int | ||||
| try_one (int syscall_num) | ||||
| { | ||||
|     struct ViceIoctl parms; | ||||
|     memset(&parms, 0, sizeof(parms)); | ||||
|  | ||||
|     if (setjmp(catch_SIGSYS) == 0) { | ||||
| 	syscall(syscall_num, AFSCALL_PIOCTL, | ||||
| 		0, VIOCSETTOK, &parms, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); | ||||
| 	if (errno == EINVAL) { | ||||
| 	    afs_entry_point = SINGLE_ENTRY_POINT; | ||||
| 	    afs_syscalls[0] = syscall_num; | ||||
| 	    return 0; | ||||
| 	} | ||||
|     } | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Try to see if `syscall_pioctl' is a pioctl syscall.  Return 0 iff | ||||
|  * succesful. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| static int | ||||
| try_two (int syscall_pioctl, int syscall_setpag) | ||||
| { | ||||
|     struct ViceIoctl parms; | ||||
|     memset(&parms, 0, sizeof(parms)); | ||||
|  | ||||
|     if (setjmp(catch_SIGSYS) == 0) { | ||||
| 	syscall(syscall_pioctl, | ||||
| 		0, VIOCSETTOK, &parms, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); | ||||
| 	if (errno == EINVAL) { | ||||
| 	    afs_entry_point = MULTIPLE_ENTRY_POINT; | ||||
| 	    afs_syscalls[0] = syscall_pioctl; | ||||
| 	    afs_syscalls[1] = syscall_setpag; | ||||
| 	    return 0; | ||||
| 	} | ||||
|     } | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
| int | ||||
| k_hasafs(void) | ||||
| { | ||||
|     int saved_errno; | ||||
|     RETSIGTYPE (*saved_func)(); | ||||
|     struct ViceIoctl parms; | ||||
|     char *env = getenv ("AFS_SYSCALL"); | ||||
|    | ||||
|     /* | ||||
|      * Already checked presence of AFS syscalls? | ||||
|      */ | ||||
|      * Already checked presence of AFS syscalls?  */ | ||||
|     if (afs_entry_point != UNKNOWN_ENTRY_POINT) | ||||
| 	return afs_entry_point != NO_ENTRY_POINT; | ||||
|  | ||||
| @@ -210,7 +262,6 @@ k_hasafs(void) | ||||
|      * If the syscall is absent we recive a SIGSYS. | ||||
|      */ | ||||
|     afs_entry_point = NO_ENTRY_POINT; | ||||
|     memset(&parms, 0, sizeof(parms)); | ||||
|    | ||||
|     saved_errno = errno; | ||||
| #ifndef NO_AFS | ||||
| @@ -218,71 +269,67 @@ k_hasafs(void) | ||||
|     saved_func = signal(SIGSYS, SIGSYS_handler); | ||||
| #endif | ||||
|  | ||||
| #if defined(AFS_SYSCALL) || defined(AFS_SYSCALL2) || defined(AFS_SYSCALL3) | ||||
|     { | ||||
| 	int tmp; | ||||
|  | ||||
| 	if (env != NULL && sscanf (env, "%d", &tmp) == 1) | ||||
| 	    if (try_one (tmp) == 0) | ||||
| 		goto done; | ||||
|     } | ||||
| #endif /* AFS_SYSCALL || AFS_SYSCALL2 || AFS_SYSCALL3 */ | ||||
|  | ||||
| #ifdef AFS_SYSCALL | ||||
|     if (setjmp(catch_SIGSYS) == 0) | ||||
| 	{ | ||||
| 	    syscall(AFS_SYSCALL, AFSCALL_PIOCTL, | ||||
| 		    0, VIOCSETTOK, &parms, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); | ||||
| 	    if (errno == EINVAL) | ||||
| 		{ | ||||
| 		    afs_entry_point = SINGLE_ENTRY_POINT; | ||||
| 		    afs_syscalls[0] = AFS_SYSCALL; | ||||
| 		    goto done; | ||||
| 		} | ||||
| 	} | ||||
|     if (try_one (AFS_SYSCALL) == 0) | ||||
| 	goto done; | ||||
| #endif /* AFS_SYSCALL */ | ||||
|  | ||||
| #ifdef AFS_PIOCTL | ||||
|     if (setjmp(catch_SIGSYS) == 0) | ||||
| 	{ | ||||
| 	    syscall(AFS_PIOCTL, | ||||
| 		    0, VIOCSETTOK, &parms, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); | ||||
| 	    if (errno == EINVAL) | ||||
| 		{ | ||||
| 		    afs_entry_point = MULTIPLE_ENTRY_POINT; | ||||
| 		    afs_syscalls[0] = AFS_PIOCTL; | ||||
| 		    afs_syscalls[1] = AFS_SETPAG; | ||||
| 		    goto done; | ||||
| 		} | ||||
| 	} | ||||
|     { | ||||
| 	int tmp[2]; | ||||
|  | ||||
| 	if (env != NULL && sscanf (env, "%d%d", &tmp[0], &tmp[1]) == 2) | ||||
| 	    if (try_two (tmp[0], tmp[1]) == 2) | ||||
| 		goto done; | ||||
|     } | ||||
| #endif /* AFS_PIOCTL */ | ||||
|  | ||||
| #ifdef AFS_PIOCTL | ||||
|     if (try_two (AFS_PIOCTL, AFS_SETPAG) == 0) | ||||
| 	goto done; | ||||
| #endif /* AFS_PIOCTL */ | ||||
|  | ||||
| #ifdef AFS_SYSCALL2 | ||||
|     if (setjmp(catch_SIGSYS) == 0) | ||||
| 	{ | ||||
| 	    syscall(AFS_SYSCALL2, AFSCALL_PIOCTL, | ||||
| 		    0, VIOCSETTOK, &parms, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); | ||||
| 	    if (errno == EINVAL) | ||||
| 		{ | ||||
| 		    afs_entry_point = SINGLE_ENTRY_POINT2; | ||||
| 		    afs_syscalls[0] = AFS_SYSCALL2; | ||||
| 		    goto done; | ||||
| 		} | ||||
| 	} | ||||
| #endif /* AFS_SYSCALL */ | ||||
|     if (try_one (AFS_SYSCALL2) == 0) | ||||
| 	goto done; | ||||
| #endif /* AFS_SYSCALL2 */ | ||||
|  | ||||
| #ifdef AFS_SYSCALL3 | ||||
|     if (setjmp(catch_SIGSYS) == 0) | ||||
| 	{ | ||||
| 	    syscall(AFS_SYSCALL3, AFSCALL_PIOCTL, | ||||
| 		    0, VIOCSETTOK, &parms, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); | ||||
| 	    if (errno == EINVAL) | ||||
| 		{ | ||||
| 		    afs_entry_point = SINGLE_ENTRY_POINT3; | ||||
| 		    afs_syscalls[0] = AFS_SYSCALL3; | ||||
| 		    goto done; | ||||
| 		} | ||||
| 	} | ||||
| #endif /* AFS_SYSCALL */ | ||||
|     if (try_one (AFS_SYSCALL3) == 0) | ||||
| 	goto done; | ||||
| #endif /* AFS_SYSCALL3 */ | ||||
|  | ||||
| #ifdef _AIX | ||||
|     aix_setup(); | ||||
|     if(Pioctl != NULL && Setpag != NULL){ | ||||
| 	afs_entry_point = AIX_ENTRY_POINTS; | ||||
| 	goto done; | ||||
| #if 0 | ||||
|     if (env != NULL) { | ||||
| 	char *pos = NULL; | ||||
| 	char *pioctl_name; | ||||
| 	char *setpag_name; | ||||
|  | ||||
| 	pioctl_name = strtok_r (env, ", \t", &pos); | ||||
| 	if (pioctl_name != NULL) { | ||||
| 	    setpag_name = strtok_r (NULL, ", \t", &pos); | ||||
| 	    if (setpag_name != NULL) | ||||
| 		if (try_aix (pioctl_name, setpag_name) == 0) | ||||
| 		    goto done; | ||||
| 	} | ||||
|     } | ||||
| #endif | ||||
|  | ||||
|     if(try_aix() == 0) | ||||
| 	goto done; | ||||
| #endif | ||||
|  | ||||
| done: | ||||
| #ifdef SIGSYS | ||||
|     signal(SIGSYS, saved_func); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Assar Westerlund
					Assar Westerlund