11 #define _RPMDIR_INTERNAL
30 rpmavx avx = (rpmavx) _avx;
32 avx->mtimes =
_free(avx->mtimes);
33 avx->sizes =
_free(avx->sizes);
34 avx->modes =
_free(avx->modes);
39 (void)
urlFree(avx->u, __FUNCTION__);
41 avx->uri =
_free(avx->uri);
54 if (_avxPool == NULL) {
60 memset(((
char *)avx)+
sizeof(avx->_item), 0,
sizeof(*avx)-
sizeof(avx->_item));
78 avx->uri = strcpy((
char *)
xmalloc(strlen(uri) + 1 + 1), uri);
80 avx->u =
urlLink(u, __FUNCTION__);
82 if ((avx->st = st) != NULL)
83 memset(avx->st, 0,
sizeof(*avx->st));
86 return rpmavxLink(avx);
90 mode_t
mode,
size_t size, time_t mtime)
95 fprintf(stderr,
"--> %s(%p,\"%s\", %06o, 0x%x, 0x%x)\n", __FUNCTION__, avx, path, (
unsigned)mode, (
unsigned)size, (
unsigned)mtime);
99 while (avx->ac >= avx->nalloced) {
100 if (avx->nalloced <= 0)
104 (
sizeof(*avx->modes) * avx->nalloced));
105 avx->sizes = (
size_t *)
xrealloc(avx->sizes,
106 (
sizeof(*avx->sizes) * avx->nalloced));
107 avx->mtimes = (time_t *)
xrealloc(avx->mtimes,
108 (
sizeof(*avx->mtimes) * avx->nalloced));
112 avx->sizes[avx->ac] =
size;
113 avx->mtimes[avx->ac] = mtime;
123 fprintf(stderr,
"--> avClosedir(%p)\n", avdir);
125 #if defined(WITH_PTHREADS)
131 avdir =
_free(avdir);
146 fprintf(stderr,
"--> avOpendir(%s, %p, %p)\n", path, av, modes);
151 while (av[ac] != NULL)
152 nb += strlen(av[ac++]) + 1;
154 nb +=
sizeof(
".") +
sizeof(
"..");
156 nb +=
sizeof(*avdir) +
sizeof(*dp) + ((ac + 1) *
sizeof(*av)) + (ac + 1);
159 dp = (
struct dirent *) (avdir + 1);
160 nav = (
const char **) (dp + 1);
161 dt = (
unsigned char *) (nav + (ac + 1));
162 t = (
char *) (dt + ac + 1);
167 avdir->data = (
char *) dp;
169 avdir->allocation = nb;
175 #if defined(WITH_PTHREADS)
183 dt[nac] = (
unsigned char)
DT_DIR; nav[nac++] = t; t =
stpcpy(t,
"."); t++;
184 dt[nac] = (
unsigned char)
DT_DIR; nav[nac++] = t; t =
stpcpy(t,
".."); t++;
190 while (av[ac] != NULL) {
192 switch (modes[ac] & S_IFMT) {
193 case S_IFIFO: dt[nac]=(
unsigned char)
DT_FIFO;
break;
194 case S_IFCHR: dt[nac]=(
unsigned char)
DT_CHR;
break;
195 case S_IFDIR: dt[nac]=(
unsigned char)
DT_DIR;
break;
196 case S_IFBLK: dt[nac]=(
unsigned char)
DT_BLK;
break;
197 case S_IFREG: dt[nac]=(
unsigned char)
DT_REG;
break;
198 case S_IFLNK: dt[nac]=(
unsigned char)
DT_LNK;
break;
202 default: dt[nac]=(
unsigned char)
DT_UNKNOWN;
break;
215 return (DIR *) avdir;
223 static int _append_pesky_trailing_slash = 1;
232 if (avdir == NULL || !
ISAVMAGIC(avdir) || avdir->data == NULL) {
238 dp = (
struct dirent *) avdir->data;
239 av = (
const char **) (dp + 1);
240 ac = (int)avdir->size;
241 dt = (
unsigned char *) (av + (ac + 1));
242 i = avdir->offset + 1;
244 if (i < 0 || i >= ac || av[i] == NULL) {
257 #if !defined(__DragonFly__) && !defined(__CYGWIN__)
261 #if !(defined(hpux) || defined(__hpux) || defined(sun) || defined(RPM_OS_AIX) || defined(__CYGWIN__) || defined(__QNXNTO__))
262 #if !defined(__APPLE__) && !defined(__FreeBSD_kernel__) && !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__DragonFly__) && !defined(__OpenBSD__)
263 dp->d_off = (off_t)i;
269 t =
stpncpy(dp->d_name, av[i],
sizeof(dp->d_name));
272 if (_append_pesky_trailing_slash) {
273 size_t nt = (t - dp->d_name);
274 if (nt > 0 && nt <
sizeof(dp->d_name))
288 fprintf(stderr,
"<-- avReaddir(%p) %p %s\n", (
void *)avdir, dp, (dp ? dp->d_name :
""));
299 avdir->offset = (off_t)-1;
304 int (*filter) (
const struct dirent *),
305 int (*compar) (
const void *,
const void *))
312 if ((dir =
Opendir(path)) == NULL)
316 while ((dp =
Readdir(dir)) != NULL) {
317 if (filter != NULL && !(*filter)(dp))
322 *nl = (
struct dirent **) (rc == 1
324 :
xrealloc(*nl, rc *
sizeof(**nl)));
325 (*nl)[rc - 1] = (
struct dirent *)
326 memcpy(
xmalloc(
sizeof(*dp)), dp,
sizeof(*dp));
331 if (compar != NULL && nl != NULL && rc > 1)
332 qsort(*nl, rc,
sizeof(**nl), compar);
346 if (avdir == NULL || !
ISAVMAGIC(avdir) || avdir->data == NULL)
349 dp = (
struct dirent *) avdir->data;
350 av = (
const char **) (dp + 1);
351 ac = (int)avdir->size;
353 if (offset < 0 || offset >= ac || av[offset] == NULL)
356 avdir->offset = offset - 1;
371 if (avdir != NULL &&
ISAVMAGIC(avdir) && avdir->data != NULL) {
372 dp = (
struct dirent *) avdir->data;
373 av = (
const char **) (dp + 1);
374 ac = (int)avdir->size;
375 offset = avdir->offset;
378 if (offset < 0 || offset >= ac || av[offset] == NULL)
388 fprintf(stderr,
"*** Closedir(%p)\n", (
void *)dir);
393 return closedir(dir);
401 int ut =
urlPath(path, &lpath);
404 fprintf(stderr,
"*** Opendir(%s)\n", path);
428 return opendir(path);
435 fprintf(stderr,
"*** Readdir(%p)\n", (
void *)dir);
446 fprintf(stderr,
"*** Rewinddir(%p)\n", (
void *)dir);
455 int (*filter) (
const struct dirent *),
456 int (*compar) (
const void *,
const void *))
459 int ut =
urlPath(path, &lpath);
470 rc =
avScandir(path, nl, filter, compar);
480 rc = scandir(lpath, nl, filter,
481 (
int (*)(
const struct dirent **,
const struct dirent **))compar);
484 fprintf(stderr,
"*** Scandir(\"%s\", %p, %p, %p) rc %d\n", path, nl, filter, compar, rc);
490 struct dirent *
const * adp = (
struct dirent *
const *) a;
491 struct dirent *
const * bdp = (
struct dirent *
const *) b;
492 #if defined(HAVE_STRCOLL)
493 return strcoll((*adp)->d_name, (*bdp)->d_name);
495 return strcmp((*adp)->d_name, (*bdp)->d_name);
501 struct dirent *
const * adp = (
struct dirent *
const *) a;
502 struct dirent *
const * bdp = (
struct dirent *
const *) b;
503 #if defined(HAVE_STRVERSCMP)
504 return strverscmp((*adp)->d_name, (*bdp)->d_name);
506 return strcmp((*adp)->d_name, (*bdp)->d_name);
513 fprintf(stderr,
"*** Seekdir(%p,%ld)\n", (
void *)dir, (
long)offset);
517 seekdir(dir, offset);
527 fprintf(stderr,
"*** Telldir(%p) off %ld\n", (
void *)dir, (
long)offset);
int rpmavxAdd(rpmavx avx, const char *path, mode_t mode, size_t size, time_t mtime)
int Versionsort(const void *a, const void *b)
DIR * davOpendir(const char *path)
Create an argv directory from DAV collection.
Hash table implemenation.
unsigned short rpmuint16_t
void * rpmavxNew(const char *uri, struct stat *st)
static off_t avTelldir(DIR *dir)
void Seekdir(DIR *dir, off_t offset)
seekdir(3) clone.
void * xcalloc(size_t nmemb, size_t size)
rpmioItem rpmioGetPool(rpmioPool pool, size_t size)
Get unused item from pool, or alloc a new item.
static void avxFini(void *_avx)
char * stpncpy(char *dest, const char *src, size_t n)
ARGV_t argvFree(ARGV_t argv)
Destroy an argv array.
void Rewinddir(DIR *dir)
rewinddir(3) clone.
int argvAdd(ARGV_t *argvp, ARGstr_t val)
Add a string to an argv array.
struct dirent * avReaddir(DIR *dir)
#define pthread_mutex_destroy(__mutex)
int Scandir(const char *path, struct dirent ***nl, int(*filter)(const struct dirent *), int(*compar)(const void *, const void *))
scandir(3) clone.
struct __dirstream * AVDIR
static void avRewinddir(DIR *dir)
DIR * avOpendir(const char *path, const char **av, rpmuint16_t *modes)
int urlSplit(const char *url, urlinfo *uret)
Parse URL string into a control structure.
urltype urlPath(const char *url, const char **pathp)
Return path component of URL.
struct dirent * Readdir(DIR *dir)
readdir(3) clone.
rpmioPool rpmioNewPool(const char *name, size_t size, int limit, int flags, char *(*dbg)(void *item), void(*init)(void *item), void(*fini)(void *item))
Create a memory pool.
int Alphasort(const void *a, const void *b)
char * stpcpy(char *dest, const char *src)
const char const char size_t size
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
static int avScandir(const char *path, struct dirent ***nl, int(*filter)(const struct dirent *), int(*compar)(const void *, const void *))
static rpmavx avxGetPool(rpmioPool pool)
static void avSeekdir(DIR *dir, off_t offset)
int Closedir(DIR *dir)
closedir(3) clone.
rpmuint32_t hashFunctionString(rpmuint32_t h, const void *data, size_t size)
Return hash value of a string.
DIR * Opendir(const char *path)
opendir(3) clone.
#define pthread_mutex_init(__mutex, __attr)
off_t Telldir(DIR *dir)
telldir(3) clone.
urlinfo urlFree(urlinfo u, const char *msg)
Dereference a URL control structure instance.
DIR * ftpOpendir(const char *path)
Create an argv directory from an ftp:// URI.
urlinfo urlLink(urlinfo u, const char *msg)
Reference a URL control structure instance.