Exemple #1
0
static void
try_table (int table, int known, int lineno,
	   errcode_t c0, errcode_t c1, errcode_t c2)
{
    try_one (c0, known, table, 0);
    try_one (c1, known, table, 1);
    try_one (c2, known, table, 2);
    if (misc_err != 0 || known_err != 0) {
	fail++;
	if (known_err)
	    printf ("table list error from line %d, table %d\n", lineno,
		    table);
	if (misc_err)
	    printf ("misc errors from line %d table %d\n", lineno, table);
	misc_err = known_err = 0;
    }
}
Exemple #2
0
int
k_hasafs(void)
{
#if !defined(NO_AFS) && defined(SIGSYS)
    RETSIGTYPE (*saved_func)(int);
#endif
    int saved_errno, ret;
    char *env = NULL;

    if (!issuid())
	env = getenv ("AFS_SYSCALL");

    /*
     * Already checked presence of AFS syscalls?
     */
    if (afs_entry_point != UNKNOWN_ENTRY_POINT)
	return afs_entry_point != NO_ENTRY_POINT;

    /*
     * Probe kernel for AFS specific syscalls,
     * they (currently) come in two flavors.
     * If the syscall is absent we recive a SIGSYS.
     */
    afs_entry_point = NO_ENTRY_POINT;

    saved_errno = errno;
#ifndef NO_AFS
#ifdef SIGSYS
    saved_func = signal(SIGSYS, SIGSYS_handler);
#endif
    if (env && strstr(env, "..") == NULL) {

	if (strncmp("/proc/", env, 6) == 0) {
	    if (try_ioctlpath(env, VIOC_SYSCALL_PROC, LINUX_PROC_POINT) == 0)
		goto done;
	}
	if (strncmp("/dev/", env, 5) == 0) {
#ifdef VIOC_SYSCALL_DEV
	    if (try_ioctlpath(env, VIOC_SYSCALL_DEV, MACOS_DEV_POINT) == 0)
		goto done;
#endif
#ifdef VIOC_SYSCALL_DEV_OPENAFS
	    if (try_ioctlpath(env,VIOC_SYSCALL_DEV_OPENAFS,MACOS_DEV_POINT) ==0)
		goto done;
#endif
	}
    }

    ret = try_ioctlpath("/proc/fs/openafs/afs_ioctl",
			VIOC_SYSCALL_PROC, LINUX_PROC_POINT);
    if (ret == 0)
	goto done;
    ret = try_ioctlpath("/proc/fs/nnpfs/afs_ioctl",
			VIOC_SYSCALL_PROC, LINUX_PROC_POINT);
    if (ret == 0)
	goto done;

#ifdef VIOC_SYSCALL_DEV_OPENAFS
    ret = try_ioctlpath("/dev/openafs_ioctl",
			VIOC_SYSCALL_DEV_OPENAFS, MACOS_DEV_POINT);
    if (ret == 0)
	goto done;
#endif
#ifdef VIOC_SYSCALL_DEV
    ret = try_ioctlpath("/dev/nnpfs_ioctl", VIOC_SYSCALL_DEV, MACOS_DEV_POINT);
    if (ret == 0)
	goto done;
#endif

#if defined(AFS_SYSCALL) || defined(AFS_SYSCALL2) || defined(AFS_SYSCALL3)
    {
	int tmp;

	if (env != NULL) {
	    if (sscanf (env, "%d", &tmp) == 1) {
		if (try_one (tmp) == 0)
		    goto done;
	    } else {
		char *end = NULL;
		char *p;
		char *s = strdup (env);

		if (s != NULL) {
		    for (p = strtok_r (s, ",", &end);
			 p != NULL;
			 p = strtok_r (NULL, ",", &end)) {
			if (map_syscall_name_to_number (p, &tmp) == 0)
			    if (try_one (tmp) == 0) {
				free (s);
				goto done;
			    }
		    }
		    free (s);
		}
	    }
	}
    }
#endif /* AFS_SYSCALL || AFS_SYSCALL2 || AFS_SYSCALL3 */

#ifdef AFS_SYSCALL
    if (try_one (AFS_SYSCALL) == 0)
	goto done;
#endif /* AFS_SYSCALL */

#ifdef AFS_PIOCTL
    {
	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 (try_one (AFS_SYSCALL2) == 0)
	goto done;
#endif /* AFS_SYSCALL2 */

#ifdef AFS_SYSCALL3
    if (try_one (AFS_SYSCALL3) == 0)
	goto done;
#endif /* AFS_SYSCALL3 */

#ifdef _AIX
#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);
#endif
#endif /* NO_AFS */
    errno = saved_errno;
    return afs_entry_point != NO_ENTRY_POINT;
}