Miscellaneous helpers
**********************************************************************/
-int psleep_flags(void *p, unsigned char flags)
+int psleep_flags_io(void *p, unsigned char flags, usize_t *n)
{
if (flags & O_NDELAY) {
- udata.u_error = EAGAIN;
- return (-1);
+ if (*n) {
+ *n = (usize_t)-1;
+ udata.u_error = EAGAIN;
+ }
+ return -1;
}
psleep(p);
if (udata.u_cursig || udata.u_ptab->p_pending) { /* messy */
- udata.u_error = EINTR;
- return (-1);
+ if (*n) {
+ *n = (usize_t)-1;
+ udata.u_error = EINTR;
+ }
+ return -1;
}
return 0;
}
+int psleep_flags(void *p, unsigned char flags)
+{
+ usize_t dummy = 0;
+ return psleep_flags_io(p, flags, &dummy);
+}
+
void kputs(const char *p)
{
while (*p)
extern bool remq(struct s_queue *q, unsigned char *cp);
extern void clrq(struct s_queue *q);
extern bool uninsq(struct s_queue *q, unsigned char *cp);
+extern int psleep_flags_io(void *event, unsigned char flags, usize_t *n);
extern int psleep_flags(void *event, unsigned char flags);
extern int nxio_open(uint8_t minor, uint16_t flag);
extern int no_open(uint8_t minor, uint16_t flag);
int tty_read(uint8_t minor, uint8_t rawflag, uint8_t flag)
{
- uint16_t nread;
+ usize_t nread;
unsigned char c;
struct s_queue *q;
struct tty *t;
if (n)
udata.u_ptab->p_timeout = n + 1;
}
- if (psleep_flags(q, flag))
- return -1;
+ if (psleep_flags_io(q, flag, &nread))
+ return nread;
/* timer expired */
if (udata.u_ptab->p_timeout == 1)
goto out;
int tty_write(uint8_t minor, uint8_t rawflag, uint8_t flag)
{
struct tty *t;
- int towrite;
+ usize_t written = 0;
uint8_t c;
used(rawflag);
t = &ttydata[minor];
- towrite = udata.u_count;
-
while (udata.u_count-- != 0) {
for (;;) { /* Wait on the ^S/^Q flag */
if (t->flag & TTYF_DEAD) {
}
if (!(t->flag & TTYF_STOP))
break;
- if (psleep_flags(&t->flag, flag))
- return -1;
+ if (psleep_flags_io(&t->flag, flag, &written))
+ return written;
}
if (!(t->flag & TTYF_DISCARD)) {
tty_putc_wait(minor, c);
}
++udata.u_base;
+ ++written;
}
- return towrite;
+ return written;
}
int tty_open(uint8_t minor, uint16_t flag)