1. 28 10月, 2011 2 次提交
    • D
      Implement RPC driver support for virDomainOpenGraphics · d442599a
      Daniel P. Berrange 提交于
      Since it needs to access file descriptors passed in the msg,
      the RPC driver for virDomainOpenGraphics needs to be manually
      implemented.
      
      * daemon/remote.c: RPC server dispatcher
      * src/remote/remote_driver.c: RPC client dispatcher
      * src/remote/remote_protocol.x: Define protocol
      d442599a
    • D
      Add client side support for FD passing · 36a9c83d
      Daniel P. Berrange 提交于
      Extend the RPC client code to allow file descriptors to be sent
      to the server with calls, and received back with replies.
      
      * src/remote/remote_driver.c: Stub extra args
      * src/libvirt_private.syms, src/rpc/virnetclient.c,
        src/rpc/virnetclient.h, src/rpc/virnetclientprogram.c,
        src/rpc/virnetclientprogram.h: Extend APIs to allow
        FD passing
      36a9c83d
  2. 25 10月, 2011 1 次提交
    • M
      startupPolicy: Emit event on disk source dropping · baf2ff7e
      Michal Privoznik 提交于
      If a disk source gets dropped because it is not accessible,
      mgmt application might want to be informed about this. Therefore
      we need to emit an event. The event presented in this patch
      is however a bit superset of what written above. The reason is simple:
      an intention to be easily expanded, e.g. on 'user ejected disk
      in guest' events. Therefore, callback gets source string and disk alias
      (which should be unique among a domain) and reason (an integer);
      baf2ff7e
  3. 19 10月, 2011 1 次提交
    • D
      Allow for URI aliases when connecting to libvirt · 777ffbd0
      Daniel P. Berrange 提交于
      This adds support for a libvirt client configuration file
      either /etc/libvirt/libvirt.conf for privileged clients,
      or $HOME/.libvirt/libvirt.conf for unprivileged clients.
      
      It allows one parameter
      
       uri_aliases = [
         "hail=qemu+ssh://root@hail.cloud.example.com/system",
         "sleet=qemu+ssh://root@sleet.cloud.example.com/system",
       ]
      
      Any call to virConnectOpen with a non-NULL URI will first
      attempt to match against the uri_aliases list. An application
      can disable this by using VIR_CONNECT_NO_ALIASES
      
      * docs/uri.html.in: Document URI aliases
      * include/libvirt/libvirt.h.in: Add VIR_CONNECT_NO_ALIASES
      * libvirt.spec.in, mingw32-libvirt.spec.in: Add /etc/libvirt/libvirt.conf
      * src/Makefile.am: Install default config file
      * src/libvirt.c: Add support for URI aliases
      * src/remote/remote_driver.c: Don't try to handle URIs
        with no scheme and which clearly are not paths
      * src/util/conf.c: Don't raise error on virConfFree(NULL)
      * src/xen/xen_driver.c: Don't raise error on URIs
        with no scheme
      777ffbd0
  4. 11 10月, 2011 1 次提交
    • E
      snapshot: remote protocol for snapshot children · db536236
      Eric Blake 提交于
      Very mechanical.  I'm so glad we've automated the generation of things,
      compared to what it was in 0.8.x days, where this would be much longer.
      
      * src/remote/remote_protocol.x
      (REMOTE_PROC_DOMAIN_SNAPSHOT_NUM_CHILDREN)
      (REMOTE_PROC_DOMAIN_SNAPSHOT_LIST_CHILDREN_NAMES): New rpcs.
      (remote_domain_snapshot_num_children_args)
      (remote_domain_snapshot_num_children_ret)
      (remote_domain_snapshot_list_children_names_args)
      (remote_domain_snapshot_list_children_names_ret): New structs.
      * src/remote/remote_driver.c (remote_driver): Use it.
      * src/remote_protocol-structs: Update.
      db536236
  5. 07 10月, 2011 1 次提交
  6. 29 9月, 2011 1 次提交
  7. 28 9月, 2011 1 次提交
    • E
      snapshot: remote protocol for getparent · 3ca4296f
      Eric Blake 提交于
      Mostly straight-forward, although this is the first API that
      returns a new snapshot based on a snapshot rather than a domain.
      
      * src/remote/remote_protocol.x
      (REMOTE_PROC_DOMAIN_SNAPSHOT_GET_PARENT): New rpc.
      (remote_domain_snapshot_get_parent_args)
      (remote_domain_snapshot_get_parent_ret): New structs.
      * src/rpc/gendispatch.pl: Adjust generator.
      * src/remote/remote_driver.c (remote_driver): Use it.
      * src/remote_protocol-structs: Update.
      3ca4296f
  8. 20 9月, 2011 1 次提交
  9. 06 9月, 2011 1 次提交
  10. 02 9月, 2011 1 次提交
  11. 01 9月, 2011 1 次提交
  12. 26 8月, 2011 1 次提交
  13. 23 8月, 2011 1 次提交
  14. 28 7月, 2011 1 次提交
  15. 22 7月, 2011 8 次提交
    • D
      Allow certificate sanity checking to be disabled · 07f9b6f0
      Daniel P. Berrange 提交于
      When libvirtd starts it it will sanity check its own certs,
      and before libvirt clients connect to a remote server they
      will sanity check their own certs. This patch allows such
      sanity checking to be skipped. There is no strong reason to
      need to do this, other than to bypass possible libvirt bugs
      in sanity checking, or for testing purposes.
      
      libvirt.conf gains tls_no_sanity_certificate parameter to
      go along with tls_no_verify_certificate. The remote driver
      client URIs gain a no_sanity URI parameter
      
      * daemon/test_libvirtd.aug, daemon/libvirtd.conf,
        daemon/libvirtd.c, daemon/libvirtd.aug: Add parameter to
        allow cert sanity checks to be skipped
      * src/remote/remote_driver.c: Add no_sanity parameter to
        skip cert checks
      * src/rpc/virnettlscontext.c, src/rpc/virnettlscontext.h:
        Add new parameter for skipping sanity checks independantly
        of skipping session cert validation checks
      07f9b6f0
    • O
      remote/ssh: optional "keyfile" parameter. · 6b01c83a
      Oskari Saarenmaa 提交于
      New optional parameter "keyfile" for ssh transport allows the user to select
      the private key to be used to authenticate to the remote host.
      6b01c83a
    • A
      Asynchronous event for BlockJob completion · d489b046
      Adam Litke 提交于
      When an operation started by virDomainBlockPull completes (either with
      success or with failure), raise an event to indicate the final status.
      This API allow users to avoid polling on virDomainGetBlockJobInfo if
      they would prefer to use an event mechanism.
      
      * daemon/remote.c: Dispatch events to client
      * include/libvirt/libvirt.h.in: Define event ID and callback signature
      * src/conf/domain_event.c, src/conf/domain_event.h,
        src/libvirt_private.syms: Extend API to handle the new event
      * src/qemu/qemu_driver.c: Connect to the QEMU monitor event
        for block_stream completion and emit a libvirt block pull event
      * src/remote/remote_driver.c: Receive and dispatch events to application
      * src/remote/remote_protocol.x: Wire protocol definition for the event
      * src/remote_protocol-structs: structure definitions for protocol verification
      * src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h,
        src/qemu/qemu_monitor_json.c: Watch for BLOCK_STREAM_COMPLETED event
        from QEMU monitor
      d489b046
    • A
      Add virDomainBlockPull support to the remote driver · 4daeefac
      Adam Litke 提交于
      The generator can handle everything except virDomainGetBlockJobInfo().
      
      * src/remote/remote_protocol.x: provide defines for the new entry points
      * src/remote/remote_driver.c daemon/remote.c: implement the client and
        server side for virDomainGetBlockJobInfo.
      * src/remote_protocol-structs: structure definitions for protocol verification
      * src/rpc/gendispatch.pl: Permit some unsigned long parameters
      4daeefac
    • E
      save: wire up remote protocol · 0696beca
      Eric Blake 提交于
      * src/remote/remote_driver.c (remote_driver): Add new callbacks.
      * src/remote/remote_protocol.x (remote_procedure): New RPCs.
      (remote_domain_save_image_get_xml_desc_args)
      (remote_domain_save_image_get_xml_desc_ret)
      (remote_domain_save_image_define_xml_args): New structs.
      * src/remote_protocol-structs: Update.
      0696beca
    • M
      destroy: Wire up the remote protocol · ca79a4fb
      Michal Privoznik 提交于
      ca79a4fb
    • E
      save: wire up remote protocol · b6fe647b
      Eric Blake 提交于
      * src/remote/remote_driver.c (remote_driver): Add new callbacks.
      * src/remote/remote_protocol.x (remote_procedure): New RPCs.
      (remote_domain_save_flags_args, remote_domain_restore_flags_args):
      New structs.
      * src/remote_protocol-structs: Update.
      b6fe647b
    • E
      build: rename files.h to virfile.h · 8e22e089
      Eric Blake 提交于
      In preparation for a future patch adding new virFile APIs.
      
      * src/util/files.h, src/util/files.c: Move...
      * src/util/virfile.h, src/util/virfile.c: ...here, and rename
      functions to virFile prefix.  Macro names are intentionally
      left alone.
      * *.c: All '#include "files.h"' uses changed.
      * src/Makefile.am (UTIL_SOURCES): Reflect rename.
      * cfg.mk (exclude_file_name_regexp--sc_prohibit_close): Likewise.
      * src/libvirt_private.syms: Likewise.
      * docs/hacking.html.in: Likewise.
      * HACKING: Regenerate.
      8e22e089
  16. 21 7月, 2011 1 次提交
    • E
      maint: fix typos on guaranteed · a7143405
      Eric Blake 提交于
      * src/conf/domain_event.c (virDomainEventDispatch): Fix typo.
      * src/internal.h (ATTRIBUTE_FMT_PRINTF): Likewise.
      * src/libvirt.c (virStreamEventUpdateCallback): Likewise.
      * src/remote/remote_driver.c (doRemoteOpen): Likewise.
      * src/storage/storage_backend_fs.c (virStorageBackendProbeTarget):
      Likewise.
      * src/util/virterror.c (virConnCopyLastError, virCopyLastError):
      Likewise.
      * src/xen/xend_internal.h (xend_wait_for_devices): Likewise.
      a7143405
  17. 20 7月, 2011 1 次提交
  18. 19 7月, 2011 2 次提交
    • D
      Add an explicit virNetClientClose method · e06c8ede
      Daniel P. Berrange 提交于
      Since the I/O callback registered against virNetSocket will
      hold a reference on the virNetClient, we can't rely on the
      virNetClientFree to be able to close the network connection.
      The last reference will only go away when the event callback
      fires (likely due to EOF from the server).
      
      This is sub-optimal and can potentially cause a leak of the
      virNetClient object if the server were to not explicitly
      close the socket itself
      
      * src/remote/remote_driver.c: Explicitly close the client
        object when disconnecting
      * src/rpc/virnetclient.c, src/rpc/virnetclient.h: Add a
        virNetClientClose method
      e06c8ede
    • E
      libvirt: do not mix internal flags into public API · 33ba6e68
      Eric Blake 提交于
      There were two API in driver.c that were silently masking flags
      bits prior to calling out to the drivers, and several others
      that were explicitly masking flags bits.  This is not
      forward-compatible - if we ever have that many flags in the
      future, then talking to an old server that masks out the
      flags would be indistinguishable from talking to a new server
      that can honor the flag.  In general, libvirt.c should forward
      _all_ flags on to drivers, and only the drivers should reject
      unknown flags.
      
      In the case of virDrvSecretGetValue, the solution is to separate
      the internal driver callback function to have two parameters
      instead of one, with only one parameter affected by the public
      API.  In the case of virDomainGetXMLDesc, it turns out that
      no one was ever mixing VIR_DOMAIN_XML_INTERNAL_STATUS with
      the dumpxml path in the first place; that internal flag was
      only used in saving and restoring state files, which happened
      to be in functions internal to a single file, so there is no
      mixing of the internal flag with a public flags argument.
      Additionally, virDomainMemoryStats passed a flags argument
      over RPC, but not to the driver.
      
      * src/driver.h (VIR_DOMAIN_XML_FLAGS_MASK)
      (VIR_SECRET_GET_VALUE_FLAGS_MASK): Delete.
      (virDrvSecretGetValue): Separate out internal flags.
      (virDrvDomainMemoryStats): Provide missing flags argument.
      * src/driver.c (verify): Drop unused check.
      * src/conf/domain_conf.h (virDomainObjParseFile): Delete
      declaration.
      (virDomainXMLInternalFlags): Move...
      * src/conf/domain_conf.c: ...here.  Delete redundant include.
      (virDomainObjParseFile): Make static.
      * src/libvirt.c (virDomainGetXMLDesc, virSecretGetValue): Update
      clients.
      (virDomainMemoryPeek, virInterfaceGetXMLDesc)
      (virDomainMemoryStats, virDomainBlockPeek, virNetworkGetXMLDesc)
      (virStoragePoolGetXMLDesc, virStorageVolGetXMLDesc)
      (virNodeNumOfDevices, virNodeListDevices, virNWFilterGetXMLDesc):
      Don't mask unknown flags.
      * src/interface/netcf_driver.c (interfaceGetXMLDesc): Reject
      unknown flags.
      * src/secret/secret_driver.c (secretGetValue): Update clients.
      * src/remote/remote_driver.c (remoteSecretGetValue)
      (remoteDomainMemoryStats): Likewise.
      * src/qemu/qemu_process.c (qemuProcessGetVolumeQcowPassphrase):
      Likewise.
      * src/qemu/qemu_driver.c (qemudDomainMemoryStats): Likewise.
      * daemon/remote.c (remoteDispatchDomainMemoryStats): Likewise.
      33ba6e68
  19. 14 7月, 2011 1 次提交
  20. 12 7月, 2011 2 次提交
    • D
      Define remote wire protocol & impls for virDomainQemuAttach · 44036460
      Daniel P. Berrange 提交于
      This tweaks the RPC generator to cope with some naming
      conventions used for the QEMU specific APIs
      
      * daemon/remote.c: Server side dispatcher
      * src/remote/remote_driver.c: Client side dispatcher
      * src/remote/qemu_protocol.x: Wire protocol definition
      * src/rpc/gendispatch.pl: Use '$structprefix' in method
        names, fix QEMU flags and fix dispatcher method names
      44036460
    • O
      remote/ssh: support for no_verify. · 9a0e6a8f
      Oskari Saarenmaa 提交于
      Set StrictHostKeyChecking=no to auto-accept new ssh host keys if the
      no_verify extra parameter was specified.  This won't disable host key
      checking for already known hosts.  Includes a test and documentation.
      9a0e6a8f
  21. 11 7月, 2011 1 次提交
    • A
      remote: Fix memory leak · 7518ad75
      Alex Jia 提交于
      Detected in valgrind run:
      
      ==9184== 1 bytes in 1 blocks are definitely lost in loss record 1 of 19
      ==9184==    at 0x4A04A28: calloc (vg_replace_malloc.c:467)
      ==9184==    by 0x3073715F78: xdr_array (xdr_array.c:97)
      ==9184==    by 0x4CF97C9: xdr_remote_domain_get_security_label_ret (remote_protocol.c:1696)
      ==9184==    by 0x4D08741: virNetMessageDecodePayload (virnetmessage.c:286)
      ==9184==    by 0x4D00F78: virNetClientProgramCall (virnetclientprogram.c:318)
      ==9184==    by 0x4CE3887: call (remote_driver.c:3933)
      ==9184==    by 0x4CF71C6: remoteDomainGetSecurityLabel (remote_driver.c:1580)
      ==9184==    by 0x4CCA480: virDomainGetSecurityLabel (libvirt.c:7340)
      ==9184==    by 0x41993A: cmdDominfo (virsh.c:2414)
      ==9184==    by 0x411E92: vshCommandRun (virsh.c:12730)
      ==9184==    by 0x4211ED: main (virsh.c:14076)
      ==9184==
      ==9184== 2 bytes in 1 blocks are definitely lost in loss record 2 of 19
      ==9184==    at 0x4A04A28: calloc (vg_replace_malloc.c:467)
      ==9184==    by 0x3073715F78: xdr_array (xdr_array.c:97)
      ==9184==    by 0x4CF974F: xdr_remote_node_get_security_model_ret (remote_protocol.c:1713)
      ==9184==    by 0x4D08741: virNetMessageDecodePayload (virnetmessage.c:286)
      ==9184==    by 0x4D00F78: virNetClientProgramCall (virnetclientprogram.c:318)
      ==9184==    by 0x4CE3887: call (remote_driver.c:3933)
      ==9184==    by 0x4CF6F96: remoteNodeGetSecurityModel (remote_driver.c:1648)
      ==9184==    by 0x4CBF799: virNodeGetSecurityModel (libvirt.c:7382)
      ==9184==    by 0x4197D7: cmdDominfo (virsh.c:2394)
      ==9184==    by 0x411E92: vshCommandRun (virsh.c:12730)
      ==9184==    by 0x4211ED: main (virsh.c:14076)
      ==9184==
      ==9184== 8 bytes in 1 blocks are definitely lost in loss record 3 of 19
      ==9184==    at 0x4A04A28: calloc (vg_replace_malloc.c:467)
      ==9184==    by 0x3073715F78: xdr_array (xdr_array.c:97)
      ==9184==    by 0x4CF9729: xdr_remote_node_get_security_model_ret (remote_protocol.c:1710)
      ==9184==    by 0x4D08741: virNetMessageDecodePayload (virnetmessage.c:286)
      ==9184==    by 0x4D00F78: virNetClientProgramCall (virnetclientprogram.c:318)
      ==9184==    by 0x4CE3887: call (remote_driver.c:3933)
      ==9184==    by 0x4CF6F96: remoteNodeGetSecurityModel (remote_driver.c:1648)
      ==9184==    by 0x4CBF799: virNodeGetSecurityModel (libvirt.c:7382)
      ==9184==    by 0x4197D7: cmdDominfo (virsh.c:2394)
      ==9184==    by 0x411E92: vshCommandRun (virsh.c:12730)
      ==9184==    by 0x4211ED: main (virsh.c:14076)
      ==9184==
      ==9184== LEAK SUMMARY:
      ==9184==    definitely lost: 11 bytes in 3 blocks
      
      * src/remote/remote_driver.c: Avoid leak on remoteDomainGetSecurityLabel
        and remoteNodeGetSecurityModel.
      7518ad75
  22. 08 7月, 2011 2 次提交
    • D
      Fix leak of remote driver if final 'CLOSE' RPC call fails · afe8839f
      Daniel P. Berrange 提交于
      When closing a remote connection we issue a (fairly pointless)
      'CLOSE' RPC call to the daemon. If this fails we skip all the
      cleanup of private data, but the virConnectPtr object still
      gets released as normal. This causes a memory leak. Since the
      CLOSE RPC call is pretty pointless, just carry on freeing the
      remote driver if it fails.
      
      * src/remote/remote_driver.c: Ignore failure to issue CLOSE
        RPC call
      afe8839f
    • E
      drivers: prefer unsigned int for flags · 1740c381
      Eric Blake 提交于
      Now that the public APIs always use unsigned flags, the internal
      driver callbacks might as well do likewise.
      
      * src/driver.h (vrDrvOpen, virDrvDomainCoreDump)
      (virDrvDomainGetXMLDesc, virDrvNetworkGetXMLDesc)
      (virDrvNWFilterGetXMLDesc): Update type.
      * src/remote/remote_protocol.x (remote_open_args)
      (remote_domain_core_dump_args, remote_domain_get_xml_desc_args)
      (remote_network_get_xml_desc_args)
      (remote_nwfilter_get_xml_desc_args): Likewise.
      * src/test/test_driver.c: Update clients.
      * src/remote/remote_driver.c: Likewise.
      * src/xen/xen_hypervisor.c: Likewise.
      * src/xen/xen_hypervisor.h: Likewise.
      * src/xen/xen_driver.c: Likewise.
      * src/xen/xend_internal.c: Likewise.
      * src/xen/xend_internal.h: Likewise.
      * src/xen/xm_internal.c: Likewise.
      * src/xen/xm_internal.h: Likewise.
      * src/xen/xs_internal.c: Likewise.
      * src/xen/xs_internal.h: Likewise.
      * src/xen/xen_inotify.c: Likewise.
      * src/xen/xen_inotify.h: Likewise.
      * src/phyp/phyp_driver.c: Likewise.
      * src/openvz/openvz_driver.c: Likewise.
      * src/vmware/vmware_driver.c: Likewise.
      * src/vbox/vbox_driver.c: Likewise.
      * src/vbox/vbox_tmpl.c: Likewise.
      * src/xenapi/xenapi_driver.c: Likewise.
      * src/esx/esx_driver.c: Likewise.
      * src/esx/esx_interface_driver.c: Likewise.
      * src/esx/esx_network_driver.c: Likewise.
      * src/esx/esx_storage_driver.c: Likewise.
      * src/esx/esx_device_monitor.c: Likewise.
      * src/esx/esx_secret_driver.c: Likewise.
      * src/esx/esx_nwfilter_driver.c: Likewise.
      * src/interface/netcf_driver.c: Likewise.
      * src/nwfilter/nwfilter_driver.c: Likewise.
      * src/libxl/libxl_driver.c: Likewise.
      * src/qemu/qemu_driver.c: Likewise.
      * src/lxc/lxc_driver.c: Likewise.
      * src/uml/uml_driver.c: Likewise.
      * src/network/bridge_driver.c: Likewise.
      * src/secret/secret_driver.c: Likewise.
      * src/storage/storage_driver.c: Likewise.
      * src/node_device/node_device_hal.c: Likewise.
      * src/node_device/node_device_udev.c: Likewise.
      * src/remote_protocol-structs: Likewise.
      1740c381
  23. 01 7月, 2011 1 次提交
    • D
      Fix stream procedure number for virDomainMigratePrepareTunnel3 · 1414cc5f
      Daniel P. Berrange 提交于
      The virDomainMigratePrepareTunnel3 impl in the remote driver
      was using the procedure number for the virDomainMigratePrepareTunnel
      method. This doesn't work out so well, because it makes the server
      ignore & drop all stream packets
      
      * src/remote/remote_driver.c: Fix procedure for PrepareTunnel3
      1414cc5f
  24. 29 6月, 2011 3 次提交
    • D
      Fix locking wrt virNetClientStreamPtr object · 8a4e2874
      Daniel P. Berrange 提交于
      The client stream object can be used independently of the
      virNetClientPtr object, so must have full locking of its
      own and not rely on any caller.
      
      * src/remote/remote_driver.c: Remove locking around stream
        callback
      * src/rpc/virnetclientstream.c: Add locking to all APIs
        and callbacks
      8a4e2874
    • E
      remote: fix uninitialized variable · cf2affff
      Eric Blake 提交于
      Detected by gcc -O2:
      
      remote/remote_driver.c: In function 'doRemoteOpen':
      remote/remote_driver.c:2753:26: error: 'sasl' may be used uninitialized in this function [-Werror=uninitialized]
      
      * src/remote/remote_driver.c (remoteAuthSASL): Initialize sasl.
      cf2affff
    • D
      Convert the remote driver to new RPC client APIs · c1b22644
      Daniel P. Berrange 提交于
      This guts the current remote driver, removing all its networking
      handling code. Instead it calls out to the new virClientPtr and
      virClientProgramPtr APIs for all RPC & networking work.
      
      * src/Makefile.am: Link remote driver with generic RPC code
      * src/remote/remote_driver.c: Gut code, replacing with RPC
        API calls
      * src/rpc/gendispatch.pl: Update for changes in the way
        streams are handled
      c1b22644
  25. 28 6月, 2011 1 次提交
  26. 27 6月, 2011 1 次提交
    • E
      build: rename Vcpupin to VcpuPin · 28e45afc
      Eric Blake 提交于
      We already have a public virDomainPinVcpu, which implies that
      Pin and Vcpu are treated as separate words.  Unreleased commit
      e261987c introduced virDomainGetVcpupinInfo as the first public
      API that used Vcpupin, although we had prior internal uses of
      that spelling.  For consistency, change the spelling to be two
      words everywhere, regardless of whether pin comes first or last.
      
      * daemon/remote.c: Treat vcpu and pin as separate words.
      * include/libvirt/libvirt.h.in: Likewise.
      * src/conf/domain_conf.c: Likewise.
      * src/conf/domain_conf.h: Likewise.
      * src/driver.h: Likewise.
      * src/libvirt.c: Likewise.
      * src/libvirt_private.syms: Likewise.
      * src/libvirt_public.syms: Likewise.
      * src/libxl/libxl_driver.c: Likewise.
      * src/qemu/qemu_driver.c: Likewise.
      * src/remote/remote_driver.c: Likewise.
      * src/xen/xend_internal.c: Likewise.
      * tools/virsh.c: Likewise.
      * src/remote/remote_protocol.x: Likewise.
      * src/remote_protocol-structs: Likewise.
      Suggested by Matthias Bolte.
      28e45afc
  27. 25 6月, 2011 1 次提交