From: Nathan Wagner Date: Wed, 28 Sep 2016 23:15:57 +0000 (+0000) Subject: add zpm-hash program X-Git-Tag: v0.1.6~171 X-Git-Url: https://pd.if.org/git/?p=zpackage;a=commitdiff_plain;h=cfbebb05d00b06bd7ac644611d94f7f689451838 add zpm-hash program --- diff --git a/.gitignore b/.gitignore index f8427b7..520cb5e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ elftype zpm-addfile zpm-extract zpm-init +zpm-hash uncompress *.zpm *.db diff --git a/lib/zpm.c b/lib/zpm.c index 96c3554..1cbf44e 100644 --- a/lib/zpm.c +++ b/lib/zpm.c @@ -11,6 +11,7 @@ #include "zpm.h" #include "sha256.h" + #if 0 struct zpm { sqlite3 *db; @@ -342,11 +343,37 @@ int zpm_close(struct zpm *pkg) { return 1; } +/* set package struct variables, database, environment, then command line */ +int zpm_readopts(struct zpm *pkg, int ac, char **av) { + char *ev; + + if (!pkg) { + return -1; + } + + ev = getenv("ZPMPACKAGE"); + if (ev) { + pkg->pkgname = dupstr(ev); + } + ev = getenv("ZPMPKGREL"); + if (ev) { + pkg->release = strtol(ev, 0, 0); + } + ev = getenv("ZPMPKGVER"); + if (ev) { + pkg->version = dupstr(ev); + } + + /* now, parse the options, return optind so the caller can adjust if needed */ + + return 1; +} + int zpm_extract(struct zpm *pkg, char *hash, char *path, int mode) { int rc; int blobsize; - int64_t size; + //int64_t size; void *xzdata; int type; FILE *out; @@ -397,7 +424,7 @@ int zpm_extract(struct zpm *pkg, char *hash, char *path, int mode) { sqlite3_close(db); return 0; } - size = sqlite3_column_int64(ifile, 0); + //size = sqlite3_column_int64(ifile, 0); xzdata = (void *)sqlite3_column_blob(ifile, 1); blobsize = sqlite3_column_bytes(ifile, 1); @@ -420,6 +447,51 @@ int zpm_extract(struct zpm *pkg, char *hash, char *path, int mode) { } +/* flags 0, close mmap, flags 1, return mmap fd */ +int zpm_hash(char *path, char *hash, uint32_t flags) { + int fd; + void *content; + struct stat sbuf; + hash_state md; + int j; + unsigned char tmp[32]; + + /* mmap the file */ + fd = open(path, O_RDONLY); + if (fd == -1) { + fprintf(stderr, "%s can't open %s: %s\n", __FUNCTION__, path,strerror(errno)); + return 0; + } + if (fstat(fd, &sbuf) == -1) { + fprintf(stderr, "%s can't fstat %s: %s\n", __FUNCTION__, path,strerror(errno)); + return 0; + } + /* not a regular file? */ + if (!S_ISREG(sbuf.st_mode)) { + /* TODO this is ok, just stored differently */ + fprintf(stderr, "%s non-regular files unsupported %s\n", __FUNCTION__, path); + return 0; + } + + content = mmap(0, sbuf.st_size, PROT_READ,MAP_PRIVATE, fd, 0); + close(fd); + if (!content) { + fprintf(stderr, "%s can't mmap %s: %s\n", __FUNCTION__, path,strerror(errno)); + return 0; + } + + /* get hash */ + sha256_init(&md); + sha256_process(&md, content, sbuf.st_size); + sha256_done(&md, tmp); + for (j=0;j<32;j++) { + sprintf(hash+j*2, "%02x", (unsigned)tmp[j]); + } + hash[64] = 0; + munmap(content, sbuf.st_size); + return 1; +} + #if 1 int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) { int fd; @@ -476,7 +548,7 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) { sprintf(hash+j*2, "%02x", (unsigned)tmp[j]); } hash[64] = 0; - fprintf(stderr, "file %s: %s\n", path, hash); + //fprintf(stderr, "file %s: %s\n", path, hash); /* prepare and bind */ /* TODO check null */ @@ -530,7 +602,7 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) { fprintf(stderr, "compresslzma failed\n"); return 0; } - fprintf(stderr, "compressed to %zu\n", outlen); + //fprintf(stderr, "compressed to %zu\n", outlen); /* don't need the original file now */ munmap(content, sbuf.st_size); close(fd); @@ -541,10 +613,10 @@ int zpm_import(struct zpm *pkg, char *path, uint32_t flags, char *hash) { /* insert */ if (haverow) { - fprintf(stderr, "adding file data\n"); + //fprintf(stderr, "adding file data\n"); rc = sqlite3_prepare(db, "update files set size = ?, content = ? where hash = ?", -1, &ifile,0); } else { - fprintf(stderr, "creating new data row\n"); + //fprintf(stderr, "creating new data row\n"); rc = sqlite3_prepare(db, "insert into files (size, content, hash) values (?,?,?)", -1, &ifile,0); } if (rc != SQLITE_OK) { diff --git a/zpm-hash.c b/zpm-hash.c new file mode 100644 index 0000000..31791b1 --- /dev/null +++ b/zpm-hash.c @@ -0,0 +1,19 @@ +#include +#include +#include "zpm.h" + +int main(int ac, char **av){ + int rv; + char hash[65]; + + if (ac < 2) { + fprintf(stderr, "usage: path\n"); + return 1; + } + rv = zpm_hash(av[1], hash, 0); + if (rv) { + printf("%s\n", hash); + } + + return rv; +} diff --git a/zpm.h b/zpm.h index 3149fe7..a45938b 100644 --- a/zpm.h +++ b/zpm.h @@ -91,3 +91,4 @@ int zpm_merge(struct zpm *z, struct zpm *src, uint32_t flags); void uncompresslzma(void *buf, size_t bufsize, FILE *out); void *compresslzma(void *buf, size_t bufsize, size_t *len); #define SQLERROR(x) fprintf(stderr, "%s %d: %s\n", __func__, __LINE__, (x)) +int zpm_hash(char *path, char *hash, uint32_t flags);