xref: /openbsd-src/usr.sbin/ractl/ractl.c (revision f1b790a5738b7375271fee81f99119b1f82f2cfd)
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