int get_header(t_info *info) { if (recv_welcome(info) < 0) return (-1); if (send_magic(info) < 0) return (-1); return (0); }
static int ctrl_accept(int ctrl_port, int *num_incidents, struct callbacks *cb, int magic) { char buf[1024], dump[8192], host[NI_MAXHOST], port[NI_MAXSERV]; struct sockaddr_storage cli_addr; socklen_t cli_len; int ctrl_conn, s; ssize_t len; retry: cli_len = sizeof(cli_addr); while ((ctrl_conn = accept(ctrl_port, (struct sockaddr *)&cli_addr, &cli_len)) == -1) { if (errno == EINTR || errno == ECONNABORTED) continue; PLOG_FATAL(cb, "accept"); } s = getnameinfo((struct sockaddr *)&cli_addr, cli_len, host, sizeof(host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV); if (s) { LOG_ERROR(cb, "getnameinfo: %s", gai_strerror(s)); strcpy(host, "(unknown)"); strcpy(port, "(unknown)"); } memset(buf, 0, sizeof(buf)); while ((len = read(ctrl_conn, buf, sizeof(buf))) == -1) { if (errno == EINTR) continue; PLOG_ERROR(cb, "read"); do_close(ctrl_conn); goto retry; } if (memcmp(buf, control_port_secret, SECRET_SIZE) != 0) { if (num_incidents) (*num_incidents)++; if (hexdump(buf, len, dump, sizeof(dump))) { LOG_WARN(cb, "Invalid secret from %s:%s\n%s", host, port, dump); } else LOG_WARN(cb, "Invalid secret from %s:%s", host, port); do_close(ctrl_conn); goto retry; } /* tell client that authentication passes */ send_magic(ctrl_conn, magic, cb, __func__); LOG_INFO(cb, "Control connection established with %s:%s", host, port); return ctrl_conn; }
static void ctrl_notify_server(int ctrl_conn, int magic, struct callbacks *cb) { send_magic(ctrl_conn, magic, cb, __func__); if (shutdown(ctrl_conn, SHUT_WR)) PLOG_ERROR(cb, "shutdown"); }
int main(void) { uint8_t buf[HID_OUT_BUFFER_SIZE-1]; IRMP_DATA myIRData; int8_t ret; LED_Switch_init(); Systick_Init(); USB_Reset(); USB_HID_Init(); USB_DISC_release(); IRMP_Init(); irsnd_init(); FLASH_Unlock(); EE_Init(); irmp_set_callback_ptr (led_callback); while (1) { if (!AlarmValue) Wakeup(); if (!send_ir_on_delay) send_magic(); wakeup_reset(); /* test if USB is connected to PC, sendtransfer is complete and configuration command is received */ if (USB_HID_GetStatus() == CONFIGURED && PrevXferComplete && USB_HID_ReceiveData(buf) == RX_READY && buf[0] == STAT_CMD) { switch ((enum access) buf[1]) { case ACC_GET: ret = get_handler(buf); break; case ACC_SET: ret = set_handler(buf); break; case ACC_RESET: ret = reset_handler(buf); break; default: ret = -1; } if (ret == -1) { buf[0] = STAT_FAILURE; ret = 3; } else { buf[0] = STAT_SUCCESS; } /* send configuration data */ USB_HID_SendData(REPORT_ID_CONFIG, buf, ret); blink_LED(); if(Reboot) reboot(); } /* poll IR-data */ if (irmp_get_data(&myIRData)) { myIRData.flags = myIRData.flags & IRMP_FLAG_REPETITION; if (!(myIRData.flags)) { store_wakeup(&myIRData); check_macros(&myIRData); check_wakeups(&myIRData); check_resets(&myIRData); check_reboot(&myIRData); } /* send IR-data */ USB_HID_SendData(REPORT_ID_IR, (uint8_t *) &myIRData, sizeof(myIRData)); } } }