summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorJoshua M. Clulow <josh@sysmgr.org>2020-05-07 22:50:13 -0700
committerToomas Soome <tsoome@me.com>2022-04-19 18:49:06 +0300
commitc542a624b7efda0b8123026500f05f430ff6c770 (patch)
tree28f7a1df6c6ba1673a69e2f1826d7959c628630e /usr/src
parentb12aaafbf56c5a06b6cfd21655531a33e38a8ed9 (diff)
downloadillumos-gate-c542a624b7efda0b8123026500f05f430ff6c770.tar.gz
14607 Add CONS_GETDEV so we can see which port is /dev/console
Reviewed by: Toomas Soome <tsoome@me.com> Reviewed by: Jason King <jason.brian.king+illumos@gmail.com> Approved by: Dan McDonald <danmcd@joyent.com>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/io/cons.c54
-rw-r--r--usr/src/uts/common/sys/console.h9
2 files changed, 48 insertions, 15 deletions
diff --git a/usr/src/uts/common/io/cons.c b/usr/src/uts/common/io/cons.c
index 8635023fe3..e651ea636a 100644
--- a/usr/src/uts/common/io/cons.c
+++ b/usr/src/uts/common/io/cons.c
@@ -94,7 +94,7 @@ static struct cb_ops cn_cb_ops = {
cnioctl, /* ioctl */
nodev, /* devmap */
nodev, /* mmap */
- nodev, /* segmap */
+ nodev, /* segmap */
cnpoll, /* poll */
ddi_prop_op, /* cb_prop_op */
0, /* streamtab */
@@ -237,9 +237,9 @@ cn_detach(dev_info_t *devi, ddi_detach_cmd_t cmd)
return (DDI_SUCCESS);
}
-/* ARGSUSED */
static int
-cn_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
+cn_info(dev_info_t *dip __unused, ddi_info_cmd_t infocmd, void *arg,
+ void **result)
{
int error = DDI_FAILURE;
@@ -346,9 +346,8 @@ cnopen(dev_t *dev, int flag, int state, struct cred *cred)
return (0);
}
-/* ARGSUSED */
static int
-cnclose(dev_t dev, int flag, int state, struct cred *cred)
+cnclose(dev_t dev __unused, int flag, int state, struct cred *cred)
{
int err = 0;
vnode_t *vp;
@@ -374,9 +373,8 @@ cnclose(dev_t dev, int flag, int state, struct cred *cred)
return (err);
}
-/* ARGSUSED */
static int
-cnread(dev_t dev, struct uio *uio, struct cred *cred)
+cnread(dev_t dev __unused, struct uio *uio, struct cred *cred)
{
kcondvar_t sleep_forever;
kmutex_t sleep_forever_mutex;
@@ -402,9 +400,8 @@ cnread(dev_t dev, struct uio *uio, struct cred *cred)
return (cdev_read(rconsdev, uio, cred));
}
-/* ARGSUSED */
static int
-cnwrite(dev_t dev, struct uio *uio, struct cred *cred)
+cnwrite(dev_t dev __unused, struct uio *uio, struct cred *cred)
{
if (rconsvp == NULL) {
uio->uio_resid = 0;
@@ -442,13 +439,40 @@ cnwrite(dev_t dev, struct uio *uio, struct cred *cred)
return (cdev_write(rconsdev, uio, cred));
}
-/* ARGSUSED */
static int
-cnprivateioc(dev_t dev, int cmd, intptr_t arg, int flag, struct cred *cred,
- int *rvalp)
+cnprivateioc(dev_t dev __unused, int cmd, intptr_t arg, int flag,
+ struct cred *cred, int *rvalp)
{
+ if (cmd == CONS_GETDEV) {
+ /*
+ * The user has requested the device number of the redirection
+ * client.
+ */
+ STRUCT_DECL(cons_getdev, cnd);
+ STRUCT_INIT(cnd, flag);
+
+ bzero(STRUCT_BUF(cnd), STRUCT_SIZE(cnd));
+
+ if ((flag & DATAMODEL_MASK) == DATAMODEL_ILP32) {
+ dev32_t rconsdev32;
+
+ if (cmpldev(&rconsdev32, rconsdev) != 1) {
+ return (EOVERFLOW);
+ }
+
+ STRUCT_FSET(cnd, cnd_rconsdev, rconsdev32);
+ } else {
+ STRUCT_FSET(cnd, cnd_rconsdev, rconsdev);
+ }
+
+ if (ddi_copyout(STRUCT_BUF(cnd), (void *)arg,
+ STRUCT_SIZE(cnd), flag) != 0) {
+ return (EFAULT);
+ }
+
+ return (0);
+ }
- /* currently we only support one ioctl */
if (cmd != CONS_GETTERM)
return (EINVAL);
@@ -470,7 +494,7 @@ cnprivateioc(dev_t dev, int cmd, intptr_t arg, int flag, struct cred *cred,
/* ARGSUSED */
static int
cnioctl(dev_t dev, int cmd, intptr_t arg, int flag, struct cred *cred,
- int *rvalp)
+ int *rvalp)
{
if (rconsvp == NULL)
return (0);
@@ -498,7 +522,7 @@ cnioctl(dev_t dev, int cmd, intptr_t arg, int flag, struct cred *cred,
/* ARGSUSED */
static int
cnpoll(dev_t dev, short events, int anyyet, short *reventsp,
- struct pollhead **phpp)
+ struct pollhead **phpp)
{
if (rconsvp == NULL)
return (nochpoll(dev, events, anyyet, reventsp, phpp));
diff --git a/usr/src/uts/common/sys/console.h b/usr/src/uts/common/sys/console.h
index 9f60764092..892f7e5b34 100644
--- a/usr/src/uts/common/sys/console.h
+++ b/usr/src/uts/common/sys/console.h
@@ -37,6 +37,7 @@ extern "C" {
#define _CNIOC (('C'<<24)|('N'<<16))
#define _CNIOC_MASK (~0xffff)
#define CONS_GETTERM (_CNIOC | 0)
+#define CONS_GETDEV (_CNIOC | 1)
#define MAX_TERM_TYPE_LEN 10
@@ -45,6 +46,10 @@ struct cons_getterm {
char *cn_term_type;
};
+struct cons_getdev {
+ dev_t cnd_rconsdev;
+};
+
#ifdef _KERNEL
#include <sys/vnode.h>
@@ -56,6 +61,10 @@ struct cons_getterm32 {
uint32_t cn_term_len;
caddr32_t cn_term_type;
};
+
+struct cons_getdev32 {
+ dev32_t cnd_rconsdev;
+};
#endif /* _SYSCALL32 */
extern void console_get_size(ushort_t *r, ushort_t *c,