Removed Common
Change-Id: I01ea8f07220375c2ad9bc0092281d4f27c642303
diff --git a/aos/network/team_number.cc b/aos/network/team_number.cc
new file mode 100644
index 0000000..eb17e7a
--- /dev/null
+++ b/aos/network/team_number.cc
@@ -0,0 +1,86 @@
+#include "aos/network/team_number.h"
+
+#include <netinet/in.h>
+#include <inttypes.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <string>
+
+#include "aos/logging/logging.h"
+#include "aos/util/string_to_num.h"
+#include "aos/linux_code/configuration.h"
+#include "aos/once.h"
+
+namespace aos {
+namespace network {
+namespace internal {
+int ParseTeamNumber(const std::string &hostname, uint16_t *teamnumber) {
+ for (size_t i = 0; i < hostname.size(); i++) {
+ if (hostname[i] == '-') {
+ const std::string num_as_s =
+ hostname[hostname.size() - 1] == 'C'
+ ? hostname.substr(i + 1, hostname.size() - 5 - i)
+ : hostname.substr(i + 1);
+
+ int num;
+ if (!::aos::util::StringToNumber(num_as_s, &num)) {
+ return -1;
+ }
+ if (hostname.substr(0, i) == "roboRIO" &&
+ std::to_string(num) == num_as_s) {
+ *teamnumber = num;
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+ }
+ return -1;
+}
+} // namespace internal
+
+namespace {
+
+uint16_t override_team;
+
+::std::string GetHostname() {
+ char buf[256];
+ buf[sizeof(buf) - 1] = '\0';
+ PCHECK(gethostname(buf, sizeof(buf) - 1));
+ return buf;
+}
+
+uint16_t *DoGetTeamNumber() {
+ if (override_team != 0) return &override_team;
+
+ static uint16_t r;
+
+ const char *override_number = getenv("AOS_TEAM_NUMBER");
+ if (override_number != nullptr) {
+ if (!::aos::util::StringToNumber(override_number, &r)) {
+ LOG(FATAL, "error parsing AOS_TEAM_NUMBER '%s'\n", override_number);
+ }
+ LOG(WARNING, "team number overridden by AOS_TEAM_NUMBER to %" PRIu16 "\n",
+ r);
+ } else {
+ int error = internal::ParseTeamNumber(GetHostname(), &r);
+ if (error) {
+ LOG(FATAL, "Invalid hostname %s\n", GetHostname().c_str());
+ }
+ LOG(INFO, "team number is %" PRIu16 "\n", r);
+ }
+ return &r;
+}
+
+} // namespace
+
+uint16_t GetTeamNumber() {
+ static Once<uint16_t> once(DoGetTeamNumber);
+ return *once.Get();
+}
+
+void OverrideTeamNumber(uint16_t team) { override_team = team; }
+
+} // namespace network
+} // namespace aos