diff options
author | Joshua M. Clulow <josh@sysmgr.org> | 2020-05-07 22:50:13 -0700 |
---|---|---|
committer | Toomas Soome <tsoome@me.com> | 2022-04-19 18:49:06 +0300 |
commit | c542a624b7efda0b8123026500f05f430ff6c770 (patch) | |
tree | 28f7a1df6c6ba1673a69e2f1826d7959c628630e /usr/src | |
parent | b12aaafbf56c5a06b6cfd21655531a33e38a8ed9 (diff) | |
download | illumos-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.c | 54 | ||||
-rw-r--r-- | usr/src/uts/common/sys/console.h | 9 |
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, |