1 /* Low-level terminal-suitable I/O routines */
16 #include "terminal/hardio.h"
17 #include "util/error.h"
19 /* Define it to have data written to stderr */
30 hw_debug_open(unsigned char *name
, int fd
, unsigned char *data
, int datalen
)
32 fprintf(stderr
, "[%s (fd=%d, data=%p, datalen=%d)]\n",
33 name
, fd
, data
, datalen
);
39 fputs("\n\n", stderr
);
44 hw_debug_write(unsigned char *data
, int w
)
55 while (i
< w
&& data
[++i
] == ' ');
58 fprintf(stderr
, "[+ %d spaces]\n", i
- c
- 1);
67 if (data
[i
] >= ' ' && data
[i
] < 127 && data
[i
] != '|') {
72 fputc(data
[i
], stderr
);
78 fprintf(stderr
,"%02x", data
[i
]);
83 #define debug_open(n, fd, data, datalen) hw_debug_open(n, fd, data, datalen)
84 #define debug_flush() hw_debug_flush()
85 #define debug_write(data, datalen) hw_debug_write(data, datalen)
87 #else /* DEBUG_HARDIO */
89 #define debug_open(n, fd, data, datalen)
91 #define debug_write(data, datalen)
93 #endif /* DEBUG_HARDIO */
97 hard_write(int fd
, unsigned char *data
, size_t datalen
)
99 ssize_t total
= datalen
;
101 assert(data
&& datalen
>= 0);
102 if_assert_failed
return -1;
104 debug_open("hard_write", fd
, data
, datalen
);
106 while (datalen
> 0) {
107 ssize_t written
= safe_write(fd
, data
, datalen
);
110 if (written
) return -1;
114 debug_write(data
, written
);
122 /* Return number of bytes written. */
123 return (total
- datalen
);
127 hard_read(int fd
, unsigned char *data
, size_t datalen
)
129 ssize_t total
= datalen
;
131 assert(data
&& datalen
>= 0);
132 if_assert_failed
return -1;
134 debug_open("hard_read", fd
, data
, datalen
);
136 while (datalen
> 0) {
137 ssize_t readlen
= safe_read(fd
, data
, datalen
);
140 if (readlen
) return -1;
144 debug_write(data
, readlen
);
152 /* Return number of bytes read. */
153 return (total
- datalen
);