sane-project-website/old-archive/1999-04/0165.html

742 wiersze
24 KiB
HTML

<!-- received="Fri Apr 9 05:44:52 1999 PDT" -->
<!-- sent="Fri, 9 Apr 1999 14:46:43 +0200" -->
<!-- name="Petter Reinholdtsen" -->
<!-- email="pere@hungry.com" -->
<!-- subject="Win32 patch for dll and net backend" -->
<!-- id="199904091246.OAA04896@lee.Cc.Uit.No" -->
<!-- inreplyto="" -->
<title>sane-devel: Win32 patch for dll and net backend</title>
<h1>Win32 patch for dll and net backend</h1>
<b>Petter Reinholdtsen</b> (<a href="mailto:pere@hungry.com"><i>pere@hungry.com</i></a>)<br>
<i>Fri, 9 Apr 1999 14:46:43 +0200</i>
<p>
<ul>
<li> <b>Messages sorted by:</b> <a href="date.html#165">[ date ]</a><a href="index.html#165">[ thread ]</a><a href="subject.html#165">[ subject ]</a><a href="author.html#165">[ author ]</a>
<!-- next="start" -->
<li> <b>Next message:</b> <a href="0166.html">Petter Reinholdtsen: "May sane_init fail?"</a>
<li> <b>Previous message:</b> <a href="0164.html">Petter Reinholdtsen: "Re: Linking non-libtool libraries into a new backend?"</a>
<!-- nextthread="start" -->
<!-- reply="end" -->
</ul>
<!-- body="start" -->
After reading the source for WinSANE 0.9, I started restructuring the<br>
net backend, and intregrating Win32 changes to the dll backend.<br>
<p>
The most importand change all backends should do, is add DLLEXPORT and<br>
DLLCALL before all DLL entry points.<br>
<p>
I beleave the dll backend should be functioning, but I have not been<br>
able to test it - I lack a windows box. :-) It also includes some<br>
cleanup, which should make the implementation smaller and better.<br>
<p>
The net changes are mostly copied from WinSANE 0.9, but I did some<br>
changes to make it more portable.<br>
<p>
This patch is also available from<br>
&lt;URL:<a href="http://www.student.uit.no/~pere/linux/">http://www.student.uit.no/~pere/linux/</a>&gt;.<br>
<p>
David, are you interested in including these patches in 1.01, or<br>
should it be postponed until later?<br>
<p>
diff -ru sane-pre1.01-4/ChangeLog sane-pre1.01-4-pere/ChangeLog<br>
--- sane-pre1.01-4/ChangeLog Sun Apr 4 01:17:20 1999<br>
+++ sane-pre1.01-4-pere/ChangeLog Fri Apr 9 14:25:28 1999<br>
@@ -1,3 +1,8 @@<br>
+1999-04-08 Petter Reinholdtsen &lt;<a href="mailto:pere@td.org.uit.no">pere@td.org.uit.no</a>&gt;<br>
+ * include/sane/config.h.in include/sane/sane.h backend/dll.c<br>
+ backend/net.c: Added initial Win32 patches. Win32 dll support<br>
+ should be complete.<br>
+ <br>
1999-04-03 David Mosberger-Tang &lt;<a href="mailto:David.Mosberger@acm.org">David.Mosberger@acm.org</a>&gt;<br>
<br>
* include/sane/sanei_debug.h: Define sanei_debug_BACKEND_NAME only<br>
diff -ru sane-pre1.01-4/backend/dll.c sane-pre1.01-4-pere/backend/dll.c<br>
--- sane-pre1.01-4/backend/dll.c Sun Feb 28 00:51:37 1999<br>
+++ sane-pre1.01-4-pere/backend/dll.c Fri Apr 9 01:20:39 1999<br>
@@ -54,6 +54,9 @@<br>
#include &lt;stdio.h&gt;<br>
#include &lt;stdlib.h&gt;<br>
#include &lt;string.h&gt;<br>
+#ifdef HAVE_WINDOWS_H<br>
+# include &lt;windows.h&gt;<br>
+#endif<br>
<br>
#if defined(HAVE_DLOPEN) &amp;&amp; defined(HAVE_DLFCN_H)<br>
# include &lt;dlfcn.h&gt;<br>
@@ -68,12 +71,29 @@<br>
# ifndef RTLD_LAZY<br>
# define RTLD_LAZY 1<br>
# endif<br>
+# if defined(_AIX)<br>
+# define DLL_PATH_ENV "LIBPATH"<br>
+# else<br>
+# define DLL_PATH_ENV "LD_LIBRARY_PATH"<br>
+# endif<br>
+# define DLL_PATH_SEPARATOR ":"<br>
+# define DLL_SLASH "/"<br>
+# define DLL_NAME "libsane-%s.so." STRINGIFY(V_MAJOR)<br>
# define HAVE_DLL<br>
-#endif<br>
-<br>
+#elif defined (HAVE_SHL_LOAD) &amp;&amp; defined(HAVE_DL_H)<br>
/* HP/UX DLL support */<br>
-#if defined (HAVE_SHL_LOAD) &amp;&amp; defined(HAVE_DL_H)<br>
# include &lt;dl.h&gt;<br>
+# define DLL_PATH_ENV "SHLIB_PATH"<br>
+# define DLL_PATH_SEPARATOR ":"<br>
+# define DLL_SLASH "/"<br>
+# define DLL_NAME "libsane-%s.sl." STRINGIFY(V_MAJOR)<br>
+# define HAVE_DLL<br>
+#elif defined(HAVE_LOADLIBRARY)<br>
+/* Win32 */<br>
+# define DLL_PATH_ENV "PATH"<br>
+# define DLL_PATH_SEPARATOR ";"<br>
+# define DLL_SLASH "\\"<br>
+# define DLL_NAME "sane%s.dll"<br>
# define HAVE_DLL<br>
#endif<br>
<br>
@@ -230,24 +250,11 @@<br>
load (struct backend *be)<br>
{<br>
#ifdef HAVE_DLL<br>
- int mode = 0;<br>
char *funcname, *src, *dir, *path = 0;<br>
char libname[PATH_MAX];<br>
int i;<br>
FILE *fp = 0;<br>
<br>
-#if defined(HAVE_DLOPEN)<br>
-# define PREFIX "libsane-"<br>
-# define POSTFIX ".so.%u"<br>
- mode = getenv ("LD_BIND_NOW") ? RTLD_NOW : RTLD_LAZY;<br>
-#elif defined(HAVE_SHL_LOAD)<br>
-# define PREFIX "libsane-"<br>
-# define POSTFIX ".sl.%u"<br>
- mode = BIND_DEFERRED;<br>
-#else<br>
-# error "Tried to compile unsupported DLL."<br>
-#endif /* HAVE_DLOPEN */<br>
-<br>
DBG(1, "loading backend %s\n", be-&gt;name);<br>
<br>
/* initialize all ops to "unsupported" so we can "use" the backend<br>
@@ -260,28 +267,22 @@<br>
dir = STRINGIFY(LIBDIR);<br>
while (dir)<br>
{<br>
- snprintf (libname, sizeof (libname), "%s/"PREFIX"%s"POSTFIX,<br>
- dir, be-&gt;name, V_MAJOR);<br>
+ snprintf (libname, sizeof (libname), "%s" DLL_SLASH DLL_NAME,<br>
+ dir, be-&gt;name);<br>
fp = fopen (libname, "r");<br>
if (fp)<br>
break;<br>
<br>
if (!path)<br>
{<br>
- path = getenv ("LD_LIBRARY_PATH");<br>
- if (!path)<br>
- {<br>
- path = getenv ("SHLIB_PATH"); /* for HP-UX */<br>
- if (!path)<br>
- path = getenv ("LIBPATH"); /* for AIX */<br>
- }<br>
+ path = getenv (DLL_PATH_ENV);<br>
if (!path)<br>
break;<br>
<br>
path = strdup (path);<br>
src = path;<br>
}<br>
- dir = strsep (&amp;src, ":");<br>
+ dir = strsep (&amp;src, DLL_PATH_SEPARATOR);<br>
}<br>
if (path)<br>
free (path);<br>
@@ -294,9 +295,11 @@<br>
DBG(2, "dlopen()ing `%s'\n", libname);<br>
<br>
#ifdef HAVE_DLOPEN<br>
- be-&gt;handle = dlopen (libname, mode);<br>
+ be-&gt;handle = dlopen (libname, getenv ("LD_BIND_NOW") ? RTLD_NOW : RTLD_LAZY);<br>
#elif defined(HAVE_SHL_LOAD)<br>
- be-&gt;handle = (shl_t)shl_load (libname, mode, 0L);<br>
+ be-&gt;handle = (shl_t)shl_load (libname, BIND_DEFERRED, 0L);<br>
+#elif defined(HAVE_LOADLIBRARY)<br>
+ be-&gt;handle = LoadLibrary(libname);<br>
#else<br>
# error "Tried to compile unsupported DLL."<br>
#endif /* HAVE_DLOPEN */<br>
@@ -319,6 +322,8 @@<br>
op = (void *(*)()) dlsym (be-&gt;handle, funcname + 1);<br>
#elif defined(HAVE_SHL_LOAD)<br>
shl_findsym ((shl_t*)&amp;(be-&gt;handle), funcname + 1, TYPE_UNDEFINED, &amp;op);<br>
+#elif defined(HAVE_LOADLIBRARY)<br>
+ op = GetProcAddress(be-&gt;handle, funcname + 1);<br>
#else<br>
# error "Tried to compile unsupported DLL."<br>
#endif /* HAVE_DLOPEN */<br>
@@ -331,6 +336,8 @@<br>
op = (void *(*)()) dlsym (be-&gt;handle, funcname);<br>
#elif defined(HAVE_SHL_LOAD)<br>
shl_findsym (be-&gt;handle, funcname, TYPE_UNDEFINED, &amp;op);<br>
+#elif defined(HAVE_LOADLIBRARY)<br>
+ op = GetProcAddress(be-&gt;handle, funcname);<br>
#else<br>
# error "Tried to compile unsupported DLL."<br>
#endif /* HAVE_DLOPEN */<br>
@@ -343,8 +350,6 @@<br>
<br>
return SANE_STATUS_GOOD;<br>
<br>
-# undef PREFIX<br>
-# undef POSTFIX<br>
#else /* HAVE_DLL */<br>
DBG(1, "load: ignoring attempt to load `%s'; compiled without dl support\n",<br>
be-&gt;name);<br>
@@ -379,7 +384,7 @@<br>
return SANE_STATUS_GOOD;<br>
}<br>
<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize)<br>
{<br>
char backend_name[PATH_MAX];<br>
@@ -425,7 +430,7 @@<br>
return SANE_STATUS_GOOD;<br>
}<br>
<br>
-void<br>
+DLLEXPORT void DLLCALL<br>
sane_exit (void)<br>
{<br>
struct backend *be, *next;<br>
@@ -441,15 +446,18 @@<br>
(*be-&gt;op[OP_EXIT]) ();<br>
#ifdef HAVE_DLL<br>
<br>
-#ifdef HAVE_DLOPEN<br>
if (be-&gt;handle)<br>
- dlclose (be-&gt;handle);<br>
+ {<br>
+#ifdef HAVE_DLOPEN<br>
+ dlclose (be-&gt;handle);<br>
#elif defined(HAVE_SHL_LOAD)<br>
- if (be-&gt;handle)<br>
- shl_unload(be-&gt;handle);<br>
+ shl_unload(be-&gt;handle);<br>
+#elif defined(HAVE_LOADLIBRARY)<br>
+ FreeLibrary(be-&gt;handle);<br>
#else<br>
# error "Tried to compile unsupported DLL."<br>
#endif /* HAVE_DLOPEN */<br>
+ }<br>
<br>
#endif /* HAVE_DLL */<br>
}<br>
@@ -468,7 +476,7 @@<br>
(assuming you know the name of the backend/device). This is<br>
appropriate for the command-line interface of SANE, for example.<br>
*/<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)<br>
{<br>
static int devlist_size = 0, devlist_len = 0;<br>
@@ -549,7 +557,7 @@<br>
return SANE_STATUS_GOOD;<br>
}<br>
<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_open (SANE_String_Const full_name, SANE_Handle * meta_handle)<br>
{<br>
const char *be_name, *dev_name;<br>
@@ -619,7 +627,7 @@<br>
return SANE_STATUS_GOOD;<br>
}<br>
<br>
-void<br>
+DLLEXPORT void DLLCALL<br>
sane_close (SANE_Handle handle)<br>
{<br>
struct meta_scanner *s = handle;<br>
@@ -629,7 +637,7 @@<br>
free (s);<br>
}<br>
<br>
-const SANE_Option_Descriptor *<br>
+DLLEXPORT const SANE_Option_Descriptor * DLLCALL<br>
sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)<br>
{<br>
struct meta_scanner *s = handle;<br>
@@ -638,7 +646,7 @@<br>
return (*s-&gt;be-&gt;op[OP_GET_OPTION_DESC]) (s-&gt;handle, option);<br>
}<br>
<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_control_option (SANE_Handle handle, SANE_Int option,<br>
SANE_Action action, void *value, SANE_Word * info)<br>
{<br>
@@ -650,7 +658,7 @@<br>
value, info);<br>
}<br>
<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)<br>
{<br>
struct meta_scanner *s = handle;<br>
@@ -659,7 +667,7 @@<br>
return (long) (*s-&gt;be-&gt;op[OP_GET_PARAMS]) (s-&gt;handle, params);<br>
}<br>
<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_start (SANE_Handle handle)<br>
{<br>
struct meta_scanner *s = handle;<br>
@@ -668,7 +676,7 @@<br>
return (long) (*s-&gt;be-&gt;op[OP_START]) (s-&gt;handle);<br>
}<br>
<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_read (SANE_Handle handle, SANE_Byte * data, SANE_Int max_length,<br>
SANE_Int * length)<br>
{<br>
@@ -679,7 +687,7 @@<br>
return (long) (*s-&gt;be-&gt;op[OP_READ]) (s-&gt;handle, data, max_length, length);<br>
}<br>
<br>
-void<br>
+DLLEXPORT void DLLCALL<br>
sane_cancel (SANE_Handle handle)<br>
{<br>
struct meta_scanner *s = handle;<br>
@@ -688,7 +696,7 @@<br>
(*s-&gt;be-&gt;op[OP_CANCEL]) (s-&gt;handle);<br>
}<br>
<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_set_io_mode (SANE_Handle handle, SANE_Bool non_blocking)<br>
{<br>
struct meta_scanner *s = handle;<br>
@@ -697,7 +705,7 @@<br>
return (long) (*s-&gt;be-&gt;op[OP_SET_IO_MODE]) (s-&gt;handle, non_blocking);<br>
}<br>
<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_get_select_fd (SANE_Handle handle, SANE_Int * fd)<br>
{<br>
struct meta_scanner *s = handle;<br>
diff -ru sane-pre1.01-4/backend/net.c sane-pre1.01-4-pere/backend/net.c<br>
--- sane-pre1.01-4/backend/net.c Sat Apr 3 06:43:01 1999<br>
+++ sane-pre1.01-4-pere/backend/net.c Fri Apr 9 13:02:41 1999<br>
@@ -63,6 +63,26 @@<br>
#include &lt;netinet/in.h&gt;<br>
#include &lt;netdb.h&gt; /* OS/2 needs this _after_ &lt;netinet/in.h&gt;, grrr... */<br>
<br>
+#ifdef HAVE_WINDOWS_H<br>
+# define HAVE_WIN32<br>
+# include &lt;windows.h&gt;<br>
+# include &lt;io.h&gt;<br>
+# include &lt;winsock.h&gt;<br>
+# include &lt;malloc.h&gt;<br>
+# define NETREAD recv<br>
+# define NETWRITE send<br>
+# define NETCLOSE closesocket<br>
+# warning "Username is hardcoded!"<br>
+# define USERNAME "hardcoded"<br>
+# define SOCKET_OK(s) (s != INVALID_SOCKET)<br>
+#else<br>
+# define NETREAD read<br>
+# define NETWRITE write<br>
+# define NETCLOSE close<br>
+# define USERNAME getlogin()<br>
+# define SOCKET_OK(s) (s &gt;= 0)<br>
+#endif<br>
+<br>
#include &lt;sane/sane.h&gt;<br>
#include &lt;sane/sanei.h&gt;<br>
#include &lt;sane/sanei_net.h&gt;<br>
@@ -149,7 +169,7 @@<br>
}<br>
<br>
dev-&gt;ctl = socket (dev-&gt;addr.sa_family, SOCK_STREAM, 0);<br>
- if (dev-&gt;ctl &lt; 0)<br>
+ if (!SOCKET_OK(dev-&gt;ctl))<br>
{<br>
DBG(1, "connect_dev: failed to obtain socket (%s)\n", strerror (errno));<br>
dev-&gt;ctl = -1;<br>
@@ -188,13 +208,13 @@<br>
<br>
sanei_w_init (&amp;dev-&gt;wire, sanei_codec_bin_init);<br>
dev-&gt;wire.io.fd = dev-&gt;ctl;<br>
- dev-&gt;wire.io.read = read;<br>
- dev-&gt;wire.io.write = write;<br>
+ dev-&gt;wire.io.read = NETREAD;<br>
+ dev-&gt;wire.io.write = NETWRITE;<br>
<br>
/* exchange version codes with the server: */<br>
req.version_code = SANE_VERSION_CODE (V_MAJOR, V_MINOR,<br>
SANEI_NET_PROTOCOL_VERSION);<br>
- req.username = getlogin ();<br>
+ req.username = USERNAME;<br>
sanei_w_call (&amp;dev-&gt;wire, SANE_NET_INIT,<br>
(WireCodecFunc) sanei_w_init_req, &amp;req,<br>
(WireCodecFunc) sanei_w_init_reply, &amp;reply);<br>
@@ -229,7 +249,7 @@<br>
return SANE_STATUS_GOOD;<br>
<br>
fail:<br>
- close (dev-&gt;ctl);<br>
+ NETCLOSE (dev-&gt;ctl);<br>
dev-&gt;ctl = -1;<br>
return SANE_STATUS_IO_ERROR;<br>
}<br>
@@ -261,7 +281,7 @@<br>
s-&gt;hw-&gt;auth_active = 0;<br>
if (s-&gt;data &gt;= 0)<br>
{<br>
- close (s-&gt;data);<br>
+ NETCLOSE (s-&gt;data);<br>
s-&gt;data = -1;<br>
}<br>
return SANE_STATUS_CANCELLED;<br>
@@ -294,7 +314,7 @@<br>
}<br>
}<br>
<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize)<br>
{<br>
char device_name[PATH_MAX];<br>
@@ -305,6 +325,27 @@<br>
<br>
DBG_INIT();<br>
<br>
+#ifdef HAVE_WIN32<br>
+ {<br>
+ WSADATA wsadata;<br>
+ WORD wVer;<br>
+<br>
+ mVer = MAKEWORD(1,1);<br>
+ if (0 != WSAStartup(wVer, &amp;wsadata))<br>
+ {<br>
+ DBG(1, "WSAStartup(1.1, ptr) failed.");<br>
+ return SANE_STATUS_UNSUPPORTED; /* XXX check this error value */<br>
+ }<br>
+<br>
+ /* Check WINSOCK.DLL version */<br>
+ if (1 != LOBYTE(wsadata.mVersion) || 1 != HIBYTE(wsadata.mVersion))<br>
+ {<br>
+ DBG(1, "WINSOCK.DLL does not support v1.1.");<br>
+ return SANE_STATUS_UNSUPPORTED; /* XXX check this error value */<br>
+ }<br>
+ }<br>
+#endif<br>
+<br>
auth_callback = authorize;<br>
<br>
if (version_code)<br>
@@ -318,7 +359,7 @@<br>
saned_port = htons (6566);<br>
DBG(1,<br>
"init: could not find `sane' service (%s); using default port %d\n",<br>
- strerror (errno), htons (saned_port));<br>
+ strerror (errno), htons ((unsigned short)saned_port));<br>
}<br>
<br>
fp = sanei_config_open (NET_CONFIG_FILE);<br>
@@ -354,7 +395,7 @@<br>
return SANE_STATUS_GOOD;<br>
}<br>
<br>
-void<br>
+DLLEXPORT void DLLCALL<br>
sane_exit (void)<br>
{<br>
Net_Scanner *handle, *next_handle;<br>
@@ -382,10 +423,19 @@<br>
sanei_w_call (&amp;dev-&gt;wire, SANE_NET_EXIT,<br>
(WireCodecFunc) sanei_w_void, 0,<br>
(WireCodecFunc) sanei_w_void, 0);<br>
- close (dev-&gt;ctl);<br>
+ NETCLOSE (dev-&gt;ctl);<br>
}<br>
free (dev);<br>
}<br>
+#ifdef HAVE_WIN32<br>
+ /* Release Windows socket DLL */<br>
+ if (SOCKET_ERROR == WSACleanup())<br>
+ if (WSAEINPROGRESS == WSAGetLastError())<br>
+ {<br>
+ WSACancelBlockingCall();<br>
+ WSACleanup();<br>
+ }<br>
+#endif<br>
}<br>
<br>
/* Note that a call to get_devices() implies that we'll have to<br>
@@ -394,7 +444,7 @@<br>
backend/device). This is appropriate for the command-line<br>
interface of SANE, for example.<br>
*/<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)<br>
{<br>
static int devlist_size = 0, devlist_len = 0;<br>
@@ -500,7 +550,7 @@<br>
return SANE_STATUS_GOOD;<br>
}<br>
<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_open (SANE_String_Const full_name, SANE_Handle * meta_handle)<br>
{<br>
SANE_Open_Reply reply;<br>
@@ -609,7 +659,7 @@<br>
return SANE_STATUS_GOOD;<br>
}<br>
<br>
-void<br>
+DLLEXPORT void DLLCALL<br>
sane_close (SANE_Handle handle)<br>
{<br>
Net_Scanner *prev, *s;<br>
@@ -636,11 +686,11 @@<br>
(WireCodecFunc) sanei_w_word, &amp;s-&gt;handle,<br>
(WireCodecFunc) sanei_w_word, &amp;ack);<br>
if (s-&gt;data &gt;= 0)<br>
- close (s-&gt;data);<br>
+ NETCLOSE (s-&gt;data);<br>
free (s);<br>
}<br>
<br>
-const SANE_Option_Descriptor *<br>
+DLLEXPORT const SANE_Option_Descriptor * DLLCALL<br>
sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)<br>
{<br>
Net_Scanner *s = handle;<br>
@@ -658,7 +708,7 @@<br>
return s-&gt;opt.desc[option];<br>
}<br>
<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_control_option (SANE_Handle handle, SANE_Int option,<br>
SANE_Action action, void *value, SANE_Word * info)<br>
{<br>
@@ -733,7 +783,7 @@<br>
return status;<br>
}<br>
<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)<br>
{<br>
Net_Scanner *s = handle;<br>
@@ -755,7 +805,7 @@<br>
return status;<br>
}<br>
<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_start (SANE_Handle handle)<br>
{<br>
Net_Scanner *s = handle;<br>
@@ -779,7 +829,7 @@<br>
}<br>
<br>
fd = socket (s-&gt;hw-&gt;addr.sa_family, SOCK_STREAM, 0);<br>
- if (fd &lt; 0)<br>
+ if (!SOCKET_OK(fd))<br>
{<br>
DBG(1, "start: socket() failed (%s)\n", strerror (errno));<br>
return SANE_STATUS_IO_ERROR;<br>
@@ -802,7 +852,7 @@<br>
<br>
if (status != SANE_STATUS_GOOD)<br>
{<br>
- close (fd);<br>
+ NETCLOSE (fd);<br>
return status;<br>
}<br>
}<br>
@@ -813,7 +863,7 @@<br>
if (connect (fd, (struct sockaddr *) &amp;sin, len) &lt; 0)<br>
{<br>
DBG(1, "start: connect() failed (%s)\n", strerror (errno));<br>
- close (fd);<br>
+ NETCLOSE (fd);<br>
return SANE_STATUS_IO_ERROR;<br>
}<br>
shutdown (fd, 1);<br>
@@ -823,7 +873,7 @@<br>
return status;<br>
}<br>
<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_read (SANE_Handle handle, SANE_Byte * data, SANE_Int max_length,<br>
SANE_Int * length)<br>
{<br>
@@ -842,7 +892,7 @@<br>
{<br>
/* boy, is this painful or what? */<br>
<br>
- nread = read (s-&gt;data, s-&gt;reclen_buf + s-&gt;reclen_buf_offset,<br>
+ nread = NETREAD (s-&gt;data, s-&gt;reclen_buf + s-&gt;reclen_buf_offset,<br>
4 - s-&gt;reclen_buf_offset);<br>
if (nread &lt; 0)<br>
{<br>
@@ -873,7 +923,7 @@<br>
fcntl (s-&gt;data, F_SETFL, 0);<br>
<br>
/* read the status byte: */<br>
- if (read (s-&gt;data, &amp;ch, sizeof (ch)) != 1)<br>
+ if (NETREAD (s-&gt;data, &amp;ch, sizeof (ch)) != 1)<br>
ch = SANE_STATUS_IO_ERROR;<br>
do_cancel (s);<br>
return (SANE_Status) ch;<br>
@@ -883,7 +933,7 @@<br>
if (max_length &gt; s-&gt;bytes_remaining)<br>
max_length = s-&gt;bytes_remaining;<br>
<br>
- nread = read (s-&gt;data, data, max_length);<br>
+ nread = NETREAD (s-&gt;data, data, max_length);<br>
if (nread &lt; 0)<br>
{<br>
if (errno == EAGAIN)<br>
@@ -899,7 +949,7 @@<br>
return SANE_STATUS_GOOD;<br>
}<br>
<br>
-void<br>
+DLLEXPORT void DLLCALL<br>
sane_cancel (SANE_Handle handle)<br>
{<br>
Net_Scanner *s = handle;<br>
@@ -911,7 +961,7 @@<br>
do_cancel (s);<br>
}<br>
<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_set_io_mode (SANE_Handle handle, SANE_Bool non_blocking)<br>
{<br>
Net_Scanner *s = handle;<br>
@@ -925,7 +975,7 @@<br>
return SANE_STATUS_GOOD;<br>
}<br>
<br>
-SANE_Status<br>
+DLLEXPORT SANE_Status DLLCALL<br>
sane_get_select_fd (SANE_Handle handle, SANE_Int *fd)<br>
{<br>
Net_Scanner *s = handle;<br>
diff -ru sane-pre1.01-4/include/sane/config.h.in sane-pre1.01-4-pere/include/sane/config.h.in<br>
--- sane-pre1.01-4/include/sane/config.h.in Tue Mar 9 06:50:03 1999<br>
+++ sane-pre1.01-4-pere/include/sane/config.h.in Fri Apr 9 01:02:29 1999<br>
@@ -335,4 +335,9 @@<br>
# define __EXTENSIONS__<br>
#endif<br>
<br>
+#ifdef _WINDOWS<br>
+# define HAVE_WINDOWS_H<br>
+# define HAVE_LOADLIBRARY<br>
+#endif<br>
+<br>
#endif /* SANE_CONFIG_H */<br>
diff -ru sane-pre1.01-4/include/sane/sane.h sane-pre1.01-4-pere/include/sane/sane.h<br>
--- sane-pre1.01-4/include/sane/sane.h Sun Feb 28 00:54:08 1999<br>
+++ sane-pre1.01-4-pere/include/sane/sane.h Fri Apr 9 00:37:53 1999<br>
@@ -30,6 +30,14 @@<br>
#define SANE_FALSE 0<br>
#define SANE_TRUE 1<br>
<br>
+#if defined(_WINDOWS)<br>
+# define DLLEXPORT __declspec( dllexport )<br>
+# define DLLCALL __cdecl<br>
+#else<br>
+# define DLLEXPORT<br>
+# define DLLCALL<br>
+#endif<br>
+<br>
typedef unsigned char SANE_Byte;<br>
typedef int SANE_Word;<br>
typedef SANE_Word SANE_Bool;<br>
@@ -185,29 +193,29 @@<br>
SANE_Char username[SANE_MAX_USERNAME_LEN],<br>
SANE_Char password[SANE_MAX_PASSWORD_LEN]);<br>
<br>
-extern SANE_Status sane_init (SANE_Int * version_code,<br>
+extern DLLEXPORT SANE_Status DLLCALL sane_init (SANE_Int * version_code,<br>
SANE_Auth_Callback authorize);<br>
-extern void sane_exit (void);<br>
-extern SANE_Status sane_get_devices (const SANE_Device *** device_list,<br>
+extern DLLEXPORT void DLLCALL sane_exit (void);<br>
+extern DLLEXPORT SANE_Status DLLCALL sane_get_devices (const SANE_Device *** device_list,<br>
SANE_Bool local_only);<br>
-extern SANE_Status sane_open (SANE_String_Const devicename,<br>
+extern DLLEXPORT SANE_Status DLLCALL sane_open (SANE_String_Const devicename,<br>
SANE_Handle * handle);<br>
-extern void sane_close (SANE_Handle handle);<br>
-extern const SANE_Option_Descriptor *<br>
- sane_get_option_descriptor (SANE_Handle handle, SANE_Int option);<br>
-extern SANE_Status sane_control_option (SANE_Handle handle, SANE_Int option,<br>
+extern DLLEXPORT void DLLCALL sane_close (SANE_Handle handle);<br>
+extern DLLEXPORT const SANE_Option_Descriptor *<br>
+ DLLCALL sane_get_option_descriptor (SANE_Handle handle, SANE_Int option);<br>
+extern DLLEXPORT SANE_Status DLLCALL sane_control_option (SANE_Handle handle, SANE_Int option,<br>
SANE_Action action, void *value,<br>
SANE_Int * info);<br>
-extern SANE_Status sane_get_parameters (SANE_Handle handle,<br>
+extern DLLEXPORT SANE_Status DLLCALL sane_get_parameters (SANE_Handle handle,<br>
SANE_Parameters * params);<br>
-extern SANE_Status sane_start (SANE_Handle handle);<br>
-extern SANE_Status sane_read (SANE_Handle handle, SANE_Byte * data,<br>
+extern DLLEXPORT SANE_Status DLLCALL sane_start (SANE_Handle handle);<br>
+extern DLLEXPORT SANE_Status DLLCALL sane_read (SANE_Handle handle, SANE_Byte * data,<br>
SANE_Int max_length, SANE_Int * length);<br>
-extern void sane_cancel (SANE_Handle handle);<br>
-extern SANE_Status sane_set_io_mode (SANE_Handle handle,<br>
+extern DLLEXPORT void DLLCALL sane_cancel (SANE_Handle handle);<br>
+extern DLLEXPORT SANE_Status DLLCALL sane_set_io_mode (SANE_Handle handle,<br>
SANE_Bool non_blocking);<br>
-extern SANE_Status sane_get_select_fd (SANE_Handle handle,<br>
+extern DLLEXPORT SANE_Status DLLCALL sane_get_select_fd (SANE_Handle handle,<br>
SANE_Int * fd);<br>
-extern SANE_String_Const sane_strstatus (SANE_Status status);<br>
+extern DLLEXPORT SANE_String_Const DLLCALL sane_strstatus (SANE_Status status);<br>
<br>
#endif /* sane_h */<br>
<pre>
--
##&gt; Petter Reinholdtsen &lt;## | <a href="mailto:pere@td.org.uit.no">pere@td.org.uit.no</a>
O- &lt;SCRIPT Language="Javascript"&gt;window.close()&lt;/SCRIPT&gt;
<a href="http://www.hungry.com/~pere/">http://www.hungry.com/~pere/</a> | Go Mozilla, go! Go!
<p>
<pre>
--
Source code, list archive, and docs: <a href="http://www.mostang.com/sane/">http://www.mostang.com/sane/</a>
To unsubscribe: echo unsubscribe sane-devel | mail <a href="mailto:majordomo@mostang.com">majordomo@mostang.com</a>
</pre>
<!-- body="end" -->
<p>
<ul>
<!-- next="start" -->
<li> <b>Next message:</b> <a href="0166.html">Petter Reinholdtsen: "May sane_init fail?"</a>
<li> <b>Previous message:</b> <a href="0164.html">Petter Reinholdtsen: "Re: Linking non-libtool libraries into a new backend?"</a>
<!-- nextthread="start" -->
<!-- reply="end" -->
</ul>