source: trunk/src/wsock32/new/wsock32.cpp@ 1934

Last change on this file since 1934 was 1934, checked in by phaller, 26 years ago

Fix: WSOCK32 finally working!

File size: 33.0 KB
Line 
1/* $Id: wsock32.cpp,v 1.8 1999-12-02 07:58:54 phaller Exp $ */
2
3/*
4 *
5 * Project Odin Software License can be found in LICENSE.TXT
6 *
7 * Win32 SOCK32 for OS/2
8 *
9 * Copyright (C) 1999 Patrick Haller <phaller@gmx.net>
10 *
11 */
12
13/* Remark:
14 * 1999/11/21 experimental rewrite using IBM's PMWSock only
15 * -> some structural differences remain! (hostent)
16 * 1999/12/01 experimental rewrite works (TELNET)
17 * -> open issue: WSASetLastError / WSAGetLastError
18 * call SetLastError / GetLastError according to docs
19 *
20 * identical structures:
21 * - sockaddr_in
22 * - WSADATA
23 * - sockaddr
24 * - fd_set
25 * - timeval
26 *
27 * incompatible structures:
28 * - hostent
29 * - netent
30 * - servent
31 * - protent
32 * - linger
33 */
34
35
36/*****************************************************************************
37 * Includes *
38 *****************************************************************************/
39
40#include <pmwsock.h>
41#include <odin.h>
42#include <odinwrap.h>
43#include <os2sel.h>
44#include <misc.h>
45#include <wprocess.h>
46#include <heapstring.h>
47#include <win32wnd.h>
48
49#include "wsock32.h"
50#include "relaywin.h"
51
52
53ODINDEBUGCHANNEL(WSOCK32-WSOCK32)
54
55
56/*****************************************************************************
57 * Local variables *
58 *****************************************************************************/
59
60#define ERROR_SUCCESS 0
61
62
63static WSOCKTHREADDATA wstdFallthru; // for emergency only
64
65
66/*****************************************************************************
67 * Name :
68 * Purpose :
69 * Parameters:
70 * Variables :
71 * Result :
72 * Remark : free memory when thread dies
73 * Status : UNTESTED STUB
74 *
75 * Author : Patrick Haller [Tue, 1998/06/16 23:00]
76 *****************************************************************************/
77
78PWSOCKTHREADDATA iQueryWsockThreadData(void)
79{
80 struct _THDB* pThreadDB = (struct _THDB*)GetThreadTHDB();
81 PWSOCKTHREADDATA pwstd;
82
83 // check for existing pointer
84 if (pThreadDB != NULL)
85 {
86 if (pThreadDB->pWsockData == NULL)
87 {
88 // allocate on demand + initialize
89 pwstd = (PWSOCKTHREADDATA)HEAP_malloc (sizeof(WSOCKTHREADDATA));
90 pThreadDB->pWsockData = (LPVOID)pwstd;
91 }
92 else
93 // use already allocated memory
94 pwstd = (PWSOCKTHREADDATA)pThreadDB->pWsockData;
95 }
96
97 if (pwstd == NULL)
98 pwstd = &wstdFallthru; // no memory and not allocated already
99
100 return pwstd;
101}
102
103
104#if 0
105/*****************************************************************************
106 * Name :
107 * Purpose :
108 * Parameters:
109 * Variables :
110 * Result :
111 * Remark :
112 * Status : UNTESTED STUB
113 *
114 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
115 *****************************************************************************/
116
117#define CASEERR2(a) case SOC##a: case a: return WSA##a;
118#define CASEERR1(a) case SOC##a: return WSA##a;
119
120int iTranslateSockErrToWSock(int iError)
121{
122 switch(iError)
123 {
124 CASEERR2(EINTR)
125 CASEERR2(EBADF)
126 CASEERR2(EACCES)
127 CASEERR2(EINVAL)
128 CASEERR2(EMFILE)
129
130 CASEERR1(EWOULDBLOCK)
131 CASEERR1(EINPROGRESS)
132 CASEERR1(EALREADY)
133 CASEERR1(ENOTSOCK)
134// CASEERR1(EDESTADRREQ)
135 CASEERR1(EMSGSIZE)
136 CASEERR1(EPROTOTYPE)
137 CASEERR1(ENOPROTOOPT)
138 CASEERR1(EPROTONOSUPPORT)
139 CASEERR1(ESOCKTNOSUPPORT)
140 CASEERR1(EOPNOTSUPP)
141 CASEERR1(EPFNOSUPPORT)
142 CASEERR1(EAFNOSUPPORT)
143 CASEERR1(EADDRINUSE)
144 CASEERR1(EADDRNOTAVAIL)
145 CASEERR1(ENETDOWN)
146 CASEERR1(ENETUNREACH)
147 CASEERR1(ENETRESET)
148 CASEERR1(ECONNABORTED)
149 CASEERR1(ECONNRESET)
150 CASEERR1(ENOBUFS)
151 CASEERR1(EISCONN)
152 CASEERR1(ENOTCONN)
153 CASEERR1(ESHUTDOWN)
154 CASEERR1(ETOOMANYREFS)
155 CASEERR1(ETIMEDOUT)
156 CASEERR1(ECONNREFUSED)
157 CASEERR1(ELOOP)
158 CASEERR1(ENAMETOOLONG)
159 CASEERR1(EHOSTDOWN)
160 CASEERR1(EHOSTUNREACH)
161
162 CASEERR1(ENOTEMPTY)
163// CASEERR(EPROCLIM)
164// CASEERR(EUSERS)
165// CASEERR(EDQUOT)
166// CASEERR(ESTALE)
167// CASEERR(EREMOTE)
168// CASEERR(EDISCON)
169
170
171 default:
172 dprintf(("WSOCK32: Unknown error condition: %d\n",
173 iError));
174 return iError;
175 }
176}
177
178#endif
179
180
181
182
183
184
185
186/*****************************************************************************
187 * Name :
188 * Purpose :
189 * Parameters:
190 * Variables :
191 * Result :
192 * Remark :
193 * Status : UNTESTED STUB
194 *
195 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
196 *****************************************************************************/
197
198
199ODINPROCEDURE1(OS2WSASetLastError,
200 int,iError)
201{
202 WSASetLastError(iError);
203}
204
205
206/*****************************************************************************
207 * Name :
208 * Purpose :
209 * Parameters:
210 * Variables :
211 * Result :
212 * Remark :
213 * Status : UNTESTED STUB
214 *
215 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
216 *****************************************************************************/
217
218ODINFUNCTION0(int,OS2WSAGetLastError)
219{
220 return WSAGetLastError();
221}
222
223
224/*****************************************************************************
225 * Name :
226 * Purpose :
227 * Parameters:
228 * Variables :
229 * Result :
230 * Remark :
231 * Status : UNTESTED STUB
232 *
233 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
234 *****************************************************************************/
235
236ODINFUNCTION2(int,OS2__WSAFDIsSet,SOCKET, s,
237 fd_set*,fds)
238{
239 return (__WSAFDIsSet(s,fds));
240}
241
242
243/*****************************************************************************
244 * Name :
245 * Purpose :
246 * Parameters:
247 * Variables :
248 * Result :
249 * Remark :
250 * Status : UNTESTED STUB
251 *
252 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
253 *****************************************************************************/
254
255ODINFUNCTION3(SOCKET,OS2accept, SOCKET, s,
256 struct sockaddr *,addr,
257 int *, addrlen)
258{
259 return(accept(s,addr,addrlen));
260}
261
262
263/*****************************************************************************
264 * Name :
265 * Purpose :
266 * Parameters:
267 * Variables :
268 * Result :
269 * Remark :
270 * Status : UNTESTED STUB
271 *
272 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
273 *****************************************************************************/
274
275ODINFUNCTION3(int,OS2bind,
276 SOCKET ,s,
277 const struct sockaddr *,addr,
278 int, namelen)
279{
280 return(bind(s,addr,namelen));
281}
282
283
284/*****************************************************************************
285 * Name :
286 * Purpose :
287 * Parameters:
288 * Variables :
289 * Result :
290 * Remark :
291 * Status : UNTESTED STUB
292 *
293 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
294 *****************************************************************************/
295
296ODINFUNCTION1(int,OS2closesocket,SOCKET, s)
297{
298 return(closesocket(s));
299}
300
301
302/*****************************************************************************
303 * Name :
304 * Purpose :
305 * Parameters:
306 * Variables :
307 * Result :
308 * Remark :
309 * Status : UNTESTED STUB
310 *
311 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
312 *****************************************************************************/
313
314ODINFUNCTION3(int,OS2connect,
315 SOCKET, s,
316 const struct sockaddr *,name,
317 int, namelen)
318{
319 return(connect(s,name,namelen));
320}
321
322
323/*****************************************************************************
324 * Name :
325 * Purpose :
326 * Parameters:
327 * Variables :
328 * Result :
329 * Remark :
330 * Status : UNTESTED STUB
331 *
332 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
333 *****************************************************************************/
334
335ODINFUNCTION3(int,OS2ioctlsocket,
336 SOCKET,s,
337 long, cmd,
338 u_long *,argp)
339{
340 return(ioctlsocket(s,cmd,argp));
341}
342
343
344/*****************************************************************************
345 * Name :
346 * Purpose :
347 * Parameters:
348 * Variables :
349 * Result :
350 * Remark :
351 * Status : UNTESTED STUB
352 *
353 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
354 *****************************************************************************/
355
356ODINFUNCTION3(int,OS2getpeername,
357 SOCKET, s,
358 struct sockaddr *,name,
359 int *, namelen)
360{
361 return(getpeername(s,name,namelen));
362}
363
364
365/*****************************************************************************
366 * Name :
367 * Purpose :
368 * Parameters:
369 * Variables :
370 * Result :
371 * Remark :
372 * Status : UNTESTED STUB
373 *
374 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
375 *****************************************************************************/
376
377ODINFUNCTION3(int,OS2getsockname,
378 SOCKET,s,
379 struct sockaddr *,name,
380 int *, namelen)
381{
382 return(getsockname(s,name,namelen));
383}
384
385
386/*****************************************************************************
387 * Name :
388 * Purpose :
389 * Parameters:
390 * Variables :
391 * Result :
392 * Remark :
393 * Status : UNTESTED STUB
394 *
395 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
396 *****************************************************************************/
397
398ODINFUNCTION5(int,OS2getsockopt,
399 SOCKET, s,
400 int, level,
401 int, optname,
402 char *, optval,
403 int *,optlen)
404{
405 return(getsockopt(s,
406 level,
407 optname,
408 optval,
409 optlen));
410}
411
412
413/*****************************************************************************
414 * Name :
415 * Purpose :
416 * Parameters:
417 * Variables :
418 * Result :
419 * Remark :
420 * Status : UNTESTED STUB
421 *
422 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
423 *****************************************************************************/
424
425ODINFUNCTION1(u_long,OS2htonl,
426 u_long,hostlong)
427{
428 return(htonl(hostlong));
429}
430
431
432/*****************************************************************************
433 * Name :
434 * Purpose :
435 * Parameters:
436 * Variables :
437 * Result :
438 * Remark :
439 * Status : UNTESTED STUB
440 *
441 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
442 *****************************************************************************/
443
444ODINFUNCTION1(u_short,OS2htons,
445 u_short,hostshort)
446{
447 return(htons(hostshort));
448}
449
450
451/*****************************************************************************
452 * Name :
453 * Purpose :
454 * Parameters:
455 * Variables :
456 * Result :
457 * Remark :
458 * Status : UNTESTED STUB
459 *
460 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
461 *****************************************************************************/
462
463ODINFUNCTION1(unsigned long,OS2inet_addr,
464 const char *, cp)
465{
466 dprintf(("WSOCK32: OS2inet_addr(%s)\n",
467 cp));
468
469 return (inet_addr(cp));
470}
471
472
473/*****************************************************************************
474 * Name :
475 * Purpose :
476 * Parameters:
477 * Variables :
478 * Result :
479 * Remark :
480 * Status : UNTESTED STUB
481 *
482 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
483 *****************************************************************************/
484
485ODINFUNCTION1(char *,OS2inet_ntoa,
486 struct in_addr, in)
487{
488 return(inet_ntoa(in));
489}
490
491
492/*****************************************************************************
493 * Name :
494 * Purpose :
495 * Parameters:
496 * Variables :
497 * Result :
498 * Remark :
499 * Status : UNTESTED STUB
500 *
501 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
502 *****************************************************************************/
503
504ODINFUNCTION2(int,OS2listen,
505 SOCKET, s,
506 int, backlog)
507{
508 return(listen(s,backlog));
509}
510
511
512/*****************************************************************************
513 * Name :
514 * Purpose :
515 * Parameters:
516 * Variables :
517 * Result :
518 * Remark :
519 * Status : UNTESTED STUB
520 *
521 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
522 *****************************************************************************/
523
524ODINFUNCTION1(u_long,OS2ntohl,
525 u_long,netlong)
526{
527 return(ntohl(netlong));
528}
529
530
531/*****************************************************************************
532 * Name :
533 * Purpose :
534 * Parameters:
535 * Variables :
536 * Result :
537 * Remark :
538 * Status : UNTESTED STUB
539 *
540 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
541 *****************************************************************************/
542
543ODINFUNCTION1(u_short,OS2ntohs,
544 u_short,netshort)
545{
546 return(ntohs(netshort));
547}
548
549
550/*****************************************************************************
551 * Name :
552 * Purpose :
553 * Parameters:
554 * Variables :
555 * Result :
556 * Remark :
557 * Status : UNTESTED STUB
558 *
559 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
560 *****************************************************************************/
561
562ODINFUNCTION4(int,OS2recv,
563 SOCKET,s,
564 char *,buf,
565 int,len,
566 int,flags)
567{
568 return(recv(s,
569 buf,
570 len,
571 flags));
572}
573
574
575/*****************************************************************************
576 * Name :
577 * Purpose :
578 * Parameters:
579 * Variables :
580 * Result :
581 * Remark :
582 * Status : UNTESTED STUB
583 *
584 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
585 *****************************************************************************/
586
587ODINFUNCTION6(int,OS2recvfrom,
588 SOCKET,s,
589 char *,buf,
590 int,len,
591 int,flags,
592 struct sockaddr *,from,
593 int *,fromlen)
594{
595
596 return(recvfrom(s,
597 buf,
598 len,
599 flags,
600 from,
601 fromlen));
602}
603
604
605/*****************************************************************************
606 * Name :
607 * Purpose :
608 * Parameters:
609 * Variables :
610 * Result :
611 * Remark :
612 * Status : UNTESTED STUB
613 *
614 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
615 *****************************************************************************/
616
617ODINFUNCTION5(int,OS2select,
618 int,nfds,
619 fd_set *,readfds,
620 fd_set *,writefds,
621 fd_set *,exceptfds,
622 const struct timeval *,timeout)
623{
624 return(select(nfds,
625 readfds,
626 writefds,
627 exceptfds,
628 timeout));
629}
630
631
632/*****************************************************************************
633 * Name :
634 * Purpose :
635 * Parameters:
636 * Variables :
637 * Result :
638 * Remark :
639 * Status : UNTESTED STUB
640 *
641 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
642 *****************************************************************************/
643
644ODINFUNCTION4(int,OS2send,
645 SOCKET,s,
646 const char *,buf,
647 int,len,
648 int,flags)
649{
650 return(send(s,
651 buf,
652 len,
653 flags));
654}
655
656
657/*****************************************************************************
658 * Name :
659 * Purpose :
660 * Parameters:
661 * Variables :
662 * Result :
663 * Remark :
664 * Status : UNTESTED STUB
665 *
666 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
667 *****************************************************************************/
668
669ODINFUNCTION6(int,OS2sendto,
670 SOCKET,s,
671 const char *,buf,
672 int,len,
673 int,flags,
674 const struct sockaddr *,to,
675 int,tolen)
676{
677 return(sendto(s,
678 buf,
679 len,
680 flags,
681 to,
682 tolen));
683}
684
685
686/*****************************************************************************
687 * Name :
688 * Purpose :
689 * Parameters:
690 * Variables :
691 * Result :
692 * Remark :
693 * Status : UNTESTED STUB
694 *
695 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
696 *****************************************************************************/
697
698ODINFUNCTION5(int,OS2setsockopt,
699 SOCKET,s,
700 int,level,
701 int,optname,
702 const char *,optval,
703 int,optlen)
704{
705 struct Wlinger *yy;
706 struct linger xx;
707 int rc;
708
709 if(level == SOL_SOCKET &&
710 optname == SO_LINGER)
711 {
712 yy = (struct Wlinger *)optval;
713 xx.l_onoff = (int)yy->l_onoff;
714 xx.l_linger = (int)yy->l_linger;
715
716 rc = setsockopt(s,level,optname,(char *)&xx,optlen);
717 }
718 else
719 rc = setsockopt(s,level,optname,(char *)optval,optlen);
720
721 if (rc == SOCKET_ERROR)
722 //OS2WSASetLastError(iTranslateSockErrToWSock(sock_errno()));
723 OS2WSASetLastError(WSAEINVAL);
724 else
725 OS2WSASetLastError(ERROR_SUCCESS);
726
727 return rc;
728}
729
730
731/*****************************************************************************
732 * Name :
733 * Purpose :
734 * Parameters:
735 * Variables :
736 * Result :
737 * Remark :
738 * Status : UNTESTED STUB
739 *
740 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
741 *****************************************************************************/
742
743ODINFUNCTION2(int,OS2shutdown,
744 SOCKET,s,
745 int,how)
746{
747 return(shutdown(s,
748 how));
749}
750
751
752/*****************************************************************************
753 * Name :
754 * Purpose :
755 * Parameters:
756 * Variables :
757 * Result :
758 * Remark :
759 * Status : UNTESTED STUB
760 *
761 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
762 *****************************************************************************/
763
764ODINFUNCTION3(SOCKET,OS2socket,
765 int,af,
766 int,type,
767 int,protocol)
768{
769 return(socket(af,
770 type,
771 protocol));
772}
773
774
775/* Database function prototypes */
776
777/*****************************************************************************
778 * Name :
779 * Purpose :
780 * Parameters:
781 * Variables :
782 * Result :
783 * Remark :
784 * Status : UNTESTED STUB
785 *
786 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
787 *****************************************************************************/
788
789ODINFUNCTION3(struct Whostent *,OS2gethostbyaddr,
790 const char *,addr,
791 int,len,
792 int,type)
793{
794 WHOSTENT *yy;
795 struct hostent *xx;
796 PWSOCKTHREADDATA pwstd;
797
798 xx = gethostbyaddr((char *)addr,len,type);
799 //PH: we assume PMWSOCK sets WSASetLastError correctly!
800
801 if(xx == NULL)
802 return (WHOSTENT *)NULL;
803
804 // access current thread wsock data block
805 pwstd = iQueryWsockThreadData();
806
807 pwstd->whsnt.h_name = xx->h_name;
808 pwstd->whsnt.h_aliases = xx->h_aliases;
809 pwstd->whsnt.h_addrtype = (short)xx->h_addrtype;
810 pwstd->whsnt.h_length = (short)xx->h_length;
811 pwstd->whsnt.h_addr_list = xx->h_addr_list;
812
813 return &pwstd->whsnt;
814}
815
816
817/*****************************************************************************
818 * Name :
819 * Purpose :
820 * Parameters:
821 * Variables :
822 * Result :
823 * Remark :
824 * Status : UNTESTED STUB
825 *
826 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
827 *****************************************************************************/
828
829ODINFUNCTION1(struct Whostent *,OS2gethostbyname,
830 const char *,name)
831{
832 WHOSTENT *yy;
833 struct hostent *xx;
834 PWSOCKTHREADDATA pwstd;
835
836
837 xx = gethostbyname((char *)name);
838 //PH: we assume PMWSOCK sets WSASetLastError correctly!
839
840 if(xx == NULL)
841 return (WHOSTENT *)NULL;
842
843 // access current thread wsock data block
844 pwstd = iQueryWsockThreadData();
845
846 pwstd->whsnt.h_name = xx->h_name;
847 pwstd->whsnt.h_aliases = xx->h_aliases;
848 pwstd->whsnt.h_addrtype = (short)xx->h_addrtype;
849 pwstd->whsnt.h_length = (short)xx->h_length;
850 pwstd->whsnt.h_addr_list = xx->h_addr_list;
851
852 return &pwstd->whsnt;
853}
854
855
856/*****************************************************************************
857 * Name :
858 * Purpose :
859 * Parameters:
860 * Variables :
861 * Result :
862 * Remark :
863 * Status : UNTESTED STUB
864 *
865 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
866 *****************************************************************************/
867
868ODINFUNCTION2(int,OS2gethostname,
869 char *,name,
870 int,namelen)
871{
872 //PH: we assume PMWSOCK sets WSASetLastError correctly!
873 return(gethostname(name,
874 namelen));
875}
876
877
878/*****************************************************************************
879 * Name :
880 * Purpose :
881 * Parameters:
882 * Variables :
883 * Result :
884 * Remark :
885 * Status : UNTESTED STUB
886 *
887 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
888 *****************************************************************************/
889
890ODINFUNCTION2(struct Wservent *,OS2getservbyport,
891 int,port,
892 const char *, proto)
893{
894 struct servent *xx;
895 PWSOCKTHREADDATA pwstd;
896
897 //PH: we assume PMWSOCK sets WSASetLastError correctly!
898 xx = getservbyport(port,(char *)proto);
899
900 if(xx == NULL)
901 return (WSERVENT *)NULL;
902
903 // access current thread wsock data block
904 pwstd = iQueryWsockThreadData();
905
906 pwstd->wsvnt.s_name = xx->s_name;
907 pwstd->wsvnt.s_aliases = xx->s_aliases;
908 pwstd->wsvnt.s_port = (short)xx->s_port;
909 pwstd->wsvnt.s_proto = xx->s_proto;
910
911 return &pwstd->wsvnt;
912}
913
914
915/*****************************************************************************
916 * Name :
917 * Purpose :
918 * Parameters:
919 * Variables :
920 * Result :
921 * Remark :
922 * Status : UNTESTED STUB
923 *
924 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
925 *****************************************************************************/
926
927ODINFUNCTION2(struct Wservent *,OS2getservbyname,
928 const char *,name,
929 const char *,proto)
930{
931 WSERVENT *yy;
932 struct servent *xx;
933 PWSOCKTHREADDATA pwstd;
934
935
936 //PH: we assume PMWSOCK sets WSASetLastError correctly!
937 xx = getservbyname((char *)name,(char *)proto);
938
939 if(xx == NULL)
940 return (WSERVENT *)NULL;
941
942 // access current thread wsock data block
943 pwstd = iQueryWsockThreadData();
944
945 pwstd->wsvnt.s_name = xx->s_name;
946 pwstd->wsvnt.s_aliases = xx->s_aliases;
947 pwstd->wsvnt.s_port = (short)xx->s_port;
948 pwstd->wsvnt.s_proto = xx->s_proto;
949
950 return &pwstd->wsvnt;
951}
952
953
954/*****************************************************************************
955 * Name :
956 * Purpose :
957 * Parameters:
958 * Variables :
959 * Result :
960 * Remark :
961 * Status : UNTESTED STUB
962 *
963 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
964 *****************************************************************************/
965
966ODINFUNCTION1(struct Wprotoent *,OS2getprotobynumber,
967 int,proto)
968{
969 struct protoent *xx;
970 PWSOCKTHREADDATA pwstd;
971
972 //PH: we assume PMWSOCK sets WSASetLastError correctly!
973 xx = getprotobynumber(proto);
974
975 if(xx == NULL)
976 return (WPROTOENT *)NULL;
977
978 // access current thread wsock data block
979 pwstd = iQueryWsockThreadData();
980
981 pwstd->wptnt.p_name = xx->p_name;
982 pwstd->wptnt.p_aliases = xx->p_aliases;
983 pwstd->wptnt.p_proto = (short)xx->p_proto;
984
985 return &pwstd->wptnt;
986}
987
988
989/*****************************************************************************
990 * Name :
991 * Purpose :
992 * Parameters:
993 * Variables :
994 * Result :
995 * Remark :
996 * Status : UNTESTED STUB
997 *
998 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
999 *****************************************************************************/
1000
1001ODINFUNCTION1(struct Wprotoent *,OS2getprotobyname,
1002 const char *,name)
1003{
1004 struct protoent *xx;
1005 PWSOCKTHREADDATA pwstd;
1006
1007 //PH: we assume PMWSOCK sets WSASetLastError correctly!
1008 xx = getprotobyname((char *)name);
1009
1010 if(xx == NULL)
1011 return (WPROTOENT *)NULL;
1012
1013 // access current thread wsock data block
1014 pwstd = iQueryWsockThreadData();
1015
1016 pwstd->wptnt.p_name = xx->p_name;
1017 pwstd->wptnt.p_aliases = xx->p_aliases;
1018 pwstd->wptnt.p_proto = (short)xx->p_proto;
1019
1020 return &pwstd->wptnt;
1021}
1022
1023
1024
1025/* Microsoft Windows Extension function prototypes */
1026
1027/*****************************************************************************
1028 * Name :
1029 * Purpose :
1030 * Parameters:
1031 * Variables :
1032 * Result :
1033 * Remark :
1034 * Status : UNTESTED STUB
1035 *
1036 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
1037 *****************************************************************************/
1038
1039ODINFUNCTION2(int,OS2WSAStartup,
1040 USHORT,wVersionRequired,
1041 LPWSADATA,lpWSAData)
1042{
1043 return(WSAStartup(wVersionRequired,
1044 lpWSAData));
1045}
1046
1047
1048/*****************************************************************************
1049 * Name :
1050 * Purpose :
1051 * Parameters:
1052 * Variables :
1053 * Result :
1054 * Remark :
1055 * Status : UNTESTED STUB
1056 *
1057 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
1058 *****************************************************************************/
1059
1060ODINFUNCTION0(int,OS2WSACleanup)
1061{
1062 return(WSACleanup());
1063}
1064
1065
1066/*****************************************************************************
1067 * Name :
1068 * Purpose :
1069 * Parameters:
1070 * Variables :
1071 * Result :
1072 * Remark :
1073 * Status : UNTESTED STUB
1074 *
1075 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
1076 *****************************************************************************/
1077
1078ODINFUNCTION0(BOOL,OS2WSAIsBlocking)
1079{
1080 return WSAIsBlocking();
1081}
1082
1083
1084/*****************************************************************************
1085 * Name :
1086 * Purpose :
1087 * Parameters:
1088 * Variables :
1089 * Result :
1090 * Remark :
1091 * Status : UNTESTED STUB
1092 *
1093 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
1094 *****************************************************************************/
1095
1096ODINFUNCTION0(int,OS2WSAUnhookBlockingHook)
1097{
1098 return WSAUnhookBlockingHook();
1099}
1100
1101
1102/*****************************************************************************
1103 * Name :
1104 * Purpose :
1105 * Parameters:
1106 * Variables :
1107 * Result :
1108 * Remark :
1109 * Status : UNTESTED STUB
1110 *
1111 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
1112 *****************************************************************************/
1113
1114ODINFUNCTION1(PFN,OS2WSASetBlockingHook,
1115 PFN,lpBlockFunc)
1116{
1117 return(WSASetBlockingHook(lpBlockFunc));
1118}
1119
1120
1121/*****************************************************************************
1122 * Name :
1123 * Purpose :
1124 * Parameters:
1125 * Variables :
1126 * Result :
1127 * Remark :
1128 * Status : UNTESTED STUB
1129 *
1130 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
1131 *****************************************************************************/
1132
1133ODINFUNCTION0(int,OS2WSACancelBlockingCall)
1134{
1135 return(WSACancelBlockingCall());
1136}
1137
1138
1139/*****************************************************************************
1140 * Name :
1141 * Purpose :
1142 * Parameters:
1143 * Variables :
1144 * Result :
1145 * Remark :
1146 * Status : UNTESTED STUB
1147 *
1148 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
1149 *****************************************************************************/
1150
1151ODINFUNCTION6(LHANDLE,OS2WSAAsyncGetServByName,
1152 HWND,hWnd,
1153 u_int,wMsg,
1154 const char *,name,
1155 const char *,proto,
1156 char *,buf,
1157 int,buflen)
1158{
1159 return(WSAAsyncGetServByName(hWnd,
1160 wMsg,
1161 name,
1162 proto,
1163 buf,
1164 buflen));
1165}
1166
1167
1168/*****************************************************************************
1169 * Name :
1170 * Purpose :
1171 * Parameters:
1172 * Variables :
1173 * Result :
1174 * Remark :
1175 * Status : UNTESTED STUB
1176 *
1177 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
1178 *****************************************************************************/
1179
1180ODINFUNCTION6(LHANDLE,OS2WSAAsyncGetServByPort,
1181 HWND,hWnd,
1182 u_int,wMsg,
1183 int,port,
1184 const char *,proto,
1185 char *,buf,
1186 int,buflen)
1187{
1188 return(WSAAsyncGetServByPort(hWnd,
1189 wMsg,
1190 port,
1191 proto,
1192 buf,
1193 buflen));
1194}
1195
1196
1197/*****************************************************************************
1198 * Name :
1199 * Purpose :
1200 * Parameters:
1201 * Variables :
1202 * Result :
1203 * Remark :
1204 * Status : UNTESTED STUB
1205 *
1206 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
1207 *****************************************************************************/
1208
1209ODINFUNCTION5(LHANDLE,OS2WSAAsyncGetProtoByName,
1210 HWND,hWnd,
1211 u_int,wMsg,
1212 const char *,name,
1213 char *,buf,
1214 int,buflen)
1215{
1216 return(WSAAsyncGetProtoByName(hWnd,
1217 wMsg,
1218 name,
1219 buf,
1220 buflen));
1221}
1222
1223
1224/*****************************************************************************
1225 * Name :
1226 * Purpose :
1227 * Parameters:
1228 * Variables :
1229 * Result :
1230 * Remark :
1231 * Status : UNTESTED STUB
1232 *
1233 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
1234 *****************************************************************************/
1235
1236ODINFUNCTION5(LHANDLE,OS2WSAAsyncGetProtoByNumber,
1237 HWND,hWnd,
1238 u_int,wMsg,
1239 int,number,
1240 char *,buf,
1241 int,buflen)
1242{
1243 return(WSAAsyncGetProtoByNumber(hWnd,
1244 wMsg,
1245 number,
1246 buf,
1247 buflen));
1248}
1249
1250
1251/*****************************************************************************
1252 * Name :
1253 * Purpose :
1254 * Parameters:
1255 * Variables :
1256 * Result :
1257 * Remark :
1258 * Status : UNTESTED STUB
1259 *
1260 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
1261 *****************************************************************************/
1262
1263ODINFUNCTION5(LHANDLE,OS2WSAAsyncGetHostByName,
1264 HWND,hWnd,
1265 u_int,wMsg,
1266 const char *,name,
1267 char *,buf,
1268 int,buflen)
1269{
1270 return(WSAAsyncGetHostByName(hWnd,
1271 wMsg,
1272 name,
1273 buf,
1274 buflen));
1275}
1276
1277
1278/*****************************************************************************
1279 * Name :
1280 * Purpose :
1281 * Parameters:
1282 * Variables :
1283 * Result :
1284 * Remark :
1285 * Status : UNTESTED STUB
1286 *
1287 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
1288 *****************************************************************************/
1289
1290ODINFUNCTION7(LHANDLE,OS2WSAAsyncGetHostByAddr,
1291 HWND,hWnd,
1292 u_int,wMsg,
1293 const char *,addr,
1294 int,len,
1295 int,type,
1296 char *,buf,
1297 int,buflen)
1298{
1299 return(WSAAsyncGetHostByAddr(hWnd,
1300 wMsg,
1301 addr,
1302 len,
1303 type,
1304 buf,
1305 buflen));
1306}
1307
1308
1309/*****************************************************************************
1310 * Name :
1311 * Purpose :
1312 * Parameters:
1313 * Variables :
1314 * Result :
1315 * Remark :
1316 * Status : UNTESTED STUB
1317 *
1318 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
1319 *****************************************************************************/
1320
1321ODINFUNCTION1(int,OS2WSACancelAsyncRequest,
1322 LHANDLE,hAsyncTaskHandle)
1323{
1324 return(WSACancelAsyncRequest(hAsyncTaskHandle));
1325}
1326
1327
1328/*****************************************************************************
1329 * Name :
1330 * Purpose :
1331 * Parameters:
1332 * Variables :
1333 * Result :
1334 * Remark :
1335 * Status : UNTESTED STUB
1336 *
1337 * Author : Patrick Haller [Thu, 1999/11/25 23:00]
1338 *****************************************************************************/
1339
1340ODINFUNCTION4(int,OS2WSAAsyncSelect,
1341 SOCKET,s,
1342 HWND,hWnd,
1343 u_int,wMsg,
1344 long,lEvent)
1345{
1346 int rc;
1347// int iError;
1348 HWND hwndOS2 = Win32ToOS2Handle(hWnd);
1349 ULONG ulNewID;
1350
1351 static HWND hwndRelay; // handle to our relay window
1352
1353 if (hwndRelay == NULL) // already initialized ?
1354 hwndRelay = RelayInitialize(hwndOS2);
1355
1356 /* @@@PH: our source window doesn't seem to have an anchor block.
1357 Docs suggest we've missed to call WinInitialize on the
1358 caller thread.
1359
1360 Cause however is the Open32 handle is (of course!) invalid
1361 in plain PM Window Manager! -> use DAPWSOCK
1362
1363 Unfortunately, DAPWSOCK calls WinQueryAnchorBlock(hOpen32), too.
1364 So, we're stuck until I resolve hWnd to it's valid PM
1365 counterpart.
1366
1367 new problem: we've ultimately got to use PostMessageA instead
1368 anything else. => create invisible msg relay window:
1369 - hMsg = registerMessage(hWnd, wMsg)
1370 - call WSAAsyncSelect with object window handle
1371 - overwrite hWnd relay for "same handles"
1372 */
1373
1374 // add event to list or remove any list entry in case of WSAAsyncSelect(hwnd,0,0)
1375 if ( (wMsg == 0) && (lEvent == 0) )
1376 {
1377 // remove entry from list
1378 RelayFreeByHwnd(hWnd);
1379 }
1380 else
1381 // add entry to list
1382 ulNewID = RelayAlloc(hWnd, wMsg);
1383
1384 rc = WSAAsyncSelect(s,
1385 hwndRelay,
1386 ulNewID,
1387 lEvent);
1388
1389// iError = WSAGetLastError();
1390// dprintf(("res=%d, err=%d\n",
1391// rc,
1392// iError));
1393 return (rc);
1394}
Note: See TracBrowser for help on using the repository browser.