VOID tstarc() { /* test integrity of an archive */ struct heads hdr; /* file header */ long arcsize, ftell(); /* archive size */ openarc(0); /* open archive for reading */ fseek(arc, 0L, 2); /* move to end of archive */ arcsize = ftell(arc); /* see how big it is */ fseek(arc, 0L, 0); /* return to top of archive */ while (readhdr(&hdr, arc)) { if (ftell(arc) + hdr.size > arcsize) { printf("Archive truncated in file %s\n", hdr.name); nerrs++; break; } else { printf("Testing file: %-12s ", hdr.name); fflush(stdout); if (unpack(arc, NULL, &hdr)) nerrs++; else printf("okay\n"); } } if (nerrs < 1) printf("No errors detected\n"); else if (nerrs == 1) printf("One error detected\n"); else printf("%d errors detected\n", nerrs); }
static void skiptoend(int ar) { Hdr *hp; while ((hp = readhdr(ar)) != nil) skip(ar, hp, "skipping to end"); /* * we have just read the end-of-archive Tblock. * now seek back over the (big) archive block containing it, * and back up curblk ptr over end-of-archive Tblock in memory. */ if (seek(ar, blkoff, 0) < 0) sysfatal("can't seek back over end-of-archive in %s: %r", arname); curblk--; }
static char * extract(char **argv) { int ar; char *int32_tname; char msg[Maxname + 40]; Compress *comp; Hdr *hp; Pushstate ps; /* open archive to be read */ if (usefile) ar = open(usefile, OREAD); else ar = Stdin; /* push decompression filter if requested or extension is known */ comp = compmethod(usefile); if (comp) ar = push(ar, comp->decomp, Input, &ps); if (ar < 0) sysfatal("can't open archive %s: %r", usefile); while ((hp = readhdr(ar)) != nil) { int32_tname = name(hp); if (match(int32_tname, argv)) extract1(ar, hp, int32_tname); else { snprint(msg, sizeof msg, "extracting %s", int32_tname); skip(ar, hp, msg); } } if (comp) return pushclose(&ps); if (ar > Stderr) close(ar); return nil; }
int main(int argc, char *argv[]) { int i, rc; MDB_env *env; MDB_txn *txn; MDB_cursor *mc; MDB_dbi dbi; char *envname; int envflags = 0, putflags = 0; int dohdr = 0; prog = argv[0]; if (argc < 2) { usage(); } /* -f: load file instead of stdin * -n: use NOSUBDIR flag on env_open * -s: load into named subDB * -N: use NOOVERWRITE on puts * -T: read plaintext * -V: print version and exit */ while ((i = getopt(argc, argv, "f:ns:NTV")) != EOF) { switch(i) { case 'V': printf("%s\n", MDB_VERSION_STRING); exit(0); break; case 'f': if (freopen(optarg, "r", stdin) == NULL) { fprintf(stderr, "%s: %s: reopen: %s\n", prog, optarg, strerror(errno)); exit(EXIT_FAILURE); } break; case 'n': envflags |= MDB_NOSUBDIR; break; case 's': subname = strdup(optarg); break; case 'N': putflags = MDB_NOOVERWRITE|MDB_NODUPDATA; break; case 'T': mode |= NOHDR | PRINT; break; default: usage(); } } if (optind != argc - 1) usage(); dbuf.mv_size = 4096; dbuf.mv_data = malloc(dbuf.mv_size); if (!(mode & NOHDR)) readhdr(); envname = argv[optind]; rc = mdb_env_create(&env); if (rc) { fprintf(stderr, "mdb_env_create failed, error %d %s\n", rc, mdb_strerror(rc)); return EXIT_FAILURE; } mdb_env_set_maxdbs(env, 2); if (info.me_maxreaders) mdb_env_set_maxreaders(env, info.me_maxreaders); if (info.me_mapsize) mdb_env_set_mapsize(env, info.me_mapsize); if (info.me_mapaddr) envflags |= MDB_FIXEDMAP; rc = mdb_env_open(env, envname, envflags, 0664); if (rc) { fprintf(stderr, "mdb_env_open failed, error %d %s\n", rc, mdb_strerror(rc)); goto env_close; } kbuf.mv_size = mdb_env_get_maxkeysize(env) * 2 + 2; kbuf.mv_data = malloc(kbuf.mv_size); while(!Eof) { MDB_val key, data; int batch = 0; flags = 0; if (!dohdr) { dohdr = 1; } else if (!(mode & NOHDR)) readhdr(); rc = mdb_txn_begin(env, NULL, 0, &txn); if (rc) { fprintf(stderr, "mdb_txn_begin failed, error %d %s\n", rc, mdb_strerror(rc)); goto env_close; } rc = mdb_open(txn, subname, flags|MDB_CREATE, &dbi); if (rc) { fprintf(stderr, "mdb_open failed, error %d %s\n", rc, mdb_strerror(rc)); goto txn_abort; } rc = mdb_cursor_open(txn, dbi, &mc); if (rc) { fprintf(stderr, "mdb_cursor_open failed, error %d %s\n", rc, mdb_strerror(rc)); goto txn_abort; } while(1) { rc = readline(&key, &kbuf); if (rc) /* rc == EOF */ break; rc = readline(&data, &dbuf); if (rc) { fprintf(stderr, "%s: line %" Z "d: failed to read key value\n", prog, lineno); goto txn_abort; } rc = mdb_cursor_put(mc, &key, &data, putflags); if (rc == MDB_KEYEXIST && putflags) continue; if (rc) { fprintf(stderr, "mdb_cursor_put failed, error %d %s\n", rc, mdb_strerror(rc)); goto txn_abort; } batch++; if (batch == 100) { rc = mdb_txn_commit(txn); if (rc) { fprintf(stderr, "%s: line %" Z "d: txn_commit: %s\n", prog, lineno, mdb_strerror(rc)); goto env_close; } rc = mdb_txn_begin(env, NULL, 0, &txn); if (rc) { fprintf(stderr, "mdb_txn_begin failed, error %d %s\n", rc, mdb_strerror(rc)); goto env_close; } rc = mdb_cursor_open(txn, dbi, &mc); if (rc) { fprintf(stderr, "mdb_cursor_open failed, error %d %s\n", rc, mdb_strerror(rc)); goto txn_abort; } batch = 0; } } rc = mdb_txn_commit(txn); txn = NULL; if (rc) { fprintf(stderr, "%s: line %" Z "d: txn_commit: %s\n", prog, lineno, mdb_strerror(rc)); goto env_close; } mdb_dbi_close(env, dbi); } txn_abort: mdb_txn_abort(txn); env_close: mdb_env_close(env); return rc ? EXIT_FAILURE : EXIT_SUCCESS; }
int main(int argc, char *argv[]) { int i, rc; MDBX_env *env = NULL; MDBX_txn *txn = NULL; MDBX_cursor *mc = NULL; MDBX_dbi dbi; char *envname = NULL; int envflags = MDBX_UTTERLY_NOSYNC, putflags = 0; int append = 0; MDBX_val prevk; prog = argv[0]; if (argc < 2) usage(); /* -a: append records in input order * -f: load file instead of stdin * -n: use NOSUBDIR flag on env_open * -s: load into named subDB * -N: use NOOVERWRITE on puts * -T: read plaintext * -V: print version and exit */ while ((i = getopt(argc, argv, "af:ns:NTV")) != EOF) { switch (i) { case 'V': printf("%s (%s, build %s)\n", mdbx_version.git.describe, mdbx_version.git.datetime, mdbx_build.datetime); exit(EXIT_SUCCESS); break; case 'a': append = 1; break; case 'f': if (freopen(optarg, "r", stdin) == NULL) { fprintf(stderr, "%s: %s: reopen: %s\n", prog, optarg, mdbx_strerror(errno)); exit(EXIT_FAILURE); } break; case 'n': envflags |= MDBX_NOSUBDIR; break; case 's': subname = mdbx_strdup(optarg); break; case 'N': putflags = MDBX_NOOVERWRITE | MDBX_NODUPDATA; break; case 'T': mode |= NOHDR | PRINT; break; default: usage(); } } if (optind != argc - 1) usage(); #if defined(_WIN32) || defined(_WIN64) SetConsoleCtrlHandler(ConsoleBreakHandlerRoutine, true); #else #ifdef SIGPIPE signal(SIGPIPE, signal_handler); #endif #ifdef SIGHUP signal(SIGHUP, signal_handler); #endif signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); #endif /* !WINDOWS */ dbuf.iov_len = 4096; dbuf.iov_base = mdbx_malloc(dbuf.iov_len); /* read first header for mapsize= */ if (!(mode & NOHDR)) readhdr(); envname = argv[optind]; rc = mdbx_env_create(&env); if (rc) { fprintf(stderr, "mdbx_env_create failed, error %d %s\n", rc, mdbx_strerror(rc)); return EXIT_FAILURE; } mdbx_env_set_maxdbs(env, 2); if (envinfo.mi_maxreaders) mdbx_env_set_maxreaders(env, envinfo.mi_maxreaders); if (envinfo.mi_mapsize) { if (envinfo.mi_mapsize > SIZE_MAX) { fprintf(stderr, "mdbx_env_set_mapsize failed, error %d %s\n", rc, mdbx_strerror(MDBX_TOO_LARGE)); return EXIT_FAILURE; } mdbx_env_set_mapsize(env, (size_t)envinfo.mi_mapsize); } #ifdef MDBX_FIXEDMAP if (info.mi_mapaddr) envflags |= MDBX_FIXEDMAP; #endif rc = mdbx_env_open(env, envname, envflags, 0664); if (rc) { fprintf(stderr, "mdbx_env_open failed, error %d %s\n", rc, mdbx_strerror(rc)); goto env_close; } kbuf.iov_len = mdbx_env_get_maxkeysize(env); if (kbuf.iov_len >= SIZE_MAX / 4) { fprintf(stderr, "mdbx_env_get_maxkeysize failed, returns %zu\n", kbuf.iov_len); goto env_close; } kbuf.iov_len = (kbuf.iov_len + 1) * 2; kbuf.iov_base = malloc(kbuf.iov_len * 2); k0buf.iov_len = kbuf.iov_len; k0buf.iov_base = (char *)kbuf.iov_base + kbuf.iov_len; prevk.iov_base = k0buf.iov_base; while (!Eof) { if (user_break) { rc = MDBX_EINTR; break; } rc = mdbx_txn_begin(env, NULL, 0, &txn); if (rc) { fprintf(stderr, "mdbx_txn_begin failed, error %d %s\n", rc, mdbx_strerror(rc)); goto env_close; } rc = mdbx_dbi_open_ex(txn, subname, dbi_flags | MDBX_CREATE, &dbi, append ? anyway_greater : NULL, append ? anyway_greater : NULL); if (rc) { fprintf(stderr, "mdbx_open failed, error %d %s\n", rc, mdbx_strerror(rc)); goto txn_abort; } rc = mdbx_cursor_open(txn, dbi, &mc); if (rc) { fprintf(stderr, "mdbx_cursor_open failed, error %d %s\n", rc, mdbx_strerror(rc)); goto txn_abort; } int batch = 0; prevk.iov_len = 0; while (1) { MDBX_val key; rc = readline(&key, &kbuf); if (rc) /* rc == EOF */ break; MDBX_val data; rc = readline(&data, &dbuf); if (rc) { fprintf(stderr, "%s: line %" PRIiSIZE ": failed to read key value\n", prog, lineno); goto txn_abort; } int appflag = 0; if (append) { appflag = MDBX_APPEND; if (dbi_flags & MDBX_DUPSORT) { if (prevk.iov_len == key.iov_len && memcmp(prevk.iov_base, key.iov_base, key.iov_len) == 0) appflag = MDBX_APPEND | MDBX_APPENDDUP; else memcpy(prevk.iov_base, key.iov_base, prevk.iov_len = key.iov_len); } } rc = mdbx_cursor_put(mc, &key, &data, putflags | appflag); if (rc == MDBX_KEYEXIST && putflags) continue; if (rc) { fprintf(stderr, "mdbx_cursor_put failed, error %d %s\n", rc, mdbx_strerror(rc)); goto txn_abort; } batch++; if (batch == 100) { rc = mdbx_txn_commit(txn); if (rc) { fprintf(stderr, "%s: line %" PRIiSIZE ": txn_commit: %s\n", prog, lineno, mdbx_strerror(rc)); goto env_close; } rc = mdbx_txn_begin(env, NULL, 0, &txn); if (rc) { fprintf(stderr, "mdbx_txn_begin failed, error %d %s\n", rc, mdbx_strerror(rc)); goto env_close; } rc = mdbx_cursor_open(txn, dbi, &mc); if (rc) { fprintf(stderr, "mdbx_cursor_open failed, error %d %s\n", rc, mdbx_strerror(rc)); goto txn_abort; } batch = 0; } } rc = mdbx_txn_commit(txn); txn = NULL; if (rc) { fprintf(stderr, "%s: line %" PRIiSIZE ": txn_commit: %s\n", prog, lineno, mdbx_strerror(rc)); goto env_close; } mdbx_dbi_close(env, dbi); /* try read next header */ if (!(mode & NOHDR)) readhdr(); } txn_abort: mdbx_txn_abort(txn); env_close: mdbx_env_close(env); return rc ? EXIT_FAILURE : EXIT_SUCCESS; }
int main(int argc, char **argv) { int fd, i; optind=opterr=0; while ((i = getopt(argc, argv, "s:"))!= -1) { segment=optarg; } if (optind != argc-1) { fprintf(stderr, "Usage: %s [-s segment] <file.bmp>.\n", argv[0]); return -1; } if ((fd = open(argv[optind], O_RDONLY)) < 0) { fprintf(stderr, "Error opening `%s'.\n", argv[optind]); return -1; } if (readhdr(fd) < 0) { fprintf(stderr, "`%s' is not a BMP file.\n", argv[optind]); close(fd); return -1; } checkbmp(); if (type == GFX_UNKNOWN) { fprintf(stderr, "`%s' is not a BMP file or\n does not contain a known C64 gfx type.\n" "Supported types:\n" " hires bitmap (320x200x1)\n" " 40 char font (256x64x1)\n" " 80 char font (128x64x1)\n" " hires sprite (24x21x1)\n", argv[1]); close(fd); return -1; } readbmp(fd); close(fd); if (!bitmap) { fprintf(stderr, "Error reading `%s' -- corrupted file.\n", argv[optind]); return -1; } char *name = basename(argv[optind]); char *ext = name + strlen(name) - 4; if (*ext == '.') { *ext = '\0'; } convertbmp(); #ifdef WIN32 setmode(fileno(stdout), O_BINARY); #endif switch (type) { case GFX_IMAGE: break; case GFX_FONT_40: case GFX_FONT_80: formatfont(name); break; case GFX_SPRITE: formatsprite(name); break; } free(c64bitmap); return 0; }