Solaris specific syslog support.
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 9 Mar 2011 22:13:09 +0000 (22:13 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 9 Mar 2011 22:13:09 +0000 (22:13 +0000)
From-SVN: r170837

libgo/Makefile.am
libgo/Makefile.in
libgo/go/syslog/syslog.go
libgo/go/syslog/syslog_c.c [new file with mode: 0644]
libgo/go/syslog/syslog_solaris.go [new file with mode: 0644]
libgo/go/syslog/syslog_unix.go [new file with mode: 0644]

index 407868779822d8eb0eab8387f2ba1a2de2b7a460..bc8b8316f0ee173b09f6e53696b01e38526b29ef 100644 (file)
@@ -787,8 +787,15 @@ go_sync_files = \
 go_sync_c_files = \
        go/sync/cas.c
 
+if LIBGO_IS_SOLARIS
+go_syslog_file = go/syslog/syslog_solaris.go
+else
+go_syslog_file = go/syslog/syslog_unix.go
+endif
+
 go_syslog_files = \
-       go/syslog/syslog.go
+       go/syslog/syslog.go \
+       $(go_syslog_file)
 
 go_tabwriter_files = \
        go/tabwriter/tabwriter.go
@@ -1785,10 +1792,14 @@ sync/check: $(CHECK_DEPS)
        $(CHECK)
 .PHONY: sync/check
 
-syslog/libsyslog.$(OBJEXT): $(go_syslog_files) fmt.gox log.gox net.gox os.gox
-       $(BUILDPACKAGE)
-syslog/libsyslog.lo: syslog/libsyslog.$(OBJEXT)
-syslog/libsyslog.la: syslog/libsyslog.lo
+syslog/syslog.$(OBJEXT): $(go_syslog_files) fmt.gox log.gox net.gox os.gox \
+               syscall.gox
+       test -d syslog || $(MKDIR_P) syslog
+       $(LTGOCOMPILE) -I . -c -o $@ -fgo-prefix=libgo_syslog $(srcdir)/go/syslog/syslog.go $(srcdir)/$(go_syslog_file)
+syslog/syslog_c.$(OBJEXT): $(srcdir)/go/syslog/syslog_c.c syslog/syslog.$(OBJEXT)
+       $(LTCOMPILE) -c -o $@ $(srcdir)/go/syslog/syslog_c.c
+syslog/libsyslog.la: syslog/syslog.$(OBJEXT) syslog/syslog_c.$(OBJEXT)
+       $(LINK) syslog/syslog.lo syslog/syslog_c.lo
 syslog/check: $(CHECK_DEPS)
        $(CHECK)
 .PHONY: syslog/check
@@ -2733,7 +2744,7 @@ strings.gox: strings/libstrings.$(OBJEXT)
        $(BUILDGOX)
 sync.gox: sync/mutex.$(OBJEXT)
        $(BUILDGOX)
-syslog.gox: syslog/libsyslog.$(OBJEXT)
+syslog.gox: syslog/syslog.$(OBJEXT)
        $(BUILDGOX)
 syscall.gox: syscalls/syscall.$(OBJEXT)
        $(BUILDGOX)
index 46821bad8ad2a88e3f10847a406f0e60fbdacb13..12c542cd1e1bba62c3114dafe6e2e2f424d8b8b1 100644 (file)
@@ -1139,8 +1139,11 @@ go_sync_files = \
 go_sync_c_files = \
        go/sync/cas.c
 
+@LIBGO_IS_SOLARIS_FALSE@go_syslog_file = go/syslog/syslog_unix.go
+@LIBGO_IS_SOLARIS_TRUE@go_syslog_file = go/syslog/syslog_solaris.go
 go_syslog_files = \
-       go/syslog/syslog.go
+       go/syslog/syslog.go \
+       $(go_syslog_file)
 
 go_tabwriter_files = \
        go/tabwriter/tabwriter.go
@@ -4163,10 +4166,14 @@ sync/check: $(CHECK_DEPS)
        $(CHECK)
 .PHONY: sync/check
 
-syslog/libsyslog.$(OBJEXT): $(go_syslog_files) fmt.gox log.gox net.gox os.gox
-       $(BUILDPACKAGE)
-syslog/libsyslog.lo: syslog/libsyslog.$(OBJEXT)
-syslog/libsyslog.la: syslog/libsyslog.lo
+syslog/syslog.$(OBJEXT): $(go_syslog_files) fmt.gox log.gox net.gox os.gox \
+               syscall.gox
+       test -d syslog || $(MKDIR_P) syslog
+       $(LTGOCOMPILE) -I . -c -o $@ -fgo-prefix=libgo_syslog $(srcdir)/go/syslog/syslog.go $(srcdir)/$(go_syslog_file)
+syslog/syslog_c.$(OBJEXT): $(srcdir)/go/syslog/syslog_c.c syslog/syslog.$(OBJEXT)
+       $(LTCOMPILE) -c -o $@ $(srcdir)/go/syslog/syslog_c.c
+syslog/libsyslog.la: syslog/syslog.$(OBJEXT) syslog/syslog_c.$(OBJEXT)
+       $(LINK) syslog/syslog.lo syslog/syslog_c.lo
 syslog/check: $(CHECK_DEPS)
        $(CHECK)
 .PHONY: syslog/check
@@ -5107,7 +5114,7 @@ strings.gox: strings/libstrings.$(OBJEXT)
        $(BUILDGOX)
 sync.gox: sync/mutex.$(OBJEXT)
        $(BUILDGOX)
-syslog.gox: syslog/libsyslog.$(OBJEXT)
+syslog.gox: syslog/syslog.$(OBJEXT)
        $(BUILDGOX)
 syscall.gox: syscalls/syscall.$(OBJEXT)
        $(BUILDGOX)
index 4924a76d0c8d224d99ea00fc0ca8fa7c53c259ca..711d5ddc74e5f8bf2ade888c8a4c9e30eaca06d4 100644 (file)
@@ -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 (file)
index 0000000..f49b9ff
--- /dev/null
@@ -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 (file)
index 0000000..044351d
--- /dev/null
@@ -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 (file)
index 0000000..b4daf88
--- /dev/null
@@ -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")
+}