123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002 |
- /*
- Copyright (C) 1996-1997 Id Software, Inc.
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
- #include <go32.h>
- #include "mpdosock.h"
- //#include "types.h"
- typedef unsigned char BYTE;
- typedef unsigned short WORD;
- typedef unsigned long DWORD;
- //#include "lpc.h"
- typedef struct {
- short version; // version of LPC requested
- short sizeOfArgs; // size of arguments
- short service; // service # requested
- char Data[1]; // data
- } LPCData;
- typedef struct {
- short version; // LPC version
- short sizeOfReturn; // return data size
- short error; // any error codes
- short noRet; // number of returns
- char Data[1]; // data
- } LPCReturn;
- //#include "services.h"
- #define MAXSOCKETS 20
- // services
- #define LPC_SOCKBIND 4
- #define LPC_SOCKGETHOSTBYNAME 5
- #define LPC_SOCKGETHOSTNAME 6
- #define LPC_SOCKGETHOSTBYADDR 7
- #define LPC_SOCKCLOSE 8
- #define LPC_SOCKSOCKET 9
- #define LPC_SOCKRECVFROM 10
- #define LPC_SOCKSENDTO 11
- #define LPC_SOCKIOCTL 12
- #define LPC_SOCKGETSOCKNAME 13
- #define LPC_SOCKFLUSH 14
- #define LPC_SOCKSETOPT 15
- #define LPC_SOCKGETLASTERROR 16
- #define LPC_SOCKINETADDR 17
- // htons, ntohs, htonl, ntohl implemented locally
- // errors
- #define LPC_UNRECOGNIZED_SERVICE -1
- #define LPC_NOERROR 0
- // structures for support
- typedef struct {
- SOCKET s;
- int namelen;
- char name[1];
- } BindArgs;
- typedef struct {
- SOCKET s;
- long cmd;
- char data[1];
- } IoctlArgs;
- typedef struct {
- int retVal;
- int namelen;
- char name[1];
- } GetSockNameRet;
- typedef GetSockNameRet GetHostNameRet;
- typedef struct {
- int retVal;
- int h_addr_0; // that's the only important value
- } GetHostByNameRet;
- typedef struct {
- int len;
- int type;
- char addr[1];
- } GetHostByAddrArgs;
- typedef struct {
- int retVal;
- char h_name[1]; // h_name is the only important value
- } GetHostByAddrRet;
- typedef struct {
- SOCKET s;
- int flags;
- } RecvFromArgs;
- typedef struct {
- int retVal;
- int errCode;
- int len; // message len
- struct sockaddr sockaddr;
- int sockaddrlen;
- char Data[1];
- } RecvFromRet;
- typedef struct {
- SOCKET s;
- int flags;
- int len;
- struct sockaddr sockaddr;
- int sockaddrlen;
- char Data[1];
- } SendToArgs;
- typedef struct {
- int retVal;
- int errCode;
- } SendToRet;
- typedef struct {
- int bufflen;
- SOCKET s;
- int len;
- int sockaddrlen;
- struct sockaddr address;
- char data[1];
- } SocketChannelData;
- typedef struct {
- int af;
- int type;
- int protocol;
- } SocketArgs;
- typedef struct {
- SOCKET s;
- int len;
- int flags;
- int addrlen;
- struct sockaddr addr;
- char data[1];
- } WinSockData;
- typedef struct {
- SOCKET s;
- int level;
- int optname;
- int optlen;
- char optval[1];
- } SetSockOptArgs;
- typedef struct {
- SOCKET sock[MAXSOCKETS];
- } SocketMap;
- //#include "rtq.h"
- #define RTQ_NODE struct rtq_node
- RTQ_NODE
- {
- RTQ_NODE *self; // Ring zero address of this node
- RTQ_NODE *left; // Ring zero address of preceding node
- RTQ_NODE *right; // Ring zero address of succeding node
- BYTE * rtqDatum; // Ring 3 Datum of Buffer (start of preface)
- BYTE * rtqInsert; // Ring 3 insertion position
- WORD rtqLen; // Length of buffer, excluding preface
- WORD rtqUpCtr; // Up Counter of bytes used so far
- WORD rtqQCtr; // number of nodes attached
- WORD padding; // DWORD alignment
- };
- #define RTQ_PARAM_MOVENODE struct rtq_param_movenode
- RTQ_PARAM_MOVENODE
- {
- WORD rtqFromDQ;
- WORD rtqToDQ;
- };
- RTQ_NODE* rtq_fetch(RTQ_NODE*, RTQ_NODE*); // To, From
- //#include "mplib.h"
- // give up time slice
- void Yield(void);
- void MGenWakeupDll(void);
- // post a message to win32 side
- void PostWindowsMessage(void);
- // get # of items on qNo
- int MGenGetQueueCtr(int qNo);
- // move first node from qFrom to qTo
- RTQ_NODE *MGenMoveTo(int qFrom, int qTo);
- // get first node from q
- RTQ_NODE *MGenGetNode(int q);
- // get master node, returning size of RTQ_NODE for size verification
- RTQ_NODE *MGenGetMasterNode(unsigned *size);
- // move all nodes from qFrom to qTo
- RTQ_NODE *MGenFlushNodes(int qFrom, int qTo);
- // count number of nodes in queues designated by bitmask
- // lowerOrderBits == 0..31, upperOrderBits == 32-63
- int MGenMCount(unsigned lowerOrderBits, unsigned upperOrderBits);
- // perform consistency check on chunnel address space
- int MGenSanityCheck(void);
- #include <stdio.h>
- #include <sys/farptr.h>
- extern short flat_selector;
- #define SOCKET_MAP_QUEUE 41
- #define IDLE_QUEUE 44
- #define REC_QUEUE 45
- #define SEND_QUEUE 46
- // queue sizes
- #define FREEQBASE 58
- #define FREEQ64 58
- #define FREEQ128 59
- #define FREEQ256 60
- #define FREEQ512 61
- #define FREEQ1024 62
- #define FREEQ2048 63
- #define NFREEQ 6
- #define QLIMIT 10
- #define PRIVATEQ 50
- #define FARPKL(x) (_farnspeekl((unsigned long) x))
- #define FARPKB(x) (_farnspeekb((unsigned long) x))
- #define FARPKS(x) (_farnspeekw((unsigned long) x))
- #define FARPOKL(x, y) (_farnspokel((unsigned long) x, (unsigned long) y))
- #define FARPOKB(x, y) (_farnspokeb((unsigned long) x, (unsigned char) y))
- int Qsizes[] = { 64, 128, 256, 512, 1024, 2048 };
- int SocketError = 0;
- SocketMap *SockMap;
- #define HOSTENT_ALIAS_LIMIT 5
- #define HOSTENT_STRLEN_LIMIT 50
- #define HOSTENT_ADDR_LIST_LIMIT 5
- struct hostent HostEnt;
- char HostEnt_hname[HOSTENT_STRLEN_LIMIT];
- char *HostEnt_h_aliases[HOSTENT_ALIAS_LIMIT];
- char HostEnt_names[HOSTENT_ALIAS_LIMIT][HOSTENT_STRLEN_LIMIT];
- struct in_addr* HostEnt_addr_list[HOSTENT_ADDR_LIST_LIMIT];
- struct in_addr HostEnt_addrs[HOSTENT_ADDR_LIST_LIMIT];
- void
- fmemcpyto(void *to, const void *from, int length)
- {
- movedata(_my_ds(), (unsigned)from, flat_selector, (unsigned)to, length);
- }
- void
- fmemcpyfrom(void *to, const void *from, int length)
- {
- movedata(flat_selector, (unsigned)from, _my_ds(), (unsigned)to, length);
- }
- void
- fstrcpyto(char *to, const char *from)
- {
- while (*from) {
- FARPOKB(to, *from);
- to++; from++;
- }
- FARPOKB(to, 0);
- }
- void
- fstrncpyto(char *to, const char *from, int len)
- {
- while (*from && len) {
- FARPOKB(to, *from);
- to++; from++; len--;
- }
- FARPOKB(to, 0);
- }
- void
- fstrcpyfrom(char *to, const char *from)
- {
- while (FARPKB(from)) {
- *to = FARPKB(from);
- from++; to++;
- }
- *to = 0;
- }
- void
- fstrncpyfrom(char *to, const char *from, int len)
- {
- while (FARPKB(from) && len) {
- *to = FARPKB(from);
- from++; to++; len--;
- }
- *to = 0;
- }
- void
- GetSocketMap(void)
- {
- RTQ_NODE *n = MGenGetNode(SOCKET_MAP_QUEUE);
- SockMap = (SocketMap *) FARPKL(&n->rtqDatum);
- }
- void *
- GetFreeBufferToQueue(int q, int bufSize)
- {
- int i;
- for (i = 0; i < NFREEQ; i++) {
- if (Qsizes[i] >= bufSize && MGenGetQueueCtr(i+FREEQBASE)) {
- RTQ_NODE *n = MGenMoveTo(i+FREEQBASE, q);
- if (!n)
- continue;
- FARPOKL(&n->rtqUpCtr, bufSize);
- return (void *) FARPKL(&n->rtqDatum);
- }
- }
- return 0;
- }
- void
- FreeBufferFromQueue(int q)
- {
- int i;
- RTQ_NODE *n = MGenGetNode(q);
- for (i = 0; i < NFREEQ; i++) {
- if (Qsizes[i] == FARPKS(&n->rtqLen)) {
- MGenMoveTo(q, i+FREEQBASE);
- return;
- }
- }
- }
- void
- SetLPCData(LPCData *lpc)
- {
- FARPOKL(&(lpc->version), 1);
- FARPOKL(&(lpc->sizeOfArgs), 0);
- FARPOKL(&(lpc->service), 0);
- }
- int
- bind(SOCKET s, const struct sockaddr *name, int namelen)
- {
- RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
- LPCData *p;
- LPCReturn *r;
- BindArgs *bargs;
- int retVal;
- _farsetsel(flat_selector);
- SocketError = 0;
- p = (LPCData *) FARPKL(&n->rtqDatum);
- SetLPCData(p);
- FARPOKL(&p->service, LPC_SOCKBIND);
- bargs = (BindArgs *) p->Data;
- FARPOKL(&bargs->s, s);
- FARPOKL(&bargs->namelen, namelen);
- fmemcpyto(bargs->name, name, namelen);
- MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
- PostWindowsMessage();
- while ((n = MGenGetNode(REC_QUEUE)) == 0)
- Yield();
- r = (LPCReturn *) FARPKL(&n->rtqDatum);
- if (FARPKS(&r->error) != LPC_NOERROR) {
- return -1;
- }
- retVal = FARPKL(r->Data);
- // get ready for next call
- MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
- return retVal;
- }
- int
- closesocket(SOCKET s)
- {
- RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
- LPCData *p;
- LPCReturn *r;
- int retVal;
- _farsetsel(flat_selector);
- SocketError = 0;
- p = (LPCData *) FARPKL(&n->rtqDatum);
- SetLPCData(p);
- FARPOKL(&p->service, LPC_SOCKCLOSE);
- FARPOKL(p->Data, s);
- MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
- PostWindowsMessage();
- while ((n = MGenGetNode(REC_QUEUE)) == 0)
- Yield();
- r = (LPCReturn *) FARPKL(&n->rtqDatum);
- if (FARPKS(&r->error) != LPC_NOERROR) {
- return -1;
- }
- retVal = FARPKL(r->Data);
- // get ready for next call
- MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
- return retVal;
- }
- void
- ZapHostEnt()
- {
- // do nothing
- }
- void
- ReconstructHostEnt(struct hostent *s, void *flattened)
- {
- struct hostent *old = (struct hostent *) flattened;
- int i;
- char **ptr;
- s->h_name = HostEnt_hname;
- fstrncpyfrom(s->h_name, (char *) FARPKL(&old->h_name), HOSTENT_STRLEN_LIMIT-1);
- s->h_name[HOSTENT_STRLEN_LIMIT-1] = 0;
- s->h_aliases = HostEnt_h_aliases;
- ptr = (char **) FARPKL(&old->h_aliases);
- for (i = 0; i < (HOSTENT_ALIAS_LIMIT-1) && FARPKL(ptr); i++, ptr++) {
- s->h_aliases[i] = HostEnt_names[i];
- // fstrncpyfrom(s->h_aliases[i], (void *) FARPKL(ptr), HOSTENT_STRLEN_LIMIT-1);
- s->h_aliases[i][HOSTENT_STRLEN_LIMIT-1] = 0;
- }
- s->h_aliases[i] = 0;
- s->h_addrtype = FARPKS(&old->h_addrtype);
- s->h_length = FARPKS(&old->h_length);
- if (FARPKS(&old->h_length) != sizeof(struct in_addr)) {
- printf("Error!\n");
- exit(0);
- }
- s->h_addr_list = (char **) HostEnt_addr_list;
- ptr = (char **) FARPKL(&old->h_addr_list);
- for (i = 0; i < (HOSTENT_ADDR_LIST_LIMIT - 1) && FARPKL(ptr); i++, ptr++) {
- s->h_addr_list[i] = (char *) &(HostEnt_addrs[i]);
- fmemcpyfrom(s->h_addr_list[i], (void *) FARPKL(ptr), s->h_length);
- }
- s->h_addr_list[i] = 0;
- }
- int
- getsockname(SOCKET s, struct sockaddr *name, int *namelen)
- {
- RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
- LPCData *p;
- LPCReturn *r;
- GetSockNameRet *ret;
- int retVal;
- SocketError = 0;
- _farsetsel(flat_selector);
- p = (LPCData *) FARPKL(&n->rtqDatum);
- SetLPCData(p);
- FARPOKL(&p->service, LPC_SOCKGETSOCKNAME);
- FARPOKL(p->Data, s);
- MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
- PostWindowsMessage();
- while ((n = MGenGetNode(REC_QUEUE)) == 0)
- Yield();
- r = (LPCReturn *) FARPKL(&n->rtqDatum);
- if (FARPKS(&r->error) != LPC_NOERROR) {
- return -1;
- }
- ret = (GetSockNameRet *) r->Data;
- retVal = FARPKL(&ret->retVal);
- fmemcpyfrom(name, ret->name, FARPKL(&ret->namelen));
- *namelen = FARPKL(&ret->namelen);
- // get ready for next call
- MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
- return retVal;
- }
- int
- gethostname(char *name, int namelen)
- {
- RTQ_NODE *n;
- LPCData *p;
- LPCReturn *r;
- GetHostNameRet *ret;
- int retVal;
- char *s;
- _farsetsel(flat_selector);
- SocketError = 0;
- n = (RTQ_NODE *) MGenGetNode(IDLE_QUEUE);
- p = (LPCData *) FARPKL(&n->rtqDatum);
- SetLPCData(p);
- FARPOKL(&p->service,LPC_SOCKGETHOSTNAME);
- MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
- PostWindowsMessage();
- while ((n = (RTQ_NODE *) (MGenGetNode(REC_QUEUE))) == 0)
- Yield();
- r = (LPCReturn *) FARPKL(&n->rtqDatum);
- if (FARPKS(&r->error) != LPC_NOERROR) {
- return -1;
- }
- ret = (GetHostNameRet *) r->Data;
- retVal = FARPKL(&ret->retVal);
- s = ret->name;
- fstrncpyfrom(name, s, namelen);
- #if 0
- len = strlen(ret->name);
- if (len > namelen)
- memcpy(name, ret->name, ret->namelen);
- else
- strcpy(name, ret->name);
- #endif
- // get ready for next call
- MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
- return retVal;
- }
- struct hostent *
- gethostbyname(const char *name)
- {
- RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
- LPCData *p;
- LPCReturn *r;
- struct hostent *retVal;
- _farsetsel(flat_selector);
- SocketError = 0;
- p = (LPCData *) FARPKL(&n->rtqDatum);
- SetLPCData(p);
- FARPOKL(&p->service, LPC_SOCKGETHOSTBYNAME);
- fstrcpyto(p->Data, name);
- MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
- PostWindowsMessage();
- while ((n = MGenGetNode(REC_QUEUE)) == 0)
- Yield();
- r = (LPCReturn *) FARPKL(&n->rtqDatum);
- retVal = (struct hostent *) r->Data;
- if (FARPKL(&retVal->h_name) == 0) {
- retVal = 0;
- } else {
- ZapHostEnt();
- ReconstructHostEnt(&HostEnt, (void *) retVal);
- retVal = &HostEnt;
- }
- // get ready for next call
- MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
- return retVal;
- }
- struct hostent *
- gethostbyaddr(const char *addr, int len, int type)
- {
- RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
- LPCData *p;
- LPCReturn *r;
- GetHostByAddrArgs *args;
- struct hostent *retVal;
- SocketError = 0;
- _farsetsel(flat_selector);
- p = (LPCData *) FARPKL(&n->rtqDatum);
- SetLPCData(p);
- FARPOKL(&p->service, LPC_SOCKGETHOSTBYADDR);
- args = (GetHostByAddrArgs *) p->Data;
- FARPOKL(&args->len, len);
- FARPOKL(&args->type, type);
- fmemcpyto(args->addr, addr, len);
- MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
- PostWindowsMessage();
- while ((n = MGenGetNode(REC_QUEUE)) == 0)
- Yield();
- r = (LPCReturn *) FARPKL(&n->rtqDatum);
- retVal = (struct hostent *) r->Data;
- if (FARPKL(&retVal->h_name) == 0) {
- retVal = 0;
- } else {
- ZapHostEnt();
- ReconstructHostEnt(&HostEnt, (void *) retVal);
- retVal = &HostEnt;
- }
- // get ready for next call
- MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
- return retVal;
- }
- SOCKET
- socket(int af, int type, int protocol)
- {
- RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
- LPCData *p;
- LPCReturn *r;
- SocketArgs *args;
- int retVal;
- _farsetsel(flat_selector);
- SocketError = 0;
- p = (LPCData *) FARPKL(&n->rtqDatum);
- SetLPCData(p);
- FARPOKL(&p->service, LPC_SOCKSOCKET);
- args = (SocketArgs *) p->Data;
- FARPOKL(&args->af, af);
- FARPOKL(&args->type, type);
- FARPOKL(&args->protocol, protocol);
- MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
- PostWindowsMessage();
- while ((n = MGenGetNode(REC_QUEUE)) == 0)
- Yield();
- r = (LPCReturn *) FARPKL(&n->rtqDatum);
- if (FARPKS(&r->error) != LPC_NOERROR) {
- return -1;
- }
- retVal = FARPKL(r->Data);
- // get ready for next call
- MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
- return retVal;
- }
- void
- sockets_flush(void)
- {
- RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
- LPCData *p;
- SocketError = 0;
- p = (LPCData *) FARPKL(&n->rtqDatum);
- SetLPCData(p);
- FARPOKL(&p->service, LPC_SOCKFLUSH);
- MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
- PostWindowsMessage();
- while ((n = MGenGetNode(REC_QUEUE)) == 0)
- Yield();
- MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
- }
- int
- recvfrom(SOCKET s, char *buf, int len, int flags, struct sockaddr *from,
- int *fromlen)
- {
- int i;
- RTQ_NODE *n;
- WinSockData *data;
- int bytesRead;
- SocketError = 0;
- _farsetsel(flat_selector);
- if (!SockMap)
- GetSocketMap();
- for (i = 0; i < MAXSOCKETS; i++) {
- if (FARPKL(&(SockMap->sock[i])) == s)
- break;
- }
- if (i == MAXSOCKETS)
- return SOCKET_ERROR;
- // pick up node
- n = MGenGetNode(i);
- if (n == 0) {
- SocketError = WSAEWOULDBLOCK;
- return -1;
- }
- data = (WinSockData *) FARPKL(&n->rtqDatum);
- bytesRead = FARPKL(&data->len);
- if (from) {
- fmemcpyfrom(from, &data->addr, sizeof(struct sockaddr));
- }
- if (fromlen) {
- *fromlen = FARPKL(&data->addrlen);
- }
- fmemcpyfrom(buf, data->data, len > bytesRead ? bytesRead : len);
- if ((flags & MSG_PEEK) == 0) {
- FreeBufferFromQueue(i);
- }
- return bytesRead;
- }
- int
- sendto(SOCKET s, const char *buf, int len, int flags, const struct sockaddr *to, int tolen)
- {
- int i;
- int outQ;
- WinSockData *data;
- SocketError = 0;
- _farsetsel(flat_selector);
- if (!SockMap)
- GetSocketMap();
- for (i = 0; i < MAXSOCKETS; i++) {
- if (FARPKL(&SockMap->sock[i]) == s) {
- break;
- }
- }
- if (i == MAXSOCKETS) {
- SocketError = WSAENOTSOCK;
- return SOCKET_ERROR;
- }
- outQ = i + MAXSOCKETS;
- if (MGenGetQueueCtr(outQ) >= QLIMIT) {
- SocketError = WSAEWOULDBLOCK;
- return SOCKET_ERROR;
- }
- data = GetFreeBufferToQueue(PRIVATEQ, len + sizeof(WinSockData));
- if (!data) {
- SocketError = WSAEWOULDBLOCK;
- return SOCKET_ERROR;
- }
- FARPOKL(&data->s, s);
- FARPOKL(&data->len, len);
- if (to) {
- fmemcpyto(&data->addr, to, tolen);
- FARPOKL(&data->addrlen, tolen);
- } else {
- FARPOKL(&data->addrlen, 0);
- }
- FARPOKL(&data->flags, flags);
- fmemcpyto(data->data, buf, len);
- MGenMoveTo(PRIVATEQ, outQ);
- return len;
- }
- int
- ioctlsocket(SOCKET s, long cmd, unsigned long *argp)
- {
- RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
- LPCData *p;
- LPCReturn *r;
- IoctlArgs *args;
- int retVal;
- SocketError = 0;
- _farsetsel(flat_selector);
- p = (LPCData *) FARPKL(&n->rtqDatum);
- SetLPCData(p);
- FARPOKL(&p->service, LPC_SOCKIOCTL);
- args = (IoctlArgs *) p->Data;
- FARPOKL(&args->s, s);
- FARPOKL(&args->cmd, cmd);
- switch(cmd) {
- case FIONBIO:
- FARPOKL(args->data, *argp);
- break;
- default:
- return SOCKET_ERROR;
- }
- MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
- PostWindowsMessage();
- while ((n = MGenGetNode(REC_QUEUE)) == 0)
- Yield();
- r = (LPCReturn *) FARPKL(&n->rtqDatum);
- retVal = FARPKL(r->Data);
- // get ready for next call
- MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
- return retVal;
- }
- int
- setsockopt(SOCKET s, int level, int optname, const char *optval, int optlen)
- {
- RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
- LPCData *p;
- LPCReturn *r;
- SetSockOptArgs *args;
- int retVal;
- SocketError = 0;
- _farsetsel(flat_selector);
- p = (LPCData *) FARPKL(&n->rtqDatum);
- SetLPCData(p);
- FARPOKL(&p->service, LPC_SOCKSETOPT);
- args = (SetSockOptArgs *) p->Data;
- FARPOKL(&args->s, s);
- FARPOKL(&args->level, level);
- FARPOKL(&args->optname, optname);
- FARPOKL(&args->optlen, optlen);
- fmemcpyto(args->optval, optval, optlen);
- MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
- PostWindowsMessage();
- while ((n = MGenGetNode(REC_QUEUE)) == 0)
- Yield();
- r = (LPCReturn *) FARPKL(&n->rtqDatum);
- retVal = FARPKL(r->Data);
- // get ready for next call
- MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
- return retVal;
- }
- int
- WSAGetLastError(void)
- {
- RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
- LPCData *p;
- LPCReturn *r;
- int retVal;
- _farsetsel(flat_selector);
- if (SocketError) {
- int err = SocketError;
- SocketError = 0;
- return err;
- }
- p = (LPCData *) FARPKL(&n->rtqDatum);
- SetLPCData(p);
- FARPOKL(&p->service, LPC_SOCKGETLASTERROR);
- MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
- PostWindowsMessage();
- while ((n = MGenGetNode(REC_QUEUE)) == 0)
- Yield();
- r = (LPCReturn *) FARPKL(&n->rtqDatum);
- retVal = FARPKL(r->Data);
- // get ready for next call
- MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
- return retVal;
- }
- unsigned long inet_addr(const char *cp)
- {
- int ret;
- unsigned int ha1, ha2, ha3, ha4;
- unsigned long ipaddr;
- ret = sscanf(cp, "%d.%d.%d.%d", &ha1, &ha2, &ha3, &ha4);
- if (ret != 4)
- return -1;
- ipaddr = (ha1 << 24) | (ha2 << 16) | (ha3 << 8) | ha4;
- return ipaddr;
- #if 0
- RTQ_NODE *n = MGenGetNode(IDLE_QUEUE);
- LPCData *p;
- LPCReturn *r;
- int retVal;
- SocketError = 0;
- _farsetsel(flat_selector);
- p = (LPCData *) FARPKL(&n->rtqDatum);
- SetLPCData(p);
- FARPOKL(&p->service, LPC_SOCKINETADDR);
- fstrcpyto(p->Data, cp);
- MGenMoveTo(IDLE_QUEUE, SEND_QUEUE);
- PostWindowsMessage();
- while ((n = MGenGetNode(REC_QUEUE)) == 0)
- Yield();
- r = (LPCReturn *) FARPKL(&n->rtqDatum);
- if (FARPKS(&r->error) != LPC_NOERROR) {
- return -1;
- }
- retVal = FARPKL(r->Data);
- // get ready for next call
- MGenMoveTo(REC_QUEUE, IDLE_QUEUE);
- return retVal;
- #endif
- }
- char *inet_ntoa (struct in_addr in)
- {
- static char buf [32];
- 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);
- return buf;
- }
|