MCPcopy Create free account
hub / github.com/danoon2/Boxedwine / fcntrl

Method fcntrl

source/kernel/kprocess.cpp:1988–2088  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1986}
1987
1988U32 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:

Callers 3

syscall_fcntlFunction · 0.80
syscall_fcntl64Function · 0.80
ksocketpairFunction · 0.80

Calls 15

getFileDescriptorMethod · 0.95
allocFileDescriptorMethod · 0.95
kdebugFunction · 0.85
kpanicFunction · 0.85
kwarn_fmtFunction · 0.85
readFileLockMethod · 0.80
writeFileLockMethod · 0.80
addSealsMethod · 0.80
getSealsMethod · 0.80
isBlockingMethod · 0.45
isAsyncMethod · 0.45
setBlockingMethod · 0.45

Tested by

no test coverage detected