[Win32utils-devel] FFI and errno on Windows

Heesob Park phasis at gmail.com
Sun Apr 15 14:29:42 UTC 2012


Hi,

2012/4/12 Daniel Berger <djberg96 at gmail.com>

> I'm a bit confused by error handling for posixy functions on Windows.
> Consider the following code where I'm intentionally passing a bad
> template to _mktemp. The docs say it should return EINVAL. My first
> problem is not knowing exactly what the docs mean when they talk about
> EINVAL on Windows. My second problem is that _get_errno returns a
> different value that FFI.errno, and FFI.errno seems to return the same
> value as GetLastError().
>
> require 'ffi'
> class Windows
>  extend FFI::Library
>  ffi_lib FFI::Library::LIBC
>
>  attach_function :_mktemp, [:pointer], :string
>  attach_function :_get_errno, [:pointer], :int
>
>  ffi_lib :kernel32
>
>  attach_function :GetLastError, [], :int
>
>  def self.temp(template)
>    result = _mktemp(template)
>
>    err = get_err_num # 22
>    #err = FFI.errno # 158
>    #err = GetLastError() # 158
>
>    if result.nil?
>      raise SystemCallError, err, '_mktemp'
>    end
>
>    result
>  end
>
>  def self.get_err_num
>    ptr = FFI::MemoryPointer.new(:int)
>
>    if _get_errno(ptr) != 0
>      raise SystemCallError, FFI.errno, '_get_errno'
>    end
>
>    ptr.read_int
>  end
> end
>
> Windows.temp('xx')
>
> Any insight on the subject of GetLastError vs _get_errno would be
> greatly appreciated. My google skills seem to be failing.
>
>
As you know, _mktemp is a function of C Runtime Library and provides
compatibility with mktemp of Linux.
According to the Linux manual page (
http://www.kernel.org/doc/man-pages/online/pages/man3/mktemp.3.html):

 EINVAL means that the last six characters of template were not XXXXXX.


FFI.errno is same to GetLastError() on Windows by the following lines of
LastError.c

void
rbffi_save_errno(void)
{
    int error = 0;

#ifdef _WIN32
    error = GetLastError();
#else
    error = errno;
#endif

    thread_data_get()->td_errno = error;
}

I think errno and GetLastError must be separated Windows.

The doc of mktemp mentioned only errno value. Thus GetLastError() value is
undetermined in this case.

Regards,

Park Heesob
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/win32utils-devel/attachments/20120415/6b0e51ac/attachment.html>


More information about the win32utils-devel mailing list