diff --git a/src/Conn.cc b/src/Conn.cc index 9bd79d5b98..0579243244 100644 --- a/src/Conn.cc +++ b/src/Conn.cc @@ -434,7 +434,7 @@ void Connection::AppendAddl(const char* str) { const auto& cv = ConnVal(); - const char* old = cv->GetStringField(6)->CheckString(); + const char* old = cv->GetFieldAs(6)->CheckString(); const char* format = *old ? "%s %s" : "%s%s"; cv->Assign(6, make_intrusive(util::fmt(format, old, str))); diff --git a/src/Reporter.cc b/src/Reporter.cc index 6f6000dbd5..5b0245baf3 100644 --- a/src/Reporter.cc +++ b/src/Reporter.cc @@ -369,11 +369,11 @@ bool Reporter::PermitFlowWeird(const char* name, bool Reporter::PermitExpiredConnWeird(const char* name, const RecordVal& conn_id) { - auto conn_tuple = std::make_tuple(conn_id.GetAddrField("orig_h"), - conn_id.GetAddrField("resp_h"), - conn_id.GetPortValField("orig_p")->Port(), - conn_id.GetPortValField("resp_p")->Port(), - conn_id.GetPortValField("resp_p")->PortType()); + auto conn_tuple = std::make_tuple(conn_id.GetFieldAs("orig_h"), + conn_id.GetFieldAs("resp_h"), + conn_id.GetFieldAs("orig_p")->Port(), + conn_id.GetFieldAs("resp_p")->Port(), + conn_id.GetFieldAs("resp_p")->PortType()); auto& map = expired_conn_weird_state[conn_tuple]; diff --git a/src/Sessions.cc b/src/Sessions.cc index b12e01a8e5..2f6f07b1fe 100644 --- a/src/Sessions.cc +++ b/src/Sessions.cc @@ -346,11 +346,11 @@ Connection* NetSessions::FindConnection(Val* v) // types, too. } - const IPAddr& orig_addr = vl->GetAddrField(orig_h); - const IPAddr& resp_addr = vl->GetAddrField(resp_h); + const IPAddr& orig_addr = vl->GetFieldAs(orig_h); + const IPAddr& resp_addr = vl->GetFieldAs(resp_h); - const PortVal* orig_portv = vl->GetPortValField(orig_p); - const PortVal* resp_portv = vl->GetPortValField(resp_p); + const PortVal* orig_portv = vl->GetFieldAs(orig_p); + const PortVal* resp_portv = vl->GetFieldAs(resp_p); ConnID id; diff --git a/src/SmithWaterman.cc b/src/SmithWaterman.cc index 826690726f..7ea2edcb0c 100644 --- a/src/SmithWaterman.cc +++ b/src/SmithWaterman.cc @@ -109,19 +109,19 @@ Substring::Vec* Substring::VecFromPolicy(VectorVal* vec) if ( ! v ) continue; - const String* str = v->AsRecordVal()->GetStringField(0); + const String* str = v->AsRecordVal()->GetFieldAs(0); auto* substr = new Substring(*str); const VectorVal* aligns = v->AsRecordVal()->GetField(1)->AsVectorVal(); for ( unsigned int j = 1; j <= aligns->Size(); ++j ) { const RecordVal* align = aligns->AsVectorVal()->At(j)->AsRecordVal(); - const String* str = align->GetStringField(0); - int index = align->GetCountField(1); + const String* str = align->GetFieldAs(0); + int index = align->GetFieldAs(1); substr->AddAlignment(str, index); } - bool new_alignment = v->AsRecordVal()->GetBoolField(2); + bool new_alignment = v->AsRecordVal()->GetFieldAs(2); substr->MarkNewAlignment(new_alignment); result->push_back(substr); diff --git a/src/Val.h b/src/Val.h index 3e50088533..02fa4e61a1 100644 --- a/src/Val.h +++ b/src/Val.h @@ -497,7 +497,7 @@ public: // Returns a masked port number static uint32_t Mask(uint32_t port_num, TransportProto port_type); - bro_uint_t Get() const { return uint_val; } + const PortVal* Get() const { return AsPortVal(); } protected: friend class ValManager; @@ -1259,22 +1259,27 @@ public: // underlying value. We provide these to enable efficient // access to record fields (without requiring an intermediary Val) // if we change the underlying representation of records. -#define GET_FIELD_AS(ctype, name ) \ - ctype Get ## name ## Field(int field) const \ - { return GetField(field)->As ## name(); } \ - ctype Get ## name ## Field(const char* field) const \ - { return GetField(field)->As ## name(); } + template + auto GetFieldAs(int field) const -> std::invoke_result_t + { + auto& field_ptr = GetField(field); + auto field_val_ptr = dynamic_cast(field_ptr.get()); + if ( ! field_val_ptr ) + reporter->InternalError("Typecast failed in TableVal::GetFieldAs"); - GET_FIELD_AS(bool, Bool) - GET_FIELD_AS(int, Enum) - GET_FIELD_AS(bro_int_t, Int) - GET_FIELD_AS(bro_uint_t, Count) - GET_FIELD_AS(double, Double) - GET_FIELD_AS(double, Time) - GET_FIELD_AS(double, Interval) - GET_FIELD_AS(const PortVal*, PortVal) - GET_FIELD_AS(const IPAddr&, Addr) - GET_FIELD_AS(const String*, String) + return field_val_ptr->Get(); + } + + template + auto GetFieldAs(const char* field) const -> std::invoke_result_t + { + auto& field_ptr = GetField(field); + auto field_val_ptr = dynamic_cast(field_ptr.get()); + if ( ! field_val_ptr ) + reporter->InternalError("Typecast failed in TableVal::GetFieldAs"); + + return field_val_ptr->Get(); + } /** * Looks up the value of a field by field name. If the field doesn't diff --git a/src/analyzer/protocol/krb/krb-analyzer.pac b/src/analyzer/protocol/krb/krb-analyzer.pac index aad056ee94..ead1219a6e 100644 --- a/src/analyzer/protocol/krb/krb-analyzer.pac +++ b/src/analyzer/protocol/krb/krb-analyzer.pac @@ -263,7 +263,10 @@ refine connection KRB_Conn += { rv->Assign(1, zeek::val_mgr->Bool(${msg.ap_options.mutual_required})); auto rvticket = proc_ticket(${msg.ticket}); - auto authenticationinfo = zeek_analyzer()->GetAuthenticationInfo(rvticket->GetStringField(2), rvticket->GetStringField(4), rvticket->GetCountField(3)); + auto authenticationinfo = zeek_analyzer()->GetAuthenticationInfo( + rvticket->GetFieldAs(2), + rvticket->GetFieldAs(4), + rvticket->GetFieldAs(3)); if ( authenticationinfo ) rvticket->Assign(5, authenticationinfo); diff --git a/src/analyzer/protocol/rpc/NFS.cc b/src/analyzer/protocol/rpc/NFS.cc index bf1fb00bc2..15a5f33821 100644 --- a/src/analyzer/protocol/rpc/NFS.cc +++ b/src/analyzer/protocol/rpc/NFS.cc @@ -176,7 +176,7 @@ bool NFS_Interp::RPC_BuildReply(RPC_CallInfo* c, BifEnum::rpc_status rpc_status, case BifEnum::NFS3::PROC_READ: bro_uint_t offset; - offset = c->RequestVal()->AsRecordVal()->GetCountField(1); + offset = c->RequestVal()->AsRecordVal()->GetFieldAs(1); reply = nfs3_read_reply(buf, n, nfs_status, offset); event = nfs_proc_read; break; diff --git a/src/broker/Manager.cc b/src/broker/Manager.cc index 091783935d..27fb72ed53 100644 --- a/src/broker/Manager.cc +++ b/src/broker/Manager.cc @@ -436,7 +436,7 @@ bool Manager::PublishEvent(string topic, RecordVal* args) if ( ! args->GetField(0) ) return false; - auto event_name = args->GetStringField(0)->CheckString(); + auto event_name = args->GetFieldAs(0)->CheckString(); auto vv = args->GetField(1)->AsVectorVal(); broker::vector xs; xs.reserve(vv->Size()); diff --git a/src/broker/Store.cc b/src/broker/Store.cc index 2cd288d0b4..da03cf47f7 100644 --- a/src/broker/Store.cc +++ b/src/broker/Store.cc @@ -69,7 +69,7 @@ broker::backend_options to_backend_options(broker::backend backend, case broker::backend::sqlite: { auto path = options->GetField(0)->AsRecordVal() - ->GetStringField(0)->CheckString(); + ->GetFieldAs(0)->CheckString(); return {{"path", path}}; } diff --git a/src/file_analysis/File.cc b/src/file_analysis/File.cc index f7fab6bc81..55265fa96e 100644 --- a/src/file_analysis/File.cc +++ b/src/file_analysis/File.cc @@ -120,7 +120,7 @@ void File::UpdateLastActivityTime() double File::GetLastActivityTime() const { - return val->GetTimeField(last_active_idx); + return val->GetFieldAs(last_active_idx); } bool File::UpdateConnectionFields(Connection* conn, bool is_orig) diff --git a/src/logging/Manager.cc b/src/logging/Manager.cc index b6d50f4c95..58045a1e4d 100644 --- a/src/logging/Manager.cc +++ b/src/logging/Manager.cc @@ -1543,7 +1543,7 @@ std::string Manager::FormatRotationPath(EnumValPtr writer, auto res = rotation_format_func->Invoke(ri); auto rp_val = res->AsRecordVal(); auto dir_val = rp_val->GetFieldOrDefault(0); - auto prefix = rp_val->GetStringField(1)->CheckString(); + auto prefix = rp_val->GetFieldAs(1)->CheckString(); auto dir = dir_val->AsString()->CheckString(); if ( ! util::streq(dir, "") && ! util::detail::ensure_intermediate_dirs(dir) ) diff --git a/src/reporter.bif b/src/reporter.bif index 02956f43b7..cda29f7255 100644 --- a/src/reporter.bif +++ b/src/reporter.bif @@ -148,7 +148,7 @@ function Reporter::conn_weird%(name: string, c: connection, addl: string &defaul ## Returns: true if the file was still valid, else false. function Reporter::file_weird%(name: string, f: fa_file, addl: string &default="", source: string&default=""%): bool %{ - auto fuid = f->AsRecordVal()->GetStringField(0); + auto fuid = f->AsRecordVal()->GetFieldAs(0); auto file = zeek::file_mgr->LookupFile(fuid->CheckString()); if ( ! file ) diff --git a/src/strings.bif b/src/strings.bif index 2f775bb990..a9e8c05c3b 100644 --- a/src/strings.bif +++ b/src/strings.bif @@ -684,8 +684,8 @@ function string_to_ascii_hex%(s: string%): string function str_smith_waterman%(s1: string, s2: string, params: sw_params%) : sw_substring_vec %{ zeek::detail::SWParams sw_params( - params->AsRecordVal()->GetCountField(0), - zeek::detail::SWVariant(params->AsRecordVal()->GetCountField(1))); + params->AsRecordVal()->GetFieldAs(0), + zeek::detail::SWVariant(params->AsRecordVal()->GetFieldAs(1))); auto* subseq = zeek::detail::smith_waterman(s1->AsString(), s2->AsString(), sw_params); auto result = zeek::VectorValPtr{zeek::AdoptRef{}, zeek::detail::Substring::VecToPolicy(subseq)}; diff --git a/src/supervisor/Supervisor.cc b/src/supervisor/Supervisor.cc index 91743f580f..2fd08a5061 100644 --- a/src/supervisor/Supervisor.cc +++ b/src/supervisor/Supervisor.cc @@ -1225,7 +1225,7 @@ static BifEnum::Supervisor::ClusterRole role_str_to_enum(std::string_view r) Supervisor::NodeConfig Supervisor::NodeConfig::FromRecord(const RecordVal* node) { Supervisor::NodeConfig rval; - rval.name = node->GetStringField("name")->CheckString(); + rval.name = node->GetFieldAs("name")->CheckString(); const auto& iface_val = node->GetField("interface"); if ( iface_val ) @@ -1273,9 +1273,9 @@ Supervisor::NodeConfig Supervisor::NodeConfig::FromRecord(const RecordVal* node) auto rv = v->GetVal()->AsRecordVal(); Supervisor::ClusterEndpoint ep; - ep.role = static_cast(rv->GetEnumField("role")); - ep.host = rv->GetAddrField("host").AsString(); - ep.port = rv->GetPortValField("p")->Port(); + ep.role = static_cast(rv->GetFieldAs("role")); + ep.host = rv->GetFieldAs("host").AsString(); + ep.port = rv->GetFieldAs("p")->Port(); const auto& iface = rv->GetField("interface"); diff --git a/src/zeek.bif b/src/zeek.bif index cb0dbc1cd9..2a05ed932e 100644 --- a/src/zeek.bif +++ b/src/zeek.bif @@ -3531,10 +3531,10 @@ const char* conn_id_string(zeek::Val* c) auto id = c->As()->GetField(0); auto id_r = id->As(); - const zeek::IPAddr& orig_h = id_r->GetAddrField(0); - uint32_t orig_p = id_r->GetPortValField(1)->Port(); - const zeek::IPAddr& resp_h = id_r->GetAddrField(2); - uint32_t resp_p = id_r->GetPortValField(3)->Port(); + const zeek::IPAddr& orig_h = id_r->GetFieldAs(0); + uint32_t orig_p = id_r->GetFieldAs(1)->Port(); + const zeek::IPAddr& resp_h = id_r->GetFieldAs(2); + uint32_t resp_p = id_r->GetFieldAs(3)->Port(); return zeek::util::fmt("%s/%u -> %s/%u\n", orig_h.AsString().c_str(), orig_p, resp_h.AsString().c_str(), resp_p); @@ -3656,12 +3656,12 @@ function dump_packet%(pkt: pcap_packet, file_name: string%) : bool auto pkt_r = pkt->As(); - ts.tv_sec = pkt_r->GetCountField(0); - ts.tv_usec = pkt_r->GetCountField(1); - caplen = pkt_r->GetCountField(2); - len = pkt_r->GetCountField(3); - data = pkt_r->GetStringField(4)->Bytes(); - link_type = pkt_r->GetEnumField(5); + ts.tv_sec = pkt_r->GetFieldAs(0); + ts.tv_usec = pkt_r->GetFieldAs(1); + caplen = pkt_r->GetFieldAs(2); + len = pkt_r->GetFieldAs(3); + data = pkt_r->GetFieldAs(4)->Bytes(); + link_type = pkt_r->GetFieldAs(5); Packet p(link_type, &ts, caplen, len, data, true); addl_pkt_dumper->Dump(&p);