pioctl.c: restore required result variable
[openafs.git] / src / sys / pioctl.c
index 3c0d8af..031def2 100644 (file)
 
 #include <afsconfig.h>
 #include <afs/param.h>
-#include <signal.h>
+
+#include <roken.h>
 
 #include <afs/afs_args.h>
-#if defined(AFS_SUN_ENV) && !defined(AFS_SUN5_ENV)
-#include <unistd.h>
-#else
-#include <stdio.h>
-#endif
-#if defined(HAVE_UNISTD_H)
-#include <unistd.h>
-#endif
+
 #include "afssyscalls.h"
 #include "sys_prototypes.h"
 
@@ -36,8 +30,7 @@
  * need to do anything!
  */
 
-#else
-#if defined(AFS_SGI_ENV)
+#elif defined(AFS_SGI_ENV)
 
 #pragma weak xlpioctl = lpioctl
 
@@ -47,46 +40,55 @@ lpioctl(char *path, int cmd, void *cmarg, int follow)
     return (syscall(AFS_PIOCTL, path, cmd, cmarg, follow));
 }
 
-#else /* AFS_SGI_ENV */
+#elif defined(AFS_LINUX20_ENV)
 
 int
 lpioctl(char *path, int cmd, void *cmarg, int follow)
 {
-    int errcode, rval;
-#ifndef AFS_LINUX20_ENV
-    /* As kauth/user.c says, handle smoothly the case where no AFS system call
-     * exists (yet). */
-    void (*old)(int) = signal(SIGSYS, SIG_IGN);
-#endif
+    int errcode = 0;
+    int rval;
 
-#if defined(AFS_LINUX20_ENV)
     rval = proc_afs_syscall(AFSCALL_PIOCTL, (long)path, cmd, (long)cmarg,
                            follow, &errcode);
 
     if(rval)
        errcode = syscall(AFS_SYSCALL, AFSCALL_PIOCTL, path, cmd, cmarg,
                          follow);
-#elif defined(AFS_DARWIN80_ENV)
-    rval = ioctl_afs_syscall(AFSCALL_PIOCTL, (long)path, cmd, (long)cmarg,
-                            follow, 0, 0, &errcode);
-    if (rval)
-       errcode = rval;
-#elif defined(AFS_SUN511_ENV)
-    rval = ioctl_sun_afs_syscall(AFSCALL_PIOCTL, (uintptr_t)path, cmd,
-                                 (uintptr_t)cmarg, follow, 0, 0, &errcode);
-    if (rval) {
-       errcode = rval;
+
+    return (errcode);
+}
+
+#else /* AFS_AIX32_ENV */
+
+int
+lpioctl(char *path, int cmd, void *cmarg, int follow)
+{
+    int errcode = 0;
+    /* As kauth/user.c says, handle smoothly the case where no AFS system call
+     * exists (yet). */
+    void (*old)(int) = signal(SIGSYS, SIG_IGN);
+
+# if defined(AFS_DARWIN80_ENV) || defined(AFS_SUN511_ENV)
+    {
+       int rval;       /* rval and errcode are distinct for pioctl platforms */
+#  if defined(AFS_DARWIN80_ENV)
+       rval = ioctl_afs_syscall(AFSCALL_PIOCTL, (long)path, cmd, (long)cmarg,
+                               follow, 0, 0, &errcode);
+#  elif defined(AFS_SUN511_ENV)
+       rval = ioctl_sun_afs_syscall(AFSCALL_PIOCTL, (uintptr_t)path, cmd,
+                                   (uintptr_t)cmarg, follow, 0, 0, &errcode);
+#  endif  /* !AFS_DARWIN80_ENV */
+       /* non-zero rval takes precedence over errcode */
+       if (rval)
+           errcode = rval;
     }
-#else
+# else   /* ! AFS_DARWIN80_ENV || AFS_SUN511_ENV */
     errcode = syscall(AFS_SYSCALL, AFSCALL_PIOCTL, path, cmd, cmarg, follow);
-#endif
+# endif
 
-#ifndef AFS_LINUX20_ENV
     signal(SIGSYS, old);
-#endif
 
     return (errcode);
 }
 
-#endif /* !AFS_SGI_ENV */
 #endif /* !AFS_AIX32_ENV */