diff options
author | brian <brian@cvs.openbsd.org> | 1998-01-14 01:23:51 +0000 |
---|---|---|
committer | brian <brian@cvs.openbsd.org> | 1998-01-14 01:23:51 +0000 |
commit | a1b49f10b0ae596cd397096dff8f8557d69dda70 (patch) | |
tree | a559962c6e8fdd2e3a554a98fce4733d4bce333a /usr.sbin/ppp | |
parent | 321ee1e2d287fc2c2d69ba14cff0021db9c4a377 (diff) |
Lose __libalias_version.
We now look for the biggest of libalias.so.2.*
Diffstat (limited to 'usr.sbin/ppp')
-rw-r--r-- | usr.sbin/ppp/loadalias.c | 69 |
1 files changed, 59 insertions, 10 deletions
diff --git a/usr.sbin/ppp/loadalias.c b/usr.sbin/ppp/loadalias.c index d98cbb7bc6f..e44eff70e71 100644 --- a/usr.sbin/ppp/loadalias.c +++ b/usr.sbin/ppp/loadalias.c @@ -23,16 +23,17 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: loadalias.c,v 1.2 1997/12/21 14:27:07 brian Exp $ + * $Id: loadalias.c,v 1.3 1998/01/14 01:23:50 brian Exp $ */ #include <sys/param.h> #include <netinet/in.h> -#include <alias.h> +#include <dirent.h> #include <dlfcn.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> #include <sys/socket.h> #include <unistd.h> @@ -45,7 +46,7 @@ #include "defs.h" #include "vars.h" -#define _PATH_ALIAS "/usr/lib/libalias.so." ## __libalias_version +#define _PATH_ALIAS_PREFIX "/usr/lib/libalias.so.2." #define off(item) ((int)&(((struct aliasHandlers *)0)->item)) #define entry(a) { off(a), "_" #a } @@ -76,24 +77,72 @@ loadAliasHandlers(struct aliasHandlers * h) const char *env; int i; - path = _PATH_ALIAS; - env = getenv("_PATH_ALIAS"); + path = _PATH_ALIAS_PREFIX; + env = getenv("_PATH_ALIAS_PREFIX"); if (env) if (ID0realuid() == 0) path = env; else - LogPrintf(LogALERT, "Ignoring environment _PATH_ALIAS value (%s)\n", env); + LogPrintf(LogALERT, "Ignoring environment _PATH_ALIAS_PREFIX" + " value (%s)\n", env); dl = dlopen(path, RTLD_LAZY); if (dl == (void *) 0) { - LogPrintf(LogWARN, "_PATH_ALIAS (%s): Invalid lib: %s\n", - path, dlerror()); - return -1; + /* Look for _PATH_ALIAS_PREFIX with any number appended */ + int plen; + + plen = strlen(path); + if (plen && plen < MAXPATHLEN - 1 && path[plen-1] == '.') { + DIR *d; + char p[MAXPATHLEN], *fix; + char *file, *dir; + + strcpy(p, path); + if ((file = strrchr(p, '/')) != NULL) { + fix = file; + *file++ = '\0'; + dir = p; + } else { + fix = NULL; + file = p; + dir = "."; + } + if ((d = opendir(dir))) { + struct dirent *entry; + int flen; + char *end; + long maxver, ver; + + if (fix) + *fix = '/'; + maxver = -1; + flen = strlen(file); + while ((entry = readdir(d))) + if (entry->d_namlen > flen && !strncmp(entry->d_name, file, flen)) { + ver = strtol(entry->d_name + flen, &end, 10); + strcpy(p + plen, entry->d_name + flen); + if (ver >= 0 && *end == '\0' && ver > maxver && + access(p, R_OK) == 0) + maxver = ver; + } + closedir(d); + + if (maxver > -1) { + sprintf(p + plen, "%ld", maxver); + dl = dlopen(p, RTLD_LAZY); + } + } + } + if (dl == (void *) 0) { + LogPrintf(LogWARN, "_PATH_ALIAS_PREFIX (%s*): Invalid lib: %s\n", + path, dlerror()); + return -1; + } } for (i = 0; map[i].name; i++) { *(void **) ((char *) h + map[i].offset) = dlsym(dl, map[i].name); if (*(void **) ((char *) h + map[i].offset) == (void *) 0) { - LogPrintf(LogWARN, "_PATH_ALIAS (%s): %s: %s\n", path, + LogPrintf(LogWARN, "_PATH_ALIAS (%s*): %s: %s\n", path, map[i].name, dlerror()); (void) dlclose(dl); dl = (void *) 0; |