# -*- Mode: Python; tab-width: 4 -*-

# set the global SO_OPENTYPE parameter

import struct
import windll
import winerror

wsock32 = windll.module ('wsock32')

option = windll.membuf (4)
option_len = windll.membuf (4)

option_len.write (struct.pack ('l', 4))

INVALID_SOCKET		= -1
SOCKET_SOL			= 0xffff

#
# Option for opening sockets for synchronous access.
#

SO_OPENTYPE     		= 0x7008

SO_SYNCHRONOUS_ALERT   	= 0x10
SO_SYNCHRONOUS_NONALERT	= 0x20

def set_sync_option (on=1):
	result = wsock32.getsockopt (
		INVALID_SOCKET,
		SOCKET_SOL,
		SO_OPENTYPE,
		option,
		option_len
		)
	if result:
		raise SystemError, "getsockopt: (%d)" % (
			wsock32.WSAGetLastError()
			)
	else:
		old = struct.unpack ('l', option.read())[0]
	if on:
		new = old | SO_SYNCHRONOUS_ALERT
	else:
		new = old & (~SO_SYNCHRONOUS_ALERT)
	option.write (struct.pack ('l', new))
	result = wsock32.setsockopt (
		INVALID_SOCKET,
		SOCKET_SOL,
		SO_OPENTYPE,
		option,
		option_len
		)
	if result:
		raise SystemError, "getsockopt: (%d)" % (
			wsock32.WSAGetLastError()
			)
	return old

def sync_on():
	return set_sync_option (1)

def sync_off():
	return set_sync_option (0)