107 lines
2.2 KiB
C
107 lines
2.2 KiB
C
/*
|
|
* 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);
|