Print this page
6474 getupeercred causes spurious event port wakeups on FIFOs
*** 1125,1134 ****
--- 1125,1149 ----
return ((VTOF(vp)->fn_flag & FIFOFAST) ?
fifo_fastioctl(vp, cmd, arg, mode, cr, rvalp) :
fifo_strioctl(vp, cmd, arg, mode, cr, rvalp));
}
+ static inline int
+ fifo_ioctl_getpeercred(fifonode_t *fnp, intptr_t arg, int mode)
+ {
+ k_peercred_t *kp = (k_peercred_t *)arg;
+
+ if (mode == FKIOCTL && fnp->fn_pcredp != NULL) {
+ crhold(fnp->fn_pcredp);
+ kp->pc_cr = fnp->fn_pcredp;
+ kp->pc_cpid = fnp->fn_cpid;
+ return (0);
+ } else {
+ return (ENOTSUP);
+ }
+ }
+
static int
fifo_fastioctl(vnode_t *vp, int cmd, intptr_t arg, int mode, cred_t *cr,
int *rvalp)
{
fifonode_t *fnp = VTOF(vp);
*** 1344,1353 ****
--- 1359,1372 ----
case I_FLUSHBAND:
error = 0;
*rvalp = 0;
break;
+ case _I_GETPEERCRED:
+ error = fifo_ioctl_getpeercred(fnp, arg, mode);
+ break;
+
/*
* invalid calls for stream head or fifos
*/
case I_POP: /* shouldn't happen */
*** 1391,1411 ****
{
fifonode_t *fnp = VTOF(vp);
int error;
fifolock_t *fn_lock;
! if (cmd == _I_GETPEERCRED) {
! if (mode == FKIOCTL && fnp->fn_pcredp != NULL) {
! k_peercred_t *kp = (k_peercred_t *)arg;
! crhold(fnp->fn_pcredp);
! kp->pc_cr = fnp->fn_pcredp;
! kp->pc_cpid = fnp->fn_cpid;
! return (0);
! } else {
! return (ENOTSUP);
! }
! }
error = strioctl(vp, cmd, arg, mode, U_TO_K, cr, rvalp);
switch (cmd) {
/*
--- 1410,1421 ----
{
fifonode_t *fnp = VTOF(vp);
int error;
fifolock_t *fn_lock;
! if (cmd == _I_GETPEERCRED)
! return (fifo_ioctl_getpeercred(fnp, arg, mode));
error = strioctl(vp, cmd, arg, mode, U_TO_K, cr, rvalp);
switch (cmd) {
/*