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);
 |