/* $Header: /CVSROOT/debris/dristool.h,v 1.5 2005/08/15 01:04:52 tino Exp $ * * DebRIS: DEBian Remote Install Scripter * Helping functions * * $Log: dristool.h,v $ * Revision 1.5 2005/08/15 01:04:52 tino * all functions now have a prefix (dris_) * * Revision 1.4 2005/08/13 22:59:12 tino * additional functions, see ChangeLog * * Revision 1.3 2005/07/25 03:15:43 tino * quote processing added in nextarg * * Revision 1.2 2005/07/24 22:14:43 tino * added info2 * * Revision 1.1 2005/06/01 02:12:35 tino * first version. As SirbeD is missing, this just does nothing yet. */ #define DP(X) do { dris_dprintf X; } while (0) static void dris_info2(const char *s, ...) { va_list list; va_start(list, s); vfprintf(stderr, s, list); va_end(list); fflush(stderr); } static void dris_info(const char *s, ...) { va_list list; va_start(list, s); vprintf(s, list); va_end(list); fflush(stdout); } static void dris_verbose(const char *s, ...) { va_list list; if (!config.verbose) return; va_start(list, s); vprintf(s, list); va_end(list); fflush(stdout); } static void dris_dprintf(const char *s, ...) { va_list list; if (!config.debug) return; fprintf(stderr, "["); va_start(list, s); vfprintf(stderr, s, list); va_end(list); fprintf(stderr, "]\n"); } static void dris_verr(FILE *fd, const char *s, va_list list, int e) { fprintf(fd, "error: "); vfprintf(fd, s, list); fprintf(fd, ": %s\n", strerror(e)); fflush(fd); } static int dris_err(const char *s, ...) { va_list list; int e; e = errno; va_start(list, s); dris_verr(stderr, s, list, e); va_end(list); return -1; } static void dris_ex(const char *s, ...) { va_list list; int e; e = errno; va_start(list, s); dris_verr(stdout, s, list, e); va_end(list); va_start(list, s); dris_verr(stderr, s, list, e); va_end(list); exit(-1); } static char * dris_nextarg(char **ptr) { char *ret, *cmd, *out, quote; for (cmd= *ptr;; cmd++) { if (!*cmd) return 0; if (!isspace(*cmd)) break; } ret = cmd; quote = 0; out = ret; for (;;) { char c; switch (c= *cmd++) { case 0: *ptr = 0; *out = 0; return ret; case '"': case '\'': if (!quote) { quote = c; continue; } if (c==quote) { quote = 0; continue; } break; case ' ': case '\t': case '\v': case '\r': case '\n': if (!quote) { *ptr = cmd+1; *out = 0; return ret; } } *out++ = c; } } static int dris_writeall(int fd, const void *buf, size_t len) { while (len) { int put; if ((put=write(fd, buf, len))>0) { len -= put; ((const char *)buf) += put; continue; } if (!put) return dris_err("writeall: unexpected EOF, filesystem full?"); if (errno!=EINTR && errno!=EAGAIN) return dris_err("writeall"); } return 0; } static int dris_readall(int fd, void *buf, size_t len) { int got; while ((got=read(fd, buf, len))<0) if (errno!=EINTR && errno!=EAGAIN) return dris_err("readall"); return got; }