#include #include #include #include #include #include #include #include "util.h" int uniqid(void) { static int i = 0; return i++; } void xxd(FILE *stream, const void *buf_, size_t length) { unsigned char *buf = (unsigned char*)buf_; for (size_t cursor = 0; cursor < length;) { fprintf(stream, "%08zx:", cursor); for (int i = 0; i < 16; i++) { if (i % 2 == 0) fprintf(stream, " "); if (i % 8 == 0) fprintf(stream, " "); if (cursor + i < length) fprintf(stream, "%02x", (unsigned)buf[cursor + i]); else fprintf(stream, " "); } fprintf(stream, " |"); for (int i = 0; i < 16 && cursor + i < length; i++) { if (isprint(buf[cursor + i])) fprintf(stream, "%c", buf[cursor + i]); else fprintf(stream, "."); } fprintf(stream, "|\n"); cursor += 16; } } ssize_t readall(int fd, void *data, size_t length) { size_t cursor = 0; while (cursor < length) { ssize_t nr = read(fd, data + cursor, length - cursor); if (nr < 0) { if (errno == EINTR) continue; return -1; } assert(nr > 0); cursor += nr; } return length; } ssize_t writeall(int fd, const void *data, size_t length) { size_t cursor = 0; while (cursor < length) { ssize_t nw = write(fd, data + cursor, length - cursor); if (nw < 0) { if (errno == EINTR) continue; return -1; } assert(nw > 0); cursor += nw; } return length; } int maxi(int a, int b) { return a > b ? a : b; } int64_t gettimestamp(void) { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec * 1000000LL + tv.tv_usec; }