Fixed some embarassing errors
[reactos.git] / posix / lib / psxdll / fcntl / fcntl.c
index 2404587..30a83dc 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: fcntl.c,v 1.4 2002/03/21 22:41:53 hyperion Exp $
+/* $Id: fcntl.c,v 1.5 2002/05/17 01:54:39 hyperion Exp $
  */
 /*
  * COPYRIGHT:   See COPYING in the top level directory
@@ -35,19 +35,29 @@ int fcntl(int fildes, int cmd, ...)
 
  /* lock the environment */
  __PdxAcquirePdataLock();
+ INFO("environment locked");
 
  /* get the file descriptors table */
  pftFdTable = &__PdxGetProcessData()->FdTable;
+ INFO("file descriptors table at 0x%08X", pftFdTable);
 
- /* fildes is an invalid, closed or uninitialized descriptor */
+ /* fildes is an invalid descriptor, or it's a closed or uninitialized
+    descriptor and the requested operation is not the creation of a new
+    descriptor */
  if
  (
   fildes < 0 ||
   fildes >= OPEN_MAX ||
-  __fdtable_entry_isavail(pftFdTable, fildes) == 0 ||
-  __fdtable_entry_get(pftFdTable, fildes) == 0
+  (
+   (cmd != F_NEWFD) &&
+   (
+    __fdtable_entry_isavail(pftFdTable, fildes) == 0 ||
+    __fdtable_entry_get(pftFdTable, fildes) == 0
+   )
+  )
  )
  {
+  INFO("invalid file descriptor");
   errno = EBADF;
   __PdxReleasePdataLock();
   return (-1);
@@ -55,6 +65,7 @@ int fcntl(int fildes, int cmd, ...)
 
  /* get the file descriptor referenced by fildes */
  pfdDescriptor = __fdtable_entry_get(pftFdTable, fildes);
+ INFO("file descriptor %d at 0x%08X", fildes, pftFdTable);
  
  /* get third argument as integer */
  va_start(vlArgs, cmd);
@@ -75,12 +86,17 @@ int fcntl(int fildes, int cmd, ...)
   {
    int         nDupFileNo;
    __fildes_t *pfdDupDescriptor;
+   
+   INFO("requested operation: F_DUPFD");
 
    /* allocate the duplicated descriptor */
    nDupFileNo = __fdtable_entry_add(pftFdTable, nThirdArg, 0, &pfdDupDescriptor);
 
    if(nDupFileNo)
+   {
+    ERR("__fdtable_entry_add() failed, errno %d", errno);
     break;
+   }
 
    /* copy the open flags */
    pfdDupDescriptor->OpenFlags = pfdDescriptor->OpenFlags;
@@ -147,12 +163,14 @@ int fcntl(int fildes, int cmd, ...)
 
   case F_GETFD:
   {
+   INFO("requested operation: F_GETFD");
    nRetVal = pfdDescriptor->FdFlags;
    break;
   }
 
   case F_SETFD:
   {
+   INFO("requested operation: F_SETFD");
    pfdDescriptor->FdFlags = nThirdArg;
    nRetVal = 0;
    break;
@@ -160,12 +178,14 @@ int fcntl(int fildes, int cmd, ...)
 
   case F_GETFL:
   {
+   INFO("requested operation: F_GETFL");
    nRetVal = pfdDescriptor->OpenFlags;
    break;
   }
 
   case F_SETFL:
   {
+   INFO("requested operation: F_SETFL");
    pfdDescriptor->OpenFlags = nThirdArg;
    nRetVal = 0;
    break;
@@ -173,24 +193,28 @@ int fcntl(int fildes, int cmd, ...)
 
   case F_GETLK:
   {
+   INFO("requested operation: F_GETLK");
    errno = EINVAL;
    break;
   }
 
   case F_SETLK:
   {
+   INFO("requested operation: F_SETLK");
    errno = EINVAL;
    break;
   }
 
   case F_SETLKW:
   {
+   INFO("requested operation: F_SETLKW");
    errno = EINVAL;
    break;
   }
 
   case F_NEWFD:
   {
+   INFO("requested operation: F_NEWFD");
    /* allocate a new descriptor */
    nRetVal = __fdtable_entry_add(pftFdTable, fildes, (__fildes_t *)pThirdArg, 0);
    break;
@@ -198,6 +222,7 @@ int fcntl(int fildes, int cmd, ...)
 
   case F_DELFD:
   {
+   INFO("requested operation: F_DELFD");
    /* invalid return pointer */
    if(pThirdArg == 0)
    {
@@ -214,6 +239,7 @@ int fcntl(int fildes, int cmd, ...)
 
   case F_GETALL:
   {
+   INFO("requested operation: F_GETALL");
    /* invalid return pointer */
    if(pThirdArg == 0)
    {
@@ -224,10 +250,13 @@ int fcntl(int fildes, int cmd, ...)
    /* return a copy of the file descriptor */
    memcpy((__fildes_t *)pThirdArg, pfdDescriptor, sizeof(*pfdDescriptor));
    nRetVal = 0;
+   
+   break;
   }
 
   case F_SETALL:
   {
+   INFO("requested operation: F_SETALL");
    /* invalid file descriptor to copy attributes from */
    if(pThirdArg == 0)
    {
@@ -238,10 +267,13 @@ int fcntl(int fildes, int cmd, ...)
    /* copy the attributes of file descriptor from the provided descriptor */
    memcpy(pfdDescriptor, pThirdArg, sizeof(*pfdDescriptor));
    nRetVal = 0;
+   
+   break;
   }
 
   case F_GETXP:
   {
+   INFO("requested operation: F_GETXP");
    /* invalid return pointer */
    if(pThirdArg == 0)
    {
@@ -252,11 +284,13 @@ int fcntl(int fildes, int cmd, ...)
    /* return a pointer to the extra data associated to the descriptor */
    *((void **)pThirdArg) = pfdDescriptor->ExtraData;
    nRetVal = 0;
+   
    break;
   }
 
   case F_SETXP:
   {
+   INFO("requested operation: F_SETXP");
    /* set the pointer to the extra data associated */
    pfdDescriptor->ExtraData = pThirdArg;
    nRetVal = 0;
@@ -265,12 +299,14 @@ int fcntl(int fildes, int cmd, ...)
 
   case F_GETXS:
   {
+   INFO("requested operation: F_GETXS");
    nRetVal = pfdDescriptor->ExtraDataSize;
    break;
   }
 
   case F_SETXS:
   {
+   INFO("requested operation: F_SETXS");
    pfdDescriptor->ExtraDataSize = nThirdArg;
    nRetVal = 0;
    break;
@@ -278,6 +314,7 @@ int fcntl(int fildes, int cmd, ...)
 
   case F_GETFH:
   {
+   INFO("requested operation: F_GETFH");
    /* invalid return pointer */
    if(pThirdArg == 0)
    {
@@ -293,17 +330,20 @@ int fcntl(int fildes, int cmd, ...)
 
   case F_SETFH:
   {
+   INFO("requested operation: F_SETFH");
    pfdDescriptor->FileHandle = pThirdArg;
    nRetVal = 0;
    break;
   }
 
   default:
+   INFO("invalid operation requested");
    errno = EINVAL;
  }
 
  /* unlock the environment */
  __PdxReleasePdataLock();
+ INFO("environment unlocked");
 
  return (nRetVal);
 }