luactl.c revision 1.1 1 1.1 mbalmer /* $NetBSD: luactl.c,v 1.1 2013/10/16 19:48:21 mbalmer Exp $ */
2 1.1 mbalmer
3 1.1 mbalmer /*
4 1.1 mbalmer * Copyright (c) 2011, Marc Balmer <mbalmer (at) NetBSD.org>.
5 1.1 mbalmer * All rights reserved.
6 1.1 mbalmer *
7 1.1 mbalmer * Redistribution and use in source and binary forms, with or without
8 1.1 mbalmer * modification, are permitted provided that the following conditions
9 1.1 mbalmer * are met:
10 1.1 mbalmer * 1. Redistributions of source code must retain the above copyright
11 1.1 mbalmer * notice, this list of conditions and the following disclaimer.
12 1.1 mbalmer * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 mbalmer * notice, this list of conditions and the following disclaimer in the
14 1.1 mbalmer * documentation and/or other materials provided with the distribution.
15 1.1 mbalmer * 3. The name of the Author may not be used to endorse or promote products
16 1.1 mbalmer * derived from this software without specific prior written permission.
17 1.1 mbalmer *
18 1.1 mbalmer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 1.1 mbalmer * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 1.1 mbalmer * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 1.1 mbalmer * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22 1.1 mbalmer * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 1.1 mbalmer * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 1.1 mbalmer * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 1.1 mbalmer * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 1.1 mbalmer * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 1.1 mbalmer * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 1.1 mbalmer * SUCH DAMAGE.
29 1.1 mbalmer */
30 1.1 mbalmer
31 1.1 mbalmer /*
32 1.1 mbalmer * Program to control Lua devices.
33 1.1 mbalmer */
34 1.1 mbalmer
35 1.1 mbalmer #include <stdbool.h>
36 1.1 mbalmer #include <sys/param.h>
37 1.1 mbalmer #include <sys/lua.h>
38 1.1 mbalmer #include <sys/ioctl.h>
39 1.1 mbalmer
40 1.1 mbalmer #include <err.h>
41 1.1 mbalmer #include <errno.h>
42 1.1 mbalmer #include <fcntl.h>
43 1.1 mbalmer #include <limits.h>
44 1.1 mbalmer #include <paths.h>
45 1.1 mbalmer #include <stdio.h>
46 1.1 mbalmer #include <stdlib.h>
47 1.1 mbalmer #include <string.h>
48 1.1 mbalmer #include <unistd.h>
49 1.1 mbalmer
50 1.1 mbalmer int devfd = -1;
51 1.1 mbalmer int quiet = 0;
52 1.1 mbalmer int docreate = 0;
53 1.1 mbalmer
54 1.1 mbalmer static void getinfo(void);
55 1.1 mbalmer static void create(char *, char *);
56 1.1 mbalmer static void destroy(char *);
57 1.1 mbalmer
58 1.1 mbalmer static void require(char *, char *);
59 1.1 mbalmer static void load(char *, char *);
60 1.1 mbalmer
61 1.1 mbalmer static void usage(void);
62 1.1 mbalmer
63 1.1 mbalmer #define _PATH_DEV_LUA "/dev/lua"
64 1.1 mbalmer
65 1.1 mbalmer int
66 1.1 mbalmer main(int argc, char *argv[])
67 1.1 mbalmer {
68 1.1 mbalmer int ch;
69 1.1 mbalmer
70 1.1 mbalmer while ((ch = getopt(argc, argv, "cq")) != -1)
71 1.1 mbalmer switch (ch) {
72 1.1 mbalmer case 'c':
73 1.1 mbalmer docreate = 1;
74 1.1 mbalmer break;
75 1.1 mbalmer case 'q':
76 1.1 mbalmer quiet = 1;
77 1.1 mbalmer break;
78 1.1 mbalmer default:
79 1.1 mbalmer usage();
80 1.1 mbalmer /* NOTREACHED */
81 1.1 mbalmer }
82 1.1 mbalmer argc -= optind;
83 1.1 mbalmer argv += optind;
84 1.1 mbalmer
85 1.1 mbalmer if ((devfd = open(_PATH_DEV_LUA, O_RDWR)) == -1)
86 1.1 mbalmer err(EXIT_FAILURE, "%s", _PATH_DEV_LUA);
87 1.1 mbalmer
88 1.1 mbalmer if (argc == 0)
89 1.1 mbalmer getinfo();
90 1.1 mbalmer else if (!strcmp(argv[0], "create")) {
91 1.1 mbalmer if (argc == 2)
92 1.1 mbalmer create(argv[1], NULL);
93 1.1 mbalmer else if (argc == 3)
94 1.1 mbalmer create(argv[1], argv[2]);
95 1.1 mbalmer else
96 1.1 mbalmer usage();
97 1.1 mbalmer } else if (!strcmp(argv[0], "destroy")) {
98 1.1 mbalmer if (argc != 2)
99 1.1 mbalmer usage();
100 1.1 mbalmer destroy(argv[1]);
101 1.1 mbalmer } else if (!strcmp(argv[0], "require")) {
102 1.1 mbalmer if (argc != 3)
103 1.1 mbalmer usage();
104 1.1 mbalmer if (docreate)
105 1.1 mbalmer create(argv[1], NULL);
106 1.1 mbalmer require(argv[1], argv[2]);
107 1.1 mbalmer } else if (!strcmp(argv[0], "load")) {
108 1.1 mbalmer if (argc != 3)
109 1.1 mbalmer usage();
110 1.1 mbalmer if (docreate)
111 1.1 mbalmer create(argv[1], NULL);
112 1.1 mbalmer load(argv[1], argv[2]);
113 1.1 mbalmer } else
114 1.1 mbalmer usage();
115 1.1 mbalmer
116 1.1 mbalmer return EXIT_SUCCESS;
117 1.1 mbalmer }
118 1.1 mbalmer
119 1.1 mbalmer static void
120 1.1 mbalmer getinfo(void)
121 1.1 mbalmer {
122 1.1 mbalmer struct lua_info info;
123 1.1 mbalmer int n;
124 1.1 mbalmer
125 1.1 mbalmer info.states = NULL;
126 1.1 mbalmer if (ioctl(devfd, LUAINFO, &info) == -1)
127 1.1 mbalmer err(EXIT_FAILURE, "LUAINFO");
128 1.1 mbalmer
129 1.1 mbalmer if (info.num_states > 0) {
130 1.1 mbalmer info.states = calloc(info.num_states,
131 1.1 mbalmer sizeof(struct lua_state_info));
132 1.1 mbalmer if (info.states == NULL)
133 1.1 mbalmer err(EXIT_FAILURE, "calloc");
134 1.1 mbalmer if (ioctl(devfd, LUAINFO, &info) == -1)
135 1.1 mbalmer err(EXIT_FAILURE, "LUAINFO");
136 1.1 mbalmer }
137 1.1 mbalmer printf("%d active state%s:\n", info.num_states,
138 1.1 mbalmer info.num_states == 1 ? "" : "s");
139 1.1 mbalmer if (info.num_states > 0)
140 1.1 mbalmer printf("%-16s %-8s Description\n", "Name", "Creator");
141 1.1 mbalmer for (n = 0; n < info.num_states; n++)
142 1.1 mbalmer printf("%-16s %-8s %s\n", info.states[n].name,
143 1.1 mbalmer info.states[n].user == true ? "user" : "kernel",
144 1.1 mbalmer info.states[n].desc);
145 1.1 mbalmer }
146 1.1 mbalmer
147 1.1 mbalmer static void
148 1.1 mbalmer create(char *name, char *desc)
149 1.1 mbalmer {
150 1.1 mbalmer struct lua_create cr;
151 1.1 mbalmer
152 1.1 mbalmer strlcpy(cr.name, name, sizeof(cr.name));
153 1.1 mbalmer if (desc != NULL)
154 1.1 mbalmer strlcpy(cr.desc, desc, sizeof(cr.desc));
155 1.1 mbalmer else
156 1.1 mbalmer cr.desc[0] = '\0';
157 1.1 mbalmer
158 1.1 mbalmer if (ioctl(devfd, LUACREATE, &cr) == -1)
159 1.1 mbalmer err(EXIT_FAILURE, "LUACREATE");
160 1.1 mbalmer
161 1.1 mbalmer if (quiet)
162 1.1 mbalmer return;
163 1.1 mbalmer
164 1.1 mbalmer printf("%s created\n", name);
165 1.1 mbalmer }
166 1.1 mbalmer
167 1.1 mbalmer static void
168 1.1 mbalmer destroy(char *name)
169 1.1 mbalmer {
170 1.1 mbalmer struct lua_create cr;
171 1.1 mbalmer
172 1.1 mbalmer strlcpy(cr.name, name, sizeof(cr.name));
173 1.1 mbalmer
174 1.1 mbalmer if (ioctl(devfd, LUADESTROY, &cr) == -1)
175 1.1 mbalmer err(EXIT_FAILURE, "LUADESTROY");
176 1.1 mbalmer
177 1.1 mbalmer if (quiet)
178 1.1 mbalmer return;
179 1.1 mbalmer
180 1.1 mbalmer printf("%s destroyed\n", name);
181 1.1 mbalmer }
182 1.1 mbalmer
183 1.1 mbalmer static void
184 1.1 mbalmer require(char *name, char *module)
185 1.1 mbalmer {
186 1.1 mbalmer struct lua_require r;
187 1.1 mbalmer
188 1.1 mbalmer strlcpy(r.state, name, sizeof(r.state));
189 1.1 mbalmer strlcpy(r.module, module, sizeof(r.module));
190 1.1 mbalmer
191 1.1 mbalmer if (ioctl(devfd, LUAREQUIRE, &r) == -1)
192 1.1 mbalmer err(EXIT_FAILURE, "LUAREQUIRE");
193 1.1 mbalmer
194 1.1 mbalmer if (quiet)
195 1.1 mbalmer return;
196 1.1 mbalmer
197 1.1 mbalmer printf("%s required by %s\n", module, name);
198 1.1 mbalmer }
199 1.1 mbalmer
200 1.1 mbalmer static void
201 1.1 mbalmer load(char *name, char *path)
202 1.1 mbalmer {
203 1.1 mbalmer struct lua_load l;
204 1.1 mbalmer
205 1.1 mbalmer strlcpy(l.state, name, sizeof(l.state));
206 1.1 mbalmer strlcpy(l.path, path, sizeof(l.path));
207 1.1 mbalmer
208 1.1 mbalmer if (ioctl(devfd, LUALOAD, &l) == -1)
209 1.1 mbalmer err(EXIT_FAILURE, "LUALOAD");
210 1.1 mbalmer
211 1.1 mbalmer if (quiet)
212 1.1 mbalmer return;
213 1.1 mbalmer
214 1.1 mbalmer printf("%s loaded into %s\n", path, name);
215 1.1 mbalmer }
216 1.1 mbalmer
217 1.1 mbalmer static void
218 1.1 mbalmer usage(void)
219 1.1 mbalmer {
220 1.1 mbalmer const char *p;
221 1.1 mbalmer
222 1.1 mbalmer p = getprogname();
223 1.1 mbalmer fprintf(stderr, "usage: %s [-cq]\n", p);
224 1.1 mbalmer fprintf(stderr, " %s [-cq] create name [desc]\n", p);
225 1.1 mbalmer fprintf(stderr, " %s [-cq] destroy name\n", p);
226 1.1 mbalmer fprintf(stderr, " %s [-cq] require name module\n", p);
227 1.1 mbalmer fprintf(stderr, " %s [-cq] load name path\n", p);
228 1.1 mbalmer
229 1.1 mbalmer exit(EXIT_FAILURE);
230 1.1 mbalmer }
231