]> pd.if.org Git - zpackage/blob - lib/zpm.c
8df7fa82f2048baee280c67cdb918009c28c8674
[zpackage] / lib / zpm.c
1 #define _POSIX_C_SOURCE 200809L
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <sys/types.h>
7 #include <sys/stat.h>
8 #include <sys/mman.h>
9 #include <unistd.h>
10 #include <fcntl.h>
11 #include <errno.h>
12
13 #include "zpm.h"
14 #include "elf.h"
15
16 #include "sha256.h"
17
18 int zpm_begin(struct zpm *z) {
19         char *errstr = 0;
20         sqlite3_exec(z->db, "begin;", NULL, NULL, &errstr);
21         if (errstr) {
22                 fprintf(stderr, "sqlite begin error: %s\n", errstr);
23                 sqlite3_free(errstr);
24                 return 0;
25         }
26         return 1;
27 }
28
29 int zpm_commit(struct zpm *z) {
30         char *errstr = 0;
31         sqlite3_exec(z->db, "commit;", NULL, NULL, &errstr);
32         if (errstr) {
33                 fprintf(stderr, "sqlite commit error: %s\n", errstr);
34                 sqlite3_free(errstr);
35                 return 0;
36         }
37         return 1;
38 }
39
40 /* wrapper for sqlite3_exec */
41 int zpm_exec(struct zpm *z, const char *sql, int(*callback)(void *, int, char **, char**), void *arg, char **errmsg) {
42         return sqlite3_exec(z->db, sql, callback, arg, errmsg);
43 }
44
45 int zpm_rollback(struct zpm *z) {
46         char *errstr = 0;
47         sqlite3_exec(z->db, "rollback;", NULL, NULL, &errstr);
48         if (errstr) {
49                 fprintf(stderr, "sqlite rollback error: %s\n", errstr);
50                 sqlite3_free(errstr);
51                 return 0;
52         }
53         return 1;
54 }
55
56 int zpm_db_set_pragma(struct zpm *db, int pragma, int value) {
57         int rc;
58         char *sql;
59         sqlite3_stmt *s;
60
61         switch (pragma) {
62                 case 1: sql = "pragma application_id = ?;"; break;
63                 case 2: sql = "pragma user_version = ?;"; break;
64                 default: return -1; break;
65         }
66
67         rc = sqlite3_prepare_v2(db->db, sql, -1, &s, 0);
68
69         if (rc != SQLITE_OK) {
70                 SQLERROR(sqlite3_errmsg(db->db));
71                 return -1;
72         }
73
74         sqlite3_bind_int(s, 1, value);
75         if (rc != SQLITE_OK) {
76                 SQLERROR(sqlite3_errmsg(db->db));
77                 fprintf(stderr, "cant bind pragma value\n");
78                 sqlite3_finalize(s);
79                 return -1;
80         }
81         rc = sqlite3_step(s);
82         if (rc != SQLITE_DONE) {
83                 SQLERROR(sqlite3_errmsg(db->db));
84                 fprintf(stderr, "cant set pragma\n");
85                 sqlite3_finalize(s);
86                 return -1;
87         }
88
89         sqlite3_finalize(s);
90         return value;
91 }
92
93 int zpm_db_pragma(struct zpm *db, int pragma) {
94         int rc;
95         int value = -1;
96         char *sql = 0;
97         sqlite3_stmt *s;
98
99         switch (pragma) {
100                 case 1: sql = "pragma application_id;"; break;
101                 case 2: sql = "pragma user_version;"; break;
102                 default: return -1; break;
103         }
104
105         rc = sqlite3_prepare_v2(db->db, sql, -1, &s, 0);
106
107         if (rc != SQLITE_OK) {
108                 SQLERROR(sqlite3_errmsg(db->db));
109                 fprintf(stderr, "%s, errnum = %d\n", sqlite3_errmsg(db->db), rc);
110                 /* TODO just abort? */
111                 return -1;
112         }
113
114         rc = sqlite3_step(s);
115         if (rc == SQLITE_ROW) {
116                 value = sqlite3_column_int(s, 0);
117         }
118
119         sqlite3_finalize(s);
120         return value;
121 }
122
123 static
124 #include "newdb.c"
125
126 int zpm_db_initialize(struct zpm *pkg) {
127         char *error;
128         switch (sqlite3_exec(pkg->db, createdb, (int (*)(void *,int,char **,char **))0, NULL, &error)) {
129                 case SQLITE_OK: break;
130                 default:
131                         SQLERROR(sqlite3_errmsg(pkg->db));
132                         fprintf(stderr, "error: %s\n", error);
133                         sqlite3_free(error);
134                         zpm_rollback(pkg);
135                         return 0;
136                         break;
137         }
138         return 1;
139 }
140
141
142 /* assumes pkg->db is set */
143 static int setupdb(struct zpm *zpm) {
144         char *errstr = 0;
145         int appid, dbver;
146
147         zpm->error = 0;
148
149         appid = zpm_db_pragma(zpm, 1);
150         dbver = zpm_db_pragma(zpm, 2);
151
152         if (appid != 0x5a504442) {
153                 fprintf(stderr, "unknown database type\n");
154                 zpm->error = 1;
155                 return 0;
156         }
157
158         if (dbver > 1) {
159                 fprintf(stderr, "version %d zpm db detected, this program only works with version 1 databases\n", dbver);
160                 zpm->error = 1;
161                 return 0;
162         }
163
164         sqlite3_exec(zpm->db, "pragma foreign_keys = ON;", NULL, NULL, &errstr);
165
166         if (errstr) {
167                 free(zpm->errmsg);
168                 zpm->errmsg = strdup(errstr);
169                 fprintf(stderr, "sqlite foreign key error: %s\n", errstr);
170                 sqlite3_free(errstr);
171                 zpm->error = 1;
172                 return 0;
173         }
174
175         /* TODO add vercmp */
176
177         return 1;
178 }
179
180 struct zpm *zpm_clearmem(struct zpm *zpm) {
181         if (!zpm) {
182                 zpm = malloc(sizeof *zpm);
183         }
184
185         if (zpm) {
186                 *zpm = (struct zpm){0};
187         }
188
189         return zpm;
190 }
191
192 static void zpm_set_db_errmsg(struct zpm *zpm, const char *msg) {
193         if (zpm) {
194                 if (zpm->dberrmsg) {
195                         free(zpm->dberrmsg);
196                 }
197                 if (msg) {
198                         zpm->dberrmsg = strdup(msg);
199                         if (!zpm->dberrmsg) {
200                                 zpm->error = 1;
201                         }
202                 } else {
203                         zpm->dberrmsg = 0;
204                 }
205         }
206 }
207
208 int zpm_init(struct zpm *pkg, char *path) {
209         int rc;
210         sqlite3 *db = 0;
211         int appid;
212
213         if (!pkg) {
214                 return 0;
215         }
216
217         zpm_clearmem(pkg);
218
219         rc = sqlite3_open_v2(path, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
220         if (rc) {
221                 pkg->error = 1;
222                 pkg->dbresult = rc;
223                 zpm_set_db_errmsg(pkg, sqlite3_errstr(rc));
224                 if (db) {
225                         sqlite3_close(db);
226                 }
227                 fprintf(stderr, "error (%d): %s: %s\n", rc,
228                                 pkg->dberrmsg ? pkg->dberrmsg : "null", path);
229
230                 return 0;
231         }
232         pkg->db   = db;
233         pkg->path = strdup(path);
234
235         appid = zpm_db_pragma(pkg, 1);
236
237         switch (appid) {
238                 case 0: if (!zpm_db_initialize(pkg)) {
239                                 sqlite3_close(db);
240                                 return 1;
241                         };
242                         break;
243                 case 0x5a504442:
244                         /* already initialized */
245                         break;
246                 default:
247                         fprintf(stderr, "unknown database type\n");
248                         sqlite3_close(db);
249                         return 0;
250                         break;
251         }
252
253         if (!setupdb(pkg)) {
254                 sqlite3_close(db);
255                 pkg->db = 0;
256                 return 0;
257         }
258         zpm_addvercmp(pkg);
259
260         return 1;
261 }
262
263 int zpm_open(struct zpm *zpm, char *path) {
264         int rc;
265         sqlite3 *db = 0;
266
267         zpm_clearmem(zpm);
268
269         rc = sqlite3_open_v2(path, &db, SQLITE_OPEN_READWRITE, NULL);
270         if (rc) {
271                 SQLERROR(sqlite3_errmsg(db));
272                 sqlite3_close(db);
273                 zpm->error = 1;
274                 fprintf(stderr, "path = %s\n", path);
275                 return 0;
276         }
277         zpm->db   = db;
278         zpm->path = strdup(path);
279
280         if (!setupdb(zpm)) {
281                 sqlite3_close(db);
282                 zpm->db = 0;
283                 zpm->error = 1;
284                 return 0;
285         }
286         zpm_addvercmp(zpm);
287
288         return 1;
289 }
290
291 int zpm_close(struct zpm *pkg) {
292         if (pkg) {
293                 sqlite3_close(pkg->db);
294                 free(pkg->path);
295         }
296         /* TODO free any malloced names and such */
297         return 1;
298 }
299
300 static int zpm_sqlite_vercmp(void *not_used, int lena, const void *a,
301                 int lenb, const void *b) {
302         /* not sure what the ints are, possibly string lengths */
303         if (not_used != 0) fprintf(stderr, "sqlite vercmp not_used = %p\n",
304                         not_used);
305         if (lena == 0 && lenb > 0) return 1;
306         return zpm_vercmp(a, b);
307 }
308
309 int zpm_addvercmp(struct zpm *pkg) {
310         return sqlite3_create_collation(
311                         pkg->db, "vercmp", SQLITE_UTF8, NULL,
312                         zpm_sqlite_vercmp
313                         );
314 }
315
316 int zpm_extract(struct zpm *pkg, char *hash, char *path, mode_t mode) {
317         int rc;
318         int blobsize;
319         void *xzdata;
320         int type;
321         int out;
322         sqlite3_stmt *ifile;
323         size_t len;
324         char *tmpfile = 0;
325         sqlite3 *db;
326
327         if (!pkg || !pkg->db) {
328                 return 0;
329         }
330         db = pkg->db;
331
332         rc = sqlite3_prepare(db, "select size, content from files where hash = ?", -1, &ifile,0);
333         if (rc != SQLITE_OK) {
334                 SQLERROR(sqlite3_errmsg(db));
335                 return 0;
336         }
337
338         /* hash, filename */
339
340         sqlite3_bind_text(ifile, 1, hash, 64, SQLITE_STATIC);
341
342         rc = sqlite3_step(ifile);
343
344         if (rc == SQLITE_DONE) {
345                 /* didn't find a row */
346                 sqlite3_finalize(ifile);
347                 sqlite3_close(db);
348                 fprintf(stderr, "no such hash: %s\n", hash);
349                 return 0;
350         }
351         /* either way we're done with this now */
352
353         if (rc != SQLITE_ROW) {
354                 SQLERROR(sqlite3_errmsg(db));
355                 sqlite3_finalize(ifile);
356                 sqlite3_close(db);
357                 return 0;
358         }
359
360         type = sqlite3_column_type(ifile, 0);
361         if (type == SQLITE_NULL) {
362                 fprintf(stderr, "no file size\n");
363                 sqlite3_finalize(ifile);
364                 sqlite3_close(db);
365                 return 0;
366         }
367         type = sqlite3_column_type(ifile, 1);
368         if (type == SQLITE_NULL) {
369                 fprintf(stderr, "no file data\n");
370                 sqlite3_finalize(ifile);
371                 sqlite3_close(db);
372                 return 0;
373         }
374         //size = sqlite3_column_int64(ifile, 0);
375         xzdata = (void *)sqlite3_column_blob(ifile, 1);
376         blobsize = sqlite3_column_bytes(ifile, 1);
377
378         if (strcmp(path, "-")) {
379                 len = strlen(path);
380                 tmpfile = malloc(len+8+1);
381                 if (!tmpfile) {
382                         fprintf(stderr, "malloc error\n");
383                         return 0;
384                 }
385                 sprintf(tmpfile, "%sXXXXXX", path);
386
387                 out = open(tmpfile, O_CREAT|O_WRONLY|O_TRUNC, 0600);
388                 if (out == -1) {
389                         fprintf(stderr, "can't open output file %s: %s\n",
390                                         tmpfile, strerror(errno));
391                         sqlite3_finalize(ifile);
392                         sqlite3_close(db);
393                         return 0;
394                 }
395         } else {
396                 out = 1;
397         }
398
399 #if 0
400         fprintf(stderr, "uncompressing %d bytes at %p, expect %lld\n", blobsize, xzdata, (long long int)size);
401 #endif
402         uncompresslzma(xzdata, blobsize, out);
403         close(out);
404         sqlite3_finalize(ifile);
405
406         rc = 1;
407         if (tmpfile) {
408                 if (chmod(tmpfile, mode) == -1) {
409                         fprintf(stderr, "can't chmod %s: %s\n", tmpfile,
410                                         strerror(errno));
411                         rc = 0;
412                 } else if (rename(tmpfile, path) == -1) {
413                         fprintf(stderr, "extract rename failed: %s\n",
414                                         strerror(errno));
415                         rc = 0;
416                 }
417         }
418
419         if (rc == 0 && tmpfile) {
420                 if (unlink(tmpfile) == -1) {
421                         fprintf(stderr, "unlink tmpfile %s fail: %s\n",
422                                         tmpfile,
423                                         strerror(errno));
424                 }
425         }
426
427         return rc;
428 }
429
430 static int run_for_hash(sqlite3 *db, char *sql, char *hash) {
431         int rc;
432         sqlite3_stmt *ifile;
433
434         rc = sqlite3_prepare_v2(db, sql, -1, &ifile, 0);
435         if (rc != SQLITE_OK) {
436                 SQLERROR(sqlite3_errmsg(db));
437                 return 0;
438         }
439
440         /* hash, filename */
441
442         sqlite3_bind_text(ifile, 1, hash, 64, SQLITE_STATIC);
443         do {
444                 rc = sqlite3_step(ifile);
445         } while (rc == SQLITE_ROW);
446
447         sqlite3_finalize(ifile);
448
449         return rc == SQLITE_DONE;
450 }
451
452 #define SQLERP(db, msg) fprintf(stderr, "%s: %s\n", msg, sqlite3_errmsg(db))
453
454 static int set_elf_info(sqlite3 *db, char *hash, char *content, size_t length) {
455         if (length >= sizeof (Elf64_Ehdr) && libelf_iself(content)) {
456                 char *strtab;
457                 Elf64_Dyn *dyn;
458                 int i;
459                 Elf64_Phdr *phdr;
460                 Elf64_Ehdr *hdr;
461                 sqlite3_stmt *ifile;
462                 int rc;
463
464                 /* clear existing for this hash */
465
466                 if (!run_for_hash(db, "delete from elflibraries where file = ?", hash)) {
467                         SQLERP(db, "error clearing elf library");
468                         return 0;
469                 }
470
471                 if (!run_for_hash(db, "delete from elfneeded where file = ?", hash)) {
472                         SQLERP(db, "error clearing elf needed");
473                         return 0;
474                 }
475
476                 hdr = libelf_header(content);
477                 /* if lib, set soname */
478                 if (libelf_type(content) == ET_DYN) {
479                         char *soname = libelf_soname(content);
480                         if (soname) {
481
482                                 sqlite3_prepare_v2(db, "insert into elflibraries (file,soname) values (?,?)",-1, &ifile, 0);
483                                 sqlite3_bind_text(ifile,1,hash,64,SQLITE_STATIC);
484                                 sqlite3_bind_text(ifile,2,soname,-1,SQLITE_STATIC);
485                                 rc = sqlite3_step(ifile);
486                                 if (rc != SQLITE_DONE) {
487                                         SQLERROR(sqlite3_errmsg(db));
488                                         sqlite3_finalize(ifile);
489                                         fprintf(stderr, "error setting library soname\n");
490                                         return 0;
491                                 }
492                                 sqlite3_finalize(ifile);
493                         } else {
494                                 fprintf(stderr, "can't find soname\n");
495                         }
496                 }
497
498                 /* if exe, set neededs */
499                 if (libelf_type(content) == ET_EXEC) {
500                         Elf64_Shdr *dsect = 0;
501                         char *elf;
502
503                         elf = (char *)content;
504                         /* find program header table */
505                         for (i = 0; i < hdr->e_phnum; i++) {
506                                 phdr = (Elf64_Phdr *)(elf + hdr->e_phoff + i * hdr->e_phentsize);
507                                 if (phdr->p_type == PT_DYNAMIC) {
508                                         dsect = (Elf64_Shdr *)(elf + phdr->p_offset);
509                                 }
510                         }
511                         if (!dsect) {
512                                 /* no dynamic section found */
513                                 return 1;
514                         }
515
516 #if 0
517                         dyn = (Elf64_Dyn *)(elf + dsect->sh_offset);
518                         if (!dyn) {
519                                 exit(9);
520                         }
521 #endif
522                         dyn = (Elf64_Dyn *)dsect;
523
524                         dsect = libelf_section(elf, SHT_DYNAMIC);
525                         Elf64_Shdr *strsect;
526
527                         strsect = libelf_section_n(elf, dsect->sh_link);
528                         strtab = elf + strsect->sh_offset;
529
530                         sqlite3_prepare_v2(db, "insert into elfneeded (file,needed) values (?,?)",-1, &ifile, 0);
531                         sqlite3_bind_text(ifile,1,hash,64,SQLITE_STATIC);
532                         while (dyn->d_tag != DT_NULL) {
533                                 if (dyn->d_tag == DT_NEEDED) {
534                                         char *need;
535                                         int rc;
536
537                                         need = strtab + dyn->d_un.d_val;
538                                         if (strlen(need) == 0) continue;
539                                         sqlite3_bind_text(ifile,2,need,strlen(need),SQLITE_STATIC);
540 #if 0
541                                         fprintf(stderr, "%s needs %s\n", hash, need);
542 #endif
543                                         rc = sqlite3_step(ifile);
544                                         if (rc != SQLITE_DONE) {
545                                                 SQLERP(db, "error setting needed library");
546                                                 sqlite3_finalize(ifile);
547                                                 return 0;
548                                         }
549                                         sqlite3_reset(ifile);
550                                 }
551                                 dyn++;
552                         }
553                         sqlite3_finalize(ifile);
554                 }
555         }
556         return 1;
557 }
558
559 int zpm_import(struct zpm *zpm, char *path, uint32_t flags, char *hash) {
560         int fd;
561         void *content = 0;
562         struct stat sbuf;
563         unsigned char tmp[32];
564         struct sha256_state md;
565         sqlite3_stmt *ifile = 0;
566         int haverow = 0,havedata = 0;
567         int j,rc,type;
568         char hashbuf[65];
569
570         /* xz compress it */
571         size_t outlen = 0;
572         void *outbuf;
573
574         if (!zpm || !zpm->db || !path) {
575                 return 0;
576         }
577
578         /* use local if caller didn't pass in room */
579         if (!hash) {
580                 hash = hashbuf;
581         }
582
583         if (flags) {
584                 fprintf(stderr, "zpm_import unused flags = %d\n", flags);
585         }
586         /* mmap the file */
587         fd = open(path, O_RDONLY);
588         if (fd == -1) {
589                 zpm->error = errno;
590                 fprintf(stderr, "%s can't open %s: %s\n", __FUNCTION__, path,strerror(errno));
591                 return 0;
592         }
593         if (fstat(fd, &sbuf) == -1) {
594                 zpm->error = errno;
595                 fprintf(stderr, "%s can't fstat %s: %s\n", __FUNCTION__, path,strerror(errno));
596                 return 0;
597         }
598         /* not a regular file? */
599         if (!S_ISREG(sbuf.st_mode)) {
600                 char *ftype;
601                 switch (sbuf.st_mode & S_IFMT) {
602                         case S_IFSOCK: ftype = "socket"; break;
603                         case S_IFLNK : ftype = "symlink"; break;
604                         case S_IFBLK : ftype = "block device"; break;
605                         case S_IFDIR : ftype = "directory"; break;
606                         case S_IFCHR : ftype = "character device"; break;
607                         case S_IFIFO : ftype = "fifo"; break;
608                         default: ftype = "unknown file type"; break;
609                 }
610                 /* TODO this is ok, just stored differently */
611                 fprintf(stderr, "%s can't import %s file: %s\n", __FUNCTION__, ftype, path);
612                 zpm->error = EINVAL;
613                 return 0;
614         }
615
616         content = mmap(0, sbuf.st_size, PROT_READ,MAP_PRIVATE, fd, 0);
617         close(fd);
618         if (!content) {
619                 zpm->error = errno;
620                 fprintf(stderr, "%s can't mmap %s: %s\n", __FUNCTION__, path,strerror(errno));
621                 return 0;
622         }
623
624         /* get hash */
625         sha256_init(&md);
626         sha256_process(&md, content, sbuf.st_size);
627         sha256_done(&md, tmp);
628         for (j=0;j<32;j++) {
629                 sprintf(hash+j*2, "%02x", (unsigned)tmp[j]);
630         }
631         hash[64] = 0;
632
633         /* TODO check null */
634         sqlite3 *db = zpm->db;
635
636         /* prepare and bind */
637
638         rc = sqlite3_prepare_v2(db, "select size, content is not null from files where hash = ?", -1, &ifile,0);
639         if (rc != SQLITE_OK) {
640                 SQLERROR(sqlite3_errmsg(db));
641                 munmap(content, sbuf.st_size);
642                 return 0;
643         }
644
645         /* hash, filename */
646
647         sqlite3_bind_text(ifile, 1, hash, 64, SQLITE_STATIC);
648
649         rc = sqlite3_step(ifile);
650
651         if (rc != SQLITE_DONE) {
652                 if (rc != SQLITE_ROW) {
653                         /* didn't find a row */
654                         SQLERROR(sqlite3_errmsg(db));
655                 munmap(content, sbuf.st_size);
656                         return 0;
657                 }
658                 haverow = 1;
659                 type = sqlite3_column_type(ifile, 0);
660                 if (type == SQLITE_NULL) {
661                         /* TODO assert, this shouldn't be possible? */
662                         fprintf(stderr, "no file size\n");
663                         sqlite3_finalize(ifile);
664                 munmap(content, sbuf.st_size);
665                         return 0;
666                 }
667                 type = sqlite3_column_type(ifile, 1);
668                 if (type == SQLITE_NULL) {
669                         /* TODO assert, this shouldn't be possible? */
670                         fprintf(stderr, "no file data\n");
671                         sqlite3_finalize(ifile);
672                 munmap(content, sbuf.st_size);
673                         return 0;
674                         /* which is fine, just need to update the row then */
675                 }
676                 havedata = sqlite3_column_int(ifile, 1);
677         }
678
679         sqlite3_finalize(ifile);
680
681         if (!havedata) {
682                 /* compress */
683                 outbuf = compresslzma(content, sbuf.st_size, &outlen);
684                 if (!outbuf) {
685                         fprintf(stderr, "compresslzma failed\n");
686                         munmap(content, sbuf.st_size);
687                         return 0;
688                 }
689
690                 /* insert */
691                 if (haverow) {
692                         rc = sqlite3_prepare_v2(db, "update files set size = ?, content = ? where hash = ?", -1, &ifile,0);
693                 } else {
694                         rc = sqlite3_prepare_v2(db, "insert into files (size, content, hash) values (?,?,?)", -1, &ifile,0);
695                 }
696
697                 if (rc != SQLITE_OK) {
698                         SQLERROR(sqlite3_errmsg(db));
699                         fprintf(stderr, "cant prepare data\n");
700                         munmap(content, sbuf.st_size);
701                         return 0;
702                 }
703
704                 rc = sqlite3_bind_int64(ifile, 1, (sqlite3_int64)sbuf.st_size);
705                 if (rc != SQLITE_OK) {
706                         SQLERROR(sqlite3_errmsg(db));
707                         sqlite3_finalize(ifile);
708                         fprintf(stderr, "cant bind size\n");
709                         munmap(content, sbuf.st_size);
710                         return 0;
711                 }
712
713                 rc = sqlite3_bind_blob64(ifile, 2, outbuf,
714                                 (sqlite3_int64)outlen, SQLITE_STATIC);
715                 if (rc != SQLITE_OK) {
716                         SQLERROR(sqlite3_errmsg(db));
717                         sqlite3_finalize(ifile);
718                         fprintf(stderr, "cant bind content\n");
719                         munmap(content, sbuf.st_size);
720                         return 0;
721                 }
722
723                 rc = sqlite3_bind_text(ifile, 3, hash, 64, SQLITE_STATIC);
724                 if (rc != SQLITE_OK) {
725                         SQLERROR(sqlite3_errmsg(db));
726                         fprintf(stderr, "cant bind hash\n");
727                         sqlite3_finalize(ifile);
728                         munmap(content, sbuf.st_size);
729                         return 0;
730                 }
731
732                 rc = sqlite3_step(ifile);
733                 if (rc != SQLITE_DONE) {
734                         SQLERROR(sqlite3_errmsg(db));
735                         sqlite3_finalize(ifile);
736                         munmap(content, sbuf.st_size);
737                         return 0;
738                 }
739                 sqlite3_finalize(ifile);
740
741                 /* don't need the original file now */
742         }
743
744         if (!set_elf_info(zpm->db, hash, content, sbuf.st_size)) {
745                 fprintf(stderr, "setting elf info failed\n");
746                 munmap(content, sbuf.st_size);
747                 return 0;
748         }
749
750         munmap(content, sbuf.st_size);
751
752         /* return */
753         return 1;
754 }