107 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /*
 | |
|  * Copyright (c) 2006-2023, RT-Thread Development Team
 | |
|  *
 | |
|  * SPDX-License-Identifier: Apache-2.0
 | |
|  *
 | |
|  * Change Logs:
 | |
|  * Date           Author       Notes
 | |
|  * 2023-11-30     Shell        init ver.
 | |
|  */
 | |
| #define DBG_TAG "lwp.ctty"
 | |
| #define DBG_LVL DBG_INFO
 | |
| #include <rtdbg.h>
 | |
| 
 | |
| #define TTY_CONF_INCLUDE_CCHARS
 | |
| #include "tty_config.h"
 | |
| #include "tty_internal.h"
 | |
| #include "terminal.h"
 | |
| 
 | |
| static int fops_open(struct dfs_file *file)
 | |
| {
 | |
|     return -EINVAL;
 | |
| }
 | |
| 
 | |
| static rt_err_t ctty_readlink(struct rt_device *dev, char *buf, int len)
 | |
| {
 | |
|     int rc = -ENXIO;
 | |
|     lwp_tty_t tp;
 | |
|     rt_session_t sess;
 | |
|     rt_processgroup_t pgrp;
 | |
|     rt_lwp_t lwp;
 | |
| 
 | |
|     lwp = lwp_self();
 | |
|     if (lwp)
 | |
|     {
 | |
|         pgrp = lwp->pgrp;
 | |
|         if (pgrp)
 | |
|         {
 | |
|             sess = pgrp->session;
 | |
|             if (sess)
 | |
|             {
 | |
|                 tp = sess->ctty;
 | |
|                 if (tp)
 | |
|                 {
 | |
|                     tty_lock(tp);
 | |
| 
 | |
|                     if (lwp->pgrp == pgrp && pgrp->session == sess && sess->ctty == tp)
 | |
|                     {
 | |
|                         rt_strncpy(buf, tp->parent.parent.name, len);
 | |
|                         rc = RT_EOK;
 | |
|                     }
 | |
| 
 | |
|                     tty_unlock(tp);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return rc;
 | |
| }
 | |
| 
 | |
| static struct dfs_file_ops ctty_file_ops = {
 | |
|     .open = fops_open,
 | |
| };
 | |
| 
 | |
| /* character device for tty */
 | |
| #ifdef RT_USING_DEVICE_OPS
 | |
| const static struct rt_device_ops tty_dev_ops = {
 | |
|     /* IO directly through device is not allowed */
 | |
| };
 | |
| #else
 | |
| #error Must enable RT_USING_DEVICE_OPS in Kconfig
 | |
| #endif
 | |
| 
 | |
| rt_inline void device_setup(rt_device_t ctty)
 | |
| {
 | |
|     ctty->type = RT_Device_Class_Char;
 | |
| #ifdef RT_USING_DEVICE_OPS
 | |
|     ctty->ops = &tty_dev_ops;
 | |
| #else
 | |
| #error Must enable RT_USING_DEVICE_OPS in Kconfig
 | |
| #endif
 | |
| }
 | |
| 
 | |
| /* register device to DFS */
 | |
| static int lwp_ctty_register(rt_device_t ctty)
 | |
| {
 | |
|     rt_err_t rc = -RT_ENOMEM;
 | |
|     const char *tty_name = "tty";
 | |
| 
 | |
|     device_setup(ctty);
 | |
|     rc = rt_device_register(ctty, tty_name, RT_DEVICE_FLAG_DYNAMIC);
 | |
|     if (rc == RT_EOK)
 | |
|     {
 | |
|         ctty->readlink = &ctty_readlink;
 | |
|         ctty->fops = &ctty_file_ops;
 | |
|     }
 | |
|     return rc;
 | |
| }
 | |
| 
 | |
| static struct rt_device ctty;
 | |
| 
 | |
| static int lwp_ctty_init(void)
 | |
| {
 | |
|     return lwp_ctty_register(&ctty);
 | |
| }
 | |
| INIT_DEVICE_EXPORT(lwp_ctty_init);
 |