1 /** Low-level terminal-suitable I/O routines
10 #include <sys/types.h>
17 #include "terminal/hardio.h"
18 #include "util/error.h"
20 /* Define it to have data written to stderr */
31 hw_debug_open(unsigned char *name
, int fd
, unsigned char *data
, int datalen
)
33 fprintf(stderr
, "[%s (fd=%d, data=%p, datalen=%d)]\n",
34 name
, fd
, data
, datalen
);
40 fputs("\n\n", stderr
);
45 hw_debug_write(unsigned char *data
, int w
)
56 while (i
< w
&& data
[++i
] == ' ');
59 fprintf(stderr
, "[+ %d spaces]\n", i
- c
- 1);
68 if (data
[i
] >= ' ' && data
[i
] < 127 && data
[i
] != '|') {
73 fputc(data
[i
], stderr
);
79 fprintf(stderr
,"%02x", data
[i
]);
84 #define debug_open(n, fd, data, datalen) hw_debug_open(n, fd, data, datalen)
85 #define debug_flush() hw_debug_flush()
86 #define debug_write(data, datalen) hw_debug_write(data, datalen)
88 #else /* DEBUG_HARDIO */
90 #define debug_open(n, fd, data, datalen)
92 #define debug_write(data, datalen)
94 #endif /* DEBUG_HARDIO */
98 hard_write(int fd
, unsigned char *data
, size_t datalen
)
100 ssize_t total
= datalen
;
102 assert(data
&& datalen
>= 0);
103 if_assert_failed
return -1;
105 debug_open("hard_write", fd
, data
, datalen
);
107 while (datalen
> 0) {
108 ssize_t written
= safe_write(fd
, data
, datalen
);
111 if (written
) return -1;
115 debug_write(data
, written
);
123 /* Return number of bytes written. */
124 return (total
- datalen
);
128 hard_read(int fd
, unsigned char *data
, size_t datalen
)
130 ssize_t total
= datalen
;
132 assert(data
&& datalen
>= 0);
133 if_assert_failed
return -1;
135 debug_open("hard_read", fd
, data
, datalen
);
137 while (datalen
> 0) {
138 ssize_t readlen
= safe_read(fd
, data
, datalen
);
141 if (readlen
) return -1;
145 debug_write(data
, readlen
);
153 /* Return number of bytes read. */
154 return (total
- datalen
);