瀏覽代碼

Fixed several implementation errors

mingodad 13 年之前
父節點
當前提交
ede89820c0
共有 1 個文件被更改,包括 37 次插入18 次删除
  1. 37 18
      ext/sq_axtls.c

+ 37 - 18
ext/sq_axtls.c

@@ -4,12 +4,15 @@ extern "C" {
 
 #include "squirrel.h"
 #include <string.h>
+#include <stdio.h>
 #include <stdlib.h>  /* for malloc */
 #include <assert.h>  /* for a few sanity tests */
 
 #include "ssl.h"
 
-#define SQ_NETLIBNAME "axtlsl"
+static const SQChar SQ_LIBNAME[] = _SC("axtls");
+static const SQChar ssl_ctx_NAME[] = _SC("ssl_ctx");
+static const SQChar ssl_NAME[] = _SC("ssl");
 
 SQ_OPT_STRING_STRLEN();
 
@@ -55,13 +58,21 @@ static SQInteger ssl_constructor(HSQUIRRELVM v, SSL *ssl, int free_on_gc)
     if(!ssl)
         return sq_throwerror(v, _SC("Could'nt create an ssl object."));
 
-    SSL_ptr *self = (SSL_ptr*)sq_malloc(sizeof(SSL_ptr));
-    self->ptr = ssl;
-    self->free_ptr_on_gc = free_on_gc;
-
-    sq_setinstanceup(v, 1, self);
-    sq_setreleasehook(v,1, ssl_release_hook);
-	return 1;
+    sq_pushstring(v, SQ_LIBNAME, -1);
+    if(sq_getonroottable(v) == SQ_OK){
+        sq_pushstring(v, ssl_NAME, -1);
+        if(sq_get(v, -2) == SQ_OK){
+            if(sq_createinstance(v, -1) == SQ_OK){
+                SSL_ptr *self = (SSL_ptr*)sq_malloc(sizeof(SSL_ptr));
+                self->ptr = ssl;
+                self->free_ptr_on_gc = free_on_gc;
+                sq_setinstanceup(v, -1, self);
+                sq_setreleasehook(v,-1, ssl_release_hook);
+                return 1;
+            }
+        }
+    }
+	return SQ_ERROR;
 }
 
 static int sq_ssl_read(HSQUIRRELVM v){
@@ -158,7 +169,11 @@ static int sq_ssl_ctx_server_new(HSQUIRRELVM v){
     GET_ssl_ctx_INSTANCE();
     SQ_GET_INTEGER(v, 2, client_fd);
     SSL *ssl = ssl_server_new(self->ptr, client_fd);
-    return ssl_constructor(v, ssl, 1);
+    SQRESULT rc = ssl_constructor(v, ssl, 1);
+    if(rc == SQ_ERROR && ssl){
+        ssl_free(ssl);
+    }
+    return rc;
 }
 
 static int sq_ssl_ctx_client_new(HSQUIRRELVM v){
@@ -168,8 +183,12 @@ static int sq_ssl_ctx_client_new(HSQUIRRELVM v){
     SQ_OPT_STRING(v, 3, session_id, NULL);
     SQ_OPT_INTEGER(v, 4, size, -1);
 	SSL *ssl = ssl_client_new(self->ptr, client_fd, (const uint8_t *)session_id,
-                           size >= 0 ? size : session_id_size);
-    return ssl_constructor(v, ssl, 1);
+                           size >= 0 ? size : session_id_size);
+    SQRESULT rc = ssl_constructor(v, ssl, 1);
+    if(rc == SQ_ERROR && ssl){
+        ssl_free(ssl);
+    }
+    return rc;
 }
 
 static int sq_ssl_ctx_find(HSQUIRRELVM v){
@@ -287,15 +306,15 @@ static SQRegFunction ssl_ctx_obj_funcs[]={
 #define _DECL_SSL_FUNC(name,nparams,pmask) {_SC(#name),sq_ssl_##name,nparams,pmask}
 static SQRegFunction ssl_obj_funcs[]={
 	_DECL_SSL_FUNC(free,1,_SC("x")),
-	_DECL_SSL_FUNC(read,2,_SC("xi")),
-	_DECL_SSL_FUNC(write,2,_SC("xi")),
+	_DECL_SSL_FUNC(read,1,_SC("x")),
+	_DECL_SSL_FUNC(write,-2,_SC("xsi")),
 	_DECL_SSL_FUNC(get_session_id,1,_SC("x")),
 	_DECL_SSL_FUNC(get_session_id_size,1,_SC("x")),
 	_DECL_SSL_FUNC(get_cipher_id,1,_SC("x")),
 	_DECL_SSL_FUNC(handshake_status,1,_SC("x")),
 	_DECL_SSL_FUNC(verify_cert,1,_SC("x")),
-	_DECL_SSL_FUNC(get_cert_dn,1,_SC("x")),
-	_DECL_SSL_FUNC(get_cert_subject_alt_dnsname,1,_SC("x")),
+	_DECL_SSL_FUNC(get_cert_dn,2,_SC("xi")),
+	_DECL_SSL_FUNC(get_cert_subject_alt_dnsname,2,_SC("xi")),
 	_DECL_SSL_FUNC(renegotiate,1,_SC("x")),
 	{0,0}
 };
@@ -380,7 +399,7 @@ static KeyIntType axtls_constants[] = {
 /* This defines a function that opens up your library. */
 SQRESULT sqext_register_axtls (HSQUIRRELVM v) {
     //add a namespace axtls
-	sq_pushstring(v,_SC("axtls"),-1);
+	sq_pushstring(v, SQ_LIBNAME, -1);
 	sq_newtable(v);
 
 	sq_insert_reg_funcs(v, axtls_obj_funcs);
@@ -394,14 +413,14 @@ SQRESULT sqext_register_axtls (HSQUIRRELVM v) {
     }
 
     //now create the SSL Context class
-	sq_pushstring(v,_SC("ssl_ctx"),-1);
+	sq_pushstring(v,ssl_ctx_NAME,-1);
 	sq_newclass(v,SQFalse);
 	sq_settypetag(v,-1,(void*)SSL_CTX_Tag);
 	sq_insert_reg_funcs(v, ssl_ctx_obj_funcs);
 	sq_newslot(v,-3,SQFalse);
 
     //now create the SSL class
-	sq_pushstring(v,_SC("ssl"),-1);
+	sq_pushstring(v,ssl_NAME,-1);
 	sq_newclass(v,SQFalse);
 	sq_settypetag(v,-1,(void*)SSL_Tag);
 	sq_insert_reg_funcs(v, ssl_obj_funcs);