You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/02/09 12:36:21 UTC

[incubator-nuttx] branch master updated: serial/pty: Decouple SUSv1 style from pseudo fs operation

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 845640b  serial/pty: Decouple SUSv1 style from pseudo fs operation
845640b is described below

commit 845640bc337ca7fb4edb90b9954c1d39e4f84e1d
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Mon Feb 7 01:31:01 2022 +0800

    serial/pty: Decouple SUSv1 style from pseudo fs operation
    
    and always enable BSD style PTYs since this feature doesn't
    consume the additional code size
    
    Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
---
 boards/sim/sim/sim/configs/tcpblaster/defconfig |   1 -
 drivers/serial/Kconfig                          |  19 +---
 drivers/serial/ptmx.c                           |  10 +-
 drivers/serial/pty.c                            | 128 ++++++++++++++----------
 drivers/serial/pty.h                            |  23 ++---
 include/nuttx/serial/pty.h                      |   2 +-
 6 files changed, 92 insertions(+), 91 deletions(-)

diff --git a/boards/sim/sim/sim/configs/tcpblaster/defconfig b/boards/sim/sim/sim/configs/tcpblaster/defconfig
index a30cee2..bd15681 100644
--- a/boards/sim/sim/sim/configs/tcpblaster/defconfig
+++ b/boards/sim/sim/sim/configs/tcpblaster/defconfig
@@ -87,7 +87,6 @@ CONFIG_POSIX_SPAWN_PROXY_STACKSIZE=2048
 CONFIG_PREALLOC_TIMERS=4
 CONFIG_PSEUDOFS_SOFTLINKS=y
 CONFIG_PSEUDOTERM=y
-CONFIG_PSEUDOTERM_BSD=y
 CONFIG_PTHREAD_CLEANUP=y
 CONFIG_PTHREAD_CLEANUP_STACKSIZE=2
 CONFIG_PTHREAD_MUTEX_TYPES=y
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 6361321..7f686fd 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -651,24 +651,9 @@ menuconfig PSEUDOTERM
 
 if PSEUDOTERM
 
-choice
-	prompt "PTY model"
-	default PSEUDOTERM_BSD if DISABLE_PSEUDOFS_OPERATIONS
-	default PSEUDOTERM_SUSV1 if !DISABLE_PSEUDOFS_OPERATIONS
-
-config PSEUDOTERM_BSD
-	bool "BSD style"
-	---help---
-		Deprecated BSD style PTYs.
-
-		Master: /dev/ptyN
-		Slave: /dev/ttypN
-
-		Where N is the minor number
-
 config PSEUDOTERM_SUSV1
 	bool "SUSv1 style"
-	depends on !DISABLE_PSEUDOFS_OPERATIONS
+	default y
 	---help---
 		PTYs as specified in the Single Unix Specification (SUSv1).
 
@@ -677,8 +662,6 @@ config PSEUDOTERM_SUSV1
 
 		Where N is the minor number
 
-endchoice # PTY model
-
 config PSEUDOTERM_RXBUFSIZE
 	int "Pseudo-Terminal Rx buffer size"
 	default 256
diff --git a/drivers/serial/ptmx.c b/drivers/serial/ptmx.c
index bb907b6..cf372e0 100644
--- a/drivers/serial/ptmx.c
+++ b/drivers/serial/ptmx.c
@@ -196,7 +196,7 @@ static int ptmx_open(FAR struct file *filep)
    * Where N=minor
    */
 
-  ret = pty_register(minor);
+  ret = pty_register2(minor, true);
   if (ret < 0)
     {
       goto errout_with_minor;
@@ -207,20 +207,20 @@ static int ptmx_open(FAR struct file *filep)
   snprintf(devname, 16, "/dev/pty%d", minor);
   memcpy(&temp, filep, sizeof(temp));
   ret = file_open(filep, devname, O_RDWR);
-  DEBUGASSERT(ret >= 0);  /* open() should never fail */
+  DEBUGASSERT(ret >= 0);  /* file_open() should never fail */
 
   /* Close the multiplexor device: /dev/ptmx */
 
   ret = file_close(&temp);
-  DEBUGASSERT(ret >= 0);  /* close() should never fail */
+  DEBUGASSERT(ret >= 0);  /* file_close() should never fail */
 
   /* Now unlink the master.  This will remove it from the VFS namespace,
    * the driver will still persist because of the open count on the
    * driver.
    */
 
-  ret = nx_unlink(devname);
-  DEBUGASSERT(ret >= 0);  /* nx_unlink() should never fail */
+  ret = unregister_driver(devname);
+  DEBUGASSERT(ret >= 0);  /* unregister_driver() should never fail */
 
   nxsem_post(&g_ptmx.px_exclsem);
   return OK;
diff --git a/drivers/serial/pty.c b/drivers/serial/pty.c
index 94f42b9..7fcbc9d 100644
--- a/drivers/serial/pty.c
+++ b/drivers/serial/pty.c
@@ -134,12 +134,11 @@ struct pty_devpair_s
   struct pty_dev_s pp_master;   /* Maseter device */
   struct pty_dev_s pp_slave;    /* Slave device */
 
+  bool pp_susv1;                /* SUSv1 or BSD style */
   bool pp_locked;               /* Slave is locked */
-#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
   bool pp_unlinked;             /* File has been unlinked */
   uint8_t pp_minor;             /* Minor device number */
   uint16_t pp_nopen;            /* Open file count */
-#endif
   sem_t pp_slavesem;            /* Slave lock semaphore */
   sem_t pp_exclsem;             /* Mutual exclusion */
 };
@@ -209,27 +208,31 @@ static void pty_destroy(FAR struct pty_devpair_s *devpair)
 {
   char devname[16];
 
-  /* Un-register the master device (/dev/ptyN may have already been
-   * unlinked).
-   */
+  if (devpair->pp_susv1)
+    {
+      /* Free this minor number so that it can be reused */
 
-  snprintf(devname, 16, "/dev/pty%d", devpair->pp_minor);
-  unregister_driver(devname);
+      ptmx_minor_free(devpair->pp_minor);
 
-  /* Un-register the slave device */
+      /* Un-register the slave device */
 
-#ifdef CONFIG_PSEUDOTERM_SUSV1
-  snprintf(devname, 16, "/dev/pts/%d", devpair->pp_minor);
-#else
-  snprintf(devname, 16, "/dev/ttyp%d", devpair->pp_minor);
-#endif
-  unregister_driver(devname);
+      snprintf(devname, 16, "/dev/pts/%d", devpair->pp_minor);
+    }
+  else
+    {
+      /* Un-register the master device (/dev/ptyN may have already been
+       * unlinked).
+       */
 
-#ifdef CONFIG_PSEUDOTERM_SUSV1
-  /* Free this minor number so that it can be reused */
+      snprintf(devname, 16, "/dev/pty%d", (int)devpair->pp_minor);
+      unregister_driver(devname);
 
-  ptmx_minor_free(devpair->pp_minor);
-#endif
+      /* Un-register the slave device */
+
+      snprintf(devname, 16, "/dev/ttyp%d", devpair->pp_minor);
+    }
+
+  unregister_driver(devname);
 
   /* And free the device structure */
 
@@ -341,12 +344,8 @@ static int pty_open(FAR struct file *filep)
         }
     }
 
-#ifndef CONFIG_PSEUDOTERM_SUSV1
   /* If one side of the driver has been unlinked, then refuse further
    * opens.
-   *
-   * NOTE: We ignore this case in the SUSv1 case.  In the SUSv1 case, the
-   * master side is always unlinked.
    */
 
   if (devpair->pp_unlinked)
@@ -354,7 +353,6 @@ static int pty_open(FAR struct file *filep)
       ret = -EIDRM;
     }
   else
-#endif
     {
       /* First open? */
 
@@ -390,10 +388,10 @@ static int pty_close(FAR struct file *filep)
   int ret;
 
   DEBUGASSERT(filep != NULL && filep->f_inode != NULL);
-  inode     = filep->f_inode;
-  dev       = inode->i_private;
+  inode   = filep->f_inode;
+  dev     = inode->i_private;
   DEBUGASSERT(dev != NULL && dev->pd_devpair != NULL);
-  devpair   = dev->pd_devpair;
+  devpair = dev->pd_devpair;
 
   /* Get exclusive access */
 
@@ -403,24 +401,22 @@ static int pty_close(FAR struct file *filep)
       return ret;
     }
 
-#ifdef CONFIG_PSEUDOTERM_SUSV1
-  /* Did the (single) master just close its reference? */
+  /* Check if the decremented inode reference count would go to zero */
 
-  if (dev->pd_master)
+  if (inode->i_crefs == 1)
     {
-      /* Yes, then we are essentially unlinked and when all of the
-       * slaves close there references, then the PTY should be
-       * destroyed.
-       */
+      /* Did the (single) master just close its reference? */
 
-      devpair->pp_unlinked = true;
-    }
-#endif
+      if (dev->pd_master && devpair->pp_susv1)
+        {
+          /* Yes, then we are essentially unlinked and when all of the
+           * slaves close there references, then the PTY should be
+           * destroyed.
+           */
 
-  /* Check if the decremented inode reference count would go to zero */
+          devpair->pp_unlinked = true;
+        }
 
-  if (inode->i_crefs == 1)
-    {
       /* Close the contained file structures */
 
       file_close(&dev->pd_src);
@@ -776,9 +772,6 @@ static int pty_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
 
       case TIOCGPTN:    /* Get Pty Number (of pty-mux device): FAR int* */
         {
-#ifdef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
-          ret = -ENOSYS;
-#else
           FAR int *ptyno = (FAR int *)((uintptr_t)arg);
           if (ptyno == NULL)
             {
@@ -789,7 +782,6 @@ static int pty_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
               *ptyno = devpair->pp_minor;
               ret = OK;
             }
-#endif
         }
         break;
 
@@ -1028,8 +1020,8 @@ static int pty_unlink(FAR struct inode *inode)
   int ret;
 
   DEBUGASSERT(inode != NULL && inode->i_private != NULL);
-  dev       = inode->i_private;
-  devpair   = dev->pd_devpair;
+  dev     = inode->i_private;
+  devpair = dev->pd_devpair;
   DEBUGASSERT(dev->pd_devpair != NULL);
 
   /* Get exclusive access */
@@ -1064,7 +1056,7 @@ static int pty_unlink(FAR struct inode *inode)
  ****************************************************************************/
 
 /****************************************************************************
- * Name: pty_register
+ * Name: pty_register2
  *
  * Description:
  *   Create and register PTY master and slave devices.  The slave side of
@@ -1073,6 +1065,7 @@ static int pty_unlink(FAR struct inode *inode)
  *
  * Input Parameters:
  *   minor - The number that qualifies the naming of the created devices.
+ *   susv1 - select SUSv1 or BSD behaviour
  *
  * Returned Value:
  *   0 is returned on success; otherwise, the negative error code return
@@ -1080,7 +1073,7 @@ static int pty_unlink(FAR struct inode *inode)
  *
  ****************************************************************************/
 
-int pty_register(int minor)
+int pty_register2(int minor, bool susv1)
 {
   FAR struct pty_devpair_s *devpair;
   char devname[16];
@@ -1105,9 +1098,8 @@ int pty_register(int minor)
 
   nxsem_set_protocol(&devpair->pp_slavesem, SEM_PRIO_NONE);
 
-#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
+  devpair->pp_susv1             = susv1;
   devpair->pp_minor             = minor;
-#endif
   devpair->pp_locked            = true;
   devpair->pp_master.pd_devpair = devpair;
   devpair->pp_master.pd_master  = true;
@@ -1138,11 +1130,14 @@ int pty_register(int minor)
    * Where N is the minor number
    */
 
-#ifdef CONFIG_PSEUDOTERM_SUSV1
-  snprintf(devname, 16, "/dev/pts/%d", minor);
-#else
-  snprintf(devname, 16, "/dev/ttyp%d", minor);
-#endif
+  if (susv1)
+    {
+      snprintf(devname, 16, "/dev/pts/%d", minor);
+    }
+  else
+    {
+      snprintf(devname, 16, "/dev/ttyp%d", minor);
+    }
 
   ret = register_driver(devname, &g_pty_fops, 0666, &devpair->pp_slave);
   if (ret < 0)
@@ -1162,3 +1157,28 @@ errout_with_devpair:
   kmm_free(devpair);
   return ret;
 }
+
+/****************************************************************************
+ * Name: pty_register
+ *
+ * Description:
+ *   Create and register PTY master and slave devices.  The master device
+ *   will be registered at /dev/ptyN and slave at /dev/ttypN where N is
+ *   the provided minor number.
+ *
+ *   The slave side of the interface is always locked initially.  The
+ *   master must call unlockpt() before the slave device can be opened.
+ *
+ * Input Parameters:
+ *   minor - The number that qualifies the naming of the created devices.
+ *
+ * Returned Value:
+ *   Zero (OK) is returned on success; a negated errno value is returned on
+ *   any failure.
+ *
+ ****************************************************************************/
+
+int pty_register(int minor)
+{
+  return pty_register2(minor, false);
+}
diff --git a/drivers/serial/pty.h b/drivers/serial/pty.h
index 1ba918f..f4ffaef 100644
--- a/drivers/serial/pty.h
+++ b/drivers/serial/pty.h
@@ -26,6 +26,7 @@
  ****************************************************************************/
 
 #include <nuttx/config.h>
+#include <stdint.h>
 
 /****************************************************************************
  * Public Function Prototypes
@@ -52,31 +53,29 @@ extern "C"
 
 #ifdef CONFIG_PSEUDOTERM_SUSV1
 void ptmx_minor_free(uint8_t minor);
+#else
+#  define ptmx_minor_free(minor)
 #endif
 
 /****************************************************************************
- * Name: pty_register
+ * Name: pty_register2
  *
  * Description:
- *   Create and register PTY master and slave devices.  The master device
- *   will be registered at /dev/ptyN and slave at /dev/pts/N where N is
- *   the provided minor number.
- *
- *   The slave side of the interface is always locked initially.  The
- *   master must call unlockpt() before the slave device can be opened.
+ *   Create and register PTY master and slave devices.  The slave side of
+ *   the interface is always locked initially.  The master must call
+ *   unlockpt() before the slave device can be opened.
  *
  * Input Parameters:
  *   minor - The number that qualifies the naming of the created devices.
+ *   susv1 - select SUSv1 or BSD behaviour
  *
  * Returned Value:
- *   Zero (OK) is returned on success; a negated errno value is returned on
- *   any failure.
+ *   0 is returned on success; otherwise, the negative error code return
+ *   appropriately.
  *
  ****************************************************************************/
 
-#ifdef CONFIG_PSEUDOTERM_SUSV1
-int pty_register(int minor);
-#endif
+int pty_register2(int minor, bool susv1);
 
 #undef EXTERN
 #ifdef __cplusplus
diff --git a/include/nuttx/serial/pty.h b/include/nuttx/serial/pty.h
index eef68ce..542487b 100644
--- a/include/nuttx/serial/pty.h
+++ b/include/nuttx/serial/pty.h
@@ -78,7 +78,7 @@ int ptmx_register(void);
  *
  ****************************************************************************/
 
-#ifdef CONFIG_PSEUDOTERM_BSD
+#ifdef CONFIG_PSEUDOTERM
 int pty_register(int minor);
 #endif