diff options
Diffstat (limited to 'libgo/go')
-rw-r--r-- | libgo/go/syslog/syslog.go | 54 | ||||
-rw-r--r-- | libgo/go/syslog/syslog_c.c | 19 | ||||
-rw-r--r-- | libgo/go/syslog/syslog_solaris.go | 37 | ||||
-rw-r--r-- | libgo/go/syslog/syslog_unix.go | 31 |
4 files changed, 117 insertions, 24 deletions
diff --git a/libgo/go/syslog/syslog.go b/libgo/go/syslog/syslog.go index 4924a76..711d5dd 100644 --- a/libgo/go/syslog/syslog.go +++ b/libgo/go/syslog/syslog.go @@ -34,7 +34,17 @@ const ( type Writer struct { priority Priority prefix string - conn net.Conn + conn serverConn +} + +type serverConn interface { + writeBytes(p Priority, prefix string, b []byte) (int, os.Error) + writeString(p Priority, prefix string, s string) (int, os.Error) + close() os.Error +} + +type netConn struct { + conn net.Conn } // New establishes a new connection to the system log daemon. @@ -52,46 +62,30 @@ func Dial(network, raddr string, priority Priority, prefix string) (w *Writer, e if prefix == "" { prefix = os.Args[0] } - var conn net.Conn + var conn serverConn if network == "" { conn, err = unixSyslog() } else { - conn, err = net.Dial(network, "", raddr) + var c net.Conn + c, err = net.Dial(network, "", raddr) + conn = netConn{c} } return &Writer{priority, prefix, conn}, err } -func unixSyslog() (conn net.Conn, err os.Error) { - logTypes := []string{"unixgram", "unix"} - logPaths := []string{"/dev/log", "/var/run/syslog"} - var raddr string - for _, network := range logTypes { - for _, path := range logPaths { - raddr = path - conn, err := net.Dial(network, "", raddr) - if err != nil { - continue - } else { - return conn, nil - } - } - } - return nil, os.ErrorString("Unix syslog delivery error") -} - // Write sends a log message to the syslog daemon. func (w *Writer) Write(b []byte) (int, os.Error) { if w.priority > LOG_DEBUG || w.priority < LOG_EMERG { return 0, os.EINVAL } - return fmt.Fprintf(w.conn, "<%d>%s: %s\n", w.priority, w.prefix, b) + return w.conn.writeBytes(w.priority, w.prefix, b) } func (w *Writer) writeString(p Priority, s string) (int, os.Error) { - return fmt.Fprintf(w.conn, "<%d>%s: %s\n", p, w.prefix, s) + return w.conn.writeString(p, w.prefix, s) } -func (w *Writer) Close() os.Error { return w.conn.Close() } +func (w *Writer) Close() os.Error { return w.conn.close() } // Emerg logs a message using the LOG_EMERG priority. func (w *Writer) Emerg(m string) (err os.Error) { @@ -131,6 +125,18 @@ func (w *Writer) Debug(m string) (err os.Error) { return err } +func (n netConn) writeBytes(p Priority, prefix string, b []byte) (int, os.Error) { + return fmt.Fprintf(n.conn, "<%d>%s: %s\n", p, prefix, b) +} + +func (n netConn) writeString(p Priority, prefix string, s string) (int, os.Error) { + return fmt.Fprintf(n.conn, "<%d>%s: %s\n", p, prefix, s) +} + +func (n netConn) close() os.Error { + return n.conn.Close() +} + // NewLogger provides an object that implements the full log.Logger interface, // but sends messages to Syslog instead; flag is passed as is to Logger; // priority will be used for all messages sent using this interface. diff --git a/libgo/go/syslog/syslog_c.c b/libgo/go/syslog/syslog_c.c new file mode 100644 index 0000000..f49b9ff --- /dev/null +++ b/libgo/go/syslog/syslog_c.c @@ -0,0 +1,19 @@ +/* syslog_c.c -- call syslog for Go. + + Copyright 2011 The Go Authors. All rights reserved. + Use of this source code is governed by a BSD-style + license that can be found in the LICENSE file. */ + +#include <syslog.h> + +/* We need to use a C function to call the syslog function, because we + can't represent a C varargs function in Go. */ + +void syslog_c(int, const char*) + asm ("libgo_syslog.syslog.syslog_c"); + +void +syslog_c (int priority, const char *msg) +{ + syslog (priority, "%s", msg); +} diff --git a/libgo/go/syslog/syslog_solaris.go b/libgo/go/syslog/syslog_solaris.go new file mode 100644 index 0000000..044351d --- /dev/null +++ b/libgo/go/syslog/syslog_solaris.go @@ -0,0 +1,37 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// gccgo specific implementation of syslog for Solaris. Solaris uses +// STREAMS to communicate with syslogd. That is enough of a pain that +// we just call the libc function. + +package syslog + +import ( + "fmt" + "os" + "syscall" +) + +func unixSyslog() (conn serverConn, err os.Error) { + return libcConn(0), nil +} + +type libcConn int + +func syslog_c(int, *byte) + +func (libcConn) writeBytes(p Priority, prefix string, b []byte) (int, os.Error) { + syslog_c(int(p), syscall.StringBytePtr(fmt.Sprintf("%s: %s", prefix, b))) + return len(b), nil +} + +func (libcConn) writeString(p Priority, prefix string, s string) (int, os.Error) { + syslog_c(int(p), syscall.StringBytePtr(fmt.Sprintf("%s: %s", prefix, s))) + return len(s), nil +} + +func (libcConn) close() os.Error { + return nil +} diff --git a/libgo/go/syslog/syslog_unix.go b/libgo/go/syslog/syslog_unix.go new file mode 100644 index 0000000..b4daf88 --- /dev/null +++ b/libgo/go/syslog/syslog_unix.go @@ -0,0 +1,31 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package syslog + +import ( + "net" + "os" +) + +// unixSyslog opens a connection to the syslog daemon running on the +// local machine using a Unix domain socket. + +func unixSyslog() (conn serverConn, err os.Error) { + logTypes := []string{"unixgram", "unix"} + logPaths := []string{"/dev/log", "/var/run/syslog"} + var raddr string + for _, network := range logTypes { + for _, path := range logPaths { + raddr = path + conn, err := net.Dial(network, "", raddr) + if err != nil { + continue + } else { + return netConn{conn}, nil + } + } + } + return nil, os.ErrorString("Unix syslog delivery error") +} |