int parse_event(IDSA_EVENT * evt, char *buf) { int result = 0; pid_t pid = 0; unsigned int pri = DEFAULT_PRI; int j = 0; int i = 0; int k = 0; char *service = NULL; char *message = buf; if ((evt == NULL) || (buf == NULL)) { /* unreasonable input */ #ifdef TRACE fprintf(stderr, "parse_event(): NULL data\n"); #endif return 1; } #ifdef TRACE fprintf(stderr, "parse_event(): buffer=%s\n", buf); #endif /* look for priority */ if (buf[i] == '<') { /* try to get hold of priority */ i++; pri = atoi(buf + i); while (isdigit(buf[i]) && i < 5) { i++; } if (buf[i] == '>') { i++; } else { i = 0; pri = DEFAULT_PRI; } } message = buf + i; #ifdef TRACE fprintf(stderr, "parse_event(): priority=%d, message=%s\n", pri, message); #endif /* look for date */ /* 0123456789012345 */ /* date prefix has the following structure: "XXX XX XX:XX:XX " */ if (strlen(buf + i) > 16) { if ((buf[i + 3] == ' ') && (buf[i + 6] == ' ') && (buf[i + 9] == ':') && (buf[i + 12] == ':') && (buf[i + 15] == ' ')) { i += 16; } } message = buf + i; #ifdef TRACE fprintf(stderr, "parse_event(): skipped date, message=%s\n", message); #endif j = i; /* does this look like a symbolic hostname ? */ while ((buf[i] != '\0') && (isalnum(buf[i]) || buf[i] == '.' || buf[i] == '-')) { i++; } if (isspace(buf[i])) { i++; } else { i = j; } #ifdef TRACE fprintf(stderr, "parse_event(): skipped hostname, message=%s\n", message); #endif j = i; /* try and find the : after service[pid]: */ while ((buf[i] != '\0') && (buf[i] != ':') && (!isspace(buf[i]))) { switch (buf[i]) { case '[': k = i; pid = atoi(buf + i + 1); break; case ']': break; } i++; } if ((buf[i] == ':') || (pid > 0)) { /* sensible modern syslog: <pri>...service[pid]: */ if (k > 0) { buf[k] = '\0'; } else { buf[i] = '\0'; } service = buf + j; i++; if (isspace(buf[i])) { i++; } message = buf + i; } #ifdef TRACE fprintf(stderr, "parse_event(): tried to get service=%s, message=%s\n", service, message); #endif result += idsa_event_syslog(evt, pri, message); if (service) { result += idsa_service(evt, service); if (pid) { result += idsa_pid(evt, pid); } } result += parse_extra(evt, service ? service : "syslog", message); #ifdef TRACE idsa_event_dump(evt, stderr); #endif return result; }
int main(int argc, char *argv[]) { unsigned char buffer[4096] = {0}; int bufferLen = 0; int bytesReceived = 0; int bytesWritten = 0; int timer = 0; unsigned int deviceId[3]; Command command; int extra = -1; if (argc < 3) { print_error("Usage: insteon deviceId [on|off|status|temp_ambient]\n"); return 1; } // Parse arguments parse_device(argv[1], deviceId); command = parse_command(argv[2]); if (argc > 3) extra = parse_extra(argv[3]); if (command < 0) { print_error("Invalid command name!\n"); return 1; } print_debug("*****************\n"); print_debug("Device: %s\n", argv[1]); print_debug("Command: %s\n", argv[2]); if (argc > 3) print_debug("Extra: %s\n", argv[3]); print_debug("*****************\n"); if (acquire_lock()) { print_error("Timeout while acquiring lock!\n"); return 1; } print_debug("Opening comport\n"); if(OpenComport(comport, 19200)) { print_error("Can not open comport\n"); release_lock(); return 1; } // Send command bytesWritten = send_command(deviceId, command, extra); if (bytesWritten < 0) { print_error("Invalid command or internal error!\n"); goto return_error; } // Wait for response while(1) { bytesReceived = PollComport(16, buffer + bufferLen, 4095); //print_debug("br=%d bl=%d ", bytesReceived, bufferLen); bufferLen += bytesReceived; //print_debug("br=%d bl=%d\n", bytesReceived, bufferLen); if(bytesReceived > 0) { int i; timer = 0; print_debug("received %i bytes: (%i total)", bytesReceived, bufferLen); for(i=0; i < bufferLen; i++) { print_debug("%02X ", buffer[i]); } print_debug("\n"); if (bufferLen > bytesWritten) { unsigned int ack = *(buffer + bytesWritten); unsigned char* message = buffer + bytesWritten + 1; int messageLen = bufferLen - bytesWritten - 1; if (ack != CMD_ACK) { print_error("Message not acknowledged!\n"); goto return_error; } if (messageLen > 1) { if (message[0] == CMD_PREFIX) { if (message[1] == CMD_INSTEON_STD_RECEIVED) { if (messageLen >= 11) { static int resultCounter = 0; print_debug("Insteon standard message received!\n"); if(parse_message(command, message)) { goto return_error; } if(command == CMD_TEMP_GET_SETPOINT && resultCounter == 0 && extra == 3) { resultCounter++; bufferLen -= 11; } else { goto return_success; } } } else if (message[1] == CMD_INSTEON_EXT_RECEIVED) { if (messageLen >= 25) { print_debug("Insteon extended message received!\n"); if(parse_message(command, message)) { goto return_error; } goto return_success; } } else if (message[1] == CMD_X10_RECEIVED) { if (messageLen >= 4) { print_debug("X10 message received!\n"); if(parse_message(command, message)) { goto return_error; } goto return_success; } } else { print_error("Unexpected message received! '"); for(i=0; i < messageLen; i++) { print_error("%02X ", message[i]); } print_error("'\n"); goto return_error; } } else { print_error("Unexpected message header received! '"); for(i=0; i < messageLen; i++) { print_error("%02X ", message[i]); } print_error("'\n"); goto return_error; } } } } usleep(250); timer++; if (timer > 4000) { print_error("Timeout while waiting for bytes!\n"); goto return_error; } } return_success: CloseComport(16); release_lock(); return 0; return_error: CloseComport(16); release_lock(); return 1; }