177 #define STR(x) vstring_str(x)
178 #define LEN(x) VSTRING_LEN(x)
201 const char *myname =
"netstring_get_length";
213 msg_info(
"%s: read netstring length %ld", myname, (
long) len);
232 const char *myname =
"netstring_get_data";
247 msg_info(
"%s: read netstring data %.*s",
248 myname, (
int) (len < 30 ? len : 30),
STR(buf));
273 if (limit && len > limit)
283 const char *myname =
"netstring_put";
286 msg_info(
"%s: write netstring len %ld data %.*s",
287 myname, (
long) len, (
int) (len < 30 ? len : 30), data);
297 const char *myname =
"netstring_put_multi";
307 va_start(ap, stream);
313 for (total = 0; (data = va_arg(ap,
char *)) != 0; total += data_len)
314 if ((data_len = va_arg(ap, ssize_t)) < 0)
315 msg_panic(
"%s: bad data length %ld", myname, (
long) data_len);
318 msg_panic(
"%s: bad total length %ld", myname, (
long) total);
320 msg_info(
"%s: write total length %ld", myname, (
long) total);
326 while ((data = va_arg(ap2,
char *)) != 0) {
327 data_len = va_arg(ap2, ssize_t);
329 msg_info(
"%s: write netstring len %ld data %.*s",
330 myname, (
long) data_len,
331 (
int) (data_len < 30 ? data_len : 30), data);
375 return (
"unexpected disconnect");
377 return (
"time limit exceeded");
379 return (
"input format error");
381 return (
"input exceeds size limit");
383 return (
"unknown netstring error");
402 static VSTRING *stdin_read_buf;
403 static VSTRING *child_read_buf;
408 static void stdin_read_event(
int event,
void *context)
441 static void child_read_event(
int event,
void *context)
462 int main(
int argc,
char **argv)
470 msg_fatal(
"usage: %s command...", argv[0]);
void event_enable_read(int fd, EVENT_NOTIFY_RDWR_FN callback, void *context)
void netstring_except(VSTREAM *stream, int exception)
void netstring_fflush(VSTREAM *stream)
#define CA_VSTREAM_CTL_TIMEOUT(v)
#define NETSTRING_ERR_FORMAT
NORETURN msg_panic(const char *fmt,...)
VSTRING * netstring_get(VSTREAM *stream, VSTRING *buf, ssize_t limit)
ssize_t netstring_get_length(VSTREAM *stream)
int main(int argc, char **argv)
VSTRING * netstring_memcpy(VSTRING *buf, const char *src, ssize_t len)
#define vstream_longjmp(stream, val)
#define CA_VSTREAM_POPEN_ARGV(v)
void netstring_setup(VSTREAM *stream, int timeout)
#define CA_VSTREAM_CTL_DOUBLE
#define vstream_setjmp(stream)
#define VA_COPY(dest, src)
#define NETSTRING_ERR_SIZE
VSTRING * netstring_get_data(VSTREAM *stream, VSTRING *buf, ssize_t len)
#define VSTRING_ADDCH(vp, ch)
VSTRING * vstring_sprintf_append(VSTRING *vp, const char *format,...)
VSTREAM * vstream_fprintf(VSTREAM *stream, const char *fmt,...)
VSTRING * netstring_memcat(VSTRING *buf, const char *src, ssize_t len)
#define vstream_ftimeout(vp)
#define VSTREAM_GETCHAR()
void event_loop(int delay)
#define VSTRING_RESET(vp)
VSTRING * vstring_alloc(ssize_t len)
#define CA_VSTREAM_POPEN_END
const char * netstring_strerror(int err)
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
void netstring_put_multi(VSTREAM *stream,...)
NORETURN msg_fatal(const char *fmt,...)
#define vstream_fread(v, b, n)
int vstream_fflush(VSTREAM *stream)
VSTRING * vstring_memcat(VSTRING *vp, const char *src, ssize_t len)
#define vstream_fwrite(v, b, n)
void netstring_put(VSTREAM *stream, const char *data, ssize_t len)
#define NETSTRING_ERR_EOF
#define VSTRING_SPACE(vp, len)
#define NETSTRING_ERR_TIME
#define CA_VSTREAM_CTL_EXCEPT
#define vstream_fileno(vp)
#define VSTRING_AT_OFFSET(vp, offset)
#define CA_VSTREAM_CTL_END
#define VSTREAM_PUTC(ch, vp)
void vstream_control(VSTREAM *stream, int name,...)
VSTREAM VSTREAM const char VSTREAM * vstream_popen(int,...)
void netstring_get_terminator(VSTREAM *stream)
#define NETSTRING_PUT_BUF(str, buf)
void msg_info(const char *fmt,...)