<div dir="ltr">Hi Denis,<div class="gmail_extra"><br><div class="gmail_quote">On Tue, Aug 8, 2017 at 2:11 AM, Denis Kudriashov <span dir="ltr"><<a href="mailto:dionisiydk@gmail.com" target="_blank">dionisiydk@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"> <br><div dir="ltr">Hi.<div><br></div><div>I play a bit of idea to make binding to libssh2 library.</div><div><br></div><div>And the main problem is function </div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div>int libssh2_session_handshake(<wbr>LIBSSH2_SESSION *session, libssh2_socket_t socket)<br></div></blockquote>where socket parameter is raw OS socket handle as I understand.<div><br></div><div>So question: is it possible to access this handle from image side from Socket instance?</div></div></blockquote><div><br></div><div>Yes, but non-trivially.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>There is socketHandle instance variable which is bytearray. What is it? </div></div></blockquote><div><br></div><div>It is an instance of this struct:</div><div><br></div><div><div>typedef struct</div><div>{</div><div> int sessionID;</div><div> int socketType; /* 0 = TCP, 1 = UDP */</div><div> void *privateSocketPtr;</div><div>} SQSocket, *SocketPtr;</div></div><div><br></div><div>The two most common definitions are:</div><div>linux/mac</div><div><div>typedef struct privateSocketStruct</div><div>{</div><div> int s; /* Unix socket */</div><div> int connSema; /* connection io notification semaphore */</div><div> int readSema; /* read io notification semaphore */</div><div> int writeSema; /* write io notification semaphore */</div><div> int sockState; /* connection + data state */</div><div> int sockError; /* errno after socket error */</div><div> union sockaddr_any peer; /* default send/recv address for UDP */</div><div> socklen_t peerSize; /* dynamic sizeof(peer) */</div><div> union sockaddr_any sender; /* sender address for last UDP receive */</div><div> socklen_t senderSize; /* dynamic sizeof(sender) */</div><div> int multiListen; /* whether to listen for multiple connections */</div><div> int acceptedSock; /* a connection that has been accepted */</div><div>} privateSocketStruct;</div></div><div><br></div><div>win32:</div><div><div>typedef struct privateSocketStruct {</div><div> struct privateSocketStruct *next;</div><div> SOCKET s;</div><div><br></div><div> int sockType;</div><div> int sockState;</div><div> int sockError;</div><div><br></div><div> int readSema;</div><div> int writeSema;</div><div> int connSema;</div><div><br></div><div> union sockaddr_any peer; /* socket address in connect() or send/rcv address for UDP */</div><div> socklen_t peerSize; /* dynamic sizeof(peer) */</div><div><br></div><div> HANDLE mutex; /* The mutex used for synchronized access to this socket */</div><div> acceptedSocketStruct *accepted; /* Accepted connections on a socket */</div><div><br></div><div><br></div><div> DWORD readWatcherOp; /* read operation to watch */</div><div> HANDLE hReadWatcherEvent; /* event for waking up read watcher */</div><div> HANDLE hReadThread;</div><div><br></div><div> DWORD writeWatcherOp; /* write operation to watch */</div><div> HANDLE hWriteWatcherEvent; /* event for waking up write watcher */</div><div> HANDLE hWriteThread;</div><div><br></div><div> volatile DWORD closePending; /* Cleanup counter */</div><div><br></div><div> int readSelect;</div><div> int writeSelect;</div><div>} privateSocketStruct;</div></div><div><br></div><div>So you *could* create an Alien on the 4 bytes at 9 in the handle on 32-bits, or the 8 bytes at 9 on 64-bits, and then decode the resulting pointer to a privateSocketStruct. On linux & mac os it is the 4 bytes at 1. On Win32 it's the 4 bytes at 5, and on Win64 it's the 4 bytes at 9.</div><div><br></div><div>But I would instead add a new primitive to the socket plugin, something like primitiveSocketGetNativeHandle, and use that :-)</div><div><br></div><div>To do this:</div><div>a) modify VMMaker.oscog's SocketPlugin to add the primitive</div><div>b) in platforms/Cross/plugins/SocketPlugin./SocketPlugin.h add something like</div><div> sqInt sqSocketNativeHandle(SocketPtr s, int type);</div><div>where type is, say, 0 for the normal file descriptor and other values for future use (one platform has both data and control sockets in its privateSocketStruct</div><div>c) implement sqSocketNativeHandle appropriately in platforms/unix/plugins/SocketPlugin/sqUnixSocket.c, platforms/win32/plugins/SocketPlugin/sqWin32NewNet.c et al. There are 5 in all; Mac OS Carbon, RiscOS & Plan9 are the other three.)</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Best regards,<br></div><div>Denis</div></div>
</blockquote></div><br><div class="gmail_signature"><div dir="ltr"><div><span style="font-size:small;border-collapse:separate"><div>_,,,^..^,,,_<br></div><div>best, Eliot</div></span></div></div></div>
</div></div>