Esempio n. 1
0
File: sparse.c Progetto: hsiboy/ida
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;
}
Esempio n. 2
0
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;
}