void fprint_remote_head(FILE* f, const struct ir_remote* rem) { fprintf(f, "begin remote\n\n"); fprintf(f, " name %s\n", rem->name); if (rem->manual_sort) fprintf(f, " manual_sort %d\n", rem->manual_sort); if (rem->driver) fprintf(f, " driver %s\n", rem->driver); if (!is_raw(rem)) fprintf(f, " bits %5d\n", rem->bits); fprint_flags(f, rem->flags); fprintf(f, " eps %5d\n", rem->eps); fprintf(f, " aeps %5d\n\n", rem->aeps); if (!is_raw(rem)) { if (has_header(rem)) fprintf(f, " header %5u %5u\n", (__u32)rem->phead, (__u32)rem->shead); if (rem->pthree != 0 || rem->sthree != 0) fprintf(f, " three %5u %5u\n", (__u32)rem->pthree, (__u32)rem->sthree); if (rem->ptwo != 0 || rem->stwo != 0) fprintf(f, " two %5u %5u\n", (__u32)rem->ptwo, (__u32)rem->stwo); fprintf(f, " one %5u %5u\n", (__u32)rem->pone, (__u32)rem->sone); fprintf(f, " zero %5u %5u\n", (__u32)rem->pzero, (__u32)rem->szero); } if (rem->ptrail != 0) fprintf(f, " ptrail %5u\n", (__u32)rem->ptrail); if (!is_raw(rem)) { if (rem->plead != 0) fprintf(f, " plead %5u\n", (__u32)rem->plead); if (has_foot(rem)) fprintf(f, " foot %5u %5u\n", (__u32)rem->pfoot, (__u32)rem->sfoot); } if (has_repeat(rem)) fprintf(f, " repeat %5u %5u\n", (__u32)rem->prepeat, (__u32)rem->srepeat); if (!is_raw(rem)) { if (rem->pre_data_bits > 0) { fprintf(f, " pre_data_bits %d\n", rem->pre_data_bits); fprintf(f, " pre_data 0x%llX\n", (unsigned long long)rem->pre_data); } if (rem->post_data_bits > 0) { fprintf(f, " post_data_bits %d\n", rem->post_data_bits); fprintf(f, " post_data 0x%llX\n", (unsigned long long)rem->post_data); } if (rem->pre_p != 0 && rem->pre_s != 0) fprintf(f, " pre %5u %5u\n", (__u32)rem->pre_p, (__u32)rem->pre_s); if (rem->post_p != 0 && rem->post_s != 0) fprintf(f, " post %5u %5u\n", (__u32)rem->post_p, (__u32)rem->post_s); } fprint_remote_gap(f, rem); if (has_repeat_gap(rem)) fprintf(f, " repeat_gap %u\n", (__u32)rem->repeat_gap); if (rem->suppress_repeat > 0) fprintf(f, " suppress_repeat %d\n", rem->suppress_repeat); if (rem->min_repeat > 0) { fprintf(f, " min_repeat %d\n", rem->min_repeat); if (rem->suppress_repeat == 0) { fprintf(f, "# suppress_repeat %d\n", rem->min_repeat); fprintf(f, "# uncomment to suppress unwanted repeats\n"); } } if (!is_raw(rem)) { if (rem->min_code_repeat > 0) fprintf(f, " min_code_repeat %d\n", rem->min_code_repeat); fprintf(f, " toggle_bit_mask 0x%llX\n", (unsigned long long)rem->toggle_bit_mask); if (has_toggle_mask(rem)) fprintf(f, " toggle_mask 0x%llX\n", (unsigned long long)rem->toggle_mask); if (rem->repeat_mask != 0) fprintf(f, " repeat_mask 0x%llX\n", (unsigned long long)rem->repeat_mask); if (rem->rc6_mask != 0) fprintf(f, " rc6_mask 0x%llX\n", (unsigned long long)rem->rc6_mask); if (has_ignore_mask(rem)) fprintf(f, " ignore_mask 0x%llX\n", (unsigned long long)rem->ignore_mask); if (is_serial(rem)) { fprintf(f, " baud %d\n", rem->baud); fprintf(f, " serial_mode %dN%d%s\n", rem->bits_in_byte, rem->stop_bits / 2, rem->stop_bits % 2 ? ".5" : ""); } } if (rem->freq != 0) fprintf(f, " frequency %u\n", rem->freq); if (rem->duty_cycle != 0) fprintf(f, " duty_cycle %u\n", rem->duty_cycle); fprintf(f, "\n"); }
void fprint_remote_head(FILE *f, struct ir_remote *rem) { fprintf(f, "begin remote\n\n"); if(!is_raw(rem)){ fprintf(f, " name %s\n",rem->name); fprintf(f, " bits %5d\n",rem->bits); fprint_flags(f,rem->flags); fprintf(f, " eps %5d\n",rem->eps); fprintf(f, " aeps %5d\n\n",rem->aeps); if(has_header(rem)) { fprintf(f, " header %5lu %5lu\n", (unsigned long) rem->phead, (unsigned long) rem->shead); } if(rem->pthree!=0 || rem->sthree!=0) fprintf(f, " three %5lu %5lu\n", (unsigned long) rem->pthree, (unsigned long) rem->sthree); if(rem->ptwo!=0 || rem->stwo!=0) fprintf(f, " two %5lu %5lu\n", (unsigned long) rem->ptwo, (unsigned long) rem->stwo); fprintf(f, " one %5lu %5lu\n", (unsigned long) rem->pone, (unsigned long) rem->sone); fprintf(f, " zero %5lu %5lu\n", (unsigned long) rem->pzero, (unsigned long) rem->szero); if(rem->ptrail!=0) { fprintf(f, " ptrail %5lu\n", (unsigned long) rem->ptrail); } if(rem->plead!=0) { fprintf(f, " plead %5lu\n", (unsigned long) rem->plead); } if(has_foot(rem)) { fprintf(f, " foot %5lu %5lu\n", (unsigned long) rem->pfoot, (unsigned long) rem->sfoot); } if(has_repeat(rem)) { fprintf(f, " repeat %5lu %5lu\n", (unsigned long) rem->prepeat, (unsigned long) rem->srepeat); } if(rem->pre_data_bits>0) { fprintf(f, " pre_data_bits %d\n",rem->pre_data_bits); # ifdef LONG_IR_CODE fprintf(f, " pre_data 0x%llX\n",rem->pre_data); # else fprintf(f, " pre_data 0x%lX\n",rem->pre_data); # endif } if(rem->post_data_bits>0) { fprintf(f, " post_data_bits %d\n",rem->post_data_bits); # ifdef LONG_IR_CODE fprintf(f, " post_data 0x%llX\n",rem->post_data); # else fprintf(f, " post_data 0x%lX\n",rem->post_data); # endif } if(rem->pre_p!=0 && rem->pre_s!=0) { fprintf(f, " pre %5lu %5lu\n", (unsigned long) rem->pre_p, (unsigned long) rem->pre_s); } if(rem->post_p!=0 && rem->post_s!=0) { fprintf(f, " post %5lu %5lu\n", (unsigned long) rem->post_p, (unsigned long) rem->post_s); } fprintf(f, " gap %lu\n", (unsigned long) rem->gap); if(has_repeat_gap(rem)) { fprintf(f, " repeat_gap %lu\n", (unsigned long) rem->repeat_gap); } if(rem->min_repeat>0) { fprintf(f, " min_repeat %d\n",rem->min_repeat); } if(rem->min_code_repeat>0) { fprintf(f, " min_code_repeat %d\n", rem->min_code_repeat); } # ifdef LONG_IR_CODE fprintf(f, " toggle_bit_mask 0x%llX\n", rem->toggle_bit_mask); # else fprintf(f, " toggle_bit_mask 0x%lX\n", rem->toggle_bit_mask); # endif if(has_toggle_mask(rem)) { # ifdef LONG_IR_CODE fprintf(f, " toggle_mask 0x%llX\n", rem->toggle_mask); # else fprintf(f, " toggle_mask 0x%lX\n", rem->toggle_mask); # endif } if(rem->rc6_mask!=0) { # ifdef LONG_IR_CODE fprintf(f, " rc6_mask 0x%llX\n", rem->rc6_mask); # else fprintf(f, " rc6_mask 0x%lX\n", rem->rc6_mask); # endif } if(is_serial(rem)) { fprintf(f, " baud %d\n",rem->baud); fprintf(f, " serial_mode %dN%d%s\n", rem->bits_in_byte, rem->stop_bits/2, rem->stop_bits%2 ? ".5":""); } } else { fprintf(f, " name %s\n",rem->name); fprint_flags(f,rem->flags); fprintf(f, " eps %5d\n",rem->eps); fprintf(f, " aeps %5d\n\n",rem->aeps); fprintf(f, " ptrail %5lu\n",(unsigned long) rem->ptrail); fprintf(f, " repeat %5lu %5lu\n", (unsigned long) rem->prepeat, (unsigned long) rem->srepeat); fprintf(f, " gap %lu\n",(unsigned long) rem->gap); } if(rem->freq!=0) { fprintf(f, " frequency %u\n",rem->freq); } if(rem->duty_cycle!=0) { fprintf(f, " duty_cycle %u\n",rem->duty_cycle); } fprintf(f,"\n"); }
static int listen_for_IP() { struct sockaddr_nl addr; int sock, len; const int RECV_SIZE = 512; char recv_buffer[RECV_SIZE]; if ((sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE)) == -1) { _perror("couldn't open NETLINK_ROUTE socket"); _assert(false); return 1; } memset(&addr, 0, sizeof(addr)); addr.nl_family = AF_NETLINK; addr.nl_groups = RTMGRP_IPV6_IFADDR; if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) { _perror("couldn't bind"); assert(false); return 1; } send_ip_list_request(sock); loop: while ((len = recv(sock, recv_buffer, RECV_SIZE, 0)) > 0) { struct nlmsghdr* nlh = (struct nlmsghdr*) recv_buffer; while (NLMSG_OK(nlh, len) && (nlh->nlmsg_type != NLMSG_DONE)) { if (nlh->nlmsg_type == RTM_NEWADDR || nlh->nlmsg_type == RTM_GETADDR || nlh->nlmsg_type == RTM_DELADDR) { struct ifaddrmsg *ifa = (struct ifaddrmsg *) NLMSG_DATA(nlh); if(verbose_mode) { log_time(); log("Message: [%d] flags: ", nlh->nlmsg_type); fprint_flags(global_output, ifa->ifa_flags); log(" scope: %d\n", ifa->ifa_scope); } if (ifa->ifa_family == AF_INET6) { void *address = NULL; //The IP Address: struct ifa_cacheinfo *ci = NULL; //Cache info for address: struct rtattr *rth = IFA_RTA(ifa); int rtl = IFA_PAYLOAD(nlh); while (rtl && RTA_OK(rth, rtl)) { if (rth->rta_type == IFA_ADDRESS) { address = RTA_DATA(rth); if(verbose_mode) { log("[IFA_ADDRESS]"); log_ipv6(address); log("\n"); } } else if (rth->rta_type == IFA_CACHEINFO) { ci = (struct ifa_cacheinfo *) RTA_DATA(rth); if(verbose_mode) { log("[IFA_CACHEINFO] valid: %d prefered: %d\n", ci->ifa_valid, ci->ifa_prefered); } } else { verbose_log("[?%d?]\n", rth->rta_type); } rth = RTA_NEXT(rth, rtl); } assert(address != NULL); assert(ci != NULL); filter_ip(address, ifa->ifa_flags, ifa->ifa_scope, ci->ifa_prefered); } } else if (nlh->nlmsg_type == NLMSG_ERROR) { struct nlmsgerr *err = (struct nlmsgerr*) NLMSG_DATA(nlh); if (nlh->nlmsg_len < NLMSG_LENGTH(sizeof(struct nlmsgerr))) { log("ERROR truncated\n"); } else { errno = -err->error; _perror("RTNETLINK answers"); } return -1; } nlh = NLMSG_NEXT(nlh, len); } fflush(global_output); } if (errno == EINTR || errno == EAGAIN) goto loop; //Would a do..while be cleaner? assert(len != 0); assert(len > 0); return 0; }