as_namespace * as_namespace_get_bymsgfield_unswap(as_msg_field *fp) { return as_namespace_get_bybuf((byte *)fp->data, as_msg_field_get_value_sz_unswap(fp)); }
void as_msg_peek( cl_msg *msgp, proto_peek *peek ) { memset(peek, 0, sizeof(proto_peek)); if (msgp == 0) return; if (msgp->proto.version != PROTO_VERSION || msgp->proto.type != PROTO_TYPE_AS_MSG) { return; } as_msg *m = &msgp->msg; peek->info1 = m->info1; peek->info2 = m->info2; if (m->n_fields == 0) { return; } int n_fields = m->n_fields; bool swap = n_fields < 10 ? false : true; if (swap) n_fields = ntohs(n_fields); as_msg_field *kdfp = 0; as_msg_field *sfp = 0; as_msg_field *kfp = 0; as_msg_field *nfp = 0; // over all the fields as_msg_field *mf = (as_msg_field *) m->data; uint i = 0; for (; i < n_fields ; i++) { switch (mf->type) { case AS_MSG_FIELD_TYPE_DIGEST_RIPE: kdfp = mf; break; case AS_MSG_FIELD_TYPE_SET: sfp = mf; break; case AS_MSG_FIELD_TYPE_KEY: kfp = mf; break; case AS_MSG_FIELD_TYPE_NAMESPACE: nfp = mf; break; } if (swap) mf = as_msg_field_get_next_unswap(mf); else mf = as_msg_field_get_next(mf); } // find the key if (kdfp) { peek->keyd = *(cf_digest *)kdfp->data; } else { if (kfp) { if (sfp == 0 || as_msg_field_get_value_sz(sfp) == 0) { int ksz = swap ? as_msg_field_get_value_sz_unswap(kfp) : as_msg_field_get_value_sz(kfp); cf_digest_compute(kfp->data, ksz, &peek->keyd); } else { int ksz = swap ? as_msg_field_get_value_sz_unswap(kfp) : as_msg_field_get_value_sz(kfp); int ssz = swap ? as_msg_field_get_value_sz_unswap(sfp) : as_msg_field_get_value_sz(sfp); cf_digest_compute2(sfp->data, ssz, kfp->data, ksz, &peek->keyd); } } } // find the namespace if (nfp) { int nsz = swap ? as_msg_field_get_value_sz_unswap(nfp) : as_msg_field_get_value_sz(nfp); if (nsz > AS_ID_NAMESPACE_SZ) goto no_ns; // this should be illegal for (int i = 0; i < g_config.namespaces; i++) { tsvc_namespace_devices *ndev = &g_tsvc_devices_a[i]; if (ndev->n_sz != nsz) continue; if (0 == memcmp(ndev->n_name, nfp->data, nsz)) { peek->ns_queue_offset = ndev->queue_offset; peek->ns_n_devices = ndev->n_devices; /* if (peek->info1 & AS_MSG_INFO1_READ) { cf_info(AS_PROTO, "read peek %s gives ofst %d n_dev %d",ndev->n_name,peek->ns_queue_offset,peek->ns_n_devices); } else { cf_info(AS_PROTO, "write peek %s gives ofst %d n_dev %d",ndev->n_name,peek->ns_queue_offset,peek->ns_n_devices); } */ break; } } } no_ns: return; }