Line data Source code
1 : #include "burp.h"
2 : #include "asfd.h"
3 : #include "async.h"
4 : #include "bfile.h"
5 : #include "cmd.h"
6 : #include "fzp.h"
7 : #include "iobuf.h"
8 : #include "log.h"
9 : #include "msg.h"
10 :
11 462132 : int send_msg_fzp(struct fzp *fzp, enum cmd cmd, const char *buf, size_t s)
12 : {
13 462132 : if(fzp_printf(fzp, "%c%04X", cmd, (unsigned int)s)!=5
14 462132 : || fzp_write(fzp, buf, s)!=s
15 462132 : || fzp_printf(fzp, "\n")!=1)
16 : {
17 0 : logp("Unable to write message to file: %s\n", strerror(errno));
18 0 : return -1;
19 : }
20 : return 0;
21 : }
22 :
23 0 : static int do_write(struct asfd *asfd, struct BFILE *bfd,
24 : uint8_t *out, size_t outlen, uint64_t *sent)
25 : {
26 0 : int ret=0;
27 0 : if((ret=bfd->write(bfd, out, outlen))<=0)
28 : {
29 0 : logp("%s: error when appending %lu: %d\n",
30 : __func__, (unsigned long)outlen, ret);
31 0 : asfd->write_str(asfd, CMD_ERROR, "write failed");
32 0 : return -1;
33 : }
34 0 : *sent+=outlen;
35 0 : return 0;
36 : }
37 :
38 0 : static int do_inflate(struct asfd *asfd, z_stream *zstrm, struct BFILE *bfd,
39 : uint8_t *out, uint64_t *sent)
40 : {
41 0 : int zret=Z_OK;
42 0 : unsigned have=0;
43 0 : struct iobuf *rbuf=asfd->rbuf;
44 :
45 0 : zstrm->avail_in=rbuf->len;
46 0 : zstrm->next_in=(uint8_t *)rbuf->buf;
47 :
48 : do
49 : {
50 0 : zstrm->avail_out=ZCHUNK;
51 0 : zstrm->next_out=out;
52 0 : zret=inflate(zstrm, Z_NO_FLUSH);
53 0 : switch(zret)
54 : {
55 : case Z_NEED_DICT:
56 0 : zret=Z_DATA_ERROR;
57 : case Z_DATA_ERROR:
58 : case Z_MEM_ERROR:
59 0 : logp("zstrm inflate error: %d\n", zret);
60 0 : return -1;
61 : }
62 0 : have=ZCHUNK-zstrm->avail_out;
63 0 : if(!have) continue;
64 :
65 0 : if(do_write(asfd, bfd, out, have, sent))
66 : return -1;
67 0 : } while(!zstrm->avail_out);
68 : return 0;
69 : }
70 :
71 0 : int transfer_gzfile_in(struct asfd *asfd, struct BFILE *bfd,
72 : uint64_t *rcvd, uint64_t *sent)
73 : {
74 0 : int quit=0;
75 0 : int ret=-1;
76 : uint8_t out[ZCHUNK];
77 0 : struct iobuf *rbuf=asfd->rbuf;
78 : z_stream zstrm;
79 :
80 0 : zstrm.zalloc=Z_NULL;
81 0 : zstrm.zfree=Z_NULL;
82 0 : zstrm.opaque=Z_NULL;
83 0 : zstrm.avail_in=0;
84 0 : zstrm.next_in=Z_NULL;
85 :
86 0 : if(inflateInit2(&zstrm, (15+16)))
87 : {
88 0 : logp("unable to init inflate\n");
89 0 : goto end;
90 : }
91 :
92 : while(!quit)
93 : {
94 0 : iobuf_free_content(rbuf);
95 0 : if(asfd->read(asfd)) goto end_inflate;
96 0 : (*rcvd)+=rbuf->len;
97 :
98 : //logp("transfer in: %c:%s\n", rbuf->cmd, rbuf->buf);
99 0 : switch(rbuf->cmd)
100 : {
101 : case CMD_APPEND: // append
102 0 : if(!bfd)
103 : {
104 0 : logp("given append, but no file to write to\n");
105 0 : asfd->write_str(asfd, CMD_ERROR,
106 : "append with no file");
107 0 : goto end_inflate;
108 : }
109 : else
110 : {
111 0 : if(do_inflate(asfd, &zstrm,
112 : bfd, out, sent))
113 : goto end_inflate;
114 : }
115 : break;
116 : case CMD_END_FILE: // finish up
117 : goto end_ok;
118 : case CMD_MESSAGE:
119 : case CMD_WARNING:
120 : {
121 0 : struct cntr *cntr=NULL;
122 0 : log_recvd(rbuf, cntr, 0);
123 0 : break;
124 : }
125 : default:
126 0 : iobuf_log_unexpected(rbuf, __func__);
127 0 : goto end_inflate;
128 : }
129 : }
130 :
131 : end_ok:
132 : ret=0;
133 : end_inflate:
134 0 : inflateEnd(&zstrm);
135 : end:
136 0 : if(ret) logp("transfer file returning: %d\n", ret);
137 0 : iobuf_free_content(rbuf);
138 0 : return ret;
139 : }
|