blob: 40653bc6b794dcbd602f17566b1dd2adf32d6a5c [file] [log] [blame]
/*
* openwsman-ruby.c
*
* helper functions to convert between ruby and openwsman values
*
* Author: Klaus Kaempf <kkaempf@suse.de>
*
*/
/*****************************************************************************
* Copyright (C) 2008 Novell Inc. All rights reserved.
* Copyright (C) 2008 SUSE Linux Products GmbH. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* - Neither the name of Novell Inc. nor of SUSE Linux Products GmbH nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL Novell Inc. OR SUSE Linux Products GmbH OR
* THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
/* convert char* to string VALUE */
static VALUE
makestring( const char *s )
{
if (s) return rb_str_new2( s );
return Qnil;
}
/* convert symbol or string VALUE to char* */
static const char *
as_string( VALUE v )
{
const char *s;
if ( SYMBOL_P( v ) ) {
ID id = SYM2ID( v );
s = rb_id2name( id );
}
else {
s = StringValuePtr( v );
}
return s;
}
/* convert openwsman hash_t* to hash VALUE (string pairs) */
static VALUE
hash2value( hash_t *hash )
{
VALUE v;
hnode_t *node;
hscan_t ptr;
if (!hash) return Qnil;
hash_scan_begin( &ptr, hash );
v = rb_hash_new();
while ((node = hash_scan_next( &ptr )) ) {
rb_hash_aset( v, makestring( hnode_getkey( node ) ), makestring( hnode_get( node ) ) );
}
return v;
}
/* add key,value VALUE pair to hash_t*
* (used as callback for value2hash)
*/
static int
add_i( VALUE key, VALUE value, hash_t *h )
{
if (key != Qundef) {
const char *k = as_string( key );
const char *v = as_string( value );
if (!hash_lookup( h, k ) ) {
if ( !hash_alloc_insert( h, k, v ) ) {
rb_raise( rb_eException, "hash_alloc_insert failed" );
}
}
}
return 0;
}
/* create hash (h == NULL) or add to hash (h != NULL) from hash VALUE */
static hash_t *
value2hash( hash_t *h, VALUE v )
{
if (NIL_P(v)) return NULL;
Check_Type( v, T_HASH );
if (!h) h = hash_create(HASHCOUNT_T_MAX, 0, 0);
rb_hash_foreach( v, add_i, (unsigned long)h );
return h;
}
/*
* callback function if client authentication fails
*
*/
static void
auth_request_callback( WsManClient *client, wsman_auth_type_t t, char **username, char **password )
{
/*
* Uhm, swig 1.3.40 (or earlier) renamed its internal class variables from
* cFoo to SwigClassFoo
* 1.3.36 certainly used cFoo
*
*/
#if SWIG_VERSION < 0x010340
#define TRANSPORT_CLASS cTransport
#else
#define TRANSPORT_CLASS SwigClassTransport
#endif
extern swig_class TRANSPORT_CLASS;
VALUE c = SWIG_NewPointerObj((void*) client, SWIGTYPE_p__WsManClient, 0);
/* ruby callback */
VALUE result = rb_funcall( TRANSPORT_CLASS.klass, rb_intern( "auth_request_callback" ), 2, c, INT2NUM( t ) );
if (CLASS_OF( result ) == rb_cArray) {
if (RARRAY(result)->len == 2 ) {
VALUE first = rb_ary_entry( result, 0 );
VALUE second = rb_ary_entry( result, 1 );
if ((TYPE( first ) == T_STRING)
&& (TYPE( second ) == T_STRING) )
{
*username = strdup(StringValuePtr( first ));
*password= strdup(StringValuePtr( second ));
return;
}
}
}
*username = NULL; /* abort authentication */
return;
}