Esempio n. 1
0
static void poll_slave(uint8_t channel) {
  uint32_t now=rtc_get_time();
  struct ant_slave_list_entry *entry;
  struct ant_slave_t *slave;

  while(ant_master.current) {
    entry=ant_master.current;

    if(now > (entry->slave.last_rx+entry->slave.timeout)) {
      ant_master.current=entry->next;
      remove_slave(&entry->slave);
      continue;            
    }                  
    else if(now < entry->next_poll) {
      ant_master.current=ant_master.current->next;
      continue;
    }
    
    slave=&entry->slave;
    if(entry->poll_count==1) {
      send_poll_begin_msg(channel, slave->shared_address);
    }
    else if(entry->poll_count<(entry->slave.no_of_polls-1)) {
      send_poll_msg(channel, slave->shared_address, false);
    }
    else {
      send_poll_end_msg(channel, slave->shared_address);
    }
    
    if(++entry->poll_count>=entry->slave.no_of_polls) {
      entry->poll_count=0;
      entry->next_poll=now+entry->slave.poll_interval;
      ant_master.current=ant_master.current->next;
    }
    return;
  }

  switch(++alternation_index % 2) {
    case 0:
      send_address_available_msg(channel, next_shared_address);
      break;
    case 1:
      send_channel_available_msg(channel, ant_state.network_id);
      ant_master.current=ant_master.slave_list;
      break;
  }
}
Esempio n. 2
0
static void
add_slave (krb5_context context, krb5_keytab keytab, slave **root, int fd)
{
    krb5_principal server;
    krb5_error_code ret;
    slave *s;
    socklen_t addr_len;
    krb5_ticket *ticket = NULL;
    char hostname[128];

    s = malloc(sizeof(*s));
    if (s == NULL) {
	krb5_warnx (context, "add_slave: no memory");
	return;
    }
    s->name = NULL;
    s->ac = NULL;

    addr_len = sizeof(s->addr);
    s->fd = accept (fd, (struct sockaddr *)&s->addr, &addr_len);
    if (s->fd < 0) {
	krb5_warn (context, errno, "accept");
	goto error;
    }
    gethostname(hostname, sizeof(hostname));
    ret = krb5_sname_to_principal (context, hostname, IPROP_NAME,
				   KRB5_NT_SRV_HST, &server);
    if (ret) {
	krb5_warn (context, ret, "krb5_sname_to_principal");
	goto error;
    }

    ret = krb5_recvauth (context, &s->ac, &s->fd,
			 IPROP_VERSION, server, 0, keytab, &ticket);
    krb5_free_principal (context, server);
    if (ret) {
	krb5_warn (context, ret, "krb5_recvauth");
	goto error;
    }
    ret = krb5_unparse_name (context, ticket->client, &s->name);
    if (ret) {
	krb5_warn (context, ret, "krb5_unparse_name");
	goto error;
    }
    if (check_acl (context, s->name)) {
	krb5_warnx (context, "%s not in acl", s->name);
	goto error;
    }
    krb5_free_ticket (context, ticket);
    ticket = NULL;

    {
	slave *l = *root;

	while (l) {
	    if (strcmp(l->name, s->name) == 0)
		break;
	    l = l->next;
	}
	if (l) {
	    if (l->flags & SLAVE_F_DEAD) {
		remove_slave(context, l, root);
	    } else {
		krb5_warnx (context, "second connection from %s", s->name);
		goto error;
	    }
	}
    }

    krb5_warnx (context, "connection from %s", s->name);

    s->version = 0;
    s->flags = 0;
    slave_seen(s);
    s->next = *root;
    *root = s;
    return;
error:
    remove_slave(context, s, root);
}