[cffi-devel] Strange... Help!

Frank Goenninger frgo at me.com
Mon Jan 18 13:32:31 UTC 2010


Nobody ? Really nobody ? Well, please !!

Am 18.01.2010 um 00:40 schrieb Frank Goenninger:

> Hi again -
>
> I have the following C function definition (from RabbitMQ C client):
>
> typedef enum amqp_response_type_enum_ {
>   AMQP_RESPONSE_NONE = 0,
>   AMQP_RESPONSE_NORMAL,
>   AMQP_RESPONSE_LIBRARY_EXCEPTION,
>   AMQP_RESPONSE_SERVER_EXCEPTION
> } amqp_response_type_enum;
>
> typedef struct amqp_rpc_reply_t_ {
>   amqp_response_type_enum reply_type;
>   amqp_method_t reply;
>   int library_errno;
> } amqp_rpc_reply_t;
>
> /* Opaque struct. */
> typedef struct amqp_connection_state_t_ *amqp_connection_state_t;
>
> typedef enum amqp_sasl_method_enum_ {
>   AMQP_SASL_METHOD_PLAIN = 0
> } amqp_sasl_method_enum;
>
> extern amqp_rpc_reply_t amqp_login(amqp_connection_state_t state,
> 				   char const *vhost,
> 				   int channel_max,
> 				   int frame_max,
> 				   int heartbeat,
> 				   amqp_sasl_method_enum sasl_method, ...);
>
> which I hand-translated to the following CFFI statements:
>
> (defcenum amqp-sasl-method-enum
>   (:AMQP-SASL-METHOD-PLAIN 0))
>
> (defcenum amqp-response-type-enum
>   (:AMQP-RESPONSE-NONE 0)
>   :AMQP-RESPONSE-NORMAL
>   :AMQP-RESPONSE-LIBRARY-EXCEPTION
>   :AMQP-RESPONSE-SERVER-EXCEPTION)
>
> (defcstruct amqp-rpc-reply-struct
>   (reply-type      amqp-response-type-enum)
>   (reply           amqp-method-t)
>   (library-errno   :int))
>
> (defctype amqp-rpc-reply-t amqp-rpc-reply-struct)
>
> (defctype amqp-connection-state-t :pointer)
>
> (defcfun ("amqp_login" %amqp-login) amqp-rpc-reply-t
>   (state       amqp-connection-state-t)
>   (vhost       :string)
>   (channel-max :int)
>   (frame-max   :int)
>   (heartbeat   :int)
>   (sasl-method amqp-sasl-method-enum)
>   &rest) ;; varargs !
>
> You still there ? ;-) Good. Now for my "issue":
>
> Calling the C function amqp_login function as follows:
>
> (defparameter *hostname* "192.168.2.121")
> (defparameter *port*     5672)
> (defparameter *user*     "ccag.pib")
> (defparameter *password* "ccag.pib")
> (defparameter *vhost*    "/ccag/pib")
>
> (let* ((conn   (%amqp-new-connection))
>        (sockfd (%amqp-open-socket *hostname* *port*)))
>
>       (%amqp-login conn
>                    *vhost*
>                    0
>                    131072
>                    0
>                    :AMQP-SASL-METHOD-PLAIN
>                    :string *user*
>                    :string *password*)
>   ...
>
> results in the following output from the C function amqp_login (which
> I instrumented):
>
> ***     AMQP_LOGIN sees:
>         -> state       = 0x64034010
>         -> vhost       = (null)
>         -> channel_max = 131072
>         -> frame_max   = 0
>         -> heartbeat   = 0
>         -> sasl_method = 1677934672
>
> Hmmmmmm - let's see:
>
> vhost .........: Not good. Should be "/ccag/pib".
> channel_max ...: Not good. Should be 0.
> frame_max .....: Not good. Should be 131072.
> sasl_method ...: Not good. Should be 0.
>
> What am I doing wrong here? By now I'm trying to figure this out for
> more than 10 hours and I am at a loss here.... Any help/ ideas really
> appreciated!
>
> TIA!!!
>   Frank
>
>
> _______________________________________________
> cffi-devel mailing list
> cffi-devel at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel





More information about the cffi-devel mailing list