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; } }
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); }