lm_ssl.c
changeset 42 61d0ab29f17f
parent 38 34a2b880615c
child 54 6bef2082e5f9
--- 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               },