void sched_tx_payload(shkey_t *dest_key, void *data, size_t data_len, void *payload, size_t payload_len) { tx_t *tx = (tx_t *)data; tx_t sig_tx; tx_net_t net; shsig_t sig; shsig_t new_sig; shbuf_t *buff; shpeer_t *self_peer; if (!data) return; if (data_len < sizeof(tx_t)) return; prep_net_tx(tx, &net, dest_key, data_len + payload_len); buff = shbuf_init(); shbuf_cat(buff, &net, sizeof(tx_net_t)); shbuf_cat(buff, data, data_len); if (payload && payload_len) shbuf_cat(buff, payload, payload_len); tx_wrap(NULL, shbuf_data(buff) + sizeof(tx_net_t)); broadcast_raw(shbuf_data(buff), shbuf_size(buff)); shbuf_free(&buff); fprintf(stderr, "DEBUG: SEND: sched_tx_payload: [OP %d] hash(%s) peer(%s) stamp(%llu) nonce(%d) method(%d) OP(%d)\n", (int)tx->tx_op, tx->hash, shkey_print(&tx->tx_peer), (unsigned long long)tx->tx_stamp, (int)tx->nonce, TXHASH_SCRYPT, (int)tx->tx_op); }
int tx_send(shpeer_t *cli_peer, tx_t *tx) { unsigned char *data = (unsigned char *)tx; size_t data_len; tx_ledger_t *l; int err; txop_t *op; if (!data) return (SHERR_INVAL); data_len = get_tx_size(tx); if (!data_len) return (0); op = get_tx_op(tx->tx_op); if (!op) return (SHERR_INVAL); if (op->op_send) { err = op->op_send(cli_peer, data); if (err) { if (err == SHERR_OPNOTSUPP) return (0); return (err); } } if (is_tx_stored(tx->tx_op)) { l = ledger_load(shpeer_kpriv(sharedaemon_peer()), shtime()); if (l) { ledger_tx_add(l, (tx_t *)data); ledger_close(l); } } #if 0 /* encapsulate for network transfer. */ tx_wrap(shpeer_kpriv(cli_peer), (tx_t *)tx); #endif if (cli_peer) { sched_tx_sink(shpeer_kpriv(cli_peer), data, data_len); } else { sched_tx(data, data_len); } return (0); }