diff -ur sane-1.0.1/ChangeLog sane-1.0.1-pere/ChangeLog --- sane-1.0.1/ChangeLog Mon Apr 19 18:21:33 1999 +++ sane-1.0.1-pere/ChangeLog Wed Apr 28 00:52:19 1999 @@ -1,3 +1,11 @@ +1999-04-28 Petter Reinholdtsen + + * backend/dll.c: Cleanup. Use calloc() instead of + malloc/memset(0). Only check the correct environment path + variables. Make ifdef'ed code smaller and clearer. Include + bugfix reported by Ingo Wilken: use dlerror() instead of + strerror(errno). + 1999-04-19 David Mosberger-Tang * Version 1.0.1 released. diff -ur sane-1.0.1/backend/dll.c sane-1.0.1-pere/backend/dll.c --- sane-1.0.1/backend/dll.c Sun Feb 28 00:51:37 1999 +++ sane-1.0.1-pere/backend/dll.c Wed Apr 28 01:01:58 1999 @@ -68,12 +68,22 @@ # ifndef RTLD_LAZY # define RTLD_LAZY 1 # endif +# if defined(_AIX) +# define DLL_PATH_ENV "LIBPATH" +# else +# define DLL_PATH_ENV "LD_LIBRARY_PATH" +# endif +# define DLL_PATH_SEPARATOR ":" +# define DLL_SLASH "/" +# define DLL_NAME "libsane-%s.so." STRINGIFY(V_MAJOR) # define HAVE_DLL -#endif - +#elif defined (HAVE_SHL_LOAD) && defined(HAVE_DL_H) /* HP/UX DLL support */ -#if defined (HAVE_SHL_LOAD) && defined(HAVE_DL_H) # include +# define DLL_PATH_ENV "SHLIB_PATH" +# define DLL_PATH_SEPARATOR ":" +# define DLL_SLASH "/" +# define DLL_NAME "libsane-%s.sl." STRINGIFY(V_MAJOR) # define HAVE_DLL #endif @@ -211,11 +221,10 @@ return SANE_STATUS_GOOD; } - be = malloc (sizeof (*be)); + be = calloc (1, sizeof (*be)); if (!be) return SANE_STATUS_NO_MEM; - memset (be, 0, sizeof (*be)); be->name = strdup (name); if (!be->name) return SANE_STATUS_NO_MEM; @@ -230,24 +239,12 @@ load (struct backend *be) { #ifdef HAVE_DLL - int mode = 0; + int funcnamesize = 0; char *funcname, *src, *dir, *path = 0; char libname[PATH_MAX]; int i; FILE *fp = 0; -#if defined(HAVE_DLOPEN) -# define PREFIX "libsane-" -# define POSTFIX ".so.%u" - mode = getenv ("LD_BIND_NOW") ? RTLD_NOW : RTLD_LAZY; -#elif defined(HAVE_SHL_LOAD) -# define PREFIX "libsane-" -# define POSTFIX ".sl.%u" - mode = BIND_DEFERRED; -#else -# error "Tried to compile unsupported DLL." -#endif /* HAVE_DLOPEN */ - DBG(1, "loading backend %s\n", be->name); /* initialize all ops to "unsupported" so we can "use" the backend @@ -260,28 +257,23 @@ dir = STRINGIFY(LIBDIR); while (dir) { - snprintf (libname, sizeof (libname), "%s/"PREFIX"%s"POSTFIX, - dir, be->name, V_MAJOR); + /* Make string like "/sane-.so." */ + snprintf (libname, sizeof (libname), "%s" DLL_SLASH DLL_NAME, + dir, be->name); fp = fopen (libname, "r"); if (fp) break; if (!path) { - path = getenv ("LD_LIBRARY_PATH"); - if (!path) - { - path = getenv ("SHLIB_PATH"); /* for HP-UX */ - if (!path) - path = getenv ("LIBPATH"); /* for AIX */ - } + path = getenv (DLL_PATH_ENV); if (!path) break; path = strdup (path); src = path; } - dir = strsep (&src, ":"); + dir = strsep (&src, DLL_PATH_SEPARATOR); } if (path) free (path); @@ -294,57 +286,52 @@ DBG(2, "dlopen()ing `%s'\n", libname); #ifdef HAVE_DLOPEN - be->handle = dlopen (libname, mode); + be->handle = dlopen (libname, getenv ("LD_BIND_NOW") ? RTLD_NOW : RTLD_LAZY); #elif defined(HAVE_SHL_LOAD) - be->handle = (shl_t)shl_load (libname, mode, 0L); + be->handle = (shl_t)shl_load (libname, BIND_DEFERRED, 0L); #else # error "Tried to compile unsupported DLL." #endif /* HAVE_DLOPEN */ if (!be->handle) { +#ifdef HAVE_DLOPEN + DBG(2, "dlopen() failed (%s)\n", dlerror()); +#else DBG(2, "dlopen() failed (%s)\n", strerror (errno)); +#endif return SANE_STATUS_INVAL; } /* all is dandy---lookup and fill in backend ops: */ - funcname = alloca (strlen (be->name) + 64); + funcnamesize = strlen (be->name) + 64; + funcname = alloca (funcnamesize); for (i = 0; i < NUM_OPS; ++i) { void *(*op) (); + void *(*op_) (); - sprintf (funcname, "_sane_%s_%s", be->name, op_name[i]); + snprintf (funcname, funcnamesize, "_sane_%s_%s", be->name, op_name[i]); /* First try looking up the symbol without a leading underscore. */ + /* Then try again, with an underscore prepended. */ #ifdef HAVE_DLOPEN op = (void *(*)()) dlsym (be->handle, funcname + 1); + op_ = (void *(*)()) dlsym (be->handle, funcname); #elif defined(HAVE_SHL_LOAD) shl_findsym ((shl_t*)&(be->handle), funcname + 1, TYPE_UNDEFINED, &op); + shl_findsym (be->handle, funcname, TYPE_UNDEFINED, &op_); #else # error "Tried to compile unsupported DLL." #endif /* HAVE_DLOPEN */ - if (op) - be->op[i] = op; + + if (NULL != op || NULL != op_) + be->op[i] = (NULL != op) ? op : op_; else - { - /* Try again, with an underscore prepended. */ -#ifdef HAVE_DLOPEN - op = (void *(*)()) dlsym (be->handle, funcname); -#elif defined(HAVE_SHL_LOAD) - shl_findsym (be->handle, funcname, TYPE_UNDEFINED, &op); -#else -# error "Tried to compile unsupported DLL." -#endif /* HAVE_DLOPEN */ - if (op) - be->op[i] = op; - } - if (NULL == op) DBG(2, "unable to find %s\n", funcname); } return SANE_STATUS_GOOD; -# undef PREFIX -# undef POSTFIX #else /* HAVE_DLL */ DBG(1, "load: ignoring attempt to load `%s'; compiled without dl support\n", be->name); @@ -441,15 +428,16 @@ (*be->op[OP_EXIT]) (); #ifdef HAVE_DLL -#ifdef HAVE_DLOPEN if (be->handle) - dlclose (be->handle); + { +#ifdef HAVE_DLOPEN + dlclose (be->handle); #elif defined(HAVE_SHL_LOAD) - if (be->handle) - shl_unload(be->handle); + shl_unload(be->handle); #else # error "Tried to compile unsupported DLL." #endif /* HAVE_DLOPEN */ + } #endif /* HAVE_DLL */ } @@ -607,11 +595,10 @@ if (status != SANE_STATUS_GOOD) return status; - s = malloc (sizeof (*s)); + s = calloc (1, sizeof (*s)); if (!s) return SANE_STATUS_NO_MEM; - memset (s, 0, sizeof (*s)); s->be = be; s->handle = handle; *meta_handle = s;