Esempio n. 1
0
/* ARGSUSED3 */
static void
machtime_dg(int s, const struct sockaddr *sap, int sa_len, const void *buf,
    size_t sz)
{
	uint32_t result = machtime();

	(void) safe_sendto(s, &result, sizeof (result), 0, sap, sa_len);
}
Esempio n. 2
0
/* ARGSUSED3 */
static void
daytime_dg(int s, const struct sockaddr *sap, int sa_size, const void *buf,
    size_t sz)
{
	(void) safe_sendto(s, daytime(), TIMEBUF_SIZE, 0, sap, sa_size);
}
Esempio n. 3
0
int main(int argc, char **argv) {
  /*
   *   chilli_query [ -s <unix-socket> ] <command> [<argument>]
   *   (or maybe this should get the unix-socket from the config file)
   */

#ifdef HAVE_GLOB
  char *cmdsock = DEFSTATEDIR"/chilli*.sock";
  glob_t globbuf;
  int i;
#else
  char *cmdsock = DEFSTATEDIR"/chilli.sock";
#endif
  int s, len;
  struct sockaddr_un remote;
  char line[1024], *cmd;
  int argidx = 1;

  struct itimerval itval;

#ifdef ENABLE_CLUSTER
  int peerid = -1;
#endif

  int query_timeout = QUERY_TIMEOUT;

  if (getenv("QUERY_TIMEOUT")) {
    query_timeout = atoi(getenv("QUERY_TIMEOUT"));
  }
  
  set_signal(SIGALRM, timeout_alarm);
  
  memset(&itval, 0, sizeof(itval));
  itval.it_interval.tv_sec = query_timeout;
  itval.it_interval.tv_usec = 0; 
  itval.it_value.tv_sec = query_timeout;
  itval.it_value.tv_usec = 0; 
  
  if (setitimer(ITIMER_REAL, &itval, NULL)) {
    log_err(errno, "setitimer() failed!");
  }
  
  if (argc < 2) return usage(argv[0]);
  
  if (*argv[argidx] == '/') {
    /* for backward support, ignore a unix-socket given as first arg */
    if (argc < 3) return usage(argv[0]);
    cmdsock = argv[argidx++];
  } 
  
  memset(&request,0,sizeof(request));
  
  while (argidx < argc && *argv[argidx] == '-') {
    if (!strcmp(argv[argidx], "-s")) {
      argidx++;
      if (argidx >= argc) return usage(argv[0]);
      cmdsock = argv[argidx++];
#ifdef ENABLE_CLUSTER
    } else if (!strcmp(argv[argidx], "-p")) {
      argidx++;
      if (argidx >= argc) return usage(argv[0]);
      peerid = atoi(argv[argidx++]);
#endif
    } else if (!strcmp(argv[argidx], "-json")) {
      request.options |= CMDSOCK_OPT_JSON;
      argidx++;
    }
  }
  
  if (argidx >= argc) return usage(argv[0]);
  
  cmd = argv[argidx++];
  for (s = 0; commands[s].command; s++) {
    if (!strcmp(cmd, commands[s].command)) {
      request.type = commands[s].type;
      
      switch(request.type) {

#ifdef ENABLE_INSPECT
      case CMDSOCK_INSPECT:
#endif
      case CMDSOCK_LOGIN:
      case CMDSOCK_LOGOUT:
      case CMDSOCK_UPDATE:
      case CMDSOCK_AUTHORIZE:
      case CMDSOCK_ADD_GARDEN:
      case CMDSOCK_REM_GARDEN:
	argidx = process_args(argc, argv, argidx);
	if (request.type != CMDSOCK_LOGOUT || argidx >= argc)
	  break;
	/* else, drop through */
      case CMDSOCK_DHCP_DROP:
      case CMDSOCK_DHCP_RELEASE:
      case CMDSOCK_ENTRY_FOR_MAC:
	{
	  if (argc < argidx+1) {
	    fprintf(stderr, "%s requires a MAC address argument\n", cmd);
	    return usage(argv[0]);
	  }

	  if (parse_mac(request.mac, argv[argidx]))
	    return usage(argv[0]);
	  
	  /* do another switch to pick up param configs for authorize */
	}
	break;
      case CMDSOCK_ENTRY_FOR_IP:
	{
	  struct in_addr ip;

	  /* Test for a valid ip argument. */
  	  if (argc < argidx+1) {
  	    fprintf(stderr, "%s requires an IP address argument\n", cmd);
  	    return usage(argv[0]);
  	  }
	  
	  if (!inet_aton(argv[argidx], &ip)) {
	    fprintf(stderr, "Invalid IP Address: %s\n", argv[argidx]);
	    return usage(argv[0]);
	  }
	 
	  request.ip.s_addr = ip.s_addr;
	}
	break;
#ifdef ENABLE_MULTIROUTE
      case CMDSOCK_ROUTE:
      case CMDSOCK_ROUTE_GW:
	{
	  unsigned int temp[PKT_ETH_ALEN];
	  char macstr[RADIUS_ATTR_VLEN];
	  int macstrlen;
	  int i;
	  
	  if (argc < argidx + 2) {
	    break;
	  }
	  
	  if ((macstrlen = strlen(argv[argidx])) >= (RADIUS_ATTR_VLEN-1)) {
	    fprintf(stderr, "%s: bad MAC address\n", argv[argidx]);
	    break;
	  }

	  memcpy(macstr, argv[argidx], macstrlen);
	  macstr[macstrlen] = 0;

	  for (i=0; i<macstrlen; i++) 
	    if (!isxdigit((int) macstr[i])) 
	      macstr[i] = 0x20;

	  if (sscanf(macstr, "%2x %2x %2x %2x %2x %2x", 
		     &temp[0], &temp[1], &temp[2], 
		     &temp[3], &temp[4], &temp[5]) != 6) {
	    fprintf(stderr, "%s: bad MAC address\n", argv[argidx]);
	    break;
	  }

	  for (i = 0; i < PKT_ETH_ALEN; i++) 
	    request.mac[i] = temp[i];

	  argidx++;
	  request.d.sess.params.routeidx = atoi(argv[argidx]);

	  if (request.type != CMDSOCK_ROUTE_GW)
	    request.type = CMDSOCK_ROUTE_SET;
	  
	  /* do another switch to pick up param configs for authorize */
	}
	break;
#endif
      }
      break;
    }
  }
  
  if (!commands[s].command) {
    fprintf(stderr,"unknown command: %s\n",cmd);
    exit(1);
  }
  
#ifdef ENABLE_CLUSTER
  if (peerid > -1) {

    struct sockaddr_in s;
    int blen = sizeof(struct pkt_chillihdr_t);
    uint8_t b[blen];

    int fd = socket(AF_INET, SOCK_DGRAM, 0);

    printf("blen %d\n", blen);

    if (fd < 0) {
      log_err(errno,"socket() failed");
      exit(1);
    }

    memset(&s, 0, sizeof(struct sockaddr_in));
    s.sin_family = AF_INET;
    s.sin_port = htons(10203);
    s.sin_addr.s_addr = htonl(INADDR_BROADCAST);
    
    (void) safe_sendto(fd, b, blen, 0, 
		       (struct sockaddr *)&s, 
		       sizeof(struct sockaddr_in));

  } else {
#endif
  
#ifdef HAVE_GLOB
  globbuf.gl_offs = 0;
  glob(cmdsock, GLOB_DOOFFS, NULL, &globbuf);

  if (!globbuf.gl_pathc) {
    fprintf(stderr,"no cmdsock sockets: %s\n",cmdsock);
    exit(1);
  }
  
  for (i=0 ; i < globbuf.gl_pathc; i++) {
    cmdsock = globbuf.gl_pathv[i];
    if (globbuf.gl_pathc>1) {
      char header[256];
      int headerlen;
      safe_snprintf(header, sizeof(header), "\nQuerying socket %s\n", cmdsock);
      headerlen=strlen(header);
      if (write(1, header, strlen(header))!=headerlen) {
        perror("write");
        exit(1);
      }
    }
#endif

  if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
    perror("socket");
    exit(1);
  }

  remote.sun_family = AF_UNIX;
  strcpy(remote.sun_path, cmdsock);

#if defined (__FreeBSD__)  || defined (__APPLE__) || defined (__OpenBSD__)
  remote.sun_len = strlen(remote.sun_path) + 1;
#endif

  len = offsetof(struct sockaddr_un, sun_path) + strlen(remote.sun_path);

  if (connect(s, (struct sockaddr *)&remote, len) == -1) {
    perror("connect");
    exit(1);
  }
  
  if (safe_write(s, &request, sizeof(request)) != sizeof(request)) {
    perror("write");
    exit(1);
  }

  while((len = safe_read(s, line, sizeof(line)-1)) > 0) {
    if (write(1, line, len) != len) {
      perror("write");
      exit(1);
    }
  }

  if (len < 0) {
    perror("read");
    exit(1);
  }

  shutdown(s, 2);
  close(s);

#ifdef HAVE_GLOB
  }
  globfree(&globbuf);
#endif

#ifdef ENABLE_CLUSTER
  }
#endif
  
  return 0;
}