| 发表于:2008-01-18 14:04:077楼 得分:0 |
the conditionfunc is a placeholder for the application-specified callback function. the actual condition function must reside in a dll or application module. it is exported in the module definition file. int callback conditionfunc( in lpwsabuf lpcallerid, in lpwsabuf lpcallerdata, in out lpqos lpsqos, in out lpqos lpgqos, in lpwsabuf lpcalleeid, out lpwsabuf lpcalleedata, out group far *g, in dword_ptr dwcallbackdata ); +socket winapi wsaaccept( socket s, struct ws_sockaddr *addr, lpint addrlen, + lpconditionproc lpfncondition, dword dwcallbackdata) +{ + + int ret = 0, size = 0; + wsabuf callerid, callerdata, calleeid, calleedata; + /* qos sqos, gqos; */ + group g; + socket cs; + sockaddr s_addr, d_addr; + + trace("socket %ui, sockaddr %p, addrlen %p, fncondition %p, dwcallbackd ata %ld\n", + s, addr, addrlen, lpfncondition, dwcallbackdata); + + + size = sizeof(s_addr); + cs = ws_accept(s, &s_addr, &size); + + if (cs == socket_error) return socket_error; + + callerid.buf = (char *)&s_addr; + callerid.len = sizeof(s_addr); + + callerdata.buf = null; + callerdata.len = (ulong)null; + + ws_getsockname(cs, &d_addr, &size); + + calleeid.buf = (char *)&d_addr; + calleeid.len = sizeof(d_addr); + + + ret = (*lpfncondition)(&callerid, &callerdata, null, null, + &calleeid, &calleedata, &g, dwcallbackdata); + + switch (ret) + { + case cf_accept: + if (addr && addrlen) + addr = memcpy(addr, &s_addr, (*addrlen > size) ? size : *addrlen ); + return cs; + case cf_defer: + setlasterror(wsatry_again); + return socket_error; + case cf_reject: + ws_closesocket(cs); + setlasterror(wsaeconnrefused); + return socket_error; + default: + fixme("unknown return type from condition function\n"); + setlasterror(wsaenotsock); + return socket_error; + } + + setlasterror(wsaenotsock); + return socket_error; | | |
|