int jl_sprintbuf(struct jl_printbuf *p, const char *msg, ...) { va_list ap; char *t; int size; char buf[128]; /* user stack buffer first */ va_start(ap, msg); size = vsnprintf(buf, 128, msg, ap); va_end(ap); /* if string is greater than stack buffer, then use dynamic string with vasprintf. Note: some implementation of vsnprintf return -1 if output is truncated whereas some return the number of bytes that would have been written - this code handles both cases. */ if(size == -1 || size > 127) { va_start(ap, msg); if((size = vasprintf(&t, msg, ap)) == -1) { va_end(ap); return -1; } va_end(ap); jl_printbuf_memappend(p, t, size); free(t); return size; } else { jl_printbuf_memappend(p, buf, size); return size; } }
struct mtev_json_object *mtev_json_object_from_fd(int fd) { struct jl_printbuf *pb; struct mtev_json_object *obj; char buf[JSON_FILE_BUF_SIZE]; int ret; if(!(pb = jl_printbuf_new())) { MC_ERROR("mtev_json_object_from_fd: jl_printbuf_new failed%s\n", ""); return (struct mtev_json_object*)error_ptr(-1); } while((ret = read(fd, buf, JSON_FILE_BUF_SIZE)) > 0) { jl_printbuf_memappend(pb, buf, ret); } if(ret < 0) { MC_ABORT("mtev_json_object_from_fd: error reading fd %d: %s\n", fd, strerror(errno)); jl_printbuf_free(pb); return (struct mtev_json_object*)error_ptr(-1); } obj = mtev_json_tokener_parse(pb->buf); jl_printbuf_free(pb); return obj; }