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

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

Fix: relay window implemented

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