diff --git a/mgetsockname.c b/mgetsockname.c new file mode 100644 index 0000000..2982334 --- /dev/null +++ b/mgetsockname.c @@ -0,0 +1,57 @@ +#include "marignotti.h" +#include +#include +#include + +#include + +#pragma noroot +#pragma optimize 79 + +int mgetsockname(Entry *e, void *p1, void *p2, void *p3, void *p4, void *p5) +{ + LongWord addr; + Word port; + int len; + + xsockaddr_in *sock_addr = (xsockaddr_in *)p3; + int *addrlen = (int *)p4; + + if (!addrlen) return EINVAL; + if (!sock_addr) return EINVAL; + + len = *addrlen; + + // bsd { has char sin_len; char sin_family; ... } + // gno has { short sin_family; ... } + + + IncBusy(); + port = TCPIPGetSourcePort(e->ipid); + addr = TCPIPGetMyIPAddress(); + DecBusy(); + + memset(sock_addr, 0, len); + + // truncate missing data. + if (len >= 2) + sock_addr->sin_family = AF_INET; + + if (len >= 4) + { + asm { + lda sin_port = port; + } + + if (len >= 8) + { + sock_addr->sin_addr = addr; + } + + + return 0; +} \ No newline at end of file