|
|
|
@ -653,6 +653,22 @@ static enum stream_state muxrpc_write_sink_1(struct boxs *bs, int infd,
|
|
|
|
|
return stream_state_open;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static enum stream_state muxrpc_write_sink_1_hashed(struct boxs *bs, int infd,
|
|
|
|
|
crypto_hash_sha256_state *hash_state, int req_id) {
|
|
|
|
|
int rc;
|
|
|
|
|
char buf[4096];
|
|
|
|
|
ssize_t sz = read(infd, buf, sizeof(buf));
|
|
|
|
|
if (sz < 0) err(1, "read");
|
|
|
|
|
if (sz == 0) {
|
|
|
|
|
ps_write(bs, "true", 4, pkt_type_json, req_id, true, true);
|
|
|
|
|
return stream_state_ended_ok;
|
|
|
|
|
}
|
|
|
|
|
rc = crypto_hash_sha256_update(hash_state, buf, sz);
|
|
|
|
|
if (rc < 0) errx(1, "hash update failed");
|
|
|
|
|
ps_write(bs, buf, sz, pkt_type_buffer, req_id, true, false);
|
|
|
|
|
return stream_state_open;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int muxrpc_write_sink(struct boxs *bs, int infd, enum pkt_type ptype, int req_id) {
|
|
|
|
|
int rc;
|
|
|
|
|
fd_set rd;
|
|
|
|
@ -675,6 +691,43 @@ static int muxrpc_write_sink(struct boxs *bs, int infd, enum pkt_type ptype, int
|
|
|
|
|
in == stream_state_ended_error || out == stream_state_ended_error ? 2 : 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int muxrpc_write_blob_add(struct boxs *bs, int infd, int outfd, int req_id) {
|
|
|
|
|
int rc;
|
|
|
|
|
fd_set rd;
|
|
|
|
|
int sfd = bs->s;
|
|
|
|
|
int maxfd = infd > sfd ? infd : sfd;
|
|
|
|
|
enum stream_state in = stream_state_open;
|
|
|
|
|
enum stream_state out = stream_state_open;
|
|
|
|
|
crypto_hash_sha256_state hash_state;
|
|
|
|
|
unsigned char hash[32];
|
|
|
|
|
char id[54] = "&";
|
|
|
|
|
|
|
|
|
|
rc = crypto_hash_sha256_init(&hash_state);
|
|
|
|
|
if (rc < 0) { errno = EINVAL; return -1; }
|
|
|
|
|
|
|
|
|
|
while (out == stream_state_open) {
|
|
|
|
|
FD_ZERO(&rd);
|
|
|
|
|
if (in == stream_state_open) FD_SET(infd, &rd);
|
|
|
|
|
if (out == stream_state_open) FD_SET(sfd, &rd);
|
|
|
|
|
rc = select(maxfd + 1, &rd, 0, 0, NULL);
|
|
|
|
|
if (rc < 0) err(1, "select");
|
|
|
|
|
if (FD_ISSET(infd, &rd)) in = muxrpc_write_sink_1_hashed(bs, infd, &hash_state, req_id);
|
|
|
|
|
if (FD_ISSET(sfd, &rd)) out = muxrpc_read_source_1(bs, -1, req_id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rc = crypto_hash_sha256_final(&hash_state, hash);
|
|
|
|
|
if (rc < 0) errx(1, "hash finalize failed");
|
|
|
|
|
|
|
|
|
|
rc = base64_encode(hash, 32, id+1, sizeof(id)-1);
|
|
|
|
|
if (rc < 0) err(1, "encoding hash failed");
|
|
|
|
|
strcpy(id + 45, ".sha256\n");
|
|
|
|
|
rc = write_all(outfd, id, sizeof(id)-1);
|
|
|
|
|
if (rc < 0) err(1, "writing hash failed");
|
|
|
|
|
|
|
|
|
|
return in == stream_state_ended_ok && out == stream_state_ended_ok ? 0 :
|
|
|
|
|
in == stream_state_ended_error || out == stream_state_ended_error ? 2 : 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int muxrpc_duplex(struct boxs *bs, int infd, int outfd, enum pkt_type in_ptype, int req_id) {
|
|
|
|
|
int rc;
|
|
|
|
|
fd_set rd;
|
|
|
|
@ -860,7 +913,11 @@ int main(int argc, char *argv[]) {
|
|
|
|
|
rc = muxrpc_read_source(&bs, STDOUT_FILENO, 1);
|
|
|
|
|
break;
|
|
|
|
|
case muxrpc_type_sink:
|
|
|
|
|
if (!strcmp(methodstr, "blobs.add")) {
|
|
|
|
|
rc = muxrpc_write_blob_add(&bs, STDIN_FILENO, STDOUT_FILENO, 1);
|
|
|
|
|
} else {
|
|
|
|
|
rc = muxrpc_write_sink(&bs, STDIN_FILENO, ptype, 1);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case muxrpc_type_duplex:
|
|
|
|
|
rc = muxrpc_duplex(&bs, STDIN_FILENO, STDOUT_FILENO, ptype, 1);
|
|
|
|
|