/* 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); }
/* 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); }
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; }