#ifdef HAVE_LUSTRE_HACK
#include <syscall.h>
+#include <native.h>
static int
-_sysio_fcntl(int fd, int cmd, va_list ap)
+_sysio_fcntl(int fd, int cmd, va_list ap, int *rtn)
{
- int err;
- long arg;
-
- switch (cmd) {
- case F_GETFD:
- case F_GETFL:
- case F_GETOWN:
- return syscall(SYS_fcntl, fd, cmd);
- case F_DUPFD:
- case F_SETFD:
- case F_SETFL:
- case F_GETLK:
- case F_SETLK:
- case F_SETLKW:
- case F_SETOWN:
- arg = va_arg(ap, long);
- return syscall(SYS_fcntl, fd, cmd, arg);
- }
+ long arg = va_arg(ap, long);
- errno = ENOSYS;
- return -1;
+ *rtn = syscall(SYSIO_SYS_fcntl, fd, cmd, arg);
+ return *rtn == -1 ? -errno : 0;
}
#endif
SYSIO_INTERFACE_NAME(fcntl)(int fd, int cmd, ...)
{
int err;
+ int rtn;
struct file *fil;
va_list ap;
SYSIO_INTERFACE_DISPLAY_BLOCK;
if (!fil) {
#ifdef HAVE_LUSTRE_HACK
va_start(ap, cmd);
- err = _sysio_fcntl(fd, cmd, ap);
+ err = _sysio_fcntl(fd, cmd, ap, &rtn);
va_end(ap);
- if (err == -1)
- err = -errno;
goto out;
#else
+
+ rtn = -1;
err = -EBADF;
goto out;
#endif
newfd = va_arg(ap, long);
va_end(ap);
if (newfd != (int )newfd || newfd < 0) {
+ rtn = -1;
err = -EBADF;
goto out;
}
- err = _sysio_fd_dup2(fd, (int )newfd);
+ rtn = _sysio_fd_dup(fd, (int )newfd, 0);
+ if (rtn < 0) {
+ err = rtn;
+ rtn = -1;
+ }
}
break;
default:
va_start(ap, cmd);
- err = fil->f_ino->i_ops.inop_fcntl(fil->f_ino, cmd, ap);
+ err = fil->f_ino->i_ops.inop_fcntl(fil->f_ino, cmd, ap, &rtn);
va_end(ap);
break;
}
out:
- SYSIO_INTERFACE_RETURN(err ? -1 : 0, err);
+ SYSIO_INTERFACE_RETURN(rtn, err);
}
#ifdef __GLIBC__