123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- /*
- * 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);
|