blob: 84b6b600f669e1d1c494e835bc18b7353fffb398 [file] [log] [blame]
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -04001// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -04005package net
6
7import (
Mikio Harad6665bc2012-09-26 16:11:49 +09008 "os"
Mikio Hara03d4c7c2012-02-17 10:59:30 +09009 "syscall"
Mikio Harab58b5ba2012-01-19 12:25:37 +090010 "time"
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040011)
12
Mikio Harad6665bc2012-09-26 16:11:49 +090013// UnixConn is an implementation of the Conn interface for connections
14// to Unix domain sockets.
Anthony Martin253ed022012-11-30 11:41:50 -080015type UnixConn struct {
16 conn
Mikio Harad6665bc2012-09-26 16:11:49 +090017}
18
19// ReadFromUnix reads a packet from c, copying the payload into b. It
20// returns the number of bytes copied into b and the source address of
21// the packet.
22//
23// ReadFromUnix can be made to time out and return an error with
24// Timeout() == true after a fixed time limit; see SetDeadline and
25// SetReadDeadline.
26func (c *UnixConn) ReadFromUnix(b []byte) (int, *UnixAddr, error) {
Mikio Haraafd2d2b2015-04-21 22:53:47 +090027 return 0, nil, &OpError{Op: "read", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: syscall.EPLAN9}
Mikio Harad6665bc2012-09-26 16:11:49 +090028}
29
Mikio Hara3d400db2012-01-29 19:11:05 +090030// ReadFrom implements the PacketConn ReadFrom method.
Mikio Harad6665bc2012-09-26 16:11:49 +090031func (c *UnixConn) ReadFrom(b []byte) (int, Addr, error) {
Mikio Haraafd2d2b2015-04-21 22:53:47 +090032 return 0, nil, &OpError{Op: "read", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: syscall.EPLAN9}
Mikio Harad6665bc2012-09-26 16:11:49 +090033}
34
35// ReadMsgUnix reads a packet from c, copying the payload into b and
36// the associated out-of-band data into oob. It returns the number of
37// bytes copied into b, the number of bytes copied into oob, the flags
38// that were set on the packet, and the source address of the packet.
39func (c *UnixConn) ReadMsgUnix(b, oob []byte) (n, oobn, flags int, addr *UnixAddr, err error) {
Mikio Haraafd2d2b2015-04-21 22:53:47 +090040 return 0, 0, 0, nil, &OpError{Op: "read", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: syscall.EPLAN9}
Mikio Harad6665bc2012-09-26 16:11:49 +090041}
42
43// WriteToUnix writes a packet to addr via c, copying the payload from b.
44//
45// WriteToUnix can be made to time out and return an error with
46// Timeout() == true after a fixed time limit; see SetDeadline and
47// SetWriteDeadline. On packet-oriented connections, write timeouts
48// are rare.
49func (c *UnixConn) WriteToUnix(b []byte, addr *UnixAddr) (int, error) {
Mikio Hara22829bd2015-05-30 07:33:16 +090050 return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr.opAddr(), Err: syscall.EPLAN9}
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040051}
52
Mikio Hara3d400db2012-01-29 19:11:05 +090053// WriteTo implements the PacketConn WriteTo method.
Mikio Harad6665bc2012-09-26 16:11:49 +090054func (c *UnixConn) WriteTo(b []byte, addr Addr) (int, error) {
Mikio Haraafd2d2b2015-04-21 22:53:47 +090055 return 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr, Err: syscall.EPLAN9}
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040056}
57
Mikio Harad6665bc2012-09-26 16:11:49 +090058// WriteMsgUnix writes a packet to addr via c, copying the payload
59// from b and the associated out-of-band data from oob. It returns
60// the number of payload and out-of-band bytes written.
61func (c *UnixConn) WriteMsgUnix(b, oob []byte, addr *UnixAddr) (n, oobn int, err error) {
Mikio Hara22829bd2015-05-30 07:33:16 +090062 return 0, 0, &OpError{Op: "write", Net: c.fd.dir, Source: c.fd.laddr, Addr: addr.opAddr(), Err: syscall.EPLAN9}
Mikio Harad6665bc2012-09-26 16:11:49 +090063}
64
Mikio Hara0d197252012-12-16 11:51:47 +090065// CloseRead shuts down the reading side of the Unix domain connection.
66// Most callers should just use Close.
Rémy Oudompheng0ce90452012-05-30 00:08:58 +020067func (c *UnixConn) CloseRead() error {
Mikio Haraafd2d2b2015-04-21 22:53:47 +090068 return &OpError{Op: "close", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: syscall.EPLAN9}
Rémy Oudompheng0ce90452012-05-30 00:08:58 +020069}
70
Mikio Hara0d197252012-12-16 11:51:47 +090071// CloseWrite shuts down the writing side of the Unix domain connection.
72// Most callers should just use Close.
Rémy Oudompheng0ce90452012-05-30 00:08:58 +020073func (c *UnixConn) CloseWrite() error {
Mikio Haraafd2d2b2015-04-21 22:53:47 +090074 return &OpError{Op: "close", Net: c.fd.dir, Source: c.fd.laddr, Addr: c.fd.raddr, Err: syscall.EPLAN9}
Rémy Oudompheng0ce90452012-05-30 00:08:58 +020075}
76
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040077// DialUnix connects to the remote address raddr on the network net,
Mikio Hara0d197252012-12-16 11:51:47 +090078// which must be "unix", "unixgram" or "unixpacket". If laddr is not
79// nil, it is used as the local address for the connection.
Mikio Harad6665bc2012-09-26 16:11:49 +090080func DialUnix(net string, laddr, raddr *UnixAddr) (*UnixConn, error) {
Brad Fitzpatrickef6806f2012-11-08 10:35:16 -060081 return dialUnix(net, laddr, raddr, noDeadline)
82}
83
84func dialUnix(net string, laddr, raddr *UnixAddr, deadline time.Time) (*UnixConn, error) {
Mikio Hara22829bd2015-05-30 07:33:16 +090085 return nil, &OpError{Op: "dial", Net: net, Source: laddr.opAddr(), Addr: raddr.opAddr(), Err: syscall.EPLAN9}
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040086}
87
Mikio Harad6665bc2012-09-26 16:11:49 +090088// UnixListener is a Unix domain socket listener. Clients should
89// typically use variables of type Listener instead of assuming Unix
90// domain sockets.
Mikio Haraafd2d2b2015-04-21 22:53:47 +090091type UnixListener struct {
92 fd *netFD
93}
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040094
Mikio Harad6665bc2012-09-26 16:11:49 +090095// ListenUnix announces on the Unix domain socket laddr and returns a
Mikio Haraa0430da2013-02-09 08:18:32 +090096// Unix listener. The network net must be "unix" or "unixpacket".
Mikio Harad6665bc2012-09-26 16:11:49 +090097func ListenUnix(net string, laddr *UnixAddr) (*UnixListener, error) {
Mikio Hara22829bd2015-05-30 07:33:16 +090098 return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: syscall.EPLAN9}
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -040099}
100
Mikio Harad6665bc2012-09-26 16:11:49 +0900101// AcceptUnix accepts the next incoming call and returns the new
Kamil Kisiela3834a22013-09-06 12:00:03 -0700102// connection.
Mikio Harad6665bc2012-09-26 16:11:49 +0900103func (l *UnixListener) AcceptUnix() (*UnixConn, error) {
Mikio Haraafd2d2b2015-04-21 22:53:47 +0900104 return nil, &OpError{Op: "accept", Net: l.fd.dir, Source: nil, Addr: l.fd.laddr, Err: syscall.EPLAN9}
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -0400105}
106
Mikio Harad6665bc2012-09-26 16:11:49 +0900107// Accept implements the Accept method in the Listener interface; it
108// waits for the next call and returns a generic Conn.
109func (l *UnixListener) Accept() (Conn, error) {
Mikio Haraafd2d2b2015-04-21 22:53:47 +0900110 return nil, &OpError{Op: "accept", Net: l.fd.dir, Source: nil, Addr: l.fd.laddr, Err: syscall.EPLAN9}
Mikio Harad6665bc2012-09-26 16:11:49 +0900111}
112
113// Close stops listening on the Unix address. Already accepted
114// connections are not closed.
Russ Coxeb692922011-11-01 22:05:34 -0400115func (l *UnixListener) Close() error {
Mikio Haraafd2d2b2015-04-21 22:53:47 +0900116 return &OpError{Op: "close", Net: l.fd.dir, Source: nil, Addr: l.fd.laddr, Err: syscall.EPLAN9}
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -0400117}
118
119// Addr returns the listener's network address.
Shenghou Ma7e43aee2015-02-03 12:59:40 -0500120// The Addr returned is shared by all invocations of Addr, so
121// do not modify it.
Fazlul Shahriar0f7bc922011-08-17 13:28:29 -0400122func (l *UnixListener) Addr() Addr { return nil }
Mikio Harad6665bc2012-09-26 16:11:49 +0900123
124// SetDeadline sets the deadline associated with the listener.
125// A zero time value disables the deadline.
126func (l *UnixListener) SetDeadline(t time.Time) error {
Mikio Haraafd2d2b2015-04-21 22:53:47 +0900127 return &OpError{Op: "set", Net: l.fd.dir, Source: nil, Addr: l.fd.laddr, Err: syscall.EPLAN9}
Mikio Harad6665bc2012-09-26 16:11:49 +0900128}
129
130// File returns a copy of the underlying os.File, set to blocking
131// mode. It is the caller's responsibility to close f when finished.
132// Closing l does not affect f, and closing f does not affect l.
Mikio Hara73417e42013-04-24 08:32:11 +0900133//
134// The returned os.File's file descriptor is different from the
135// connection's. Attempting to change properties of the original
136// using this duplicate may or may not have the desired effect.
Mikio Harad6665bc2012-09-26 16:11:49 +0900137func (l *UnixListener) File() (*os.File, error) {
Mikio Haraafd2d2b2015-04-21 22:53:47 +0900138 return nil, &OpError{Op: "file", Net: l.fd.dir, Source: nil, Addr: l.fd.laddr, Err: syscall.EPLAN9}
Mikio Harad6665bc2012-09-26 16:11:49 +0900139}
140
141// ListenUnixgram listens for incoming Unix datagram packets addressed
Mikio Hara8a448ef2013-03-31 16:48:18 +0900142// to the local address laddr. The network net must be "unixgram".
143// The returned connection's ReadFrom and WriteTo methods can be used
144// to receive and send packets with per-packet addressing.
Mikio Hara0d197252012-12-16 11:51:47 +0900145func ListenUnixgram(net string, laddr *UnixAddr) (*UnixConn, error) {
Mikio Hara22829bd2015-05-30 07:33:16 +0900146 return nil, &OpError{Op: "listen", Net: net, Source: nil, Addr: laddr.opAddr(), Err: syscall.EPLAN9}
Mikio Harad6665bc2012-09-26 16:11:49 +0900147}