kopia lustrzana https://gitlab.com/sane-project/website
742 wiersze
24 KiB
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>
|
|
<URL:<a href="http://www.student.uit.no/~pere/linux/">http://www.student.uit.no/~pere/linux/</a>>.<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 <<a href="mailto:pere@td.org.uit.no">pere@td.org.uit.no</a>><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 <<a href="mailto:David.Mosberger@acm.org">David.Mosberger@acm.org</a>><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 <stdio.h><br>
|
|
#include <stdlib.h><br>
|
|
#include <string.h><br>
|
|
+#ifdef HAVE_WINDOWS_H<br>
|
|
+# include <windows.h><br>
|
|
+#endif<br>
|
|
<br>
|
|
#if defined(HAVE_DLOPEN) && defined(HAVE_DLFCN_H)<br>
|
|
# include <dlfcn.h><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) && defined(HAVE_DL_H)<br>
|
|
/* HP/UX DLL support */<br>
|
|
-#if defined (HAVE_SHL_LOAD) && defined(HAVE_DL_H)<br>
|
|
# include <dl.h><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->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->name, V_MAJOR);<br>
|
|
+ snprintf (libname, sizeof (libname), "%s" DLL_SLASH DLL_NAME,<br>
|
|
+ dir, be->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 (&src, ":");<br>
|
|
+ dir = strsep (&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->handle = dlopen (libname, mode);<br>
|
|
+ be->handle = dlopen (libname, getenv ("LD_BIND_NOW") ? RTLD_NOW : RTLD_LAZY);<br>
|
|
#elif defined(HAVE_SHL_LOAD)<br>
|
|
- be->handle = (shl_t)shl_load (libname, mode, 0L);<br>
|
|
+ be->handle = (shl_t)shl_load (libname, BIND_DEFERRED, 0L);<br>
|
|
+#elif defined(HAVE_LOADLIBRARY)<br>
|
|
+ be->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->handle, funcname + 1);<br>
|
|
#elif defined(HAVE_SHL_LOAD)<br>
|
|
shl_findsym ((shl_t*)&(be->handle), funcname + 1, TYPE_UNDEFINED, &op);<br>
|
|
+#elif defined(HAVE_LOADLIBRARY)<br>
|
|
+ op = GetProcAddress(be->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->handle, funcname);<br>
|
|
#elif defined(HAVE_SHL_LOAD)<br>
|
|
shl_findsym (be->handle, funcname, TYPE_UNDEFINED, &op);<br>
|
|
+#elif defined(HAVE_LOADLIBRARY)<br>
|
|
+ op = GetProcAddress(be->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->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->op[OP_EXIT]) ();<br>
|
|
#ifdef HAVE_DLL<br>
|
|
<br>
|
|
-#ifdef HAVE_DLOPEN<br>
|
|
if (be->handle)<br>
|
|
- dlclose (be->handle);<br>
|
|
+ {<br>
|
|
+#ifdef HAVE_DLOPEN<br>
|
|
+ dlclose (be->handle);<br>
|
|
#elif defined(HAVE_SHL_LOAD)<br>
|
|
- if (be->handle)<br>
|
|
- shl_unload(be->handle);<br>
|
|
+ shl_unload(be->handle);<br>
|
|
+#elif defined(HAVE_LOADLIBRARY)<br>
|
|
+ FreeLibrary(be->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->be->op[OP_GET_OPTION_DESC]) (s->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->be->op[OP_GET_PARAMS]) (s->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->be->op[OP_START]) (s->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->be->op[OP_READ]) (s->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->be->op[OP_CANCEL]) (s->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->be->op[OP_SET_IO_MODE]) (s->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 <netinet/in.h><br>
|
|
#include <netdb.h> /* OS/2 needs this _after_ <netinet/in.h>, grrr... */<br>
|
|
<br>
|
|
+#ifdef HAVE_WINDOWS_H<br>
|
|
+# define HAVE_WIN32<br>
|
|
+# include <windows.h><br>
|
|
+# include <io.h><br>
|
|
+# include <winsock.h><br>
|
|
+# include <malloc.h><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 >= 0)<br>
|
|
+#endif<br>
|
|
+<br>
|
|
#include <sane/sane.h><br>
|
|
#include <sane/sanei.h><br>
|
|
#include <sane/sanei_net.h><br>
|
|
@@ -149,7 +169,7 @@<br>
|
|
}<br>
|
|
<br>
|
|
dev->ctl = socket (dev->addr.sa_family, SOCK_STREAM, 0);<br>
|
|
- if (dev->ctl < 0)<br>
|
|
+ if (!SOCKET_OK(dev->ctl))<br>
|
|
{<br>
|
|
DBG(1, "connect_dev: failed to obtain socket (%s)\n", strerror (errno));<br>
|
|
dev->ctl = -1;<br>
|
|
@@ -188,13 +208,13 @@<br>
|
|
<br>
|
|
sanei_w_init (&dev->wire, sanei_codec_bin_init);<br>
|
|
dev->wire.io.fd = dev->ctl;<br>
|
|
- dev->wire.io.read = read;<br>
|
|
- dev->wire.io.write = write;<br>
|
|
+ dev->wire.io.read = NETREAD;<br>
|
|
+ dev->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 (&dev->wire, SANE_NET_INIT,<br>
|
|
(WireCodecFunc) sanei_w_init_req, &req,<br>
|
|
(WireCodecFunc) sanei_w_init_reply, &reply);<br>
|
|
@@ -229,7 +249,7 @@<br>
|
|
return SANE_STATUS_GOOD;<br>
|
|
<br>
|
|
fail:<br>
|
|
- close (dev->ctl);<br>
|
|
+ NETCLOSE (dev->ctl);<br>
|
|
dev->ctl = -1;<br>
|
|
return SANE_STATUS_IO_ERROR;<br>
|
|
}<br>
|
|
@@ -261,7 +281,7 @@<br>
|
|
s->hw->auth_active = 0;<br>
|
|
if (s->data >= 0)<br>
|
|
{<br>
|
|
- close (s->data);<br>
|
|
+ NETCLOSE (s->data);<br>
|
|
s->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, &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 (&dev->wire, SANE_NET_EXIT,<br>
|
|
(WireCodecFunc) sanei_w_void, 0,<br>
|
|
(WireCodecFunc) sanei_w_void, 0);<br>
|
|
- close (dev->ctl);<br>
|
|
+ NETCLOSE (dev->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, &s->handle,<br>
|
|
(WireCodecFunc) sanei_w_word, &ack);<br>
|
|
if (s->data >= 0)<br>
|
|
- close (s->data);<br>
|
|
+ NETCLOSE (s->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->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->hw->addr.sa_family, SOCK_STREAM, 0);<br>
|
|
- if (fd < 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 *) &sin, len) < 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->data, s->reclen_buf + s->reclen_buf_offset,<br>
|
|
+ nread = NETREAD (s->data, s->reclen_buf + s->reclen_buf_offset,<br>
|
|
4 - s->reclen_buf_offset);<br>
|
|
if (nread < 0)<br>
|
|
{<br>
|
|
@@ -873,7 +923,7 @@<br>
|
|
fcntl (s->data, F_SETFL, 0);<br>
|
|
<br>
|
|
/* read the status byte: */<br>
|
|
- if (read (s->data, &ch, sizeof (ch)) != 1)<br>
|
|
+ if (NETREAD (s->data, &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 > s->bytes_remaining)<br>
|
|
max_length = s->bytes_remaining;<br>
|
|
<br>
|
|
- nread = read (s->data, data, max_length);<br>
|
|
+ nread = NETREAD (s->data, data, max_length);<br>
|
|
if (nread < 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>
|
|
--
|
|
##> Petter Reinholdtsen <## | <a href="mailto:pere@td.org.uit.no">pere@td.org.uit.no</a>
|
|
O- <SCRIPT Language="Javascript">window.close()</SCRIPT>
|
|
<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>
|