Пример #1
0
int run_chassis_tbs(struct katcp_dispatch *d, struct katcp_arb *a, unsigned int mode)
{
  struct input_event event;
  int rr, fd;

  fd = fileno_arb_katcp(d, a);

  if(mode & KATCP_ARB_READ){
    rr = read(fd, &event, sizeof(struct input_event));
    if(rr == sizeof(struct input_event)){
      log_message_katcp(d, KATCP_LEVEL_TRACE, NULL, "input event type=%d, code=%d, value=%d", event.type, event.code, event.value);
      if(event.type == EV_KEY && (event.value > 0)){
        switch(event.code){
          case KEY_POWER : 
          case KEY_SYSRQ :
            log_message_katcp(d, KATCP_LEVEL_WARN, NULL, "power button pressed, shutting down");
            terminate_katcp(d, KATCP_EXIT_HALT);
            break;
        }
      }
    }
  }

  return 0;
}
Пример #2
0
int write_event_tbs(struct katcp_dispatch *d, struct katcp_arb *a, int type, int code, int value)
{
  int fd, result;
  struct input_event event;

  fd = fileno_arb_katcp(d, a);
  if(fd < 0){
    log_message_katcp(d, KATCP_LEVEL_ERROR, NULL, "no valid file descriptor as event target");
    return -1;
  }

  event.type  = type;
  event.code  = code;
  event.value = value;

  result = write(fd, &event, sizeof(struct input_event));
  if(result == sizeof(struct input_event)){
    return 0;
  }

  if(result < 0){
    log_message_katcp(d, KATCP_LEVEL_ERROR, NULL, "event write failed: %s", strerror(errno));
  } else {
    log_message_katcp(d, KATCP_LEVEL_ERROR, NULL, "logic problem, short event write");
  }

  return -1;
}
Пример #3
0
int accept_flat_katcp(struct katcp_dispatch *d, struct katcp_arb *a, unsigned int mode)
{
#define LABEL_BUFFER 32
  int fd, nfd;
  unsigned int len;
  struct sockaddr_in sa;
  struct katcp_flat *f;
  struct katcp_listener *kl;
  char label[LABEL_BUFFER];
  long opts;
  int result;

  result = 0;

  if(mode & KATCP_ARB_READ){

    fd = fileno_arb_katcp(d, a);

    len = sizeof(struct sockaddr_in);
    nfd = accept(fd, (struct sockaddr *) &sa, &len);

    if(nfd < 0){
      log_message_katcp(d, KATCP_LEVEL_TRACE, NULL, "accept on %s failed: %s", name_arb_katcp(d, a), strerror(errno));
      return 0;
    }

    kl = data_arb_katcp(d, a);

    sane_listener_katcl(kl);

    if(kl->l_group == NULL){
      log_message_katcp(d, KATCP_LEVEL_ERROR, NULL, "group needed for accept");
      close(fd);
      return 0;
    }

    opts = fcntl(nfd, F_GETFL, NULL);
    if(opts >= 0){
      opts = fcntl(nfd, F_SETFL, opts | O_NONBLOCK);
    }

    fcntl(nfd, F_SETFD, FD_CLOEXEC);

    snprintf(label, LABEL_BUFFER, "%s:%d", inet_ntoa(sa.sin_addr), ntohs(sa.sin_port));
    label[LABEL_BUFFER - 1] = '\0';

    log_message_katcp(d, KATCP_LEVEL_INFO, NULL, "accepted new connection from %s via %s", label, name_arb_katcp(d, a));

    f = create_flat_katcp(d, nfd, KATCP_FLAT_TOCLIENT, label, kl->l_group);
    if(f == NULL){
      close(nfd);
    }

  }

  if(mode & KATCP_ARB_STOP){
    kl = data_arb_katcp(d, a);

    sane_listener_katcl(kl);

    release_listener_katcp(d, kl);

  }
  
  if(mode & KATCP_ARB_WRITE){
    log_message_katcp(d, KATCP_LEVEL_FATAL, NULL, "listener callback called in mode 0x%x", mode);
    result = (-1);
  }

  return result;
#undef LABEL_BUFFER
}