diff options
author | jjako <jjako> | 2003-04-11 09:43:22 +0000 |
---|---|---|
committer | jjako <jjako> | 2003-04-11 09:43:22 +0000 |
commit | a760e322fe5ccbbfe7d49140185fb6dd3463a696 (patch) | |
tree | 482237956f34bed296e87426ef8a25f2408c352c /ggsn | |
parent | a7cd249501b869ed518746b301eb92230ec50f50 (diff) |
added syserr.h and syserr.c
Diffstat (limited to 'ggsn')
-rw-r--r-- | ggsn/syserr.c | 76 | ||||
-rw-r--r-- | ggsn/syserr.h | 26 |
2 files changed, 102 insertions, 0 deletions
diff --git a/ggsn/syserr.c b/ggsn/syserr.c new file mode 100644 index 0000000..9d793e0 --- /dev/null +++ b/ggsn/syserr.c @@ -0,0 +1,76 @@ +/* + * Syslog functions. + * Copyright (C) 2003 Mondru AB. + * + * The contents of this file may be used under the terms of the GNU + * General Public License Version 2, provided that the above copyright + * notice and this permission notice is included in all copies or + * substantial portions of the software. + * + * The initial developer of the original code is + * Jens Jakobsen <jj@openggsn.org> + * + * Contributor(s): + * + */ + +#include <stdarg.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <stdio.h> +#include <syslog.h> +#include <string.h> +#include <netinet/in.h> +#include <arpa/inet.h> + +#include "syserr.h" + + +void sys_err(int pri, char *fn, int ln, int en, char *fmt, ...) { + va_list args; + char buf[SYSERR_MSGSIZE]; + + va_start(args, fmt); + vsnprintf(buf, SYSERR_MSGSIZE, fmt, args); + va_end(args); + buf[SYSERR_MSGSIZE-1] = 0; /* Make sure it is null terminated */ + if (en) + syslog(pri, "%s: %d: %d (%s) %s", fn, ln, en, strerror(en), buf); + else + syslog(pri, "%s: %d: %s", fn, ln, buf); +} + +void sys_errpack(int pri, char *fn, int ln, int en, struct sockaddr_in *peer, + void *pack, unsigned len, char *fmt, ...) { + + va_list args; + char buf[SYSERR_MSGSIZE]; + char buf2[SYSERR_MSGSIZE]; + int n; + int pos; + + va_start(args, fmt); + vsnprintf(buf, SYSERR_MSGSIZE, fmt, args); + va_end(args); + buf[SYSERR_MSGSIZE-1] = 0; + + snprintf(buf2, SYSERR_MSGSIZE, "Packet from %s:%u, length: %d, content:", + inet_ntoa(peer->sin_addr), + ntohs(peer->sin_port), + len); + buf2[SYSERR_MSGSIZE-1] = 0; + pos = strlen(buf2); + for(n=0; n<len; n++) { + if ((pos+4)<SYSERR_MSGSIZE) { + sprintf((buf2+pos), " %02hhx", ((unsigned char*)pack)[n]); + pos += 3; + } + } + buf2[pos] = 0; + + if (en) + syslog(pri, "%s: %d: %d (%s) %s. %s", fn, ln, en, strerror(en), buf, buf2); + else + syslog(pri, "%s: %d: %s. %s", fn, ln, buf, buf2); + +} diff --git a/ggsn/syserr.h b/ggsn/syserr.h new file mode 100644 index 0000000..ae07848 --- /dev/null +++ b/ggsn/syserr.h @@ -0,0 +1,26 @@ +/* + * Syslog functions. + * Copyright (C) 2003 Mondru AB. + * + * The contents of this file may be used under the terms of the GNU + * General Public License Version 2, provided that the above copyright + * notice and this permission notice is included in all copies or + * substantial portions of the software. + * + * The initial developer of the original code is + * Jens Jakobsen <jj@openggsn.org> + * + * Contributor(s): + * + */ + +#ifndef _SYSERR_H +#define _SYSERR_H + +#define SYSERR_MSGSIZE 256 + +void sys_err(int pri, char *filename, int en, int line, char *fmt, ...); +void sys_errpack(int pri, char *fn, int ln, int en, struct sockaddr_in *peer, + void *pack, unsigned len, char *fmt, ...); + +#endif /* !_SYSERR_H */ |