| 1986 | } |
| 1987 | |
| 1988 | U32 KProcess::fcntrl(KThread* thread, FD fildes, U32 cmd, U32 arg) { |
| 1989 | KFileDescriptorPtr fd = this->getFileDescriptor(fildes); |
| 1990 | |
| 1991 | if (!fd) { |
| 1992 | return -K_EBADF; |
| 1993 | } |
| 1994 | switch (cmd) { |
| 1995 | case K_F_SETOWN: |
| 1996 | if (this->id != arg) { |
| 1997 | kdebug("F_SETOWN not implemented: %d",fildes); |
| 1998 | } |
| 1999 | return 0; |
| 2000 | case K_F_DUPFD: { |
| 2001 | KFileDescriptorPtr result = this->allocFileDescriptor(fd->kobject, fd->accessFlags, fd->descriptorFlags, -1, arg); |
| 2002 | return result->handle; |
| 2003 | } |
| 2004 | case K_F_DUPFD_CLOEXEC: { |
| 2005 | KFileDescriptorPtr result = this->allocFileDescriptor(fd->kobject, fd->accessFlags, fd->descriptorFlags, -1, arg); |
| 2006 | result->descriptorFlags=FD_CLOEXEC; |
| 2007 | return result->handle; |
| 2008 | } |
| 2009 | case K_F_GETFD: |
| 2010 | return fd->descriptorFlags; |
| 2011 | case K_F_SETFD: |
| 2012 | if (arg) { |
| 2013 | fd->descriptorFlags=FD_CLOEXEC; |
| 2014 | } else { |
| 2015 | fd->descriptorFlags=0; |
| 2016 | } |
| 2017 | return 0; |
| 2018 | // blocking is at the file description level, not the file descriptor level |
| 2019 | case K_F_GETFL: |
| 2020 | return fd->accessFlags | (fd->kobject->isBlocking()?0:K_O_NONBLOCK) | (fd->kobject->isAsync()?K_O_ASYNC:0); |
| 2021 | case K_F_SETFL: |
| 2022 | fd->accessFlags = (fd->accessFlags & K_O_ACCMODE) | (arg & ~K_O_ACCMODE); |
| 2023 | fd->kobject->setBlocking((arg & K_O_NONBLOCK)==0); |
| 2024 | fd->kobject->setAsync((arg & K_O_ASYNC)!=0); |
| 2025 | return 0; |
| 2026 | case K_F_GETLK: |
| 2027 | case K_F_GETLK64: |
| 2028 | if (fd->kobject->supportsLocks()) { |
| 2029 | KFileLock lock; |
| 2030 | KFileLock* result; |
| 2031 | lock.readFileLock(thread, arg, cmd==K_F_GETLK64); |
| 2032 | result = fd->kobject->getLock(&lock); |
| 2033 | if (!result) { |
| 2034 | memory->writew(arg, K_F_UNLCK); |
| 2035 | } else { |
| 2036 | result->writeFileLock(thread, arg, K_F_GETLK64 == cmd); |
| 2037 | } |
| 2038 | return 0; |
| 2039 | } else { |
| 2040 | return -K_EBADF; |
| 2041 | } |
| 2042 | case K_F_SETLK: |
| 2043 | case K_F_SETLK64: |
| 2044 | case K_F_SETLKW: |
| 2045 | case K_F_SETLKW64: |
no test coverage detected