⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mplpc.c

📁 quake1 dos源代码最新版本
💻 C
📖 第 1 页 / 共 2 页
字号:
   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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -