aboutsummaryrefslogtreecommitdiff
path: root/libgo/go
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2011-03-09 22:13:09 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2011-03-09 22:13:09 +0000
commitbef18456b74c6e8114214e7252882f55500d43df (patch)
treea79eaedceae2cad9594cb151794741e8feba386e /libgo/go
parentdb7ec03597533caa93e7eb3688de61c0d6e2bc77 (diff)
downloadgcc-bef18456b74c6e8114214e7252882f55500d43df.zip
gcc-bef18456b74c6e8114214e7252882f55500d43df.tar.gz
gcc-bef18456b74c6e8114214e7252882f55500d43df.tar.bz2
Solaris specific syslog support.
From-SVN: r170837
Diffstat (limited to 'libgo/go')
-rw-r--r--libgo/go/syslog/syslog.go54
-rw-r--r--libgo/go/syslog/syslog_c.c19
-rw-r--r--libgo/go/syslog/syslog_solaris.go37
-rw-r--r--libgo/go/syslog/syslog_unix.go31
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")
+}