[cffi-devel] Strange... Help!

Frank Goenninger frgo at me.com
Sun Jan 17 23:40:32 UTC 2010


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





More information about the cffi-devel mailing list