sigtool: allow arbitrary names for --build

remotes/push_mirror/vc9-vt-dnd
Tomasz Kojm 15 years ago
parent 450d030a3d
commit 467ab203c6
  1. 4
      ChangeLog
  2. 124
      sigtool/sigtool.c

@ -1,3 +1,7 @@
Tue Mar 15 17:56:59 CET 2011 (tk)
---------------------------------
* sigtool: allow arbitrary names for --build
Thu Mar 10 15:54:05 CET 2011 (tk)
---------------------------------
* libclamav: optimize handling of {n} wildcards (bb#1796)

@ -72,58 +72,62 @@
#define MAX_DEL_LOOKAHEAD 200
static const struct dblist_s {
const char *name;
const char *ext;
unsigned int count;
} dblist[] = {
/* special files */
{ "COPYING", 0 },
{ "daily.cfg", 0 },
{ "daily.ign", 0 },
{ "daily.ign2", 0 },
{ "daily.ftm", 0 },
{ "main.info", 0 }, { "daily.info", 0 }, { "safebrowsing.info", 0 },
{ "cfg", 0 },
{ "ign", 0 },
{ "ign2", 0 },
{ "ftm", 0 },
{ "info", 0 },
/* databases */
{ "main.db", 1 }, { "daily.db", 1 },
{ "main.hdb", 1 }, { "daily.hdb", 1 },
{ "main.hdu", 1 }, { "daily.hdu", 1 },
{ "main.hsb", 1 }, { "daily.hsb", 1 },
{ "main.hsu", 1 }, { "daily.hsu", 1 },
{ "main.mdb", 1 }, { "daily.mdb", 1 },
{ "main.mdu", 1 }, { "daily.mdu", 1 },
{ "main.msb", 1 }, { "daily.msb", 1 },
{ "main.msu", 1 }, { "daily.msu", 1 },
{ "main.ndb", 1 }, { "daily.ndb", 1 },
{ "main.ndu", 1 }, { "daily.ndu", 1 },
{ "main.ldb", 1 }, { "daily.ldb", 1 },
{ "main.ldu", 1 }, { "daily.ldu", 1 },
{ "main.sdb", 1 }, { "daily.sdb", 1 },
{ "main.zmd", 1 }, { "daily.zmd", 1 },
{ "main.rmd", 1 }, { "daily.rmd", 1 },
{ "main.idb", 0 }, { "daily.idb", 0 },
{ "main.fp", 0 }, { "daily.fp", 0 },
{ "main.sfp", 0 }, { "daily.sfp", 0 },
{ "main.pdb", 1 }, { "daily.pdb", 1 }, { "safebrowsing.gdb", 1 },
{ "main.wdb", 0 }, { "daily.wdb", 0 }, { "safebrowsing.wdb", 0 },
{ "db", 1 },
{ "hdb", 1 },
{ "hdu", 1 },
{ "hsb", 1 },
{ "hsu", 1 },
{ "mdb", 1 },
{ "mdu", 1 },
{ "msb", 1 },
{ "msu", 1 },
{ "ndb", 1 },
{ "ndu", 1 },
{ "ldb", 1 },
{ "ldu", 1 },
{ "sdb", 1 },
{ "zmd", 1 },
{ "rmd", 1 },
{ "idb", 0 },
{ "fp", 0 },
{ "sfp", 0 },
{ "gdb", 1 },
{ "pdb", 1 },
{ "wdb", 0 },
{ NULL, 0 }
};
static const char *getdbname(const char *str)
static char *getdbname(const char *str, char *dst, int dstlen)
{
if(strstr(str, "main"))
return "main";
else if(strstr(str, "daily"))
return "daily";
else if(strstr(str, "safebrowsing"))
return "safebrowsing";
else if(strstr(str, "bytecode"))
return "bytecode";
else {
mprintf("!getdbname: Can't extract db name\n");
return "UNKNOWN";
int len = strlen(str);
if(cli_strbcasestr(str, ".cvd") || cli_strbcasestr(str, ".cld"))
len -= 4;
if(dst) {
strncpy(dst, str, MIN(dstlen - 1, len));
dst[MIN(dstlen - 1, len)] = 0;
} else {
dst = (char *) malloc(len + 1);
if(!dst)
return NULL;
strncpy(dst, str, len - 4);
dst[MIN(dstlen - 1, len - 4)] = 0;
}
return dst;
}
static int hexdump(void)
@ -411,7 +415,7 @@ static int writeinfo(const char *dbname, const char *builder, const char *header
{
FILE *fh;
unsigned int i, bytes;
char file[32], *pt;
char file[32], *pt, dbfile[32];
unsigned char digest[32], buffer[FILEBUFF];
SHA256_CTX ctx;
@ -450,14 +454,15 @@ static int writeinfo(const char *dbname, const char *builder, const char *header
free(pt);
}
} else {
for(i = 0; dblist[i].name; i++) {
if(!cli_strbcasestr(dblist[i].name, ".info") && strstr(dblist[i].name, dbname) && !access(dblist[i].name, R_OK)) {
if(!(pt = sha256file(dblist[i].name, &bytes))) {
for(i = 0; dblist[i].ext; i++) {
snprintf(dbfile, sizeof(dbfile), "%s.%s", dbname, dblist[i].ext);
if(strcmp(dblist[i].ext, "info") && !access(dbfile, R_OK)) {
if(!(pt = sha256file(dbfile, &bytes))) {
mprintf("!writeinfo: Can't generate SHA256 for %s\n", file);
fclose(fh);
return -1;
}
if(fprintf(fh, "%s:%u:%s\n", dblist[i].name, bytes, pt) < 0) {
if(fprintf(fh, "%s:%u:%s\n", dbfile, bytes, pt) < 0) {
mprintf("!writeinfo: Can't write to info file\n");
fclose(fh);
free(pt);
@ -617,8 +622,9 @@ static int build(const struct optstruct *opts)
unsigned int i, sigs = 0, oldsigs = 0, entries = 0, version, real_header, fl;
struct stat foo;
unsigned char buffer[FILEBUFF];
char *tarfile, header[513], smbuff[32], builder[32], *pt, olddb[512], patch[32], broken[32];
const char *dbname, *newcvd, *localdbdir = NULL;
char *tarfile, header[513], smbuff[32], builder[32], *pt, olddb[512];
char patch[32], broken[32], dbname[32], dbfile[32];
const char *newcvd, *localdbdir = NULL;
struct cl_engine *engine;
FILE *cvd, *fh;
gzFile *tar;
@ -648,7 +654,7 @@ static int build(const struct optstruct *opts)
return -1;
}
dbname = getdbname(optget(opts, "build")->strarg);
getdbname(optget(opts, "build")->strarg, dbname, sizeof(dbname));
if(!strcmp(dbname, "bytecode"))
bc = 1;
@ -714,9 +720,11 @@ static int build(const struct optstruct *opts)
entries += countlines("last.hdb");
}
} else {
for(i = 0; dblist[i].name; i++)
if(dblist[i].count && strstr(dblist[i].name, dbname) && !access(dblist[i].name, R_OK))
entries += countlines(dblist[i].name);
for(i = 0; dblist[i].ext; i++) {
snprintf(dbfile, sizeof(dbfile), "%s.%s", dbname, dblist[i].ext);
if(dblist[i].count && !access(dbfile, R_OK))
entries += countlines(dbfile);
}
}
if(entries != sigs)
@ -871,9 +879,10 @@ static int build(const struct optstruct *opts)
}
}
} else {
for(i = 0; dblist[i].name; i++) {
if(strstr(dblist[i].name, dbname) && !access(dblist[i].name, R_OK)) {
if(tar_addfile(-1, tar, dblist[i].name) == -1) {
for(i = 0; dblist[i].ext; i++) {
snprintf(dbfile, sizeof(dbfile), "%s.%s", dbname, dblist[i].ext);
if(!access(dbfile, R_OK)) {
if(tar_addfile(-1, tar, dbfile) == -1) {
gzclose(tar);
unlink(tarfile);
free(tarfile);
@ -1474,7 +1483,7 @@ static int comparesha(const char *dbname)
int ret = 0, tokens_count;
snprintf(info, sizeof(info), "%s.info", getdbname(dbname));
snprintf(info, sizeof(info), "%s.info", getdbname(dbname, buff, 32));
if(!(fh = fopen(info, "rb"))) {
mprintf("!verifydiff: Can't open %s\n", info);
@ -1712,6 +1721,7 @@ static int compare(const char *oldpath, const char *newpath, FILE *diff)
if(!badxchg) {
while(fgets(obuff, l1, old)) {
oline++;
cli_chomp(obuff);
obuff[MIN(16, l1-1)] = 0;
if((pt = strchr(obuff, ' ')))
*pt = 0;
@ -2574,7 +2584,7 @@ static int diffdirs(const char *old, const char *new, const char *patch)
static int makediff(const struct optstruct *opts)
{
char *odir, *ndir, name[32], broken[32];
char *odir, *ndir, name[32], broken[32], dbname[32];
struct cl_cvd *cvd;
unsigned int oldver, newver;
int ret;
@ -2648,7 +2658,7 @@ static int makediff(const struct optstruct *opts)
return -1;
}
snprintf(name, sizeof(name), "%s-%u.script", getdbname(opts->filename[0]), newver);
snprintf(name, sizeof(name), "%s-%u.script", getdbname(opts->filename[0], dbname, sizeof(dbname)), newver);
ret = diffdirs(odir, ndir, name);
cli_rmdirs(odir);

Loading…
Cancel
Save