<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>