guess some code for SUN_PROC_POINT
authorLove Hornquist Astrand <lha@h5l.org>
Tue, 25 Sep 2012 04:28:04 +0000 (21:28 -0700)
committerLove Hornquist Astrand <lha@h5l.org>
Tue, 25 Sep 2012 04:28:04 +0000 (21:28 -0700)
lib/kafs/afssys.c

index ba492ff690673b73cb72a970cde9b09467b35f1e..fe37c346b62b3906e31f36d1ba3c1470616bc295 100644 (file)
@@ -65,6 +65,32 @@ struct devdata {
 #define VIOC_SYSCALL_DEV_OPENAFS _IOWR('C', 1, struct devdata)
 #endif
 
+#ifdef _IOW
+#ifdef _ILP32
+struct sundevdata {
+    uint32_t param6;
+    uint32_t param5;
+    uint32_t param4;
+    uint32_t param3;
+    uint32_t param2;
+    uint32_t param1;
+    uint32_t syscall;
+};
+#define VIOC_SUN_SYSCALL_DEV _IOW('C', 2, struct sundevdata)
+#else
+struct sundevdata {
+    uint64_t param6;
+    uint64_t param5;
+    uint64_t param4;
+    uint64_t param3;
+    uint64_t param2;
+    uint64_t param1;
+    uint64_t syscall;
+};
+#define VIOC_SUN_SYSCALL_DEV _IOW('C', 1, struct sundevdata)
+#endif
+#endif /* _IOW */
+
 
 int _kafs_debug; /* this should be done in a better way */
 
@@ -77,6 +103,7 @@ int _kafs_debug; /* this should be done in a better way */
 #define LINUX_PROC_POINT       5
 #define AIX_ENTRY_POINTS       6
 #define MACOS_DEV_POINT                7
+#define SUN_PROC_POINT         8
 
 static int afs_entry_point = UNKNOWN_ENTRY_POINT;
 static int afs_syscalls[2];
@@ -192,6 +219,12 @@ try_ioctlpath(const char *path, unsigned long ioctlnum, int entrypoint)
        ret = ioctl(fd, ioctlnum, &data);
        break;
     }
+    case SUN_PROC_POINT: {
+       struct sundevdata data = { 0, 0, 0, 0, 0, 0, AFSCALL_PIOCTL };
+       data.param2 = (unsigned long)VIOCGETTOK;
+       ret = ioctl(fd, ioctlnum, &data);
+       break;
+    }
     default:
        abort();
     }
@@ -273,6 +306,14 @@ k_pioctl(char *a_path,
 
        return data.retval;
     }
+    case SUN_PROC_POINT: {
+       struct sundevdata data = { 0, 0, 0, 0, 0, 0, AFSCALL_PIOCTL };
+       data.param1 = (unsigned long)a_path;
+       data.param2 = (unsigned long)o_opcode;
+       data.param3 = (unsigned long)a_paramsP;
+       data.param4 = (unsigned long)a_followSymlinks;
+       return do_ioctl(&data);
+    }
 #ifdef _AIX
     case AIX_ENTRY_POINTS:
        return Pioctl(a_path, o_opcode, a_paramsP, a_followSymlinks);
@@ -331,6 +372,10 @@ k_setpag(void)
            return ret;
        return data.retval;
      }
+    case SUN_PROC_POINT: {
+       struct sundevdata data = { 0, 0, 0, 0, 0, 0, AFSCALL_SETPAG };
+       return do_ioctl(&data);
+    }
 #ifdef _AIX
     case AIX_ENTRY_POINTS:
        return Setpag();
@@ -478,6 +523,12 @@ k_hasafs(void)
     if (ret == 0)
        goto done;
 #endif
+#ifdef VIOC_SUN_SYSCALL_DEV
+    ret = try_ioctlpath("/dev/afs", VIOC_SUN_SYSCALL_DEV, SUN_PROC_POINT);
+    if (ret == 0)
+       goto done;
+#endif
+
 
 #if defined(AFS_SYSCALL) || defined(AFS_SYSCALL2) || defined(AFS_SYSCALL3)
     {