2017-12-05 1 views
0

In der unix(7) man-Seite für Unix-Domain-Sockets heißt es, dass sendmsg mit dem SCM_RIGHTS Flag verwendet werden kann, um Dateideskriptoren über diese Sockets zu senden. Wird dies in Go unterstützt? Gibt es einen guten Beispielcode, der zeigt, wie es gemacht wird?Kann Go zum Senden und Empfangen von Dateideskriptoren über Unix-Domain-Sockets verwendet werden?

Es scheint, dass im syscall Paket ein Msghdr structure angegeben ist. Aber keine Funktionen nehmen es. Vielleicht muss ich die rohe Systemaufrufschnittstelle verwenden?

Antwort

1

Es gibt ein Paket, das es hier tut: https://github.com/ftrvxmtrx/fd/blob/master/fd.go. Dies wird jedoch mithilfe des Syscall-Pakets erreicht. Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, dies mit der Go-Standardbibliothek-API zu tun.

Im syscall Paket, um die Dinge zu sehen sind UnixRights, ParseUnixRights und ParseSocketControlMessage. Diese können in Verbindung mit Readmsg und Sendmsg verwendet werden, um Dateideskriptoren über AF_UNIX-Sockets zu senden.

Die Grundstruktur geht so etwas für den Empfang:

buf := make([]byte, syscall.CmsgSpace(<number of file descriptors expected> * 4)) 
_, _, _, _, err = syscall.Recvmsg(socket, nil, buf, 0) 
if err != nil { 
    panic(err) 
} 
var msgs []syscall.SocketControlMessage 
msgs, err = syscall.ParseSocketControlMessage(buf) 
var allfds []int 
for i := 0, i < len(msgs) && err == null; i++ { 
    var msgfds []int 
    msgfds, err = syscall.ParseUnixRights(&msgs[i]) 
    append(allfds, msgfds...) 
} 

Und für das Senden, ist es viel einfacher (var fds []int):

rights := syscall.UnixRights(fds...) 
err := syscall.Sendmsg(socket, nil, rights, nil, 0) 
+1

Das ist für mich gut genug. Diese ganze Sache, an der ich arbeite, ist extrem Linux-spezifisch. Ich musste sogar ein bisschen kämpfen, damit es nicht x86_64-spezifisch wird. Diese UnixRights-Sache ist genau das Richtige. Es sollte mit allem funktionieren, das die Posix-API implementiert, die diese Art von Dingen erlaubt. – Omnifarious

+0

Wenn es Ihnen nichts ausmacht, werde ich die echte Antwort in Ihre Antwort bearbeiten. Wer weiß, ob der Code, den Sie verlinken, für immer da ist? – Omnifarious

+0

@Onmifarious guter Punkt. Es macht mir nichts aus. –

Verwandte Themen