Hi,

I'm trying to wrap two function calls from kerberos, krb5_init_context
and krb5_free_context. Here are the prototypes for both:

krb5_init_context(krb5_context * context) => krb5_error_code
krb5_free_context(krb5_context context) => void

krb5_context is a struct, but unfortunately I don't know what its
members are.

From the docs:

     The krb5_context structure is designed to hold all per thread
state. All
     global variables that are context specific are stored in this
structure,
     including default encryption types, credentials-cache (ticket
file), and
     default realms.

     The internals of the structure should never be accessed directly,
func-
     tions exist for extracting information.

All I know is that it's 8 bytes in size.

I tried something like this, but it didn't work:

require 'ffi'

module Krb5
  class Context
    extend FFI::Library

    class Error < StandardError; end

    ffi_lib 'krb5'

    attach_function :krb5_init_context, [:string], :uint
    attach_function :krb5_free_context, [:string], :void

    def initialize
      @ctx = FFI::MemoryPointer.new(:pointer, 8)
      ret = krb5_init_context(@ctx)

      if ret > 0
        raise Error, "krb5_init_context() failed"
      end

      if block_given?
        begin
          yield self
        ensure
          free
        end
      end
    end

    def free
      krb5_free_context(@ctx)
    end
  end
end

k = Krb5::Context.new
k.free

I can use a plain string buffer, but then it segfaults on the 'free'
call.

Any suggestions?

Thanks,

Dan