[PATCH spice-protocol 1/2] marshaller: learn to describe fd passing in messages

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Add a new type, "unix_fd", used to describe file descriptor sharing via
socket ancillary data (these messages are local only).

The marshaller/demarshaller can't serialize this in memory (consume_fd
implementation is empty), so it is the responsability of the marshaller
user to handle sending and receiving the handles, which are appended at
the end of the message with an extra stream byte (because some Unix
requires sending at least a byte with ancillary data).

Signed-off-by: Marc-André Lureau <marcandre.lureau@xxxxxxxxxx>
---
 python_modules/demarshal.py    | 4 ++++
 python_modules/ptypes.py       | 9 +++++++++
 python_modules/spice_parser.py | 3 ++-
 3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/python_modules/demarshal.py b/python_modules/demarshal.py
index 209eafc..2252f37 100644
--- a/python_modules/demarshal.py
+++ b/python_modules/demarshal.py
@@ -72,6 +72,10 @@ def write_parser_helpers(writer):
             writer.statement("return val")
             writer.end_block()
 
+    writer.function("SPICE_GNUC_UNUSED consume_fd", "int", "uint8_t **ptr", True)
+    writer.statement("return -1")
+    writer.end_block()
+
     writer.newline()
     writer.statement("typedef struct PointerInfo PointerInfo")
     writer.statement("typedef void (*message_destructor_t)(uint8_t *message)")
diff --git a/python_modules/ptypes.py b/python_modules/ptypes.py
index 7ab2771..9c10b57 100644
--- a/python_modules/ptypes.py
+++ b/python_modules/ptypes.py
@@ -1119,6 +1119,14 @@ class ProtocolType(Type):
 
         return self
 
+class FdType(IntegerType):
+
+    def primitive_type(self):
+        return "fd"
+
+    def c_type(self):
+        return "int"
+
 int8 = IntegerType(8, True)
 uint8 = IntegerType(8, False)
 int16 = IntegerType(16, True)
@@ -1127,3 +1135,4 @@ int32 = IntegerType(32, True)
 uint32 = IntegerType(32, False)
 int64 = IntegerType(64, True)
 uint64 = IntegerType(64, False)
+unix_fd = FdType(1, True)
diff --git a/python_modules/spice_parser.py b/python_modules/spice_parser.py
index 97af8b2..db3cc8d 100644
--- a/python_modules/spice_parser.py
+++ b/python_modules/spice_parser.py
@@ -56,6 +56,7 @@ def SPICE_BNF():
         uint32_    = Keyword("uint32").setParseAction(replaceWith(ptypes.uint32))
         int64_     = Keyword("int64").setParseAction(replaceWith(ptypes.int64))
         uint64_    = Keyword("uint64").setParseAction(replaceWith(ptypes.uint64))
+        unix_fd_   = Keyword("unix_fd").setParseAction(replaceWith(ptypes.unix_fd))
 
         # keywords
         enum32_    = Keyword("enum32").setParseAction(replaceWith(32))
@@ -108,7 +109,7 @@ def SPICE_BNF():
 
         # have to use longest match for type, in case a user-defined type name starts with a keyword type, like "channel_type"
         typeSpec << ( structSpec ^ int8_ ^ uint8_ ^ int16_ ^ uint16_ ^
-                     int32_ ^ uint32_ ^ int64_ ^ uint64_ ^
+                     int32_ ^ uint32_ ^ int64_ ^ uint64_ ^ unix_fd_ ^
                      typename).setName("type")
 
         flagsBody = enumBody = Group(lbrace + delimitedList(Group (enumname + Optional(equals + integer))) + Optional(comma) + rbrace)
-- 
2.5.0

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]