int txop_ward_init(shpeer_t *cli_peer, tx_ward_t *ward) { unsigned char context[128]; shkey_t sig_key; tx_context_t ctx; tx_t *tx; int err; if (ward->ward_stamp == SHTIME_UNDEFINED) ward->ward_stamp = shtime(); if (ward->ward_expire == SHTIME_UNDEFINED) ward->ward_expire = shtime_adj(shtime(), MAX_SHARE_SESSION_TIME); memcpy(&ward->ward_tx.tx_peer, shpeer_kpriv(sharedaemon_peer()), sizeof(shpeer_t)); memset(&ctx, 0, sizeof(ctx)); err = inittx_context(&ctx, get_tx_key(ward), ashkey_uniq()); if (err) return (err); err = tx_save(&ctx); if (err) return (err); /* store key reference to generated context */ memcpy(&ward->ward_ctx, &ctx.ctx_tx.tx_key, sizeof(ward->ward_ctx)); return (0); }
int txop_ward_confirm(shpeer_t *peer, tx_ward_t *ward) { tx_context_t *ctx; tx_t *tx; int err; #if 0 /* verify identity exists */ ctx = (tx_context_t *)tx_load(TX_CONTEXT, &ward->ward_ctx); if (!ctx) return (SHERR_NOKEY); /* .. */ pstore_free(ctx); err = confirm_signature(&ward->ward_sig, shpeer_kpriv(&ward->ward_peer), shkey_hex(&ward->ward_key)); pstore_free(tx); if (err) return (err); err = inittx_context(ctx, get_tx_key(ward), ashkey_uniq()); if (err) return (err); #endif return (0); }
int txop_trust_init(shpeer_t *cli_peer, tx_trust_t *trust) { shkey_t *sig_key; uint64_t crc; int err; if (!trust) return (SHERR_INVAL); if (shkey_cmp(&trust->trust_ctx, ashkey_blank())) memcpy(&trust->trust_ctx, ashkey_uniq(), sizeof(trust->trust_ctx)); tx_sign(trust, &trust->trust_sig, &trust->trust_ctx); return (0); }
int shfs_rev_commit(shfs_ino_t *file, shfs_ino_t **rev_p) { shstat st; shbuf_t *diff_buff; shbuf_t *work_buff; shbuf_t *head_buff; shfs_ino_t *base; shfs_ino_t *repo; /* SHINODE_REPOSITORY */ shfs_ino_t *new_rev; /* SHINODE_REVISION */ shfs_ino_t *delta; /* SHINODE_DELTA */ shkey_t *rev_key; shfs_t *fs; int err; if (rev_p) *rev_p = NULL; head_buff = work_buff = diff_buff = NULL; err = shfs_fstat(file, &st); if (err) return (err); work_buff = shbuf_init(); err = shfs_read(file, work_buff); if (err) goto done; base = shfs_rev_base(file); if (base) { /* obtain delta of current file data content against BASE revision's data content. */ head_buff = shbuf_init(); err = shfs_rev_ref_read(file, "tag", "BASE", head_buff); if (err) goto done; if (shbuf_size(work_buff) == shbuf_size(head_buff) && 0 == memcmp(shbuf_data(work_buff), shbuf_data(head_buff), shbuf_size(work_buff))) { /* no difference */ err = SHERR_AGAIN; goto done; } diff_buff = shbuf_init(); err = shdelta(work_buff, head_buff, diff_buff); shbuf_free(&head_buff); if (err) return (err); rev_key = shfs_token(base); } else { /* initial revision */ rev_key = ashkey_uniq(); } repo = shfs_inode(file, NULL, SHINODE_REPOSITORY); if (!repo) { err = SHERR_IO; goto done; } /* create a new revision using previous revision's inode name */ new_rev = shfs_inode(repo, (char *)shkey_hex(rev_key), SHINODE_REVISION); if (!new_rev) { err = SHERR_IO; goto done; } /* define revision's meta information. */ shfs_meta_set(new_rev, SHMETA_USER_NAME, (char *)get_libshare_account_name()); /* save delta to new revision */ err = shfs_rev_delta_write(new_rev, diff_buff); shbuf_free(&diff_buff); if (err) goto done; /* save new revision as BASE branch head */ err = shfs_rev_base_set(file, new_rev); if (err) goto done; /* save work-data to BASE tag. */ err = shfs_rev_ref_write(file, "tag", "BASE", work_buff); shbuf_free(&work_buff); if (err) goto done; if (base) { /* tag previous revision's key token onto revision inode. */ shfs_rev_tag(new_rev, "PREV", base); } if (rev_p) *rev_p = new_rev; done: shbuf_free(&work_buff); shbuf_free(&diff_buff); shbuf_free(&head_buff); return (err); }