summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoern Engel <joern@logfs.org>2011-12-23 13:45:38 -0800
committerJoern Engel <joern@logfs.org>2011-12-23 13:45:38 -0800
commite0bbe42647f27da852cf629eb2ad7d0bd8d3055f (patch)
treefb07ea5ccb10ca4c9936835a90fe75a82a00ece0
parent4ef015343068951dcaee0cd8c50a83841710f84f (diff)
downloadcancd-e0bbe42647f27da852cf629eb2ad7d0bd8d3055f.tar.gz
Prepend date string to each line
Make this look more like syslog. Signed-off-by: Joern Engel <joern@logfs.org>
-rw-r--r--cancd.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/cancd.c b/cancd.c
index e9d8d04..8462e2c 100644
--- a/cancd.c
+++ b/cancd.c
@@ -22,6 +22,9 @@
* Boston, MA 021110-1307, USA.
*/
+#define _GNU_SOURCE
+#include <features.h>
+
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
@@ -294,7 +297,33 @@ static int do_write(int fd, const void *buf, size_t count)
return 0;
}
-static void do_output(const char *buf, int len, struct sockaddr_in *addr, socklen_t socklen)
+static int write_formated(int fd, char *buf, size_t count)
+{
+ const char *format = "%b %d %H:%M:%S ";
+ char *end;
+ char timestr[200];
+ size_t n, len, err;
+ time_t now = time(NULL);
+ struct tm *tm = localtime(&now);
+
+ while (count) {
+ end = strchrnul(buf, 0xa);
+ *end = 0xa;
+ len = end - buf + 1;
+ n = strftime(timestr, sizeof(timestr), format, tm);
+ err = do_write(fd, timestr, n);
+ if (err)
+ return err;
+ err = do_write(fd, buf, len);
+ if (err)
+ return err;
+ buf += len;
+ count -= len;
+ }
+ return 0;
+}
+
+static void do_output(char *buf, int len, struct sockaddr_in *addr, socklen_t socklen)
{
int fd, rc;
char *name, *tmp, *dir;
@@ -320,7 +349,7 @@ static void do_output(const char *buf, int len, struct sockaddr_in *addr, sockle
if (fd < 0)
syslog(LOG_ERR, "Unable to open \"%s\": %s", name, strerror(errno));
else {
- do_write(fd, buf, len);
+ write_formated(fd, buf, len);
close(fd);
}
free(name);