Mercurial > emacs
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 |