tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

getinfo_geoip.c (1544B)


      1 /* Copyright (c) 2001-2004, Roger Dingledine.
      2 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
      3 * Copyright (c) 2007-2021, The Tor Project, Inc. */
      4 /* See LICENSE for licensing information */
      5 
      6 /**
      7 * @file getinfo_geoip.c
      8 * @brief GEOIP-related controller GETINFO commands.
      9 **/
     10 
     11 #include "core/or/or.h"
     12 #include "core/mainloop/connection.h"
     13 #include "feature/control/control.h"
     14 #include "feature/control/getinfo_geoip.h"
     15 #include "lib/geoip/geoip.h"
     16 
     17 /** Helper used to implement GETINFO ip-to-country/... controller command. */
     18 int
     19 getinfo_helper_geoip(control_connection_t *control_conn,
     20                     const char *question, char **answer,
     21                     const char **errmsg)
     22 {
     23  (void)control_conn;
     24  if (!strcmpstart(question, "ip-to-country/")) {
     25    int c;
     26    sa_family_t family;
     27    tor_addr_t addr;
     28    question += strlen("ip-to-country/");
     29 
     30    if (!strcmp(question, "ipv4-available") ||
     31        !strcmp(question, "ipv6-available")) {
     32      family = !strcmp(question, "ipv4-available") ? AF_INET : AF_INET6;
     33      const int available = geoip_is_loaded(family);
     34      tor_asprintf(answer, "%d", !! available);
     35      return 0;
     36    }
     37 
     38    family = tor_addr_parse(&addr, question);
     39    if (family != AF_INET && family != AF_INET6) {
     40      *errmsg = "Invalid address family";
     41      return -1;
     42    }
     43    if (!geoip_is_loaded(family)) {
     44      *errmsg = "GeoIP data not loaded";
     45      return -1;
     46    }
     47    c = geoip_get_country_by_addr(&addr);
     48    *answer = tor_strdup(geoip_get_country_name(c));
     49  }
     50  return 0;
     51 }