Re: [PATCH v4 1/2] protocol: learn to describe fd passing in messages

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

 




----- Original Message -----
> > 
> > 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).
> > 
> > Even if there is no fd to send (or if the fd is invalid etc), the
> > receiver side expects an extra byte anyway.
> > 
> > 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)
> 
> Why not overiding the __init__ and just calling a FdType().
> Is not clear why 1 and True and actually is not 1 bit but it consumes
> 0 bytes on the marshalling.
> Why signed was True? Not that actually it matters.

Good idea,
> 
> So
> 
> class FdType(IntegerType):
>     def __init__(self):
>         IntegerType.__init__(0, False)
>         self.name = "fd"
> 
>     def c_type(self):
>         return "int"
> 
> and
> 
> 
> unix_fd = FdType()

thanks, applied

> 
> > 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
> > 
> > 
> 
> Frediano
> 
_______________________________________________
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]