# HG changeset patch # User Myhailo Danylenko # Date 1310942845 -10800 # Node ID 61d0ab29f17f541aa775a7b43dd247a71861b662 # Parent 3f6a76c8fbc8600bf105b0098ad684f87be86b03 Add ssl:tls method * tls method * fix ssl callback diff -r 3f6a76c8fbc8 -r 61d0ab29f17f lm.lua --- a/lm.lua Fri Jul 15 19:50:50 2011 +0300 +++ b/lm.lua Mon Jul 18 01:47:25 2011 +0300 @@ -53,6 +53,8 @@ if st == "table" then fp = a.fingerprint cb = a.callback + ut = a.tls + rt = a.require_tls elseif st == "function" then cb = a elseif st == "string" then @@ -60,19 +62,24 @@ elseif st ~= "nil" then error "unexpected type of argument" end + local ssl if fp then if cb then - return lm.ssl.new ( fp, cb ) + ssl = lm.ssl.new ( fp, cb ) else - return lm.ssl.new ( fp ) + ssl = lm.ssl.new ( fp ) end else if cb then - return lm.ssl.new ( cb ) + ssl = lm.ssl.new ( cb ) else - return lm.ssl.new () + ssl = lm.ssl.new () end end + if ut ~= nil then + ssl:tls ( ut, rt ) + end + return ssl end -- basically, it just provides a way diff -r 3f6a76c8fbc8 -r 61d0ab29f17f lm_ssl.c --- a/lm_ssl.c Fri Jul 15 19:50:50 2011 +0300 +++ b/lm_ssl.c Mon Jul 18 01:47:25 2011 +0300 @@ -46,9 +46,7 @@ /// ssl callback function /// User function, called when ssl error happens. -/// XXX: add lm connection object to args? it is not in API, but can be useful, -/// though, with upvalues it is not required. -/// A: lm ssl object, ssl status +/// A: userdata (lm ssl object), argument enum field (ssl status) /// R: boolean (false if connection process should be terminated) LmSSLResponse callback_lm_ssl (LmSSL *ssl, LmSSLStatus status, llm_callback_t *cb) { @@ -57,7 +55,7 @@ bless_lm_ssl (cb->L, ssl); // XXX lm_ssl_unref (ssl); luaL_pushenum (cb->L, status, status_lm_ssl); - if (lua_pcall (cb->L, 2, 0, 0)) { + if (lua_pcall (cb->L, 2, 1, 0)) { W ("SSL callback error: %s", lua_tostring (cb->L, -1)); lua_pop (cb->L, 1); return LM_SSL_RESPONSE_CONTINUE; @@ -86,7 +84,7 @@ /// both, or neither. Though, fingerprint should go before callback function. /// SSL fingerprint is a string like '01:23:45:67:89:AB:CD:EF:FE:DC:BA:98:76:54:32:10'. /// A: string (optional ssl fingerprint), ssl callback function (optional) -/// R: lm ssl object +/// R: userdata (lm ssl object) static int new_lm_ssl (lua_State *L) { int args = lua_gettop (L); @@ -128,7 +126,7 @@ /// lm.ssl.bless /// Blesses given pointer to lm ssl object. /// A: lightuserdata (C lm ssl object) -/// R: lm ssl object +/// R: userdata (lm ssl object) static int bless_lua_lm_ssl (lua_State *L) { luaL_argcheck (L, lua_islightuserdata (L, 1), 1, "lm ssl lightuserdata expected"); @@ -168,6 +166,26 @@ return 1; } +/// ssl:tls +/// Sets or returns use of starttls by this ssl object. +/// A: boolean (use starttls), boolean (require starttls) +/// or +/// R: boolean (use starttls), boolean (require starttls) +static int tls_lm_ssl (lua_State *L) +{ + llm_ssl_t *object = luaL_checklm_ssl (L, 1); + if (lua_gettop (L) > 1) { + gboolean use = lua_toboolean (L, 2); + gboolean require = lua_toboolean (L, 3); + lm_ssl_use_starttls (object -> ssl, use, require); + return 0; + } else { + lua_pushboolean (L, lm_ssl_get_use_starttls (object -> ssl)); + lua_pushboolean (L, lm_ssl_get_require_starttls (object -> ssl)); + return 2; + } +} + /// ssl:pointer /// Returns pointer to underlying C structure. /// R: lightuserdata @@ -195,6 +213,7 @@ const static luaL_Reg reg_m_lm_ssl[] = { { "fingerprint", fingerprint_lm_ssl }, + { "tls", tls_lm_ssl }, { "pointer", pointer_lm_ssl }, { "__gc", gc_lm_ssl }, { NULL, NULL },