From a6a00edd75080aecc87aedfa6bf359c652af41b9 Mon Sep 17 00:00:00 2001 From: leitner Date: Wed, 5 May 2004 16:36:00 +0000 Subject: [PATCH] add errmsg API --- CHANGES | 3 +++ buffer/errmsg_cvt.c | 29 +++++++++++++++++++++++++++++ buffer/errmsg_iam.c | 8 ++++++++ buffer/errmsg_warn.c | 14 ++++++++++++++ buffer/errmsg_warnsys.c | 28 ++++++++++++++++++++++++++++ errmsg.h | 27 +++++++++++++++++++++++++++ t.c | 12 ++++++++++++ 7 files changed, 121 insertions(+) create mode 100644 buffer/errmsg_cvt.c create mode 100644 buffer/errmsg_iam.c create mode 100644 buffer/errmsg_warn.c create mode 100644 buffer/errmsg_warnsys.c create mode 100644 errmsg.h diff --git a/CHANGES b/CHANGES index b1856ad..e34b4bc 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +0.20: + add errmsg API + 0.19.2: for some reason, a botched dependency slipped in the the Makefile diff --git a/buffer/errmsg_cvt.c b/buffer/errmsg_cvt.c new file mode 100644 index 0000000..4c5b269 --- /dev/null +++ b/buffer/errmsg_cvt.c @@ -0,0 +1,29 @@ +#include +#include +#include "errmsg.h" +#include "str.h" + +/* the people who defined stdarg.h need to be taken behind the barn and shot */ +int errmsg_cvt(struct iovec* x,const char* message, va_list a) { + int i,j; + j=0; + if (argv0) { + x[0].iov_base=(char*)argv0; + x[0].iov_len=str_len(argv0); + x[1].iov_base=": "; + x[1].iov_len=2; + j=2; + } + x[j].iov_base=(char*)message; x[j].iov_len=str_len(message); ++j; + + for (i=0; j<22; ++i) { + const char* t=va_arg(a,const char*); + if (!t) break; + x[j].iov_base=(char*)t; + x[j].iov_len=str_len(t); + ++j; + } + x[j].iov_base="\n"; + x[j].iov_len=1; + return j+1; +} diff --git a/buffer/errmsg_iam.c b/buffer/errmsg_iam.c new file mode 100644 index 0000000..00aa4b1 --- /dev/null +++ b/buffer/errmsg_iam.c @@ -0,0 +1,8 @@ +#include "errmsg.h" + +const char* argv0; + +void errmsg_iam(const char* who) { + argv0=who; +} + diff --git a/buffer/errmsg_warn.c b/buffer/errmsg_warn.c new file mode 100644 index 0000000..305afd7 --- /dev/null +++ b/buffer/errmsg_warn.c @@ -0,0 +1,14 @@ +#include +#include +#include "errmsg.h" +#include "str.h" + +extern int errmsg_cvt(struct iovec* x,const char* message, va_list a); + +void errmsg_warn(const char* message, ...) { + struct iovec x[23]; + va_list a; + va_start(a,message); + writev(2,x,errmsg_cvt(x,message,a)); + va_end(a); +} diff --git a/buffer/errmsg_warnsys.c b/buffer/errmsg_warnsys.c new file mode 100644 index 0000000..bd11ae7 --- /dev/null +++ b/buffer/errmsg_warnsys.c @@ -0,0 +1,28 @@ +#include +#include +#include "errmsg.h" +#include "str.h" +#include +#include + +extern int errmsg_cvt(struct iovec* x,const char* message, va_list a); + +void errmsg_warnsys(const char* message, ...) { + struct iovec x[25]; + va_list a; + int i; + va_start(a,message); + i=errmsg_cvt(x,message,a); + + x[i-1].iov_base=": "; + x[i-1].iov_len=2; + + x[i].iov_base=strerror(errno); + x[i].iov_len=str_len(x[i].iov_base); + + x[i+1].iov_base="\n"; + x[i+1].iov_len=1; + + writev(2,x,i+2); + va_end(a); +} diff --git a/errmsg.h b/errmsg.h new file mode 100644 index 0000000..badd9cf --- /dev/null +++ b/errmsg.h @@ -0,0 +1,27 @@ +#ifndef ERRMSG_H +#define ERRMSG_H + +#ifdef __dietlibc__ +#include +#else +#define __attribute__(x) +#endif + +/* These use file descriptor 2, not buffer_2! + * Call buffer_flush(buffer_2) before calling these! */ + +extern const char* argv0; + +void errmsg_iam(const char* who); /* set argv0 */ + +/* terminate with NULL. */ +/* newline is appended automatically. */ +void errmsg_warn(const char* message, ...); +void errmsg_warnsys(const char* message, ...); + +#define carp(...) errmsg_warn(__VA_ARGS__,0) +#define carpsys(...) errmsg_warnsys(__VA_ARGS__,0) +#define die(n,...) { errmsg_warn(__VA_ARGS__,0); exit(n); } +#define diesys(n,...) { errmsg_warnsys(__VA_ARGS__,0); exit(n); } + +#endif diff --git a/t.c b/t.c index ab5db67..fa16700 100644 --- a/t.c +++ b/t.c @@ -19,17 +19,29 @@ #include #include #include +#include #define rdtscl(low) \ __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "edx") int main(int argc,char* argv[]) { + char* c="fnord"; + int fd=open_read(c); + errmsg_iam(argv[0]); + carp("could not open file `",c,"'"); + diesys(23,"could not open file `",c,"'"); +#if 0 + errmsg_warn("could not open file `",c,"'",0); + errmsg_warnsys("could not open file `",c,"'",0); +#endif +#if 0 char buf[100]="/usr/bin/sh"; int len=str_len(buf); assert(byte_rchr(buf,len,'/')==8); assert(byte_rchr(buf,len,'@')==len); assert(byte_rchr(buf,len,'h')==len-1); printf("%d\n",byte_rchr("x",1,'x')); +#endif #if 0 char buf[IP6_FMT+100]; int i;