1*f1b790a5Sclaudio /* $OpenBSD: ractl.c,v 1.8 2024/11/21 13:38:14 claudio Exp $ */ 24882a630Sflorian 34882a630Sflorian /* 44882a630Sflorian * Copyright (c) 2005 Claudio Jeker <claudio@openbsd.org> 54882a630Sflorian * Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org> 64882a630Sflorian * Copyright (c) 2003 Henning Brauer <henning@openbsd.org> 74882a630Sflorian * 84882a630Sflorian * Permission to use, copy, modify, and distribute this software for any 94882a630Sflorian * purpose with or without fee is hereby granted, provided that the above 104882a630Sflorian * copyright notice and this permission notice appear in all copies. 114882a630Sflorian * 124882a630Sflorian * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 134882a630Sflorian * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 144882a630Sflorian * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 154882a630Sflorian * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 164882a630Sflorian * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 174882a630Sflorian * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 184882a630Sflorian * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 194882a630Sflorian */ 204882a630Sflorian 214882a630Sflorian #include <sys/types.h> 224882a630Sflorian #include <sys/queue.h> 234882a630Sflorian #include <sys/socket.h> 244882a630Sflorian #include <sys/un.h> 254882a630Sflorian #include <netinet/in.h> 264882a630Sflorian #include <arpa/inet.h> 274882a630Sflorian #include <net/if.h> 284882a630Sflorian #include <net/if_media.h> 294882a630Sflorian #include <net/if_types.h> 304882a630Sflorian 314882a630Sflorian #include <err.h> 324882a630Sflorian #include <errno.h> 334882a630Sflorian #include <event.h> 344882a630Sflorian #include <imsg.h> 354882a630Sflorian #include <stdio.h> 364882a630Sflorian #include <stdlib.h> 374882a630Sflorian #include <string.h> 384882a630Sflorian #include <unistd.h> 394882a630Sflorian 404882a630Sflorian #include "rad.h" 414882a630Sflorian #include "frontend.h" 424882a630Sflorian #include "parser.h" 434882a630Sflorian 444882a630Sflorian __dead void usage(void); 454882a630Sflorian 464882a630Sflorian struct imsgbuf *ibuf; 474882a630Sflorian 484882a630Sflorian __dead void 494882a630Sflorian usage(void) 504882a630Sflorian { 514882a630Sflorian extern char *__progname; 524882a630Sflorian 534882a630Sflorian fprintf(stderr, "usage: %s [-s socket] command [argument ...]\n", 544882a630Sflorian __progname); 554882a630Sflorian exit(1); 564882a630Sflorian } 574882a630Sflorian 584882a630Sflorian int 594882a630Sflorian main(int argc, char *argv[]) 604882a630Sflorian { 614882a630Sflorian struct sockaddr_un sun; 624882a630Sflorian struct parse_result *res; 634882a630Sflorian struct imsg imsg; 644882a630Sflorian int ctl_sock; 654882a630Sflorian int done = 0; 664882a630Sflorian int n, verbose = 0; 674882a630Sflorian int ch; 684882a630Sflorian char *sockname; 694882a630Sflorian 70e0daf9a7Sflorian sockname = _PATH_RAD_SOCKET; 714882a630Sflorian while ((ch = getopt(argc, argv, "s:")) != -1) { 724882a630Sflorian switch (ch) { 734882a630Sflorian case 's': 744882a630Sflorian sockname = optarg; 754882a630Sflorian break; 764882a630Sflorian default: 774882a630Sflorian usage(); 784882a630Sflorian } 794882a630Sflorian } 804882a630Sflorian argc -= optind; 814882a630Sflorian argv += optind; 824882a630Sflorian 834882a630Sflorian /* Parse command line. */ 844882a630Sflorian if ((res = parse(argc, argv)) == NULL) 854882a630Sflorian exit(1); 864882a630Sflorian 874882a630Sflorian /* Connect to control socket. */ 884882a630Sflorian if ((ctl_sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) 894882a630Sflorian err(1, "socket"); 904882a630Sflorian 914882a630Sflorian memset(&sun, 0, sizeof(sun)); 924882a630Sflorian sun.sun_family = AF_UNIX; 934882a630Sflorian strlcpy(sun.sun_path, sockname, sizeof(sun.sun_path)); 94cee51daaSflorian 954882a630Sflorian if (connect(ctl_sock, (struct sockaddr *)&sun, sizeof(sun)) == -1) 964882a630Sflorian err(1, "connect: %s", sockname); 974882a630Sflorian 984882a630Sflorian if (pledge("stdio", NULL) == -1) 994882a630Sflorian err(1, "pledge"); 1004882a630Sflorian 1014882a630Sflorian if ((ibuf = malloc(sizeof(struct imsgbuf))) == NULL) 1024882a630Sflorian err(1, NULL); 103*f1b790a5Sclaudio if (imsgbuf_init(ibuf, ctl_sock) == -1) 104*f1b790a5Sclaudio err(1, NULL); 1054882a630Sflorian done = 0; 1064882a630Sflorian 1074882a630Sflorian /* Process user request. */ 1084882a630Sflorian switch (res->action) { 1094882a630Sflorian case LOG_VERBOSE: 1104882a630Sflorian verbose = 1; 1114882a630Sflorian /* FALLTHROUGH */ 1124882a630Sflorian case LOG_BRIEF: 1134882a630Sflorian imsg_compose(ibuf, IMSG_CTL_LOG_VERBOSE, 0, 0, -1, 1144882a630Sflorian &verbose, sizeof(verbose)); 1154882a630Sflorian printf("logging request sent.\n"); 1164882a630Sflorian done = 1; 1174882a630Sflorian break; 1184882a630Sflorian case RELOAD: 1194882a630Sflorian imsg_compose(ibuf, IMSG_CTL_RELOAD, 0, 0, -1, NULL, 0); 1204882a630Sflorian printf("reload request sent.\n"); 1214882a630Sflorian done = 1; 1224882a630Sflorian break; 1234882a630Sflorian default: 1244882a630Sflorian usage(); 1254882a630Sflorian } 1264882a630Sflorian 127dd7efffeSclaudio if (imsgbuf_flush(ibuf) == -1) 1284882a630Sflorian err(1, "write error"); 1294882a630Sflorian 1304882a630Sflorian while (!done) { 131668e5ba9Sclaudio if ((n = imsgbuf_read(ibuf)) == -1) 132ef2e27a1Sclaudio err(1, "read error"); 1334882a630Sflorian if (n == 0) 1344882a630Sflorian errx(1, "pipe closed"); 1354882a630Sflorian 1364882a630Sflorian while (!done) { 1374882a630Sflorian if ((n = imsg_get(ibuf, &imsg)) == -1) 1384882a630Sflorian errx(1, "imsg_get error"); 1394882a630Sflorian if (n == 0) 1404882a630Sflorian break; 1414882a630Sflorian 1424882a630Sflorian switch (res->action) { 1434882a630Sflorian default: 1444882a630Sflorian break; 1454882a630Sflorian } 1464882a630Sflorian imsg_free(&imsg); 1474882a630Sflorian } 1484882a630Sflorian } 1494882a630Sflorian close(ctl_sock); 1504882a630Sflorian free(ibuf); 1514882a630Sflorian 1524882a630Sflorian return (0); 1534882a630Sflorian } 154