コード例 #1
1
ファイル: ubus.c プロジェクト: kdarbyshirebryant/dnsmasq
void ubus_init()
{
  struct ubus_context *ubus = NULL;
  int ret = 0;

  ubus = ubus_connect(NULL);
  if (!ubus)
    {
      if (!error_logged)
        {
          my_syslog(LOG_ERR, _("Cannot initialize UBus: connection failed"));
          error_logged = 1;
        }

      ubus_destroy(ubus);
      return;
    }

  ret = ubus_add_object(ubus, &ubus_object);
  if (ret)
    {
      if (!error_logged)
        {
          my_syslog(LOG_ERR, _("Cannot add object to UBus: %s"), ubus_strerror(ret));
          error_logged = 1;
        }
      return;
    }

  ubus->connection_lost = ubus_disconnect_cb;
  daemon->ubus = ubus;
  error_logged = 0;

  my_syslog(LOG_INFO, _("Connected to system UBus"));
}
コード例 #2
0
ファイル: ubus.c プロジェクト: kdarbyshirebryant/dnsmasq
void check_ubus_listeners()
{
  struct ubus_context *ubus = (struct ubus_context *)daemon->ubus;
  if (!ubus)
    {
      if (!error_logged)
        {
          my_syslog(LOG_ERR, _("Cannot poll UBus listeners: no connection"));
          error_logged = 1;
        }
      return;
    }
  
  error_logged = 0;

  if (poll_check(ubus->sock.fd, POLLIN))
    ubus_handle_event(ubus);
  
  if (poll_check(ubus->sock.fd, POLLHUP | POLLERR))
    {
      my_syslog(LOG_INFO, _("Disconnecting from UBus"));

      ubus_destroy(ubus);
    }
}
コード例 #3
0
ファイル: dbus.c プロジェクト: StephenMacras/dsl-n55u-bender
DBusHandlerResult message_handler(DBusConnection *connection, 
				  DBusMessage *message, 
				  void *user_data)
{
  char *method = (char *)dbus_message_get_member(message);
  DBusMessage *reply = NULL;
   
  if (dbus_message_is_method_call(message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect"))
    {
      /* string length: "%s" provides space for termination zero */
      if (!introspection_xml && 
	  (introspection_xml = whine_malloc(strlen(introspection_xml_template) + strlen(daemon->dbus_name))))
	sprintf(introspection_xml, introspection_xml_template, daemon->dbus_name);
    
      if (introspection_xml)
	{
	  reply = dbus_message_new_method_return(message);
	  dbus_message_append_args(reply, DBUS_TYPE_STRING, &introspection_xml, DBUS_TYPE_INVALID);
	}
    }
  else if (strcmp(method, "GetVersion") == 0)
    {
      char *v = VERSION;
      reply = dbus_message_new_method_return(message);
      
      dbus_message_append_args(reply, DBUS_TYPE_STRING, &v, DBUS_TYPE_INVALID);
    }
  else if (strcmp(method, "SetServers") == 0)
    {
      my_syslog(LOG_INFO, _("setting upstream servers from DBus"));
      dbus_read_servers(message);
      check_servers();
    }
  else if (strcmp(method, "SetServersEx") == 0)
    {
      my_syslog(LOG_INFO, _("setting upstream servers from DBus"));
      reply = dbus_read_servers_ex(message);
      check_servers();
    }
  else if (strcmp(method, "ClearCache") == 0)
    clear_cache_and_reload(dnsmasq_time());
  else
    return (DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
  
  method = user_data; /* no warning */

  /* If no reply or no error, return nothing */
  if (!reply)
    reply = dbus_message_new_method_return(message);

  if (reply)
    {
      dbus_connection_send (connection, reply, NULL);
      dbus_message_unref (reply);
    }

  return (DBUS_HANDLER_RESULT_HANDLED);
}
コード例 #4
0
ファイル: inotify.c プロジェクト: noscripter/dnsmasq-chinadns
/* initialisation for dhcp-hostdir. Set inotify watch for each directory, and read pre-existing files */
void set_dhcp_inotify(void)
{
  struct hostsfile *ah;

  for (ah = daemon->inotify_hosts; ah; ah = ah->next)
    {
       DIR *dir_stream = NULL;
       struct dirent *ent;
       struct stat buf;

       if (stat(ah->fname, &buf) == -1 || !(S_ISDIR(buf.st_mode)))
	 {
	   my_syslog(LOG_ERR, _("bad directory in dhcp-hostsdir %s"), ah->fname);
	   continue;
	 }

       if (!(ah->flags & AH_WD_DONE))
	 {
	   ah->wd = inotify_add_watch(daemon->inotifyfd, ah->fname, IN_CLOSE_WRITE | IN_MOVED_TO);
	   ah->flags |= AH_WD_DONE;
	 }
       /* Read contents of dir _after_ calling add_watch, in the ho[e of avoiding
	  a race which misses files being added as we start */
       if (ah->wd == -1 || !(dir_stream = opendir(ah->fname)))
	 {
	   my_syslog(LOG_ERR, _("failed to create inotify for %s"), ah->fname);
	   continue;
	 }

       while ((ent = readdir(dir_stream)))
	 {
	   size_t lendir = strlen(ah->fname);
	   size_t lenfile = strlen(ent->d_name);
	   char *path;
	   
	   /* ignore emacs backups and dotfiles */
	   if (lenfile == 0 || 
	       ent->d_name[lenfile - 1] == '~' ||
	       (ent->d_name[0] == '#' && ent->d_name[lenfile - 1] == '#') ||
	       ent->d_name[0] == '.')
	     continue;
	   
	   if ((path = whine_malloc(lendir + lenfile + 2)))
	     {
	       strcpy(path, ah->fname);
	       strcat(path, "/");
	       strcat(path, ent->d_name);
	       
	       /* ignore non-regular files */
	       if (stat(path, &buf) != -1 && S_ISREG(buf.st_mode))
		 option_read_hostsfile(path);
	       
	       free(path);
	     }
	 }
    }
}
コード例 #5
0
void getSLogPacket( void ) {
	char		buf[1300];
	int		bytes, retval;
	struct sockaddr_in	client_sock;
	socklen_t		client_len;
	fd_set			rfds;
	struct timeval		tv;

	FD_ZERO(&rfds);
	FD_SET(slog_serv_sock_num, &rfds);
	tv.tv_sec = 60; /* we wait maximum 60 seconds */
	tv.tv_usec = 0;

	retval = select(slog_serv_sock_num + 1, &rfds, NULL, NULL, &tv);
	if (!FD_ISSET(slog_serv_sock_num, &rfds)) {
		/* Timeout from Select */
		return;
	}

	memset( buf, 0, 1290 );
	client_len = sizeof( client_sock );
	memset( &client_sock, 0, client_len );

	bytes = recvfrom( slog_serv_sock_num, buf, 1200,
		0, (struct sockaddr *) &client_sock, &client_len );
	if (bytes < 0) {
		my_syslog( MLOG_ERROR, "syslog recvfrom: %s", strerror(errno) );
	}

	my_LogSyslog( client_sock.sin_addr.s_addr, buf );
}
コード例 #6
0
ファイル: tftpd-tftpd.c プロジェクト: Mulio80/docsis_server
/*
 * Send a nak packet (error message).
 * Error code passed in is one of the
 * standard TFTP codes, or a UNIX errno
 * offset by 100.
 */
void nak( Client *cl, int error ) {
	int size;
	struct tftphdr *tp;
	struct errmsg *pe;
	char buf[SEGSIZE + 4];

	cl->proc = CP_DONE;
	memset(buf, 0, sizeof(buf));
	tp = (struct tftphdr *)buf;
	tp->th_opcode = htons((u_short)ERROR);
	tp->th_code = htons((u_short)error);
	for (pe = errmsgs; pe->e_code >= 0; pe++)
		if (pe->e_code == error)
			break;
	if (pe->e_code < 0) {
		pe->e_msg = strerror(error - 100);
		tp->th_code = EUNDEF;   /* set 'undef' errorcode */
	}
	strncpy(tp->th_msg, pe->e_msg, SEGSIZE);
	size = strlen(pe->e_msg);
	size += 4 + 1;
	if (sendto(tftp_socket, buf, size, 0, (struct sockaddr *)&cl->sin,
	    sizeof(cl->sin)) != size)
		my_syslog( MLOG_TFTP, "nak: %s", strerror(errno) );	
}
コード例 #7
0
ファイル: ubus.c プロジェクト: kdarbyshirebryant/dnsmasq
static void ubus_subscribe_cb(struct ubus_context *ctx, struct ubus_object *obj)
{
  (void)ctx;

  my_syslog(LOG_DEBUG, _("UBus subscription callback: %s subscriber(s)"), obj->has_subscribers ? "1" : "0");
  notify = obj->has_subscribers;
}
コード例 #8
0
void check_dhcp_hosts(int fatal)
{
  /* If the same IP appears in more than one host config, then DISCOVER
     for one of the hosts will get the address, but REQUEST will be NAKed,
     since the address is reserved by the other one -> protocol loop. 
     Also check that FQDNs match the domain we are using. */
  
  struct dhcp_config *configs, *cp;
 
  for (configs = daemon->dhcp_conf; configs; configs = configs->next)
    {
      char *domain;

      if ((configs->flags & DHOPT_BANK) || fatal)
       {
	 for (cp = configs->next; cp; cp = cp->next)
	   if ((configs->flags & cp->flags & CONFIG_ADDR) && configs->addr.s_addr == cp->addr.s_addr)
	     {
	       if (fatal)
		 die(_("duplicate IP address %s in dhcp-config directive."), 
		     inet_ntoa(cp->addr), EC_BADCONF);
	       else
		 my_syslog(MS_DHCP | LOG_ERR, _("duplicate IP address %s in %s."), 
			   inet_ntoa(cp->addr), daemon->dhcp_hosts_file);
	       configs->flags &= ~CONFIG_ADDR;
	     }
	 
	 /* split off domain part */
	 if ((configs->flags & CONFIG_NAME) && (domain = strip_hostname(configs->hostname)))
	   configs->domain = domain;
       }
    }
}
コード例 #9
0
struct dhcp_netid *option_filter(struct dhcp_netid *tags, struct dhcp_netid *context_tags, struct dhcp_opt *opts)
{
    struct dhcp_netid *tagif = run_tag_if(tags);
    struct dhcp_opt *opt;

    /* flag options which are valid with the current tag set (sans context tags) */
    for (opt = opts; opt; opt = opt->next)
    {
        opt->flags &= ~DHOPT_TAGOK;
        if (!(opt->flags & (DHOPT_ENCAPSULATE | DHOPT_VENDOR | DHOPT_RFC3925)) &&
                match_netid(opt->netid, tagif, 0))
            opt->flags |= DHOPT_TAGOK;
    }

    /* now flag options which are valid, including the context tags,
       otherwise valid options are inhibited if we found a higher priority one above */
    if (context_tags)
    {
        struct dhcp_netid *last_tag;

        for (last_tag = context_tags; last_tag->next; last_tag = last_tag->next);
        last_tag->next = tags;
        tagif = run_tag_if(context_tags);

        /* reset stuff with tag:!<tag> which now matches. */
        for (opt = opts; opt; opt = opt->next)
            if (!(opt->flags & (DHOPT_ENCAPSULATE | DHOPT_VENDOR | DHOPT_RFC3925)) &&
                    (opt->flags & DHOPT_TAGOK) &&
                    !match_netid(opt->netid, tagif, 0))
                opt->flags &= ~DHOPT_TAGOK;

        for (opt = opts; opt; opt = opt->next)
            if (!(opt->flags & (DHOPT_ENCAPSULATE | DHOPT_VENDOR | DHOPT_RFC3925 | DHOPT_TAGOK)) &&
                    match_netid(opt->netid, tagif, 0))
            {
                struct dhcp_opt *tmp;
                for (tmp = opts; tmp; tmp = tmp->next)
                    if (tmp->opt == opt->opt && opt->netid && (tmp->flags & DHOPT_TAGOK))
                        break;
                if (!tmp)
                    opt->flags |= DHOPT_TAGOK;
            }
    }

    /* now flag untagged options which are not overridden by tagged ones */
    for (opt = opts; opt; opt = opt->next)
        if (!(opt->flags & (DHOPT_ENCAPSULATE | DHOPT_VENDOR | DHOPT_RFC3925 | DHOPT_TAGOK)) && !opt->netid)
        {
            struct dhcp_opt *tmp;
            for (tmp = opts; tmp; tmp = tmp->next)
                if (tmp->opt == opt->opt && (tmp->flags & DHOPT_TAGOK))
                    break;
            if (!tmp)
                opt->flags |= DHOPT_TAGOK;
            else if (!tmp->netid)
                my_syslog(MS_DHCP | LOG_WARNING, _("Ignoring duplicate dhcp-option %d"), tmp->opt);
        }

    return tagif;
}
コード例 #10
0
ファイル: netlink.c プロジェクト: a33g-dev/platform_samsung
static void nl_err(struct nlmsghdr *h)
{
  struct nlmsgerr *err = NLMSG_DATA(h);
  
  if (err->error != 0)
    my_syslog(LOG_ERR, _("netlink returns error: %s"), strerror(-(err->error)));
}
コード例 #11
0
ファイル: dbus.c プロジェクト: ebichu/dd-wrt
DBusHandlerResult message_handler(DBusConnection *connection, 
				  DBusMessage *message, 
				  void *user_data)
{
  char *method = (char *)dbus_message_get_member(message);
   
  if (strcmp(method, "GetVersion") == 0)
    {
      char *v = VERSION;
      DBusMessage *reply = dbus_message_new_method_return(message);
      
      dbus_message_append_args(reply, DBUS_TYPE_STRING, &v, DBUS_TYPE_INVALID);
      dbus_connection_send (connection, reply, NULL);
      dbus_message_unref (reply);
    }
  else if (strcmp(method, "SetServers") == 0)
    {
      my_syslog(LOG_INFO, _("setting upstream servers from DBus"));
      dbus_read_servers(message);
      check_servers();
    }
  else if (strcmp(method, "ClearCache") == 0)
    clear_cache_and_reload(dnsmasq_time());
  else
    return (DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
  
  method = user_data; /* no warning */

  return (DBUS_HANDLER_RESULT_HANDLED);
 
}
コード例 #12
0
ファイル: log.c プロジェクト: WiseMan787/ralink_sdk
void die(char *message, char *arg1, int exit_code)
{
  char *errmess = strerror(errno);
  
  if (!arg1)
    arg1 = errmess;

  log_stderr = 1; /* print as well as log when we die.... */
  fputc('\n', stderr); /* prettyfy  startup-script message */
  my_syslog(LOG_CRIT, message, arg1, errmess);
  
  log_stderr = 0;
  my_syslog(LOG_CRIT, _("FAILED to start up"));
  flush_log();
  
  exit(exit_code);
}
コード例 #13
0
ファイル: netlink.c プロジェクト: h0tw1r3/asuswrt-merlin
static int nl_async(struct nlmsghdr *h)
{
  if (h->nlmsg_type == NLMSG_ERROR)
    {
      struct nlmsgerr *err = NLMSG_DATA(h);
      if (err->error != 0)
	my_syslog(LOG_ERR, _("netlink returns error: %s"), strerror(-(err->error)));
      return 0;
    }
  else if (h->nlmsg_pid == 0 && h->nlmsg_type == RTM_NEWROUTE) 
    {
      /* We arrange to receive netlink multicast messages whenever the network route is added.
	 If this happens and we still have a DNS packet in the buffer, we re-send it.
	 This helps on DoD links, where frequently the packet which triggers dialling is
	 a DNS query, which then gets lost. By re-sending, we can avoid the lookup
	 failing. */ 
      struct rtmsg *rtm = NLMSG_DATA(h);
      
      if (rtm->rtm_type == RTN_UNICAST && rtm->rtm_scope == RT_SCOPE_LINK)
	{
  	  /* Force re-reading resolv file right now, for luck. */
	  daemon->last_resolv = 0;
	  
	  if (daemon->srv_save)
	    {
	      int fd;

	      if (daemon->srv_save->sfd)
		fd = daemon->srv_save->sfd->fd;
	      else if (daemon->rfd_save && daemon->rfd_save->refcount != 0)
		fd = daemon->rfd_save->fd;
	      else
		return 0;
	      
	      while(sendto(fd, daemon->packet, daemon->packet_len, 0,
			   &daemon->srv_save->addr.sa, sa_len(&daemon->srv_save->addr)) == -1 && retry_send()); 
	    }
	}
      return 0;
    }
  else if (h->nlmsg_type == RTM_NEWADDR) 
    {
#ifdef HAVE_DHCP6
      /* force RAs to sync new network and pick up new interfaces.  */
      if (daemon->ra_contexts)
	{
	  schedule_subnet_map();
	  ra_start_unsolicted(dnsmasq_time(), NULL);
	  /* cause lease_update_file to run after we return, in case we were called from
	     iface_enumerate and can't re-enter it now */
	  send_alarm(0, 0);
	}
#endif	 
      return 1; /* clever bind mode - rescan */
    }	 
  
  return 0;
}
コード例 #14
0
ファイル: tables.c プロジェクト: AllardJ/Tomato
int add_to_ipset(const char *setname, const struct all_addr *ipaddr,
		      int flags, int remove)
{
  struct pfr_addr addr;
  struct pfioc_table io;
  struct pfr_table table;
  int n = 0, rc = 0;

  if ( dev == -1 ) 
    {
      my_syslog(LOG_ERR, _("warning: no opened pf devices %s"), pf_device);
      return -1;
    }

  bzero(&table, sizeof(struct pfr_table));
  table.pfrt_flags |= PFR_TFLAG_PERSIST;
  if ( strlen(setname) >= PF_TABLE_NAME_SIZE )
    {
      my_syslog(LOG_ERR, _("error: cannot use table name %s"), setname);
      errno = ENAMETOOLONG;
      return -1;
    }
  
  if ( strlcpy(table.pfrt_name, setname,
               sizeof(table.pfrt_name)) >= sizeof(table.pfrt_name)) 
    {
      my_syslog(LOG_ERR, _("error: cannot strlcpy table name %s"), setname);
      return -1;
    }
  
  if ((rc = pfr_add_tables(&table, 1, &n, 0))) 
    {
      my_syslog(LOG_WARNING, _("warning: pfr_add_tables: %s(%d)"),
		pfr_strerror(errno),rc);
      return -1;
    }
  table.pfrt_flags &= ~PFR_TFLAG_PERSIST;
  if (n)
    my_syslog(LOG_INFO, _("info: table created"));
  
  fill_addr(ipaddr,flags,&addr);
  bzero(&io, sizeof(io));
  io.pfrio_flags = 0;
  io.pfrio_table = table;
  io.pfrio_buffer = &addr;
  io.pfrio_esize = sizeof(addr);
  io.pfrio_size = 1;
  if (ioctl(dev, ( remove ? DIOCRDELADDRS : DIOCRADDADDRS ), &io)) 
    {
      my_syslog(LOG_WARNING, _("warning: DIOCR%sADDRS: %s"), ( remove ? "DEL" : "ADD" ), pfr_strerror(errno));
      return -1;
    }
  
  my_syslog(LOG_INFO, _("%d addresses %s"),
            io.pfrio_nadd, ( remove ? "removed" : "added" ));
  
  return io.pfrio_nadd;
}
コード例 #15
0
ファイル: tftpd-tftpd.c プロジェクト: Mulio80/docsis_server
void  Init_TFTP_Socket( void ) {
	static struct sockaddr_in	sin;

	/* Setup our socket */
	tftp_socket = socket(AF_INET, SOCK_DGRAM, 0);
	if (tftp_socket < 0) {
		my_syslog( MLOG_ERROR, "tftp socket: %s", strerror(errno) );
		exit(1);
	}

	memset(&sin, 0, sizeof(sin));
	sin.sin_family = AF_INET;
	sin.sin_addr.s_addr = INADDR_ANY;
	sin.sin_port = htons( 69 );
	if (bind(tftp_socket, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
		my_syslog( MLOG_ERROR, "tftp bind: %s", strerror(errno) );
		exit(1);
	}
}
コード例 #16
0
ファイル: dhcpd-dhcpd.c プロジェクト: l3akage/docsis_server
int	leaseQuery( dhcp_message *message ) {
	if ( (message->in_pack.htype != 0) &&
	     (message->in_pack.hlen  != 0) ) {
		/* Search by MAC address */
		my_findMAC( message );

		if (message->lease_type == LEASE_REJECT) return 0;

		if (message->lease_type == LEASE_CPE &&
		    message->cpe_type == CPE_DYNAMIC &&
		    message->lockip == 0 &&
		    message->lease_time < 0 ) {
			// Your Lease has expired. You get a new IP!
			my_DeleteLease( message );
			message->lease_type = LEASE_NOT_FOUND;
		}

		if (message->lease_type == LEASE_NOT_FOUND ) {
			send_Query_NAK( message );
		} else {
			send_Query_ACK( message );
		}
		return 1;
	} else if (message->in_pack.ciaddr != 0) {
		/* Search by IP -- The majority of requests from Cisco CMTS*/
		my_findIP( message, FIND_CIADDR );

		if (message->lease_type == LEASE_REJECT) return 0;

		if (message->lease_type == LEASE_CPE &&
		    message->cpe_type == CPE_DYNAMIC &&
		    message->lockip == 0 &&
		    message->lease_time < 0 ) {
			// Your Lease has expired. You get a new IP!
			my_DeleteLease( message );
			message->lease_type = LEASE_NOT_FOUND;
		}

		if (message->lease_type == LEASE_NOT_FOUND ) {
			send_Query_NAK( message );
		} else {
			send_Query_ACK( message );
		}
		return 1;
	} else if (message->in_opts.client_ident_len > 0) {
		/* Search by dhcp-client-ident flag */
		/* Im not sure how I will do this. Log it */
		char	tmpstr[4096];
		cv_macaddr( message->in_opts.client_ident, tmpstr,
			    message->in_opts.client_ident_len );
		my_syslog( LOG_INFO, "DHCPlq - dhcp-client-ident search -%s-", tmpstr );
		return 0;
	}
}
コード例 #17
0
ファイル: ubus.c プロジェクト: kdarbyshirebryant/dnsmasq
static void ubus_disconnect_cb(struct ubus_context *ubus)
{
  int ret;

  ret = ubus_reconnect(ubus, NULL);
  if (ret)
    {
      my_syslog(LOG_ERR, _("Cannot reconnect to UBus: %s"), ubus_strerror(ret));

      ubus_destroy(ubus);
    }
}
コード例 #18
0
ファイル: mysql-mysql.c プロジェクト: Mulio80/docsis_server
void  my_LoadChecker( void ) {
	static int	fd = 0;
	char		buffer[1024], *loadchr, *p;
	float		avg;
	int		count;
	time_t		new_time;
	static time_t	old_time = 0;
	static float	my_LoadAvg = 0.0;
	static float	my_MaxLoad = 0.0;

	if (fd == 0) {
		fd = open ("/proc/loadavg", O_RDONLY);
	}
	if (fd == -1) { my_LoadAvg = 0; return; }

	new_time = time( NULL );
	if ( (new_time - old_time) > 15 ) {	// Check every 15 seconds

		loadchr = GetConfigVar( "suspend-load-avg" );
		if (*loadchr == ' ') { loadchr = "1.0"; }
		my_MaxLoad = atof( loadchr );

		memset( buffer, 0, 1024 );
		lseek( fd, 0, SEEK_SET );
		count = read (fd, buffer, sizeof(buffer));
		if (count <= 0) { my_LoadAvg = 0; return; }
		p = buffer;  while( *p != 0 && *p != ' ') { p++; }
		*p = 0;
		avg = atof( buffer );
		if (avg > my_MaxLoad && my_LoadAvg < my_MaxLoad) {
			my_syslog( MLOG_ERROR, "Load Average is too high. Suspending Logging. %3.3f", avg );
		}
		if (avg < my_MaxLoad && my_LoadAvg > my_MaxLoad) {
			my_syslog( MLOG_ERROR, "Load Average is OK. %3.3f", avg );
		}
		my_LoadAvg = avg;
		old_time = new_time;
	}
}
コード例 #19
0
void iface_join_multicast(const char* params)
{
    char if_name[IFNAMSIZ + 1] = {'\0',};
    char join_str[8] = {'\0',};
    char* pipe = strchr(params, '|');
    int join = 0;

    struct ipv6_mreq mreq;
    unsigned int if_index;

    strncpy(join_str, params, pipe - params);
    strcpy(if_name, pipe + 1);

    if (!strcmp(join_str, "true")) {
        join = 1;
    } else if (!strcmp(join_str, "false")) {
        join = 0;
    } else {
        my_syslog(MS_DHCP | LOG_INFO, "Malformatted msg %s", params);
        return;
    }

    if ((if_index = if_nametoindex(if_name)) > 0) {
        mreq.ipv6mr_interface = if_index;
        inet_pton(AF_INET6, ALL_RELAY_AGENTS_AND_SERVERS, &mreq.ipv6mr_multiaddr);

        if (daemon->dhcp6 && 
            setsockopt(daemon->dhcp6fd, IPPROTO_IPV6, join ? IPV6_JOIN_GROUP : IPV6_LEAVE_GROUP, &mreq, sizeof(mreq)) == -1) {
            if (errno != EADDRINUSE) {
                my_syslog(MS_DHCP | LOG_INFO, "setsockopt error: %s", strerror(errno));
                return;
            }
        } 
    } else {
       my_syslog(MS_DHCP | LOG_INFO, "if_nametoindex error: %s", strerror(errno));
       return;
    }
    my_syslog(MS_DHCP | LOG_INFO, "iface %s joined %s", if_name, ALL_RELAY_AGENTS_AND_SERVERS);
}
コード例 #20
0
ファイル: dbus.c プロジェクト: afdnlw/dnsmasq-chinadns
static DBusMessage *dbus_set_bool(DBusMessage *message, int flag, char *name)
{
  DBusMessageIter iter;
  dbus_bool_t enabled;

  if (!dbus_message_iter_init(message, &iter) || dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_BOOLEAN)
    return dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS, "Expected boolean argument");
  
  dbus_message_iter_get_basic(&iter, &enabled);

  if (enabled)
    { 
      my_syslog(LOG_INFO, "Enabling --%s option from D-Bus", name);
      set_option_bool(flag);
    }
  else
    {
      my_syslog(LOG_INFO, "Disabling --$s option from D-Bus", name);
      reset_option_bool(flag);
    }

  return NULL;
}
コード例 #21
0
void initSLogSocket( void ) {
	int	bind_res = 0;
	int	serv_sock_len = 0;

	serv_sock_len = sizeof( slog_serv_sock );
	memset( &slog_serv_sock, 0, serv_sock_len );

	slog_serv_sock.sin_family = AF_INET;
	slog_serv_sock.sin_port = htons( 514 );
	slog_serv_sock.sin_addr.s_addr = INADDR_ANY;

	slog_serv_sock_num = socket(AF_INET, SOCK_DGRAM, 0);
	if (slog_serv_sock_num == -1) {
		my_syslog( MLOG_ERROR, "Cannot open Syslog Server Socket." );
		exit(1);
	}

	bind_res = bind( slog_serv_sock_num, (struct sockaddr *) &slog_serv_sock, serv_sock_len );
	if (bind_res == -1) {
		my_syslog( MLOG_ERROR, "Cannot Bind Syslog Server Socket to Port 514" );
		exit(1);
	}
}
コード例 #22
0
ファイル: conntrack.c プロジェクト: ArchiDroid/dnsmasq
int get_incoming_mark(union mysockaddr *peer_addr, struct all_addr *local_addr, int istcp, unsigned int *markp)
{
  struct nf_conntrack *ct;
  struct nfct_handle *h;
  
  gotit = 0;
  
  if ((ct = nfct_new())) 
    {
      nfct_set_attr_u8(ct, ATTR_L4PROTO, istcp ? IPPROTO_TCP : IPPROTO_UDP);
      nfct_set_attr_u16(ct, ATTR_PORT_DST, htons(daemon->port));
      
#ifdef HAVE_IPV6
      if (peer_addr->sa.sa_family == AF_INET6)
	{
	  nfct_set_attr_u8(ct, ATTR_L3PROTO, AF_INET6);
	  nfct_set_attr(ct, ATTR_IPV6_SRC, peer_addr->in6.sin6_addr.s6_addr);
	  nfct_set_attr_u16(ct, ATTR_PORT_SRC, peer_addr->in6.sin6_port);
	  nfct_set_attr(ct, ATTR_IPV6_DST, local_addr->addr.addr6.s6_addr);
	}
      else
#endif
	{
	  nfct_set_attr_u8(ct, ATTR_L3PROTO, AF_INET);
	  nfct_set_attr_u32(ct, ATTR_IPV4_SRC, peer_addr->in.sin_addr.s_addr);
	  nfct_set_attr_u16(ct, ATTR_PORT_SRC, peer_addr->in.sin_port);
	  nfct_set_attr_u32(ct, ATTR_IPV4_DST, local_addr->addr.addr4.s_addr);
	}
      
      
      if ((h = nfct_open(CONNTRACK, 0))) 
	{
	  nfct_callback_register(h, NFCT_T_ALL, callback, (void *)markp);  
	  if (nfct_query(h, NFCT_Q_GET, ct) == -1)
	    {
	      static int warned = 0;
	      if (!warned)
		{
		  my_syslog(LOG_ERR, _("Conntrack connection mark retrieval failed: %s"), strerror(errno));
		  warned = 1;
		}
	    }
	  nfct_close(h);  
	}
      nfct_destroy(ct);
    }

  return gotit;
}
コード例 #23
0
ファイル: tftp.c プロジェクト: vlrk/dnsmasq
static ssize_t tftp_err(int err, char *packet, char *message, char *file)
{
  struct errmess {
    unsigned short op, err;
    char message[];
  } *mess = (struct errmess *)packet;
  ssize_t ret = 4;
  char *errstr = strerror(errno);
 
  mess->op = htons(OP_ERR);
  mess->err = htons(err);
  ret += (snprintf(mess->message, 500,  message, file, errstr) + 1);
  my_syslog(MS_TFTP | LOG_ERR, "%s", mess->message);
  
  return  ret;
}
コード例 #24
0
ファイル: netlink.c プロジェクト: gonzopancho/asuswrt
static int nl_async(struct nlmsghdr *h)
{
  if (h->nlmsg_type == NLMSG_ERROR)
    {
      struct nlmsgerr *err = NLMSG_DATA(h);
      if (err->error != 0)
	my_syslog(LOG_ERR, _("netlink returns error: %s"), strerror(-(err->error)));
      return 0;
    }
  else if (h->nlmsg_pid == 0 && h->nlmsg_type == RTM_NEWROUTE) 
    {
      /* We arrange to receive netlink multicast messages whenever the network route is added.
	 If this happens and we still have a DNS packet in the buffer, we re-send it.
	 This helps on DoD links, where frequently the packet which triggers dialling is
	 a DNS query, which then gets lost. By re-sending, we can avoid the lookup
	 failing. */ 
      struct rtmsg *rtm = NLMSG_DATA(h);
      
      if (rtm->rtm_type == RTN_UNICAST && rtm->rtm_scope == RT_SCOPE_LINK)
	{
  	  /* Force re-reading resolv file right now, for luck. */
	  daemon->last_resolv = 0;
	  
	  if (daemon->srv_save)
	    {
	      int fd;

	      if (daemon->srv_save->sfd)
		fd = daemon->srv_save->sfd->fd;
	      else if (daemon->rfd_save && daemon->rfd_save->refcount != 0)
		fd = daemon->rfd_save->fd;
	      else
		return 0;
	      
	      while(sendto(fd, daemon->packet, daemon->packet_len, 0,
			   &daemon->srv_save->addr.sa, sa_len(&daemon->srv_save->addr)) == -1 && retry_send()); 
	    }
	}
      return 0;
    }
  else if (h->nlmsg_type == RTM_NEWADDR || h->nlmsg_type == RTM_DELADDR) 
    return 1; /* clever bind mode - rescan */
  
  return 0;
}
コード例 #25
0
ファイル: ubus.c プロジェクト: kdarbyshirebryant/dnsmasq
void set_ubus_listeners()
{
  struct ubus_context *ubus = (struct ubus_context *)daemon->ubus;
  if (!ubus)
    {
      if (!error_logged)
        {
          my_syslog(LOG_ERR, _("Cannot set UBus listeners: no connection"));
          error_logged = 1;
        }
      return;
    }

  error_logged = 0;

  poll_listen(ubus->sock.fd, POLLIN);
  poll_listen(ubus->sock.fd, POLLERR);
  poll_listen(ubus->sock.fd, POLLHUP);
}
コード例 #26
0
ファイル: slaac.c プロジェクト: Kubing/dnsmasq
void slaac_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface, struct dhcp_lease *leases)
{
  struct dhcp_lease *lease;
  struct slaac_address *slaac;
  struct ping_packet *ping = (struct ping_packet *)packet;
  int gotone = 0;
  
  if (ping->identifier == ping_id)
    for (lease = leases; lease; lease = lease->next)
      for (slaac = lease->slaac_address; slaac; slaac = slaac->next)
	if (slaac->backoff != 0 && IN6_ARE_ADDR_EQUAL(sender, &slaac->addr))
	  {
	    slaac->backoff = 0;
	    gotone = 1;
	    inet_ntop(AF_INET6, sender, daemon->addrbuff, ADDRSTRLEN);
	    my_syslog(MS_DHCP | LOG_INFO, "SLAAC-CONFIRM(%s) %s %s", interface, daemon->addrbuff, lease->hostname); 
	  }
  
  lease_update_dns(gotone);
}
コード例 #27
0
ファイル: tftp.c プロジェクト: kdarbyshirebryant/dnsmasq
		  /* put on queue to be sent to script and deleted */
		  transfer->next = daemon->tftp_done_trans;
		  daemon->tftp_done_trans = transfer;
		}
	      continue;
	    }
	}

      up = &transfer->next;
    }    
}

static void free_transfer(struct tftp_transfer *transfer)
{
  close(transfer->sockfd);
  if (transfer->file && (--transfer->file->refcount) == 0)
    {
      close(transfer->file->fd);
      free(transfer->file);
    }
  free(transfer);
}

static char *next(char **p, char *end)
{
  char *ret = *p;
  size_t len;

  if (*(end-1) != 0 || 
      *p == end ||
      (len = strlen(ret)) == 0)
    return NULL;

  *p += len + 1;
  return ret;
}

static void sanitise(char *buf)
{
  unsigned char *q, *r;
  for (q = r = (unsigned char *)buf; *r; r++)
    if (isprint((int)*r))
      *(q++) = *r;
  *q = 0;

}

#define MAXMESSAGE 500 /* limit to make packet < 512 bytes and definitely smaller than buffer */ 
static ssize_t tftp_err(int err, char *packet, char *message, char *file)
{
  struct errmess {
    unsigned short op, err;
    char message[];
  } *mess = (struct errmess *)packet;
  ssize_t len, ret = 4;
  char *errstr = strerror(errno);
  
  memset(packet, 0, daemon->packet_buff_sz);
  sanitise(file);
  
  mess->op = htons(OP_ERR);
  mess->err = htons(err);
  len = snprintf(mess->message, MAXMESSAGE,  message, file, errstr);
  ret += (len < MAXMESSAGE) ? len + 1 : MAXMESSAGE; /* include terminating zero */
  
  my_syslog(MS_TFTP | LOG_ERR, "%s", mess->message);
  
  return  ret;
}
コード例 #28
0
ファイル: mysql-findip.c プロジェクト: Mulio80/docsis_server
int   my_findIP( dhcp_message *message, int find_type ) {
	char		qbuf[500], *ip;
	int		res;
	struct in_addr	inp;
        my_syslog(LOG_WARNING, "EXISTING IP addresses to give to gi %s mac %s lease %d docsis type %d",
                message->in_giaddr, message->s_macaddr, message->lease_type, message->in_opts.docsis_modem );

	ip = message->s_ipaddr; /* find_type = IPADDR */
	if (find_type == FIND_CIADDR) { ip = message->in_ciaddr; } else
	if (find_type == FIND_YIADDR) { ip = message->in_yiaddr; }

	inet_aton( ip, &inp );
	message->b_ipaddr = ntohl( inp.s_addr );
	strcpy( message->s_ipaddr, ip );
	ignore_repeated_customers( message );
	if (message->lease_type == LEASE_REJECT) return 0;

	snprintf( qbuf, 500, "select macaddr, subnum, dynamic_flag, modem_macaddr, "
		"unix_timestamp(end_time) - unix_timestamp() "
		"from dhcp_leases where ipaddr = '%s'", ip );

	res = my_findIP_QUERY( qbuf, message );
	if ( res ) {
		message->lease_type = LEASE_CPE;
		return 1;
	}

	snprintf( qbuf, 500, "select modem_macaddr, subnum, 'NO', modem_macaddr, "
		"1 as lease_time from docsis_modem "
		"where ipaddr = '%s'", ip );

	res = my_findIP_QUERY( qbuf, message );
	if ( res ) {
		message->lease_type = LEASE_CM;
		return 1;
	}

	return 0;
}
コード例 #29
0
ファイル: ubus.c プロジェクト: kdarbyshirebryant/dnsmasq
void ubus_event_bcast(const char *type, const char *mac, const char *ip, const char *name, const char *interface)
{
  struct ubus_context *ubus = (struct ubus_context *)daemon->ubus;
  int ret;

  if (!ubus || !notify)
    return;

  blob_buf_init(&b, BLOBMSG_TYPE_TABLE);
  if (mac)
    blobmsg_add_string(&b, "mac", mac);
  if (ip)
    blobmsg_add_string(&b, "ip", ip);
  if (name)
    blobmsg_add_string(&b, "name", name);
  if (interface)
    blobmsg_add_string(&b, "interface", interface);
  
  ret = ubus_notify(ubus, &ubus_object, type, b.head, -1);
  if (!ret)
    my_syslog(LOG_ERR, _("Failed to send UBus event: %s"), ubus_strerror(ret));
}
コード例 #30
0
static void nl_async(struct nlmsghdr *h)
{
  if (h->nlmsg_type == NLMSG_ERROR)
    {
      struct nlmsgerr *err = NLMSG_DATA(h);
      if (err->error != 0)
	my_syslog(LOG_ERR, _("netlink returns error: %s"), strerror(-(err->error)));
    }
  else if (h->nlmsg_pid == 0 && h->nlmsg_type == RTM_NEWROUTE) 
    {
      /* We arrange to receive netlink multicast messages whenever the network route is added.
	 If this happens and we still have a DNS packet in the buffer, we re-send it.
	 This helps on DoD links, where frequently the packet which triggers dialling is
	 a DNS query, which then gets lost. By re-sending, we can avoid the lookup
	 failing. */ 
      struct rtmsg *rtm = NLMSG_DATA(h);
      
      if (rtm->rtm_type == RTN_UNICAST && rtm->rtm_scope == RT_SCOPE_LINK)
	queue_event(EVENT_NEWROUTE);
    }
  else if (h->nlmsg_type == RTM_NEWADDR || h->nlmsg_type == RTM_DELADDR) 
    queue_event(EVENT_NEWADDR);
}