Diff for /embedaddon/dnsmasq/src/helper.c between versions 1.1.1.4 and 1.1.1.5

version 1.1.1.4, 2021/03/17 00:56:46 version 1.1.1.5, 2023/09/27 11:02:07
Line 1 Line 1
/* dnsmasq is Copyright (c) 2000-2021 Simon Kelley/* dnsmasq is Copyright (c) 2000-2022 Simon Kelley
   
    This program is free software; you can redistribute it and/or modify     This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by     it under the terms of the GNU General Public License as published by
Line 233  int create_helper(int event_fd, int err_fd, uid_t uid, Line 233  int create_helper(int event_fd, int err_fd, uid_t uid,
           is6 = (data.flags != AF_INET);            is6 = (data.flags != AF_INET);
           data.action = ACTION_ARP;            data.action = ACTION_ARP;
         }          }
       else        else if (data.action == ACTION_RELAY_SNOOP)
        continue;         {
           is6 = 1;
            action_str = "relay-snoop";
          }
        else
          continue;
                   
       /* stringify MAC into dhcp_buff */        /* stringify MAC into dhcp_buff */
       p = daemon->dhcp_buff;        p = daemon->dhcp_buff;
Line 287  int create_helper(int event_fd, int err_fd, uid_t uid, Line 291  int create_helper(int event_fd, int err_fd, uid_t uid,
           char *dot;            char *dot;
           hostname = (char *)buf;            hostname = (char *)buf;
           hostname[data.hostname_len - 1] = 0;            hostname[data.hostname_len - 1] = 0;
          if (data.action != ACTION_TFTP)          if (data.action != ACTION_TFTP && data.action != ACTION_RELAY_SNOOP)
             {              {
               if (!legal_hostname(hostname))                if (!legal_hostname(hostname))
                 hostname = NULL;                  hostname = NULL;
Line 333  int create_helper(int event_fd, int err_fd, uid_t uid, Line 337  int create_helper(int event_fd, int err_fd, uid_t uid,
                   lua_call(lua, 2, 0);  /* pass 2 values, expect 0 */                    lua_call(lua, 2, 0);  /* pass 2 values, expect 0 */
                 }                  }
             }              }
             else if (data.action == ACTION_RELAY_SNOOP)
               {
                 lua_getglobal(lua, "snoop"); 
                 if (lua_type(lua, -1) != LUA_TFUNCTION)
                   lua_pop(lua, 1); /* tftp function optional */
                 else
                   {
                     lua_pushstring(lua, action_str); /* arg1 - action */
                     lua_newtable(lua);               /* arg2 - data table */
                     lua_pushstring(lua, daemon->addrbuff);
                     lua_setfield(lua, -2, "client_address");
                     lua_pushstring(lua, hostname);
                     lua_setfield(lua, -2, "prefix"); 
                     lua_pushstring(lua, data.interface);
                     lua_setfield(lua, -2, "client_interface");
                     lua_call(lua, 2, 0);  /* pass 2 values, expect 0 */
                   }
               }
           else if (data.action == ACTION_ARP)            else if (data.action == ACTION_ARP)
             {              {
               lua_getglobal(lua, "arp");                 lua_getglobal(lua, "arp"); 
Line 399  int create_helper(int event_fd, int err_fd, uid_t uid, Line 421  int create_helper(int event_fd, int err_fd, uid_t uid,
                               
               end = extradata + data.ed_len;                end = extradata + data.ed_len;
               buf = extradata;                buf = extradata;
   
                 lua_pushnumber(lua, data.ed_len == 0 ? 1 : 0);
                 lua_setfield(lua, -2, "data_missing");
                               
               if (!is6)                if (!is6)
                 buf = grab_extradata_lua(buf, end, "vendor_class");                  buf = grab_extradata_lua(buf, end, "vendor_class");
Line 426  int create_helper(int event_fd, int err_fd, uid_t uid, Line 451  int create_helper(int event_fd, int err_fd, uid_t uid,
                   buf = grab_extradata_lua(buf, end, "subscriber_id");                    buf = grab_extradata_lua(buf, end, "subscriber_id");
                   buf = grab_extradata_lua(buf, end, "remote_id");                    buf = grab_extradata_lua(buf, end, "remote_id");
                 }                  }
              
               buf = grab_extradata_lua(buf, end, "requested_options");
               buf = grab_extradata_lua(buf, end, "mud_url");
               buf = grab_extradata_lua(buf, end, "tags");                buf = grab_extradata_lua(buf, end, "tags");
                               
               if (is6)                if (is6)
                 buf = grab_extradata_lua(buf, end, "relay_address");                  buf = grab_extradata_lua(buf, end, "relay_address");
               else if (data.giaddr.s_addr != 0)                else if (data.giaddr.s_addr != 0)
                 {                  {
                  lua_pushstring(lua, inet_ntoa(data.giaddr));                  inet_ntop(AF_INET, &data.giaddr, daemon->dhcp_buff2, ADDRSTRLEN);
                   lua_pushstring(lua, daemon->dhcp_buff2);
                   lua_setfield(lua, -2, "relay_address");                    lua_setfield(lua, -2, "relay_address");
                 }                  }
                               
Line 553  int create_helper(int event_fd, int err_fd, uid_t uid, Line 581  int create_helper(int event_fd, int err_fd, uid_t uid,
           close(pipeout[1]);            close(pipeout[1]);
         }          }
               
      if (data.action != ACTION_TFTP && data.action != ACTION_ARP)      if (data.action != ACTION_TFTP && data.action != ACTION_ARP && data.action != ACTION_RELAY_SNOOP)
         {          {
 #ifdef HAVE_DHCP6  #ifdef HAVE_DHCP6
           my_setenv("DNSMASQ_IAID", is6 ? daemon->dhcp_buff3 : NULL, &err);            my_setenv("DNSMASQ_IAID", is6 ? daemon->dhcp_buff3 : NULL, &err);
Line 576  int create_helper(int event_fd, int err_fd, uid_t uid, Line 604  int create_helper(int event_fd, int err_fd, uid_t uid,
                       
           end = extradata + data.ed_len;            end = extradata + data.ed_len;
           buf = extradata;            buf = extradata;
   
             if (data.ed_len == 0)
               my_setenv("DNSMASQ_DATA_MISSING", "1", &err);
                       
           if (!is6)            if (!is6)
             buf = grab_extradata(buf, end, "DNSMASQ_VENDOR_CLASS", &err);              buf = grab_extradata(buf, end, "DNSMASQ_VENDOR_CLASS", &err);
Line 604  int create_helper(int event_fd, int err_fd, uid_t uid, Line 635  int create_helper(int event_fd, int err_fd, uid_t uid,
               buf = grab_extradata(buf, end, "DNSMASQ_CIRCUIT_ID", &err);                buf = grab_extradata(buf, end, "DNSMASQ_CIRCUIT_ID", &err);
               buf = grab_extradata(buf, end, "DNSMASQ_SUBSCRIBER_ID", &err);                buf = grab_extradata(buf, end, "DNSMASQ_SUBSCRIBER_ID", &err);
               buf = grab_extradata(buf, end, "DNSMASQ_REMOTE_ID", &err);                buf = grab_extradata(buf, end, "DNSMASQ_REMOTE_ID", &err);
               buf = grab_extradata(buf, end, "DNSMASQ_REQUESTED_OPTIONS", &err);  
             }              }
                       
             buf = grab_extradata(buf, end, "DNSMASQ_REQUESTED_OPTIONS", &err);
             buf = grab_extradata(buf, end, "DNSMASQ_MUD_URL", &err);
           buf = grab_extradata(buf, end, "DNSMASQ_TAGS", &err);            buf = grab_extradata(buf, end, "DNSMASQ_TAGS", &err);
                  
           if (is6)            if (is6)
             buf = grab_extradata(buf, end, "DNSMASQ_RELAY_ADDRESS", &err);              buf = grab_extradata(buf, end, "DNSMASQ_RELAY_ADDRESS", &err);
          else           else
            my_setenv("DNSMASQ_RELAY_ADDRESS", data.giaddr.s_addr != 0 ? inet_ntoa(data.giaddr) : NULL, &err);             {
               const char *giaddr = NULL;
               if (data.giaddr.s_addr != 0)
                   giaddr = inet_ntop(AF_INET, &data.giaddr, daemon->dhcp_buff2, ADDRSTRLEN);
               my_setenv("DNSMASQ_RELAY_ADDRESS", giaddr, &err);
             }
                       
           for (i = 0; buf; i++)            for (i = 0; buf; i++)
             {              {
Line 635  int create_helper(int event_fd, int err_fd, uid_t uid, Line 672  int create_helper(int event_fd, int err_fd, uid_t uid,
         fcntl(event_fd, F_SETFD, i | FD_CLOEXEC);          fcntl(event_fd, F_SETFD, i | FD_CLOEXEC);
       close(pipefd[0]);        close(pipefd[0]);
   
         if (data.action == ACTION_RELAY_SNOOP)
           strcpy(daemon->packet, data.interface);
         
       p =  strrchr(daemon->lease_change_command, '/');        p =  strrchr(daemon->lease_change_command, '/');
       if (err == 0)        if (err == 0)
         {          {
Line 805  void queue_script(int action, struct dhcp_lease *lease Line 845  void queue_script(int action, struct dhcp_lease *lease
   bytes_in_buf = p - (unsigned char *)buf;    bytes_in_buf = p - (unsigned char *)buf;
 }  }
   
   #ifdef HAVE_DHCP6
   void queue_relay_snoop(struct in6_addr *client, int if_index, struct in6_addr *prefix, int prefix_len)
   {
     /* no script */
     if (daemon->helperfd == -1)
       return;
     
     inet_ntop(AF_INET6, prefix, daemon->addrbuff, ADDRSTRLEN);
   
     /* 5 for /nnn and zero on the end of the prefix. */
     buff_alloc(sizeof(struct script_data) + ADDRSTRLEN + 5);
     memset(buf, 0, sizeof(struct script_data));
   
     buf->action = ACTION_RELAY_SNOOP;
     buf->addr6 = *client;
     buf->hostname_len = sprintf((char *)(buf+1), "%s/%u", daemon->addrbuff, prefix_len) + 1;
     
     indextoname(daemon->dhcp6fd, if_index, buf->interface);
   
     bytes_in_buf = sizeof(struct script_data) + buf->hostname_len;
   }
   #endif
   
 #ifdef HAVE_TFTP  #ifdef HAVE_TFTP
 /* This nastily re-uses DHCP-fields for TFTP stuff */  /* This nastily re-uses DHCP-fields for TFTP stuff */
 void queue_tftp(off_t file_len, char *filename, union mysockaddr *peer)  void queue_tftp(off_t file_len, char *filename, union mysockaddr *peer)
Line 882  void helper_write(void) Line 945  void helper_write(void)
     }      }
 }  }
   
#endif#endif /* HAVE_SCRIPT */
 
 
 

Removed from v.1.1.1.4  
changed lines
  Added in v.1.1.1.5


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>