Changeset 413


Ignore:
Timestamp:
Jan 3, 2009, 4:19:32 PM (8 years ago)
Author:
eagle
Message:

transition to configurable receipient port (not finished yet)

Location:
trunk/src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/ocat.c

    r411 r413  
    3232         "   -f <config_file>      read config from config_file\n"
    3333         "   -i                    convert onion hostname to IPv6 and exit\n"
    34          "   -l <port>             set ocat listen port, default = %d\n"
     34         "   -l [<ip>:]<port>      set ocat listen address and port, default = 127.0.0.1:%d\n"
    3535         "   -L <log_file>         log output to <log_file> (default = stderr)\n"
    3636         "   -o <ipv6_addr>        convert IPv6 address to onion url and exit\n"
     
    3939         "   -r                    run as root, i.e. do not change uid/gid\n"
    4040         "   -s <port>             set hidden service virtual port, default = %d\n"
    41          "   -t [<ip>:]<port>      set Tor SOCKS ip and port, default = %d\n"
     41         "   -t [<ip>:]<port>      set Tor SOCKS address and port, default = 127.0.0.1:%d\n"
    4242#ifndef WITHOUT_TUN
    4343         "   -T <tun_device>       path to tun character device, default = \"%s\"\n"
     
    4747         , PACKAGE_STRING, __DATE__, __TIME__, s,
    4848         // option defaults start here
    49          OCAT_DIR, OCAT_CONNECT_LOG, CNF(create_clog), CNF(debug_level), CNF(ocat_listen_port),
     49         OCAT_DIR, OCAT_CONNECT_LOG, CNF(create_clog), CNF(debug_level), OCAT_LISTEN_PORT,
    5050         CNF(pid_file),
    51          CNF(ocat_dest_port), ((struct sockaddr_in*) CNF(socks_dst))->sin_port,
     51         CNF(ocat_dest_port), CNF(socks_dst)->sin_port,
    5252#ifndef WITHOUT_TUN
    5353         TUN_DEV,
     
    160160
    161161         case 'l':
    162             CNF(ocat_listen_port) = atoi(optarg);
     162            //CNF(ocat_listen_port) = atoi(optarg);
     163            if (strsockaddr(optarg, (struct sockaddr*) CNF(oc_listen)) == -1)
     164               exit(1);
    163165            break;
    164166
     
    189191
    190192         case 't':
    191             s = optarg;
    192             if (strchr(optarg, ':'))
    193             {
    194                s = strtok(optarg, ":");
    195                if (!inet_pton(AF_INET, optarg, &((struct sockaddr_in*) CNF(socks_dst))->sin_addr))
    196                   log_msg(LOG_ALERT, "\"%s\" is not a valid IPv4 address", optarg), exit(1);
    197                s = strtok(NULL, ":");
    198             }
    199 
    200             ((struct sockaddr_in*) CNF(socks_dst))->sin_port = htons(atoi(s));
     193            if (strsockaddr(optarg, (struct sockaddr*) CNF(socks_dst)) == -1)
     194               exit(1);
    201195            break;
    202196
  • trunk/src/ocat.h

    r411 r413  
    203203#define IPV4_KEY 0
    204204#define IPV6_KEY 1
     205
     206#define SOCKADDR_SIZE(x) (x->sa_family == AF_INET ? sizeof(struct sockaddr_in) : x->sa_family == AF_INET6 ? sizeof(struct sockaddr_in6) : 0)
    205207
    206208
     
    250252   time_t uptime;
    251253   char *frandn;
    252    struct sockaddr *socks_dst;
     254   //! destination socket address of Tor's SOCKS port
     255   union
     256   {
     257      struct sockaddr_in *socks_dst;
     258      struct sockaddr_in6 *socks_dst6;
     259   };
     260   //! local listening socket address for incoming connections
     261   struct sockaddr **oc_listen;
    253262};
    254263
     
    527536void oe_close(int);
    528537int oe_remtr(char *);
     538int strsockaddr(const char *, struct sockaddr *);
    529539
    530540/* ocatipv6route.c */
  • trunk/src/ocatlibe.c

    r398 r413  
    6464}
    6565
     66
     67/*! Convert character string into struct sockaddr of appropriate address family.
     68 *  AF_INET and AF_INET6 are supported yet.
     69 *  @param src Pointer to character string.
     70 *  @param addr Pointer to struct sockaddr of appropriate type (and size).
     71 *         It should be pre-initialized. strsockaddr() will not init all fields.
     72 *  @return address family on success or -1 on error.
     73 */
     74int strsockaddr(const char *src, struct sockaddr *addr)
     75{
     76   char *s, buf[100];
     77   int p;
     78
     79   strlcpy(buf, src, 100);
     80   if ((s = strchr(buf, '[')))
     81   {
     82      s++;
     83      ((struct sockaddr_in6*) addr)->sin6_family = AF_INET6;
     84      s = strtok(s, "]");
     85      if (!inet_pton(AF_INET6, s, &((struct sockaddr_in6*) addr)->sin6_addr))
     86      {
     87         log_msg(LOG_ALERT, "\"%s\" contains no valid IPv6 address", s);
     88         return -1;
     89      }
     90      if ((s = strtok(NULL, " ")))
     91      {
     92         if (*s == ':')
     93         {
     94            s++;
     95            if ((p = atoi(s)) > 0)
     96               ((struct sockaddr_in6*) addr)->sin6_port = htons(p);
     97         }
     98      }
     99      return AF_INET6;
     100   }
     101
     102   if (strchr(buf, '.'))
     103   {
     104      ((struct sockaddr_in*) addr)->sin_family = AF_INET;
     105      s = strtok(buf, ":");
     106      if (!inet_pton(AF_INET, s, &((struct sockaddr_in*) addr)->sin_addr))
     107      {
     108         log_msg(LOG_ALERT, "\"%s\" is not a valid IPv4 address", s);
     109         return -1;
     110      }
     111      s = strtok(NULL, ":");
     112      if (s)
     113         if ((p = atoi(s)) > 0)
     114            ((struct sockaddr_in*) addr)->sin_port = htons(p);
     115      return AF_INET;
     116   }
     117
     118   if ((p = atoi(buf)) > 0)
     119   {
     120      switch (((struct sockaddr_in*) addr)->sin_family)
     121      {
     122         case AF_INET:
     123            ((struct sockaddr_in*) addr)->sin_port = htons(p);
     124            return AF_INET;
     125
     126         case AF_INET6:
     127            ((struct sockaddr_in6*) addr)->sin6_port = htons(p);
     128            return AF_INET;
     129
     130         default:
     131            log_debug("adress family %04x not supported", ((struct sockaddr_in*) addr)->sin_family);
     132            return -1;
     133      }
     134   }
     135
     136   return -1;
     137}
     138
  • trunk/src/ocatroute.c

    r397 r413  
    642642
    643643
     644/** run_listeners(...) is a generic socket acceptor for
     645 *  local TCP ports (IPv4+IPv6).
     646 *  It listens on a given list of sockets.
     647 *  Every time a connection comes in the function action_accept is
     648 *  called with the incoming file descriptor as parameter.
     649 *  @param addr Double pointer to sockaddr structs. It MUST be terminated by a null pointer.
     650 *  @param sockfd Points to an int array. The array must contain at least
     651 *         as much entries as the sockaddr pointer has entries.
     652 *  @param action_accept Function pointer to function that should be called if a
     653 *         connection arrives.
     654 *  @return File descriptor or -1 on error.
     655 */
     656int run_listeners(struct sockaddr **addr, int *sockfd, int (action_accept)(int))
     657{
     658   int fd;
     659   struct sockaddr *saddr;
     660   struct sockaddr_in6 in6;
     661   fd_set rset;
     662   int maxfd, i, cnt;
     663   socklen_t alen;
     664   char iabuf[INET6_ADDRSTRLEN];
     665
     666   for (i = 0, saddr = *addr; saddr; saddr = addr[i], i++)
     667   {
     668      log_debug("create listener");
     669      if ((sockfd[i] = create_listener(saddr, SOCKADDR_SIZE(saddr))) == -1)
     670         log_msg(LOG_EMERG, "exiting"), exit(1);
     671   }
     672   cnt = i;
     673
     674   for (;;)
     675   {
     676      log_debug("setting up fd_set");
     677      FD_ZERO(&rset);
     678      maxfd = 0;
     679      for (i = 0; i < cnt; i++)
     680      {
     681         FD_SET(sockfd[i], &rset);
     682         if (sockfd[i] > maxfd)
     683            maxfd = sockfd[i];
     684      }
     685
     686      log_debug("selecting locally (maxfd = %d)", maxfd);
     687      if ((maxfd = select(maxfd + 1, &rset, NULL, NULL, NULL)) == -1)
     688      {
     689         log_debug("select returned: \"%s\"", strerror(errno));
     690         continue;
     691      }
     692      log_debug("select returned %d fds ready", maxfd);
     693
     694      for (i = 0; maxfd && (i < cnt); i++)
     695      {
     696         log_debug("checking fd %d (maxfd = %d, i = %d)", sockfd[i], maxfd, i);
     697         if (!FD_ISSET(sockfd[i], &rset))
     698            continue;
     699         maxfd--;
     700         alen = sizeof(in6);
     701         log_debug("accepting connection on %d", sockfd[i]);
     702         if ((fd = accept(sockfd[i], (struct sockaddr*) &in6, &alen)) < 0)
     703         {
     704            log_msg(LOG_ERR, "error accepting connection on %d: \"%s\"", sockfd[i], strerror(errno));
     705            // FIXME: there should be additional error handling!
     706            continue;
     707         }
     708
     709         inet_ntop(in6.sin6_family,
     710               in6.sin6_family == AF_INET6 ? &in6.sin6_addr :
     711               (void*) &((struct sockaddr_in*) &in6)->sin_addr,
     712               iabuf, INET6_ADDRSTRLEN);
     713         log_msg(LOG_INFO | LOG_FCONN, "connection %d [%d] accepted on listener %d from %s port %d", fd, i, sockfd[i], iabuf, ntohs(in6.sin6_port));
     714         (void) action_accept(fd);
     715      }
     716   }
     717   return 0;
     718}
     719
     720
    644721/** run_local_listeners(...) is a generic socket acceptor for
    645722 *  local TCP ports (IPv4+IPv6).
  • trunk/src/ocatsetup.c

    r411 r413  
    2525
    2626#include "ocat.h"
     27
     28
     29static struct sockaddr_in6 socks_dst6_;
     30static struct sockaddr_in6 oc_listen6_;
     31static struct sockaddr* oc_listen_a_[] = {(struct sockaddr*) &oc_listen6_, NULL};
    2732
    2833struct OcatSetup setup_ =
     
    3338   sizeof(uint32_t),
    3439   //TOR_SOCKS_PORT,
    35    OCAT_LISTEN_PORT, OCAT_DEST_PORT, OCAT_CTRL_PORT,
     40   OCAT_LISTEN_PORT,
     41   OCAT_DEST_PORT, OCAT_CTRL_PORT,
    3642   //! default tunfd is stdin/stdout
    3743   {0, 1},
     
    5460   0,
    5561   "/dev/urandom",
    56    NULL
     62   {(struct sockaddr_in*) &socks_dst6_},
     63   oc_listen_a_
    5764};
    58 
    59 static struct sockaddr_in socks_dst_;
    6065
    6166
     
    6570   setup_.uptime = time(NULL);
    6671
    67    socks_dst_.sin_family = AF_INET;
    68    socks_dst_.sin_port = htons(TOR_SOCKS_PORT);
    69    socks_dst_.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
     72   setup_.socks_dst->sin_family = AF_INET;
     73   setup_.socks_dst->sin_port = htons(TOR_SOCKS_PORT);
     74   setup_.socks_dst->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    7075#ifdef HAVE_SIN_LEN
    71    socks_dst_.sin_len = sizeof(socks_dst_);
     76   setup_.socks_dst->sin_len = sizeof(socks_dst6_);
    7277#endif
    73    setup_.socks_dst = (struct sockaddr*) &socks_dst_;
     78
     79   /*
     80   ((struct sockaddr_in*) *setup_.oc_listen)->sin_family = AF_INET;
     81   setup_.oc_listen->sin_port = htons(OCAT_LISTEN_PORT);
     82   setup_.oc_listen->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
     83#ifdef HAVE_SIN_LEN
     84   setup_.oc_listen->sin_len = sizeof(oc_listen6_);
     85#endif
     86*/
    7487}
    7588
     
    94107   t = time(NULL) - setup_.uptime;
    95108
    96    inet_ntop(socks_dst_.sin_family, &socks_dst_.sin_addr, sk, SBUF);
    97109
    98110   fprintf(f,
    99          "fhd_key[IPV4(%d)]  = 0x%04x\n"
    100          "fhd_key[IPV6(%d)]  = 0x%04x\n"
    101          "fhd_key_len       = %d\n"
     111         "fhd_key[IPV4(%d)]       = 0x%04x\n"
     112         "fhd_key[IPV6(%d)]       = 0x%04x\n"
     113         "fhd_key_len            = %d\n"
    102114         //"tor_socks_port    = %d\n"
    103          "ocat_listen_port  = %d\n"
    104          "ocat_dest_port    = %d\n"
    105          "ocat_ctrl_port    = %d\n"
    106          "tunfd[0]          = %d\n"
    107          "tunfd[1]          = %d\n"
    108          "debug_level       = %d\n"
    109          "usrname           = \"%s\"\n"
    110          "onion_url         = \"%s\"\n"
    111          "ocat_addr         = %s\n"
    112          "create_clog       = %d\n"
    113          "runasroot         = %d\n"
    114          "controller        = %d\n"
    115          "ocat_dir          = \"%s\"\n"
    116          "tun_dev           = \"%s\"\n"
    117          "ipv4_enable       = %d\n"
    118          "ocat_addr4        = %s\n"
    119          "ocat_addr4_mask   = %s\n"
    120          "config_file       = \"%s\"\n"
    121          "config_read       = %d\n"
    122          "use_tap           = %d\n"
    123          "ocat_hwaddr       = %s\n"
    124          "pid_file          = \"%s\"\n"
    125          "logfn             = \"%s\"\n"
    126          "logf              = %s\n"
    127          "daemon            = %d\n"
    128          "uptime            = %d days, %d:%02d\n"
    129          "socks_dst.sin_family = %d\n"
    130          "socks_dst.sin_port = %d\n"
    131          "socks_dst.sin_addr = %s\n",
    132 
     115         "ocat_listen_port       = %d\n"
     116         "ocat_dest_port         = %d\n"
     117         "ocat_ctrl_port         = %d\n"
     118         "tunfd[0]               = %d\n"
     119         "tunfd[1]               = %d\n"
     120         "debug_level            = %d\n"
     121         "usrname                = \"%s\"\n"
     122         "onion_url              = \"%s\"\n"
     123         "ocat_addr              = %s\n"
     124         "create_clog            = %d\n"
     125         "runasroot              = %d\n"
     126         "controller             = %d\n"
     127         "ocat_dir               = \"%s\"\n"
     128         "tun_dev                = \"%s\"\n"
     129         "ipv4_enable            = %d\n"
     130         "ocat_addr4             = %s\n"
     131         "ocat_addr4_mask        = %s\n"
     132         "config_file            = \"%s\"\n"
     133         "config_read            = %d\n"
     134         "use_tap                = %d\n"
     135         "ocat_hwaddr            = %s\n"
     136         "pid_file               = \"%s\"\n"
     137         "logfn                  = \"%s\"\n"
     138         "logf                   = %s\n"
     139         "daemon                 = %d\n"
     140         "uptime                 = %d days, %d:%02d\n",
    133141 
    134142         IPV4_KEY, ntohl(setup_.fhd_key[IPV4_KEY]), IPV6_KEY, ntohl(setup_.fhd_key[IPV6_KEY]),
     
    159167         logf,
    160168         setup_.daemon,
    161          t / (3600 * 24), t / 3600 % 24, t / 60 % 60,
    162          ((struct sockaddr_in*) setup_.socks_dst)->sin_family,
    163          ntohs(((struct sockaddr_in*) setup_.socks_dst)->sin_port),
    164          sk
     169         t / (3600 * 24), t / 3600 % 24, t / 60 % 60
    165170         );
    166171
     
    168173      if (inet_ntop(AF_INET6, &setup_.root_peer[i], rp, SBUF))
    169174         fprintf(f, "root_peer[%d]      = %s\n", i, rp);
     175
     176   if (setup_.socks_dst->sin_family == AF_INET)
     177   {
     178      inet_ntop(setup_.socks_dst->sin_family, &setup_.socks_dst->sin_addr, sk, SBUF);
     179      fprintf(f,
     180         "socks_dst.sin_family   = %04x\n"
     181         "socks_dst.sin_port     = %d\n"
     182         "socks_dst.sin_addr     = %s\n",
     183         setup_.socks_dst->sin_family,
     184         ntohs(setup_.socks_dst->sin_port),
     185         sk
     186         );
     187   }
     188   else
     189   {
     190      inet_ntop(setup_.socks_dst6->sin6_family, &setup_.socks_dst6->sin6_addr, sk, SBUF);
     191      fprintf(f,
     192         "socks_dst6.sin6_family = %04x\n"
     193         "socks_dst6.sin6_port   = %d\n"
     194         "socks_dst6.sin6_addr   = %s\n",
     195         setup_.socks_dst6->sin6_family,
     196         ntohs(setup_.socks_dst6->sin6_port),
     197         sk
     198         );
     199   }
     200
     201   /*
     202   if (setup_.oc_listen->sin_family == AF_INET)
     203   {
     204      inet_ntop(setup_.oc_listen->sin_family, &setup_.oc_listen->sin_addr, sk, SBUF);
     205      fprintf(f,
     206         "socks_dst.sin_family   = %04x\n"
     207         "socks_dst.sin_port     = %d\n"
     208         "socks_dst.sin_addr     = %s\n",
     209         setup_.oc_listen->sin_family,
     210         ntohs(setup_.oc_listen->sin_port),
     211         sk
     212         );
     213   }
     214   else
     215   {
     216      inet_ntop(setup_.oc_listen6->sin6_family, &setup_.oc_listen6->sin6_addr, sk, SBUF);
     217      fprintf(f,
     218         "oc_listen6.sin6_family = %04x\n"
     219         "oc_listen6.sin6_port   = %d\n"
     220         "oc_listen6.sin6_addr   = %s\n",
     221         setup_.oc_listen6->sin6_family,
     222         ntohs(setup_.oc_listen6->sin6_port),
     223         sk
     224         );
     225   }
     226   */
    170227}
    171228
  • trunk/src/ocatsocks.c

    r411 r413  
    3939//   struct sockaddr_in in;
    4040   int fd, t, len;
    41    char buf[FRAME_SIZE], onion[ONION_NAME_SIZE];
     41   char buf[FRAME_SIZE], onion[ONION_NAME_SIZE], addr[INET6_ADDRSTRLEN];
    4242   SocksHdr_t *shdr = (SocksHdr_t*) buf;
    4343   OcatPeer_t *peer;
     
    5858   log_msg(LOG_INFO, "trying to connect to \"%s\" [%s]", onion, inet_ntop(AF_INET6, &sq->addr, buf, FRAME_SIZE));
    5959
    60    if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
     60   if ((fd = socket(CNF(socks_dst)->sin_family == AF_INET ? PF_INET : PF_INET6, SOCK_STREAM, 0)) < 0)
    6161      return E_SOCKS_SOCK;
    6262
    6363   t = time(NULL);
    64    if (connect(fd, CNF(socks_dst), sizeof(*CNF(socks_dst))) == -1)
    65    {
    66       log_msg(LOG_ERR, "connect() to TOR's SOCKS port %d failed: \"%s\". Sleeping for %d seconds.", ntohs(((struct sockaddr_in*) CNF(socks_dst))->sin_port), strerror(errno), TOR_SOCKS_CONN_TIMEOUT);
     64   if (connect(fd, (struct sockaddr*) CNF(socks_dst), sizeof(struct sockaddr_in6)) == -1)
     65   {
     66      log_msg(LOG_ERR, "connect() to TOR's SOCKS port %s:%d failed: \"%s\". Sleeping for %d seconds.", inet_ntop(CNF(socks_dst)->sin_family, CNF(socks_dst)->sin_family == AF_INET ? (char*) &CNF(socks_dst)->sin_addr : (char*) &CNF(socks_dst6)->sin6_addr, addr, sizeof(addr)), ntohs(CNF(socks_dst)->sin_port), strerror(errno), TOR_SOCKS_CONN_TIMEOUT);
    6767      oe_close(fd);
    6868      sleep(TOR_SOCKS_CONN_TIMEOUT);
Note: See TracChangeset for help on using the changeset viewer.