From: Francis Cianfrocca Date: 2006-09-19T03:39:42+09:00 Subject: Re: C extension question ------=_Part_66501_5889052.1158604709438 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline On 9/18/06, snacktime wrote: > > In kerberos when doing an administration function I first need to > initialize the system with the credentials of an administrative user > like so, with handle being a void pointer initialized to NULL. The > following kerberos function will fill handle with a handle for the > connection which I can use in subsequent calls to other kadm5 > functions. > > kadm5_init_with_password(auser, apass, KADM5_ADMIN_SERVICE, NULL, > KADM5_STRUCT_VERSION, KADM5_API_VERSION_2, &handle); > > Now what I'd like is to return that handle to ruby and be able to pass > it back into my C extension when it's needed, such as when needing to > call the following kerberos function. > > kadm5_create_principal(handle, &princ, mask, pass); > > So how would I do this? If I understand void pointers correctly, > handle could be any type after the call to kadm5_init_with_password, > so it seems I would want to check it's type after it's set, then find > the right type/structure to convert it to or wrap it in before passing > it back to ruby? Not that I know how to do that:) > > Chris > > Void* is almost always the same size as the native integer. (There is legitimate controversy over this point but you can depend on it for all ends and intents.) So when the kerb function returns having filled in your void*, you can cast it to a native unsigned and then pass it back to Ruby as a VALUE returned from INT2NUM. (I wouldn't use INT2FIX because you'll need all of the native resolution.) To pass the value back into C, convert it to an int with NUM2INT and cast to a void*. I would expect (but can't say for sure) that this will work on 64-bit platforms (where void* is eight bytes wide) as long as the Ruby conversion functions are defined on the native integer. ------=_Part_66501_5889052.1158604709438--