mplpc.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002
  1. /*
  2. Copyright (C) 1996-1997 Id Software, Inc.
  3. This program is free software; you can redistribute it and/or
  4. modify it under the terms of the GNU General Public License
  5. as published by the Free Software Foundation; either version 2
  6. of the License, or (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. See the GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  14. */
  15. #include <go32.h>
  16. #include "mpdosock.h"
  17. //#include "types.h"
  18. typedef unsigned char BYTE;
  19. typedef unsigned short WORD;
  20. typedef unsigned long DWORD;
  21. //#include "lpc.h"
  22. typedef struct {
  23. short version; // version of LPC requested
  24. short sizeOfArgs; // size of arguments
  25. short service; // service # requested
  26. char Data[1]; // data
  27. } LPCData;
  28. typedef struct {
  29. short version; // LPC version
  30. short sizeOfReturn; // return data size
  31. short error; // any error codes
  32. short noRet; // number of returns
  33. char Data[1]; // data
  34. } LPCReturn;
  35. //#include "services.h"
  36. #define MAXSOCKETS 20
  37. // services
  38. #define LPC_SOCKBIND 4
  39. #define LPC_SOCKGETHOSTBYNAME 5
  40. #define LPC_SOCKGETHOSTNAME 6
  41. #define LPC_SOCKGETHOSTBYADDR 7
  42. #define LPC_SOCKCLOSE 8
  43. #define LPC_SOCKSOCKET 9
  44. #define LPC_SOCKRECVFROM 10
  45. #define LPC_SOCKSENDTO 11
  46. #define LPC_SOCKIOCTL 12
  47. #define LPC_SOCKGETSOCKNAME 13
  48. #define LPC_SOCKFLUSH 14
  49. #define LPC_SOCKSETOPT 15
  50. #define LPC_SOCKGETLASTERROR 16
  51. #define LPC_SOCKINETADDR 17
  52. // htons, ntohs, htonl, ntohl implemented locally
  53. // errors
  54. #define LPC_UNRECOGNIZED_SERVICE -1
  55. #define LPC_NOERROR 0
  56. // structures for support
  57. typedef struct {
  58. SOCKET s;
  59. int namelen;
  60. char name[1];
  61. } BindArgs;
  62. typedef struct {
  63. SOCKET s;
  64. long cmd;
  65. char data[1];
  66. } IoctlArgs;
  67. typedef struct {
  68. int retVal;
  69. int namelen;
  70. char name[1];
  71. } GetSockNameRet;
  72. typedef GetSockNameRet GetHostNameRet;
  73. typedef struct {
  74. int retVal;
  75. int h_addr_0; // that's the only important value
  76. } GetHostByNameRet;
  77. typedef struct {
  78. int len;
  79. int type;
  80. char addr[1];
  81. } GetHostByAddrArgs;
  82. typedef struct {
  83. int retVal;
  84. char h_name[1]; // h_name is the only important value
  85. } GetHostByAddrRet;
  86. typedef struct {
  87. SOCKET s;
  88. int flags;
  89. } RecvFromArgs;
  90. typedef struct {
  91. int retVal;
  92. int errCode;
  93. int len; // message len
  94. struct sockaddr sockaddr;
  95. int sockaddrlen;
  96. char Data[1];
  97. } RecvFromRet;
  98. typedef struct {
  99. SOCKET s;
  100. int flags;
  101. int len;
  102. struct sockaddr sockaddr;
  103. int sockaddrlen;
  104. char Data[1];
  105. } SendToArgs;
  106. typedef struct {
  107. int retVal;
  108. int errCode;
  109. } SendToRet;
  110. typedef struct {
  111. int bufflen;
  112. SOCKET s;
  113. int len;
  114. int sockaddrlen;
  115. struct sockaddr address;
  116. char data[1];
  117. } SocketChannelData;
  118. typedef struct {
  119. int af;
  120. int type;
  121. int protocol;
  122. } SocketArgs;
  123. typedef struct {
  124. SOCKET s;
  125. int len;
  126. int flags;
  127. int addrlen;
  128. struct sockaddr addr;
  129. char data[1];
  130. } WinSockData;
  131. typedef struct {
  132. SOCKET s;
  133. int level;
  134. int optname;
  135. int optlen;
  136. char optval[1];
  137. } SetSockOptArgs;
  138. typedef struct {
  139. SOCKET sock[MAXSOCKETS];
  140. } SocketMap;
  141. //#include "rtq.h"
  142. #define RTQ_NODE struct rtq_node
  143. RTQ_NODE
  144. {
  145. RTQ_NODE *self; // Ring zero address of this node
  146. RTQ_NODE *left; // Ring zero address of preceding node
  147. RTQ_NODE *right; // Ring zero address of succeding node
  148. BYTE * rtqDatum; // Ring 3 Datum of Buffer (start of preface)
  149. BYTE * rtqInsert; // Ring 3 insertion position
  150. WORD rtqLen; // Length of buffer, excluding preface
  151. WORD rtqUpCtr; // Up Counter of bytes used so far
  152. WORD rtqQCtr; // number of nodes attached
  153. WORD padding; // DWORD alignment
  154. };
  155. #define RTQ_PARAM_MOVENODE struct rtq_param_movenode
  156. RTQ_PARAM_MOVENODE
  157. {
  158. WORD rtqFromDQ;
  159. WORD rtqToDQ;
  160. };
  161. RTQ_NODE* rtq_fetch(RTQ_NODE*, RTQ_NODE*); // To, From
  162. //#include "mplib.h"
  163. // give up time slice
  164. void Yield(void);
  165. void MGenWakeupDll(void);
  166. // post a message to win32 side
  167. void PostWindowsMessage(void);
  168. // get # of items on qNo
  169. int MGenGetQueueCtr(int qNo);
  170. // move first node from qFrom to qTo
  171. RTQ_NODE *MGenMoveTo(int qFrom, int qTo);
  172. // get first node from q
  173. RTQ_NODE *MGenGetNode(int q);
  174. // get master node, returning size of RTQ_NODE for size verification
  175. RTQ_NODE *MGenGetMasterNode(unsigned *size);
  176. // move all nodes from qFrom to qTo
  177. RTQ_NODE *MGenFlushNodes(int qFrom, int qTo);
  178. // count number of nodes in queues designated by bitmask
  179. // lowerOrderBits == 0..31, upperOrderBits == 32-63
  180. int MGenMCount(unsigned lowerOrderBits, unsigned upperOrderBits);
  181. // perform consistency check on chunnel address space
  182. int MGenSanityCheck(void);
  183. #include <stdio.h>
  184. #include <sys/farptr.h>
  185. extern short flat_selector;
  186. #define SOCKET_MAP_QUEUE 41
  187. #define IDLE_QUEUE 44
  188. #define REC_QUEUE 45
  189. #define SEND_QUEUE 46
  190. // queue sizes
  191. #define FREEQBASE 58
  192. #define FREEQ64 58
  193. #define FREEQ128 59
  194. #define FREEQ256 60
  195. #define FREEQ512 61
  196. #define FREEQ1024 62
  197. #define FREEQ2048 63
  198. #define NFREEQ 6
  199. #define QLIMIT 10
  200. #define PRIVATEQ 50
  201. #define FARPKL(x) (_farnspeekl((unsigned long) x))
  202. #define FARPKB(x) (_farnspeekb((unsigned long) x))
  203. #define FARPKS(x) (_farnspeekw((unsigned long) x))
  204. #define FARPOKL(x, y) (_farnspokel((unsigned long) x, (unsigned long) y))
  205. #define FARPOKB(x, y) (_farnspokeb((unsigned long) x, (unsigned char) y))
  206. int Qsizes[] = { 64, 128, 256, 512, 1024, 2048 };
  207. int SocketError = 0;
  208. SocketMap *SockMap;
  209. #define HOSTENT_ALIAS_LIMIT 5
  210. #define HOSTENT_STRLEN_LIMIT 50
  211. #define HOSTENT_ADDR_LIST_LIMIT 5
  212. struct hostent HostEnt;
  213. char HostEnt_hname[HOSTENT_STRLEN_LIMIT];
  214. char *HostEnt_h_aliases[HOSTENT_ALIAS_LIMIT];
  215. char HostEnt_names[HOSTENT_ALIAS_LIMIT][HOSTENT_STRLEN_LIMIT];
  216. struct in_addr* HostEnt_addr_list[HOSTENT_ADDR_LIST_LIMIT];
  217. struct in_addr HostEnt_addrs[HOSTENT_ADDR_LIST_LIMIT];
  218. void
  219. fmemcpyto(void *to, const void *from, int length)
  220. {
  221. movedata(_my_ds(), (unsigned)from, flat_selector, (unsigned)to, length);
  222. }
  223. void
  224. fmemcpyfrom(void *to, const void *from, int length)
  225. {
  226. movedata(flat_selector, (unsigned)from, _my_ds(), (unsigned)to, length);
  227. }
  228. void
  229. fstrcpyto(char *to, const char *from)
  230. {
  231. while (*from) {
  232. FARPOKB(to, *from);
  233. to++; from++;
  234. }
  235. FARPOKB(to, 0);
  236. }
  237. void
  238. fstrncpyto(char *to, const char *from, int len)
  239. {
  240. while (*from && len) {
  241. FARPOKB(to, *from);
  242. to++; from++; len--;
  243. }
  244. FARPOKB(to, 0);
  245. }
  246. void
  247. fstrcpyfrom(char *to, const char *from)
  248. {
  249. while (FARPKB(from)) {
  250. *to = FARPKB(from);
  251. from++; to++;
  252. }
  253. *to = 0;
  254. }
  255. void
  256. fstrncpyfrom(char *to, const char *from, int len)
  257. {
  258. while (FARPKB(from) && len) {
  259. *to = FARPKB(from);
  260. from++; to++; len--;
  261. }
  262. *to = 0;
  263. }
  264. void
  265. GetSocketMap(void)
  266. {
  267. RTQ_NODE *n = MGenGetNode(SOCKET_MAP_QUEUE);
  268. SockMap = (SocketMap *) FARPKL(&n->rtqDatum);
  269. }
  270. void *
  271. GetFreeBufferToQueue(int q, int bufSize)
  272. {
  273. int i;
  274. for (i = 0; i < NFREEQ; i++) {
  275. if (Qsizes[i] >= bufSize && MGenGetQueueCtr(i+FREEQBASE)) {
  276. RTQ_NODE *n = MGenMoveTo(i+FREEQBASE, q);
  277. if (!n)
  278. continue;
  279. FARPOKL(&n->rtqUpCtr, bufSize);
  280. return (void *) FARPKL(&n->rtqDatum);
  281. }
  282. }
  283. return 0;
  284. }
  285. void
  286. FreeBufferFromQueue(int q)
  287. {
  288. int i;
  289. RTQ_NODE *n = MGenGetNode(q);
  290. for (i = 0; i < NFREEQ; i++) {
  291. if (Qsizes[i] == FARPKS(&n->rtqLen)) {
  292. MGenMoveTo(q, i+FREEQBASE);
  293. return;
  294. }
  295. }
  296. }
  297. void
  298. SetLPCData(LPCData *lpc)
  299. {
  300. FARPOKL(&(lpc->version), 1);
  301. FARPOKL(&(lpc->sizeOfArgs), 0);
  302. FARPOKL(&(lpc->service), 0);
  303. }
  304. int
  305. bind(SOCKET s, const struct sockaddr *name, int namelen)
  306. {
  307. RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
  308. LPCData *p;
  309. LPCReturn *r;
  310. BindArgs *bargs;
  311. int retVal;
  312. _farsetsel(flat_selector);
  313. SocketError = 0;
  314. p = (LPCData *) FARPKL(&n->rtqDatum);
  315. SetLPCData(p);
  316. FARPOKL(&p->service, LPC_SOCKBIND);
  317. bargs = (BindArgs *) p->Data;
  318. FARPOKL(&bargs->s, s);
  319. FARPOKL(&bargs->namelen, namelen);
  320. fmemcpyto(bargs->name, name, namelen);
  321. MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
  322. PostWindowsMessage();
  323. while ((n = MGenGetNode(REC_QUEUE)) == 0)
  324. Yield();
  325. r = (LPCReturn *) FARPKL(&n->rtqDatum);
  326. if (FARPKS(&r->error) != LPC_NOERROR) {
  327. return -1;
  328. }
  329. retVal = FARPKL(r->Data);
  330. // get ready for next call
  331. MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
  332. return retVal;
  333. }
  334. int
  335. closesocket(SOCKET s)
  336. {
  337. RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
  338. LPCData *p;
  339. LPCReturn *r;
  340. int retVal;
  341. _farsetsel(flat_selector);
  342. SocketError = 0;
  343. p = (LPCData *) FARPKL(&n->rtqDatum);
  344. SetLPCData(p);
  345. FARPOKL(&p->service, LPC_SOCKCLOSE);
  346. FARPOKL(p->Data, s);
  347. MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
  348. PostWindowsMessage();
  349. while ((n = MGenGetNode(REC_QUEUE)) == 0)
  350. Yield();
  351. r = (LPCReturn *) FARPKL(&n->rtqDatum);
  352. if (FARPKS(&r->error) != LPC_NOERROR) {
  353. return -1;
  354. }
  355. retVal = FARPKL(r->Data);
  356. // get ready for next call
  357. MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
  358. return retVal;
  359. }
  360. void
  361. ZapHostEnt()
  362. {
  363. // do nothing
  364. }
  365. void
  366. ReconstructHostEnt(struct hostent *s, void *flattened)
  367. {
  368. struct hostent *old = (struct hostent *) flattened;
  369. int i;
  370. char **ptr;
  371. s->h_name = HostEnt_hname;
  372. fstrncpyfrom(s->h_name, (char *) FARPKL(&old->h_name), HOSTENT_STRLEN_LIMIT-1);
  373. s->h_name[HOSTENT_STRLEN_LIMIT-1] = 0;
  374. s->h_aliases = HostEnt_h_aliases;
  375. ptr = (char **) FARPKL(&old->h_aliases);
  376. for (i = 0; i < (HOSTENT_ALIAS_LIMIT-1) && FARPKL(ptr); i++, ptr++) {
  377. s->h_aliases[i] = HostEnt_names[i];
  378. // fstrncpyfrom(s->h_aliases[i], (void *) FARPKL(ptr), HOSTENT_STRLEN_LIMIT-1);
  379. s->h_aliases[i][HOSTENT_STRLEN_LIMIT-1] = 0;
  380. }
  381. s->h_aliases[i] = 0;
  382. s->h_addrtype = FARPKS(&old->h_addrtype);
  383. s->h_length = FARPKS(&old->h_length);
  384. if (FARPKS(&old->h_length) != sizeof(struct in_addr)) {
  385. printf("Error!\n");
  386. exit(0);
  387. }
  388. s->h_addr_list = (char **) HostEnt_addr_list;
  389. ptr = (char **) FARPKL(&old->h_addr_list);
  390. for (i = 0; i < (HOSTENT_ADDR_LIST_LIMIT - 1) && FARPKL(ptr); i++, ptr++) {
  391. s->h_addr_list[i] = (char *) &(HostEnt_addrs[i]);
  392. fmemcpyfrom(s->h_addr_list[i], (void *) FARPKL(ptr), s->h_length);
  393. }
  394. s->h_addr_list[i] = 0;
  395. }
  396. int
  397. getsockname(SOCKET s, struct sockaddr *name, int *namelen)
  398. {
  399. RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
  400. LPCData *p;
  401. LPCReturn *r;
  402. GetSockNameRet *ret;
  403. int retVal;
  404. SocketError = 0;
  405. _farsetsel(flat_selector);
  406. p = (LPCData *) FARPKL(&n->rtqDatum);
  407. SetLPCData(p);
  408. FARPOKL(&p->service, LPC_SOCKGETSOCKNAME);
  409. FARPOKL(p->Data, s);
  410. MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
  411. PostWindowsMessage();
  412. while ((n = MGenGetNode(REC_QUEUE)) == 0)
  413. Yield();
  414. r = (LPCReturn *) FARPKL(&n->rtqDatum);
  415. if (FARPKS(&r->error) != LPC_NOERROR) {
  416. return -1;
  417. }
  418. ret = (GetSockNameRet *) r->Data;
  419. retVal = FARPKL(&ret->retVal);
  420. fmemcpyfrom(name, ret->name, FARPKL(&ret->namelen));
  421. *namelen = FARPKL(&ret->namelen);
  422. // get ready for next call
  423. MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
  424. return retVal;
  425. }
  426. int
  427. gethostname(char *name, int namelen)
  428. {
  429. RTQ_NODE *n;
  430. LPCData *p;
  431. LPCReturn *r;
  432. GetHostNameRet *ret;
  433. int retVal;
  434. char *s;
  435. _farsetsel(flat_selector);
  436. SocketError = 0;
  437. n = (RTQ_NODE *) MGenGetNode(IDLE_QUEUE);
  438. p = (LPCData *) FARPKL(&n->rtqDatum);
  439. SetLPCData(p);
  440. FARPOKL(&p->service,LPC_SOCKGETHOSTNAME);
  441. MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
  442. PostWindowsMessage();
  443. while ((n = (RTQ_NODE *) (MGenGetNode(REC_QUEUE))) == 0)
  444. Yield();
  445. r = (LPCReturn *) FARPKL(&n->rtqDatum);
  446. if (FARPKS(&r->error) != LPC_NOERROR) {
  447. return -1;
  448. }
  449. ret = (GetHostNameRet *) r->Data;
  450. retVal = FARPKL(&ret->retVal);
  451. s = ret->name;
  452. fstrncpyfrom(name, s, namelen);
  453. #if 0
  454. len = strlen(ret->name);
  455. if (len > namelen)
  456. memcpy(name, ret->name, ret->namelen);
  457. else
  458. strcpy(name, ret->name);
  459. #endif
  460. // get ready for next call
  461. MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
  462. return retVal;
  463. }
  464. struct hostent *
  465. gethostbyname(const char *name)
  466. {
  467. RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
  468. LPCData *p;
  469. LPCReturn *r;
  470. struct hostent *retVal;
  471. _farsetsel(flat_selector);
  472. SocketError = 0;
  473. p = (LPCData *) FARPKL(&n->rtqDatum);
  474. SetLPCData(p);
  475. FARPOKL(&p->service, LPC_SOCKGETHOSTBYNAME);
  476. fstrcpyto(p->Data, name);
  477. MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
  478. PostWindowsMessage();
  479. while ((n = MGenGetNode(REC_QUEUE)) == 0)
  480. Yield();
  481. r = (LPCReturn *) FARPKL(&n->rtqDatum);
  482. retVal = (struct hostent *) r->Data;
  483. if (FARPKL(&retVal->h_name) == 0) {
  484. retVal = 0;
  485. } else {
  486. ZapHostEnt();
  487. ReconstructHostEnt(&HostEnt, (void *) retVal);
  488. retVal = &HostEnt;
  489. }
  490. // get ready for next call
  491. MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
  492. return retVal;
  493. }
  494. struct hostent *
  495. gethostbyaddr(const char *addr, int len, int type)
  496. {
  497. RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
  498. LPCData *p;
  499. LPCReturn *r;
  500. GetHostByAddrArgs *args;
  501. struct hostent *retVal;
  502. SocketError = 0;
  503. _farsetsel(flat_selector);
  504. p = (LPCData *) FARPKL(&n->rtqDatum);
  505. SetLPCData(p);
  506. FARPOKL(&p->service, LPC_SOCKGETHOSTBYADDR);
  507. args = (GetHostByAddrArgs *) p->Data;
  508. FARPOKL(&args->len, len);
  509. FARPOKL(&args->type, type);
  510. fmemcpyto(args->addr, addr, len);
  511. MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
  512. PostWindowsMessage();
  513. while ((n = MGenGetNode(REC_QUEUE)) == 0)
  514. Yield();
  515. r = (LPCReturn *) FARPKL(&n->rtqDatum);
  516. retVal = (struct hostent *) r->Data;
  517. if (FARPKL(&retVal->h_name) == 0) {
  518. retVal = 0;
  519. } else {
  520. ZapHostEnt();
  521. ReconstructHostEnt(&HostEnt, (void *) retVal);
  522. retVal = &HostEnt;
  523. }
  524. // get ready for next call
  525. MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
  526. return retVal;
  527. }
  528. SOCKET
  529. socket(int af, int type, int protocol)
  530. {
  531. RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
  532. LPCData *p;
  533. LPCReturn *r;
  534. SocketArgs *args;
  535. int retVal;
  536. _farsetsel(flat_selector);
  537. SocketError = 0;
  538. p = (LPCData *) FARPKL(&n->rtqDatum);
  539. SetLPCData(p);
  540. FARPOKL(&p->service, LPC_SOCKSOCKET);
  541. args = (SocketArgs *) p->Data;
  542. FARPOKL(&args->af, af);
  543. FARPOKL(&args->type, type);
  544. FARPOKL(&args->protocol, protocol);
  545. MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
  546. PostWindowsMessage();
  547. while ((n = MGenGetNode(REC_QUEUE)) == 0)
  548. Yield();
  549. r = (LPCReturn *) FARPKL(&n->rtqDatum);
  550. if (FARPKS(&r->error) != LPC_NOERROR) {
  551. return -1;
  552. }
  553. retVal = FARPKL(r->Data);
  554. // get ready for next call
  555. MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
  556. return retVal;
  557. }
  558. void
  559. sockets_flush(void)
  560. {
  561. RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
  562. LPCData *p;
  563. SocketError = 0;
  564. p = (LPCData *) FARPKL(&n->rtqDatum);
  565. SetLPCData(p);
  566. FARPOKL(&p->service, LPC_SOCKFLUSH);
  567. MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
  568. PostWindowsMessage();
  569. while ((n = MGenGetNode(REC_QUEUE)) == 0)
  570. Yield();
  571. MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
  572. }
  573. int
  574. recvfrom(SOCKET s, char *buf, int len, int flags, struct sockaddr *from,
  575. int *fromlen)
  576. {
  577. int i;
  578. RTQ_NODE *n;
  579. WinSockData *data;
  580. int bytesRead;
  581. SocketError = 0;
  582. _farsetsel(flat_selector);
  583. if (!SockMap)
  584. GetSocketMap();
  585. for (i = 0; i < MAXSOCKETS; i++) {
  586. if (FARPKL(&(SockMap->sock[i])) == s)
  587. break;
  588. }
  589. if (i == MAXSOCKETS)
  590. return SOCKET_ERROR;
  591. // pick up node
  592. n = MGenGetNode(i);
  593. if (n == 0) {
  594. SocketError = WSAEWOULDBLOCK;
  595. return -1;
  596. }
  597. data = (WinSockData *) FARPKL(&n->rtqDatum);
  598. bytesRead = FARPKL(&data->len);
  599. if (from) {
  600. fmemcpyfrom(from, &data->addr, sizeof(struct sockaddr));
  601. }
  602. if (fromlen) {
  603. *fromlen = FARPKL(&data->addrlen);
  604. }
  605. fmemcpyfrom(buf, data->data, len > bytesRead ? bytesRead : len);
  606. if ((flags & MSG_PEEK) == 0) {
  607. FreeBufferFromQueue(i);
  608. }
  609. return bytesRead;
  610. }
  611. int
  612. sendto(SOCKET s, const char *buf, int len, int flags, const struct sockaddr *to, int tolen)
  613. {
  614. int i;
  615. int outQ;
  616. WinSockData *data;
  617. SocketError = 0;
  618. _farsetsel(flat_selector);
  619. if (!SockMap)
  620. GetSocketMap();
  621. for (i = 0; i < MAXSOCKETS; i++) {
  622. if (FARPKL(&SockMap->sock[i]) == s) {
  623. break;
  624. }
  625. }
  626. if (i == MAXSOCKETS) {
  627. SocketError = WSAENOTSOCK;
  628. return SOCKET_ERROR;
  629. }
  630. outQ = i + MAXSOCKETS;
  631. if (MGenGetQueueCtr(outQ) >= QLIMIT) {
  632. SocketError = WSAEWOULDBLOCK;
  633. return SOCKET_ERROR;
  634. }
  635. data = GetFreeBufferToQueue(PRIVATEQ, len + sizeof(WinSockData));
  636. if (!data) {
  637. SocketError = WSAEWOULDBLOCK;
  638. return SOCKET_ERROR;
  639. }
  640. FARPOKL(&data->s, s);
  641. FARPOKL(&data->len, len);
  642. if (to) {
  643. fmemcpyto(&data->addr, to, tolen);
  644. FARPOKL(&data->addrlen, tolen);
  645. } else {
  646. FARPOKL(&data->addrlen, 0);
  647. }
  648. FARPOKL(&data->flags, flags);
  649. fmemcpyto(data->data, buf, len);
  650. MGenMoveTo(PRIVATEQ, outQ);
  651. return len;
  652. }
  653. int
  654. ioctlsocket(SOCKET s, long cmd, unsigned long *argp)
  655. {
  656. RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
  657. LPCData *p;
  658. LPCReturn *r;
  659. IoctlArgs *args;
  660. int retVal;
  661. SocketError = 0;
  662. _farsetsel(flat_selector);
  663. p = (LPCData *) FARPKL(&n->rtqDatum);
  664. SetLPCData(p);
  665. FARPOKL(&p->service, LPC_SOCKIOCTL);
  666. args = (IoctlArgs *) p->Data;
  667. FARPOKL(&args->s, s);
  668. FARPOKL(&args->cmd, cmd);
  669. switch(cmd) {
  670. case FIONBIO:
  671. FARPOKL(args->data, *argp);
  672. break;
  673. default:
  674. return SOCKET_ERROR;
  675. }
  676. MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
  677. PostWindowsMessage();
  678. while ((n = MGenGetNode(REC_QUEUE)) == 0)
  679. Yield();
  680. r = (LPCReturn *) FARPKL(&n->rtqDatum);
  681. retVal = FARPKL(r->Data);
  682. // get ready for next call
  683. MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
  684. return retVal;
  685. }
  686. int
  687. setsockopt(SOCKET s, int level, int optname, const char *optval, int optlen)
  688. {
  689. RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
  690. LPCData *p;
  691. LPCReturn *r;
  692. SetSockOptArgs *args;
  693. int retVal;
  694. SocketError = 0;
  695. _farsetsel(flat_selector);
  696. p = (LPCData *) FARPKL(&n->rtqDatum);
  697. SetLPCData(p);
  698. FARPOKL(&p->service, LPC_SOCKSETOPT);
  699. args = (SetSockOptArgs *) p->Data;
  700. FARPOKL(&args->s, s);
  701. FARPOKL(&args->level, level);
  702. FARPOKL(&args->optname, optname);
  703. FARPOKL(&args->optlen, optlen);
  704. fmemcpyto(args->optval, optval, optlen);
  705. MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
  706. PostWindowsMessage();
  707. while ((n = MGenGetNode(REC_QUEUE)) == 0)
  708. Yield();
  709. r = (LPCReturn *) FARPKL(&n->rtqDatum);
  710. retVal = FARPKL(r->Data);
  711. // get ready for next call
  712. MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
  713. return retVal;
  714. }
  715. int
  716. WSAGetLastError(void)
  717. {
  718. RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
  719. LPCData *p;
  720. LPCReturn *r;
  721. int retVal;
  722. _farsetsel(flat_selector);
  723. if (SocketError) {
  724. int err = SocketError;
  725. SocketError = 0;
  726. return err;
  727. }
  728. p = (LPCData *) FARPKL(&n->rtqDatum);
  729. SetLPCData(p);
  730. FARPOKL(&p->service, LPC_SOCKGETLASTERROR);
  731. MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
  732. PostWindowsMessage();
  733. while ((n = MGenGetNode(REC_QUEUE)) == 0)
  734. Yield();
  735. r = (LPCReturn *) FARPKL(&n->rtqDatum);
  736. retVal = FARPKL(r->Data);
  737. // get ready for next call
  738. MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
  739. return retVal;
  740. }
  741. unsigned long inet_addr(const char *cp)
  742. {
  743. int ret;
  744. unsigned int ha1, ha2, ha3, ha4;
  745. unsigned long ipaddr;
  746. ret = sscanf(cp, "%d.%d.%d.%d", &ha1, &ha2, &ha3, &ha4);
  747. if (ret != 4)
  748. return -1;
  749. ipaddr = (ha1 << 24) | (ha2 << 16) | (ha3 << 8) | ha4;
  750. return ipaddr;
  751. #if 0
  752. RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
  753. LPCData *p;
  754. LPCReturn *r;
  755. int retVal;
  756. SocketError = 0;
  757. _farsetsel(flat_selector);
  758. p = (LPCData *) FARPKL(&n->rtqDatum);
  759. SetLPCData(p);
  760. FARPOKL(&p->service, LPC_SOCKINETADDR);
  761. fstrcpyto(p->Data, cp);
  762. MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
  763. PostWindowsMessage();
  764. while ((n = MGenGetNode(REC_QUEUE)) == 0)
  765. Yield();
  766. r = (LPCReturn *) FARPKL(&n->rtqDatum);
  767. if (FARPKS(&r->error) != LPC_NOERROR) {
  768. return -1;
  769. }
  770. retVal = FARPKL(r->Data);
  771. // get ready for next call
  772. MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
  773. return retVal;
  774. #endif
  775. }
  776. char *inet_ntoa (struct in_addr in)
  777. {
  778. static char buf [32];
  779. sprintf(buf, "%u.%u.%u.%u", in.S_un.S_un_b.s_b1, in.S_un.S_un_b.s_b2, in.S_un.S_un_b.s_b3, in.S_un.S_un_b.s_b4);
  780. return buf;
  781. }