libha: renamings to make names consistent
[libha.git] / src / main_unp.c
blob2438f2e49ef6e5deb36500f529b506665aa143a6
1 /***********************************************************************
2 * This file is part of HA, a general purpose file archiver.
3 * Copyright (C) 1995 Harri Hirvola
4 * Modified by Ketmar // Invisible Vector
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 ***********************************************************************/
20 #include <fcntl.h>
21 #include <stdint.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <unistd.h>
27 #include <sys/stat.h>
28 #include <sys/types.h>
30 #include "libhaunp.h"
31 #include "pbar.h"
34 static int fdi = -1;
35 static int fdo = -1;
36 static uint64_t bytes_done = 0, bytes_total = 0;
38 #ifdef NDEBUG
39 # define OUTBUF_SIZE (1024*1024)
40 #else
41 # define OUTBUF_SIZE 1
42 #endif
43 static uint8_t *wrbuf;
46 static int dot_count = -1;
49 static int bread (void *buf, int buf_len, void *udata) {
50 return read(fdi, buf, buf_len);
54 int main (int argc, char *argv[]) {
55 haunp_t hup;
56 int res = 0;
57 char sign[4];
58 #ifndef NDEBUG
59 if (argc != 3) {
60 argc = 3;
61 argv[1] = "egatiles.dd2.haz";
62 argv[2] = "z01";
64 #endif
65 if (argc != 3) {
66 fprintf(stderr, "usage: %s infile outfile\n", argv[0]);
67 return 1;
69 fdi = open(argv[1], O_RDONLY|O_CLOEXEC);
70 if (fdi < 0) {
71 fprintf(stderr, "FATAL: can't open file: '%s'\n", argv[1]);
72 return 1;
74 if (read(fdi, sign, 4) != 4) res = -1;
75 else if (memcmp(sign, "LBHZ", 4) != 0) res = -1;
76 else if (read(fdi, &bytes_total, 8) != 8) res = -1;
77 if (res == -1) {
78 close(fdi);
79 fprintf(stderr, "FATAL: not libha file!\n");
80 return 1;
82 fdo = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0640);
83 if (fdo < 0) {
84 fprintf(stderr, "FATAL: can't create file: '%s'\n", argv[2]);
85 return 1;
87 hup = haunp_open_io(bread, NULL);
88 wrbuf = malloc(OUTBUF_SIZE);
89 //printf("output buffer size: %d\n", OUTBUF_SIZE);
90 for (;;) {
91 if (pbar_dot_count(bytes_done, bytes_total) != dot_count) {
92 dot_count = pbar_dot_count(bytes_done, bytes_total);
93 pbar_draw(bytes_done, bytes_total);
95 int rd = haunp_read(hup, wrbuf, OUTBUF_SIZE);
96 if (rd <= 0) {
97 pbar_clear();
98 if (rd < 0) fprintf(stdout, "READ ERROR!\n");
99 res = (rd < 0 ? -1 : 0);
100 break;
102 if (write(fdo, wrbuf, rd) != rd) {
103 pbar_clear();
104 fprintf(stdout, "WRITE ERROR!\n");
105 res = -1;
106 break;
108 bytes_done += rd;
110 free(wrbuf);
111 pbar_clear();
112 haunp_close(hup);
113 close(fdi);
114 close(fdo);
115 if (res != 0) unlink(argv[2]);
116 return res;