Please ignore this patch, I will send another one soon. Thanks, Alin Balutoiu.
> -----Original Message----- > From: Alin Balutoiu > Sent: Tuesday, January 3, 2017 5:17 PM > To: d...@openvswitch.org > Cc: Alin Balutoiu <abalut...@cloudbasesolutions.com> > Subject: [PATCH V2 1/5] Python tests: Add winutils.py module > > From: Alin Balutoiu <abalut...@cloudbasesolutions.com> > > This patch adds a new python module which contains helper functions. These > will be neccessary for the Windows implementation. > > They cover the following aspects: sockets and namedpipes. > > Signed-off-by: Alin-Gheorghe Balutoiu <abalut...@cloudbasesolutions.com> > --- > V2: No changes. > --- > python/automake.mk | 3 +- > python/ovs/winutils.py | 226 > +++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 > python/ovs/winutils.py > > diff --git a/python/automake.mk b/python/automake.mk index > 1c8fa38..e417483 100644 > --- a/python/automake.mk > +++ b/python/automake.mk > @@ -34,7 +34,8 @@ ovs_pyfiles = \ > python/ovs/unixctl/server.py \ > python/ovs/util.py \ > python/ovs/version.py \ > - python/ovs/vlog.py > + python/ovs/vlog.py \ > + python/ovs/winutils.py > > # These python files are used at build time but not runtime, # so they are > not installed. > diff --git a/python/ovs/winutils.py b/python/ovs/winutils.py new file mode > 100644 index 0000000..0694ce2 > --- /dev/null > +++ b/python/ovs/winutils.py > @@ -0,0 +1,226 @@ > +# Copyright (c) 2016 Cloudbase Solutions Srl # # Licensed under the > +Apache License, Version 2.0 (the "License"); # you may not use this > +file except in compliance with the License. > +# You may obtain a copy of the License at: > +# > +# http://www.apache.org/licenses/LICENSE-2.0 > +# > +# Unless required by applicable law or agreed to in writing, software # > +distributed under the License is distributed on an "AS IS" BASIS, # > +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > +# See the License for the specific language governing permissions and # > +limitations under the License. > + > +import six > +import sys > + > +if sys.platform != 'win32': > + raise Exception("Intented to use only on Windows") > +else: > + import pywintypes > + import winerror > + import win32pipe > + import win32con > + import win32security > + import win32file > + import win32event > + > + > +def close_handle(handle, logger=None): > + try: > + win32file.CloseHandle(handle) > + return None > + except pywintypes.error as e: > + if logger is not None: > + logger("failed to close handle: %s" % e.strerror) > + return e.winerror > + > + > +def windows_create_pipe(sAttrs=-1, nSize=None): > + # Default values if parameters are not passed > + if sAttrs == -1: > + sAttrs = win32security.SECURITY_ATTRIBUTES() > + sAttrs.bInheritHandle = 1 > + if nSize is None: > + # If this parameter is zero, the system uses the default buffer size. > + nSize = 0 > + > + try: > + (read_pipe, write_pipe) = win32pipe.CreatePipe(sAttrs, nSize) > + except pywintypes.error: > + raise > + > + return (read_pipe, write_pipe) > + > + > +def windows_read_pipe(fd, length): > + try: > + (error, data) = win32file.ReadFile(fd, length) > + return error, data > + except pywintypes.error as e: > + return e.winerror, "" > + > + > +def create_file(filename, desiredAccess=None, shareMode=None, > attributes=-1, > + CreationDisposition=None, flagsAndAttributes=None, > + hTemplateFile=-1): > + # Default values if parameters are not passed > + if desiredAccess is None: > + desiredAccess = win32file.GENERIC_READ | win32file.GENERIC_WRITE > + if shareMode is None: > + shareMode = 0 > + if attributes == -1: > + # attributes can be None > + attributes = None > + if CreationDisposition is None: > + CreationDisposition = win32file.OPEN_EXISTING > + if flagsAndAttributes is None: > + flagsAndAttributes = (win32file.FILE_ATTRIBUTE_NORMAL | > + win32file.FILE_FLAG_OVERLAPPED | > + win32file.FILE_FLAG_NO_BUFFERING) > + if hTemplateFile == -1: > + hTemplateFile = None > + > + try: > + npipe = win32file.CreateFile(filename, > + desiredAccess, > + shareMode, > + attributes, > + CreationDisposition, > + flagsAndAttributes, > + hTemplateFile) > + except pywintypes.error: > + raise > + return npipe > + > + > +def write_file(handle, data, overlapped=None): > + try: > + (errCode, nBytesWritten) = win32file.WriteFile(handle, > + data, > + overlapped) > + # Note: win32file.WriteFile doesn't throw an exception > + # in case it receives ERROR_IO_PENDING. > + return (errCode, nBytesWritten) > + except pywintypes.error as e: > + return (e.winerror, 0) > + > + > +def read_file(handle, bufsize, overlapped=None): > + try: > + # Note: win32file.ReadFile doesn't throw an exception > + # in case it receives ERROR_IO_PENDING. > + (errCode, read_buffer) = win32file.ReadFile( > + handle, bufsize, overlapped) > + return (errCode, read_buffer) > + except pywintypes.error as e: > + return (e.winerror, "") > + > + > +def create_named_pipe(pipename, openMode=None, pipeMode=None, > + nMaxInstances=None, nOutBufferSize=None, > + nInBufferSize=None, nDefaultTimeOut=None, > + saAttr=-1): > + # Default values if parameters are not passed > + if openMode is None: > + openMode = win32con.PIPE_ACCESS_DUPLEX | > win32con.FILE_FLAG_OVERLAPPED > + if pipeMode is None: > + pipeMode = (win32con.PIPE_TYPE_MESSAGE | > + win32con.PIPE_READMODE_BYTE | > + win32con.PIPE_WAIT) > + if nMaxInstances is None: > + nMaxInstances = 64 > + if nOutBufferSize is None: > + nOutBufferSize = 65000 > + if nInBufferSize is None: > + nInBufferSize = 65000 > + if nDefaultTimeOut is None: > + nDefaultTimeOut = 0 > + if saAttr == -1: > + # saAttr can be None > + saAttr = win32security.SECURITY_ATTRIBUTES() > + saAttr.bInheritHandle = 1 > + > + try: > + npipe = win32pipe.CreateNamedPipe(pipename, > + openMode, > + pipeMode, > + nMaxInstances, > + nOutBufferSize, > + nInBufferSize, > + nDefaultTimeOut, > + saAttr) > + > + if npipe == win32file.INVALID_HANDLE_VALUE: > + return None > + > + return npipe > + except pywintypes.error: > + return None > + > + > +def set_pipe_mode(hPipe, mode=-1, maxCollectionCount=None, > + collectDataTimeout=None): > + # Default values if parameters are not passed > + if mode == -1: > + mode = win32pipe.PIPE_READMODE_BYTE > + try: > + win32pipe.SetNamedPipeHandleState( > + hPipe, mode, maxCollectionCount, collectDataTimeout) > + except pywintypes.error: > + raise > + > + > +def connect_named_pipe(pipe_handle, overlapped=None): > + try: > + # If the result of ConnectNamedPipe is ERROR_IO_PENDING or > + # ERROR_PIPE_CONNECTED, then this value is returned. > + # All other error values raise a win32 exception > + error = win32pipe.ConnectNamedPipe(pipe_handle, overlapped) > + return error > + except pywintypes.error as e: > + return e.winerror > + > + > +def get_pipe_name(name): > + name = name.replace('/', '') > + name = name.replace('\\', '') > + name = "\\\\.\\pipe\\" + name > + return name > + > + > +def get_overlapped_result(handle, overlapped=None, bWait=False): > + try: > + return win32file.GetOverlappedResult(handle, overlapped, bWait) > + except pywintypes.error: > + raise > + > + > +def get_decoded_buffer(recvBuffer): > + if six.PY3: > + return bytes(recvBuffer).decode("utf-8") > + else: > + return str(recvBuffer) > + > + > +def get_encoded_buffer(buff): > + # Python 3 has separate types for strings and bytes. > + # We must have bytes here. > + if not isinstance(buff, six.binary_type): > + if six.PY3: > + buff = six.binary_type(buff, 'utf-8') > + else: > + buff = six.binary_type(buff) > + return buff > + > + > +def get_new_event(sa=None, bManualReset=True, bInitialState=True, > + objectName=None): > + return win32event.CreateEvent(sa, bManualReset, bInitialState, > +objectName) > + > + > +pipe_disconnected_errors = [winerror.ERROR_PIPE_NOT_CONNECTED, > + winerror.ERROR_BAD_PIPE, > + winerror.ERROR_NO_DATA, > + winerror.ERROR_BROKEN_PIPE] > -- > 2.10.0.windows.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev