comparison src/w32.c @ 45090:c9aa2603d1f7

(sys_getpeername, fcntl): New functions. (_sys_read_ahead): Temporarily block on non-blocking sockets.
author Jason Rumney <jasonr@gnu.org>
date Fri, 03 May 2002 20:40:03 +0000
parents f46982d9ac50
children dd21f49754a1
comparison
equal deleted inserted replaced
45089:3e9cb1567659 45090:c9aa2603d1f7
82 #undef ntohs 82 #undef ntohs
83 #undef inet_addr 83 #undef inet_addr
84 #undef gethostname 84 #undef gethostname
85 #undef gethostbyname 85 #undef gethostbyname
86 #undef getservbyname 86 #undef getservbyname
87 #undef getpeername
87 #undef shutdown 88 #undef shutdown
88 #undef setsockopt 89 #undef setsockopt
89 #undef listen 90 #undef listen
90 #undef getsockname 91 #undef getsockname
91 #undef accept 92 #undef accept
2422 u_short (PASCAL *pfn_ntohs) (u_short netshort); 2423 u_short (PASCAL *pfn_ntohs) (u_short netshort);
2423 unsigned long (PASCAL *pfn_inet_addr) (const char * cp); 2424 unsigned long (PASCAL *pfn_inet_addr) (const char * cp);
2424 int (PASCAL *pfn_gethostname) (char * name, int namelen); 2425 int (PASCAL *pfn_gethostname) (char * name, int namelen);
2425 struct hostent * (PASCAL *pfn_gethostbyname) (const char * name); 2426 struct hostent * (PASCAL *pfn_gethostbyname) (const char * name);
2426 struct servent * (PASCAL *pfn_getservbyname) (const char * name, const char * proto); 2427 struct servent * (PASCAL *pfn_getservbyname) (const char * name, const char * proto);
2427 2428 int (PASCAL *pfn_getpeername) (SOCKET s, struct sockaddr *addr, int * namelen);
2428 int (PASCAL *pfn_setsockopt) (SOCKET s, int level, int optname, 2429 int (PASCAL *pfn_setsockopt) (SOCKET s, int level, int optname,
2429 const char * optval, int optlen); 2430 const char * optval, int optlen);
2430 int (PASCAL *pfn_listen) (SOCKET s, int backlog); 2431 int (PASCAL *pfn_listen) (SOCKET s, int backlog);
2431 int (PASCAL *pfn_getsockname) (SOCKET s, struct sockaddr * name, 2432 int (PASCAL *pfn_getsockname) (SOCKET s, struct sockaddr * name,
2432 int * namelen); 2433 int * namelen);
2502 LOAD_PROC( ntohs ); 2503 LOAD_PROC( ntohs );
2503 LOAD_PROC( inet_addr ); 2504 LOAD_PROC( inet_addr );
2504 LOAD_PROC( gethostname ); 2505 LOAD_PROC( gethostname );
2505 LOAD_PROC( gethostbyname ); 2506 LOAD_PROC( gethostbyname );
2506 LOAD_PROC( getservbyname ); 2507 LOAD_PROC( getservbyname );
2508 LOAD_PROC( getpeername );
2507 LOAD_PROC( WSACleanup ); 2509 LOAD_PROC( WSACleanup );
2508 LOAD_PROC( setsockopt ); 2510 LOAD_PROC( setsockopt );
2509 LOAD_PROC( listen ); 2511 LOAD_PROC( listen );
2510 LOAD_PROC( getsockname ); 2512 LOAD_PROC( getsockname );
2511 LOAD_PROC( accept ); 2513 LOAD_PROC( accept );
2921 set_errno (); 2923 set_errno ();
2922 return serv; 2924 return serv;
2923 } 2925 }
2924 2926
2925 int 2927 int
2928 sys_getpeername (int s, struct sockaddr *addr, int * namelen)
2929 {
2930 if (winsock_lib == NULL)
2931 {
2932 h_errno = ENETDOWN;
2933 return SOCKET_ERROR;
2934 }
2935
2936 check_errno ();
2937 if (fd_info[s].flags & FILE_SOCKET)
2938 {
2939 int rc = pfn_getpeername (SOCK_HANDLE (s), addr, namelen);
2940 if (rc == SOCKET_ERROR)
2941 set_errno ();
2942 return rc;
2943 }
2944 h_errno = ENOTSOCK;
2945 return SOCKET_ERROR;
2946 }
2947
2948
2949 int
2926 sys_shutdown (int s, int how) 2950 sys_shutdown (int s, int how)
2927 { 2951 {
2928 if (winsock_lib == NULL) 2952 if (winsock_lib == NULL)
2929 { 2953 {
2930 h_errno = ENETDOWN; 2954 h_errno = ENETDOWN;
3067 { 3091 {
3068 int rc = pfn_sendto (SOCK_HANDLE (s), buf, len, flags, to, tolen); 3092 int rc = pfn_sendto (SOCK_HANDLE (s), buf, len, flags, to, tolen);
3069 if (rc == SOCKET_ERROR) 3093 if (rc == SOCKET_ERROR)
3070 set_errno (); 3094 set_errno ();
3071 return rc; 3095 return rc;
3096 }
3097 h_errno = ENOTSOCK;
3098 return SOCKET_ERROR;
3099 }
3100
3101 /* Windows does not have an fcntl function. Provide an implementation
3102 solely for making sockets non-blocking. */
3103 int
3104 fcntl (int s, int cmd, int options)
3105 {
3106 if (winsock_lib == NULL)
3107 {
3108 h_errno = ENETDOWN;
3109 return -1;
3110 }
3111
3112 check_errno ();
3113 if (fd_info[s].flags & FILE_SOCKET)
3114 {
3115 if (cmd == F_SETFL && options == O_NDELAY)
3116 {
3117 unsigned long nblock = 1;
3118 int rc = pfn_ioctlsocket (SOCK_HANDLE (s), FIONBIO, &nblock);
3119 if (rc == SOCKET_ERROR)
3120 set_errno();
3121 /* Keep track of the fact that we set this to non-blocking. */
3122 fd_info[s].flags |= FILE_NDELAY;
3123 return rc;
3124 }
3125 else
3126 {
3127 h_errno = EINVAL;
3128 return SOCKET_ERROR;
3129 }
3072 } 3130 }
3073 h_errno = ENOTSOCK; 3131 h_errno = ENOTSOCK;
3074 return SOCKET_ERROR; 3132 return SOCKET_ERROR;
3075 } 3133 }
3076 3134
3255 Sleep (0); 3313 Sleep (0);
3256 } 3314 }
3257 } 3315 }
3258 #ifdef HAVE_SOCKETS 3316 #ifdef HAVE_SOCKETS
3259 else if (fd_info[fd].flags & FILE_SOCKET) 3317 else if (fd_info[fd].flags & FILE_SOCKET)
3260 rc = pfn_recv (SOCK_HANDLE (fd), &cp->chr, sizeof (char), 0); 3318 {
3319 unsigned long nblock = 0;
3320 /* We always want this to block, so temporarily disable NDELAY. */
3321 if (fd_info[fd].flags & FILE_NDELAY)
3322 pfn_ioctlsocket (SOCK_HANDLE (fd), FIONBIO, &nblock);
3323
3324 rc = pfn_recv (SOCK_HANDLE (fd), &cp->chr, sizeof (char), 0);
3325
3326 if (fd_info[fd].flags & FILE_NDELAY)
3327 {
3328 nblock = 1;
3329 pfn_ioctlsocket (SOCK_HANDLE (fd), FIONBIO, &nblock);
3330 }
3331 }
3261 #endif 3332 #endif
3262 3333
3263 if (rc == sizeof (char)) 3334 if (rc == sizeof (char))
3264 cp->status = STATUS_READ_SUCCEEDED; 3335 cp->status = STATUS_READ_SUCCEEDED;
3265 else 3336 else