summaryrefslogtreecommitdiff
path: root/t
diff options
context:
space:
mode:
authorNagi5Yeq <wu@x-nagi.com>2020-06-03 02:36:05 +0800
committerNagi5Yeq <wu@x-nagi.com>2020-06-03 02:36:05 +0800
commit2d6ab4b7f207a746a7caaa93466b410cbe328626 (patch)
tree570a2d7776e616309149adf065acc474c0c0de98 /t
parentcd1466f30c146e12faa0db7e1b53b508bf2274c6 (diff)
support for short, int64 and AST dump
Diffstat (limited to 't')
-rw-r--r--t/extern.pas4
-rw-r--r--t/ssl.pas83
2 files changed, 85 insertions, 2 deletions
diff --git a/t/extern.pas b/t/extern.pas
index 92c0481..f5cf617 100644
--- a/t/extern.pas
+++ b/t/extern.pas
@@ -1,8 +1,8 @@
program hello_world;
extern Pascal_puts(s:string):integer;
-extern Pascal_printf(s:string, ...):integer;
-extern Pascal_scanf(s:string, ...):integer;
+extern Pascal_printf(s:string; ...):integer;
+extern Pascal_scanf(s:string; ...):integer;
function main():integer;
var
diff --git a/t/ssl.pas b/t/ssl.pas
new file mode 100644
index 0000000..22d4d79
--- /dev/null
+++ b/t/ssl.pas
@@ -0,0 +1,83 @@
+program ssl;
+
+type
+ hostent=record
+ h_name:^char;
+ h_aliases:^^char;
+ h_addrtype:integer;
+ h_length:integer;
+ h_addr_list:^^char
+ end;
+ sockaddr_in=record
+ sin_family:short;
+ sin_port:short;
+ sin_addr:array[0..3] of char;
+ sin_zero:array[0..7] of char
+ end;
+
+const
+ AF_INET=2;
+ SOCK_STREAM=1;
+ IPPROTO_TCP=6;
+
+extern memset(dst:^void; n:integer; size:int64):^void;
+extern memcpy(dst:^void; src:^void; size:int64):^void;
+extern sprintf(s:^char; fmt:^char; ...):integer;
+extern printf(fmt:^char; ...):int64;
+
+extern socket(domain:integer; socktype:integer; protocol:integer):integer;
+extern htons(port:short):short;
+extern gethostbyname(name:^char):^hostent;
+extern connect(s:integer; addr:^sockaddr_in; size:integer):integer;
+
+extern TLS_method():^void;
+extern SSL_CTX_new(meth:^void):^void;
+extern SSL_new(meth:^void):^void;
+extern SSL_set_fd(ssl:^void; fd:integer):integer;
+extern SSL_connect(ssl:^void):integer;
+extern SSL_write(ssl:^void; buf:^void; num:integer):integer;
+extern SSL_read(ssl:^void; buf:^void; num:integer):integer;
+extern SSL_shutdown(ssl:^void):integer;
+extern SSL_free(ssl:^void):void;
+extern SSL_CTX_free(ssl:^void):void;
+
+function main(argc:integer; argv:^^char):integer;
+var
+ s, len, size, thissize:integer;
+ ssl, ctx:^void;
+ host:^hostent;
+ addr:sockaddr_in;
+ buf:array[0..1023] of char;
+ p:^char;
+begin
+ s := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ memset(@addr, 0, 16);
+ addr.sin_family := AF_INET;
+ addr.sin_port := htons(443);
+ host := gethostbyname(argv[1]);
+ p := host^.h_addr_list[0];
+ memcpy(@addr.sin_addr, p, 4);
+ connect(s, @addr, 16);
+ ctx := SSL_CTX_new(TLS_method());
+ ssl := SSL_new(ctx);
+ SSL_set_fd(ssl, s);
+ SSL_connect(ssl);
+ len := sprintf(@buf, 'GET / HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n', argv[1]);
+ size := 0;
+ while len>0 do begin
+ thissize := SSL_write(ssl, @buf[size], len - size);
+ len := len - thissize;
+ size := size + thissize;
+ end;
+ while true do begin
+ size := SSL_read(ssl, @buf, 1023);
+ if size<=0 then break;
+ buf[size] := '\0';
+ printf('%s', @buf);
+ end;
+ SSL_shutdown(ssl);
+ SSL_free(ssl);
+ SSL_CTX_free(ctx);
+ main := 0;
+end;
+