# Ruby/DL binding to CASA: Segmentation fault

**URL:** <https://www.ruby-forum.com/t/ruby-dl-binding-to-casa-segmentation-fault/77934>\
**Category:** Ruby\
**Created:** [December 1, 2006, 6:17pm UTC](https://www.ruby-forum.com/t/ruby-dl-binding-to-casa-segmentation-fault/77934 "2006-12-01T18:17:00Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Nate\_Younger](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/58956e/32.png) [@Nate\_Younger](https://www.ruby-forum.com/u/Nate_Younger)\
**Post date:** [December 1, 2006, 6:17pm UTC](https://www.ruby-forum.com/t/ruby-dl-binding-to-casa-segmentation-fault/77934/1 "2006-12-01T18:17:00Z")

</div>

Hello,

I am trying to create a binding for  
CASA([http://developer.novell.com/wiki/index.php/Casa](http://developer.novell.com/wiki/index.php/Casa)) using Ruby/DL.  
And I am running into the following problem:

casa.rb:85: [BUG] Segmentation fault  
ruby 1.8.4 (2005-12-24) [x86\_64-linux]

I’m almost sure its something that I missed. I’m just hoping that some  
one smarter than me can help me find it. Thanks in advance!

-Nate

casa.rb:

NSSCS\_MAX\_USERID\_LEN = 256  
NSSCS\_MAX\_PWORD\_LEN = 128  
NSSCS\_MAX\_SECRET\_ID\_LEN = 512

SSCS\_CRED\_TYPE\_BASIC\_F = 0x0000001  
SSCS\_CRED\_TYPE\_BINARY\_F = 0x0000002  
SSCS\_CRED\_TYPE\_SERVER\_F = 0x0000004

USERNAME\_TYPE\_CN\_F = 0x0000000  
USERNAME\_TYPE\_NDS\_DN\_F = 0x0000001  
USERNAME\_TYPE\_NDS\_FDN\_F = 0x0000002  
USERNAME\_TYPE\_LDAP\_DN\_F = 0x0000004  
USERNAME\_TYPE\_EMAIL\_F = 0x0000008  
USERNAME\_TYPE\_OTHER\_F = 0x0000010

module CASA  
require ‘dl’  
require ‘dl/import’  
require ‘dl/struct’  
require ‘dl/types’

extend DL::Importable

# Type alias

typealias(“uint32\_t”, “unsigned int”)  
typealias(“int32\_t”, “int”)  
typealias(“SS\_UTF8\_T”, “unsigned char”)

# Struct Type Alias

typealias(“SSCS\_BASIC\_CREDENTIAL”, “struct”)  
typealias(“SSCS\_SECRET\_ID\_T”, “struct”)

SSCS\_SECRET\_ID = struct([  
“uint32\_t len”,  
“SS\_UTF8\_T id[#{NSSCS\_MAX\_SECRET\_ID\_LEN}]”  
])

SSCS\_BASIC\_CREDENTIAL = struct [  
“uint32\_t unFlags”,  
“uint32\_t unLen”,  
“SS\_UTF8\_T username[#{NSSCS\_MAX\_USERID\_LEN}]”,  
“uint32\_t pwordLen”,  
“SS\_UTF8\_T password[#{NSSCS\_MAX\_PWORD\_LEN}]”  
]

LIB = DL.dlopen(‘/usr/lib64/libmicasa.so’)  
SYM = {  
:miCASAGetCredential =\> LIB[‘miCASAGetCredential’,‘IIPPIPP’],  
:miCASASetCredential =\> LIB[‘miCASASetCredential’,‘IIPPIPP’],  
:miCASARemoveCredential =\> LIB[‘miCASAGetCredential’,‘IIPPP’]  
}

def CASA::get\_sscs\_secret\_id\_t(id)  
id\_bytes = []  
id.each\_byte { |b| id\_bytes \<\< b }

```
 sscs_secret_id_t = SSCS_SECRET_ID.malloc()
 sscs_secret_id_t.len = id_bytes.length
 sscs_secret_id_t.id = id_bytes

 return sscs_secret_id_t

```

end

def CASA::get\_sscs\_basic\_credential( flags, username, password )  
username\_bytes = []  
username.each\_byte { |b| username\_bytes \<\< b }  
password\_bytes = []  
password.each\_byte { |b| password\_bytes \<\< b }

```
sscs_basic_credential = SSCS_BASIC_CREDENTIAL.malloc()
sscs_basic_credential.unFlags = flags
sscs_basic_credential.unLen = username_bytes.length
sscs_basic_credential.username = username_bytes
sscs_basic_credential.pwordLen = password_bytes.length
sscs_basic_credential.password = password_bytes

return sscs_basic_credential

```

end

def CASA::get\_credential( username, password, secret\_id, shared\_id =  
nil )  
sec\_id = CASA::get\_sscs\_secret\_id\_t(secret\_id)  
basic\_cred = CASA::get\_sscs\_basic\_credential( USERNAME\_TYPE\_CN\_F,  
username, password )

```
i, ir = SYM[:miCASAGetCredential].call( 0, sec_id, nil, 

```

SSCS\_CRED\_TYPE\_BASIC\_F, basic\_cred, nil )  
puts i  
end  
end
