rpm/rpmio/tfts.c

181 lines
4.3 KiB
C

#include "system.h"
#include <fts.h>
#include <rpmio_internal.h>
#include <rpmmacro.h>
#include <rpmmessages.h>
#include <popt.h>
#include "debug.h"
/*@unchecked@*/
static int _fts_debug = 0;
#if 0
#define HTTPSPATH "https://localhost/rawhide/test/"
#define HTTPPATH "http://localhost/rawhide/test/"
#else
#define HTTPSPATH "https://localhost/rawhide/"
#define HTTPPATH "http://localhost/rawhide/"
#endif
#define FTPPATH "ftp://localhost/pub/rawhide/packages/test"
#define DIRPATH "/var/ftp/pub/rawhide/packages/test"
static char * httpspath = HTTPSPATH;
static char * httppath = HTTPPATH;
static char * ftppath = FTPPATH;
static char * dirpath = DIRPATH;
static int ndirs = 0;
static int nfiles = 0;
static int indent = 2;
static const char * ftsInfoStrings[] = {
"UNKNOWN",
"D",
"DC",
"DEFAULT",
"DNR",
"DOT",
"DP",
"ERR",
"F",
"INIT",
"NS",
"NSOK",
"SL",
"SLNONE",
"W",
};
static const char * ftsInfoStr(int fts_info) {
if (!(fts_info >= 1 && fts_info <= 14))
fts_info = 0;
return ftsInfoStrings[ fts_info ];
}
static int ftsPrint(FTS * ftsp, FTSENT * fts)
{
if (_fts_debug)
fprintf(stderr, "FTS_%s\t%*s %s\n", ftsInfoStr(fts->fts_info),
indent * (fts->fts_level < 0 ? 0 : fts->fts_level), "",
fts->fts_name);
switch (fts->fts_info) {
case FTS_D: /* preorder directory */
ndirs++;
break;
case FTS_DP: /* postorder directory */
break;
case FTS_F: /* regular file */
nfiles++;
break;
case FTS_NS: /* stat(2) failed */
case FTS_DNR: /* unreadable directory */
case FTS_ERR: /* error; errno is set */
break;
case FTS_DC: /* directory that causes cycles */
case FTS_DEFAULT: /* none of the above */
case FTS_DOT: /* dot or dot-dot */
case FTS_INIT: /* initialized only */
case FTS_NSOK: /* no stat(2) requested */
case FTS_SL: /* symbolic link */
case FTS_SLNONE: /* symbolic link without target */
case FTS_W: /* whiteout object */
default:
break;
}
return 0;
}
static int ftsOpts = 0;
static void ftsWalk(const char * path)
{
const char * ftsSet[2];
FTS * ftsp;
FTSENT * fts;
int xx;
ftsSet[0] = path;
ftsSet[1] = NULL;
ndirs = nfiles = 0;
ftsp = Fts_open((char *const *)ftsSet, ftsOpts, NULL);
while((fts = Fts_read(ftsp)) != NULL)
xx = ftsPrint(ftsp, fts);
xx = Fts_close(ftsp);
fprintf(stderr, "===== (%d/%d) dirs/files in %s\n", ndirs, nfiles, path);
}
static struct poptOption optionsTable[] = {
{ "ftsdebug", 'd', POPT_ARG_VAL, &_fts_debug, -1, NULL, NULL },
{ "comfollow", '\0', POPT_BIT_SET, &ftsOpts, FTS_COMFOLLOW,
N_("follow command line symlinks"), NULL },
{ "logical", '\0', POPT_BIT_SET, &ftsOpts, FTS_LOGICAL,
N_("logical walk"), NULL },
{ "nochdir", '\0', POPT_BIT_SET, &ftsOpts, FTS_NOCHDIR,
N_("don't change directories"), NULL },
{ "nostat", '\0', POPT_BIT_SET, &ftsOpts, FTS_NOSTAT,
N_("don't get stat info"), NULL },
{ "physical", '\0', POPT_BIT_SET, &ftsOpts, FTS_PHYSICAL,
N_("physical walk"), NULL },
{ "seedot", '\0', POPT_BIT_SET, &ftsOpts, FTS_SEEDOT,
N_("return dot and dot-dot"), NULL },
{ "xdev", '\0', POPT_BIT_SET, &ftsOpts, FTS_XDEV,
N_("don't cross devices"), NULL },
{ "whiteout", '\0', POPT_BIT_SET, &ftsOpts, FTS_WHITEOUT,
N_("return whiteout information"), NULL },
{ "ftpdebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_ftp_debug, -1,
N_("debug protocol data stream"), NULL},
{ "rpmiodebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmio_debug, -1,
N_("debug rpmio I/O"), NULL},
{ "urldebug", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_url_debug, -1,
N_("debug URL cache handling"), NULL},
{ "verbose", 'v', 0, 0, 'v', NULL, NULL },
POPT_AUTOHELP
POPT_TABLEEND
};
int
main(int argc, const char *argv[])
{
poptContext optCon = poptGetContext(argv[0], argc, argv, optionsTable, 0);
int rc;
while ((rc = poptGetNextOpt(optCon)) > 0) {
switch (rc) {
case 'v':
rpmIncreaseVerbosity();
/*@switchbreak@*/ break;
default:
/*@switchbreak@*/ break;
}
}
if (ftsOpts == 0)
ftsOpts = (FTS_COMFOLLOW | FTS_LOGICAL | FTS_NOSTAT);
_av_debug = -1;
_ftp_debug = -1;
_dav_debug = 1;
#if 0
ftsWalk(dirpath);
ftsWalk(ftppath);
#endif
ftsWalk(httppath);
#if 0
ftsWalk(httpspath);
#endif
/*@i@*/ urlFreeCache();
return 0;
}