dllscan.c revision 34f9b3eef6fdadbda0a846aa4d68691ac40eace5
/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 1997-2009 AT&T Intellectual Property *
* and is licensed under the *
* Common Public License, Version 1.0 *
* by AT&T Intellectual Property *
* *
* A copy of the License is available at *
* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
* *
* Information and Software Systems Research *
* AT&T Research *
* Florham Park NJ *
* *
* Glenn Fowler <gsf@research.att.com> *
* *
***********************************************************************/
#pragma prototyped
/*
* Glenn Fowler
* AT&T Research
*/
#define _DLLINFO_PRIVATE_ \
char* sib[3]; \
char sibbuf[64]; \
char envbuf[64];
#define _DLLSCAN_PRIVATE_ \
int flags; \
char** sb; \
char** sp; \
char* pb; \
char* pp; \
char* pe; \
int off; \
int prelen; \
int suflen; \
char** lib; \
char nam[64]; \
char pat[64]; \
char buf[64];
#define DLL_MATCH_DONE 0x8000
#define DLL_MATCH_NAME 0x4000
#define DLL_MATCH_VERSION 0x2000
#include <ast.h>
#include <cdt.h>
#include <ctype.h>
#include <error.h>
#include <fts.h>
#include <vmalloc.h>
typedef struct Uniq_s
{
char name[1];
} Uniq_t;
#include <dlldefs.h>
static char bin[] = "bin";
static char lib[] = "lib";
/*
* we need a sibling dir in PATH to search for dlls
* the confstr LIBPATH provides the local info
*
* <sibling-dir>[:<env-var>[:<host-pattern>]][,...]
*
* if <host-pattern> is present then it must match confstr HOSTTYPE
*/
dllinfo(void)
{
register char* s;
register char* h;
char* d;
char* v;
char* p;
int dn;
int vn;
int pn;
char pat[256];
{
{
while (*s == ':' || *s == ',')
s++;
if (*s)
{
h = 0;
for (;;)
{
for (d = s; *s && *s != ':' && *s != ','; s++);
if (!(dn = s - d))
d = 0;
if (*s == ':')
{
for (v = ++s; *s && *s != ':' && *s != ','; s++);
if (!(vn = s - v))
v = 0;
if (*s == ':')
{
for (p = ++s; *s && *s != ':' && *s != ','; s++);
if (!(pn = s - p))
p = 0;
}
else
p = 0;
}
else
{
v = 0;
p = 0;
}
while (*s && *s++ != ',');
break;
break;
}
{
}
{
}
}
}
else
}
return &info;
}
/*
* fts version sort order
* higher versions appear first
*/
static int
{
register int n;
register int m;
char* e;
for (;;)
{
{
m = strtol((char*)a, &e, 10);
a = (unsigned char*)e;
n = strtol((char*)b, &e, 10);
b = (unsigned char*)e;
if (n -= m)
return n;
}
if (n = *a - *b)
return n;
if (!*a++)
return *b ? 0 : -1;
if (!*b++)
return 1;
}
/*NOTREACHED*/
}
/*
* open a scan stream
*/
{
register char* s;
register char* t;
int i;
char buf[32];
return 0;
{
/*
* grab the local part of the library id
*/
lib = (const char*)(s + 1);
}
else
{
lib = 0;
i = 0;
}
version = 0;
{
return 0;
}
if (lib)
{
version = "0.0";
}
{
name = (const char*)"?*";
}
{
goto bad;
name = (const char*)(t + 1);
}
if (!version)
{
}
{
for (s = (char*)version; *s; s++)
if (isdigit(*s))
goto bad;
}
else
{
}
{
{
if (!version)
version = "*([0-9_])";
else
{
t = buf;
for (s = (char*)version; *s; s++)
*t++ = *s;
*t = 0;
}
}
else if (version)
sfsprintf(scan->pat, sizeof(scan->pat), "%s%s@(%s([-.])%s%s|%s.%s)", info->prefix, name, strchr(version, '.') ? "@" : "?", version, info->suffix, info->suffix, version);
else
{
version = "*([0-9.])";
sfsprintf(scan->pat, sizeof(scan->pat), "%s%s@(?([-.])%s%s|%s%s)", info->prefix, name, version, info->suffix, info->suffix, version);
}
}
return scan;
bad:
return 0;
}
/*
* close a scan stream
*/
int
{
if (!scan)
return -1;
return 0;
}
/*
* return the next scan stream entry
*/
{
register char* p;
register char* b;
register char* t;
register Uniq_t* u;
register int n;
register int m;
return 0;
do
{
{
{
}
{
return 0;
}
if (*p == '/')
else
{
return 0;
{
goto found;
}
continue;
}
{
return 0;
if ((scan->fts = fts_open((char**)t, FTS_LOGICAL|FTS_NOPOSTORDER|FTS_ONEPATH, vercmp)) && (scan->ent = fts_read(scan->fts)) && (scan->ent = fts_children(scan->fts, FTS_NOSTAT)))
break;
}
}
return 0;
{
break;
b--;
}
b -= 2;
n = m = 0;
if (isdigit(*(t - 1)))
n = 1;
else if (*(t - 1) != m)
{
if (*(t - 1) == '.' || *(t - 1) == '-' || *(t - 1) == '_')
{
n = 1;
if (m)
{
m = -1;
t--;
break;
}
m = *(t - 1);
}
else
break;
}
if (n)
{
n = (t[0] - '0') * 10 + (t[1] - '0');
n = (t[1] - '0') * 10 + (t[2] - '0');
else
n = 0;
if (n && !(n & (n - 1)))
{
if (!isdigit(t[0]))
t++;
m = *(t += 2);
}
b = t;
}
*b = 0;
goto again;
{
{
return 0;
}
goto again;
return 0;
}
return 0;
else
}