Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/snp/snp.c
Show First 20 Lines • Show All 158 Lines • ▼ Show 20 Lines | snp_read(struct cdev *dev, struct uio *uio, int flag) | ||||
if (uio->uio_resid == 0) | if (uio->uio_resid == 0) | ||||
return (0); | return (0); | ||||
error = devfs_get_cdevpriv((void **)&ss); | error = devfs_get_cdevpriv((void **)&ss); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
tp = ss->snp_tty; | tp = ss->snp_tty; | ||||
if (tp == NULL || tty_gone(tp)) | if (tp == NULL) | ||||
return (EIO); | return (EIO); | ||||
ttydisc_lock(tp); | |||||
if (tty_gone(tp)) { | |||||
ttydisc_unlock(tp); | |||||
return (EIO); | |||||
} | |||||
tty_lock(tp); | |||||
for (;;) { | for (;;) { | ||||
error = ttyoutq_read_uio(&ss->snp_outq, tp, uio); | error = ttyoutq_read_uio(&ss->snp_outq, tp, uio); | ||||
if (error != 0 || uio->uio_resid != oresid) | if (error != 0 || uio->uio_resid != oresid) | ||||
break; | break; | ||||
/* Wait for more data. */ | /* Wait for more data. */ | ||||
if (flag & O_NONBLOCK) { | if (flag & O_NONBLOCK) { | ||||
error = EWOULDBLOCK; | error = EWOULDBLOCK; | ||||
break; | break; | ||||
} | } | ||||
error = cv_wait_sig(&ss->snp_outwait, tty_getlock(tp)); | error = cv_wait_sig(&ss->snp_outwait, ttydisc_getlock(tp)); | ||||
if (error != 0) | if (error != 0) | ||||
break; | break; | ||||
if (tty_gone(tp)) { | if (tty_gone(tp)) { | ||||
error = EIO; | error = EIO; | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
tty_unlock(tp); | ttydisc_unlock(tp); | ||||
return (error); | return (error); | ||||
} | } | ||||
static int | static int | ||||
snp_write(struct cdev *dev, struct uio *uio, int flag) | snp_write(struct cdev *dev, struct uio *uio, int flag) | ||||
{ | { | ||||
struct snp_softc *ss; | struct snp_softc *ss; | ||||
▲ Show 20 Lines • Show All 174 Lines • Show Last 20 Lines |