Lines Matching full:server

2  * Console server process for OpenBMC
43 #include "console-server.h"
72 console_server_find_released_pollfd(struct console_server *server) in console_server_find_released_pollfd() argument
74 for (size_t i = 0; i < server->capacity_pollfds; i++) { in console_server_find_released_pollfd()
75 struct pollfd *p = &server->pollfds[i]; in console_server_find_released_pollfd()
83 // returns the index of that pollfd in server->pollfds
84 // we cannot return a pointer because 'realloc' may move server->pollfds
85 ssize_t console_server_request_pollfd(struct console_server *server, int fd, in console_server_request_pollfd() argument
91 index = console_server_find_released_pollfd(server); in console_server_request_pollfd()
94 const size_t newcap = server->capacity_pollfds + 1; in console_server_request_pollfd()
96 struct pollfd *newarr = reallocarray(server->pollfds, newcap, in console_server_request_pollfd()
101 server->pollfds = newarr; in console_server_request_pollfd()
103 index = (ssize_t)server->capacity_pollfds; in console_server_request_pollfd()
105 server->capacity_pollfds = newcap; in console_server_request_pollfd()
108 pollfd = &server->pollfds[index]; in console_server_request_pollfd()
116 int console_server_release_pollfd(struct console_server *server, in console_server_release_pollfd() argument
119 if (pollfd_index >= server->capacity_pollfds) { in console_server_release_pollfd()
123 struct pollfd *pfd = &server->pollfds[pollfd_index]; in console_server_release_pollfd()
136 /* populates server->tty.dev and server->tty.sysfs_devnode, using the tty kernel name */
137 static int tty_find_device(struct console_server *server) in tty_find_device() argument
149 server->tty.type = TTY_DEVICE_UNDEFINED; in tty_find_device()
151 assert(server->tty.kname); in tty_find_device()
152 if (!strlen(server->tty.kname)) { in tty_find_device()
158 if (server->tty.kname[0] == '/') { in tty_find_device()
159 tty_path_input = strdup(server->tty.kname); in tty_find_device()
165 rc = asprintf(&tty_path_input, "/dev/%s", server->tty.kname); in tty_find_device()
180 * Allow hooking obmc-console-server up to PTYs for testing in tty_find_device()
185 server->tty.type = TTY_DEVICE_PTY; in tty_find_device()
186 server->tty.dev = strdup(server->tty.kname); in tty_find_device()
187 rc = server->tty.dev ? 0 : -1; in tty_find_device()
193 warn("Can't find real name for %s", server->tty.kname); in tty_find_device()
211 rc = asprintf(&server->tty.dev, "/dev/%s", tty_kname_real); in tty_find_device()
217 server->tty.type = TTY_DEVICE_UART; in tty_find_device()
270 server->tty.type = TTY_DEVICE_VUART; in tty_find_device()
271 server->tty.vuart.sysfs_devnode = in tty_find_device()
290 static int tty_set_sysfs_attr(struct console_server *server, const char *name, in tty_set_sysfs_attr() argument
297 assert(server->tty.type == TTY_DEVICE_VUART); in tty_set_sysfs_attr()
299 if (!server->tty.vuart.sysfs_devnode) { in tty_set_sysfs_attr()
303 rc = asprintf(&path, "%s/%s", server->tty.vuart.sysfs_devnode, name); in tty_set_sysfs_attr()
311 server->tty.kname); in tty_set_sysfs_attr()
320 server->tty.kname); in tty_set_sysfs_attr()
332 void tty_init_termios(struct console_server *server) in tty_init_termios() argument
337 rc = tcgetattr(server->tty.fd, &termios); in tty_init_termios()
343 if (server->tty.type == TTY_DEVICE_UART && server->tty.uart.baud) { in tty_init_termios()
344 if (cfsetspeed(&termios, server->tty.uart.baud) < 0) { in tty_init_termios()
345 warn("Couldn't set speeds for %s", server->tty.kname); in tty_init_termios()
354 rc = tcsetattr(server->tty.fd, TCSANOW, &termios); in tty_init_termios()
356 warn("Can't set terminal options for %s", server->tty.kname); in tty_init_termios()
363 static void tty_init_vuart_io(struct console_server *server) in tty_init_vuart_io() argument
365 assert(server->tty.type == TTY_DEVICE_VUART); in tty_init_vuart_io()
367 if (server->tty.vuart.sirq) { in tty_init_vuart_io()
368 tty_set_sysfs_attr(server, "sirq", server->tty.vuart.sirq); in tty_init_vuart_io()
371 if (server->tty.vuart.lpc_addr) { in tty_init_vuart_io()
372 tty_set_sysfs_attr(server, "lpc_address", in tty_init_vuart_io()
373 server->tty.vuart.lpc_addr); in tty_init_vuart_io()
377 static int tty_init_io(struct console_server *server) in tty_init_io() argument
379 server->tty.fd = open(server->tty.dev, O_RDWR); in tty_init_io()
380 if (server->tty.fd <= 0) { in tty_init_io()
381 warn("Can't open tty %s", server->tty.dev); in tty_init_io()
388 fcntl(server->tty.fd, F_SETFL, FNDELAY); in tty_init_io()
390 tty_init_termios(server); in tty_init_io()
393 console_server_request_pollfd(server, server->tty.fd, POLLIN); in tty_init_io()
399 server->tty_pollfd_index = (size_t)index; in tty_init_io()
404 static int tty_init_vuart(struct console_server *server, struct config *config) in tty_init_vuart() argument
410 assert(server->tty.type == TTY_DEVICE_VUART); in tty_init_vuart()
427 server->tty.vuart.lpc_addr = (uint16_t)parsed; in tty_init_vuart()
447 server->tty.vuart.sirq = (int)parsed; in tty_init_vuart()
456 static int tty_init(struct console_server *server, struct config *config, in tty_init() argument
463 server->tty.kname = tty_arg; in tty_init()
465 server->tty.kname = val; in tty_init()
471 rc = tty_find_device(server); in tty_init()
476 switch (server->tty.type) { in tty_init()
478 rc = tty_init_vuart(server, config); in tty_init()
483 tty_init_vuart_io(server); in tty_init()
488 if (config_parse_baud(&server->tty.uart.baud, val)) { in tty_init()
501 return tty_init_io(server); in tty_init()
504 static void tty_fini(struct console_server *server) in tty_fini() argument
506 if (server->tty_pollfd_index < server->capacity_pollfds) { in tty_fini()
507 console_server_release_pollfd(server, server->tty_pollfd_index); in tty_fini()
508 server->tty_pollfd_index = SIZE_MAX; in tty_fini()
511 if (server->tty.type == TTY_DEVICE_VUART) { in tty_fini()
512 free(server->tty.vuart.sysfs_devnode); in tty_fini()
515 free(server->tty.dev); in tty_fini()
626 return write_buf_to_fd(console->server->tty.fd, data, len); in console_data_out()
749 console->server, fd, (short)(events & 0x7fff)); in console_poller_register()
817 console_server_release_pollfd(console->server, poller->pollfd_index); in console_poller_unregister()
825 console->server->pollfds[poller->pollfd_index].events = in console_poller_set_events()
894 pollfd = &console->server->pollfds[poller->pollfd_index]; in call_pollers()
985 static int run_console_iteration(struct console_server *server) in run_console_iteration() argument
998 timeout = get_poll_timeout(server->active, &tv); in run_console_iteration()
1000 rc = poll(server->pollfds, server->capacity_pollfds, (int)timeout); in run_console_iteration()
1016 if (server->pollfds[server->tty_pollfd_index].revents) { in run_console_iteration()
1017 rc = read(server->tty.fd, buf, sizeof(buf)); in run_console_iteration()
1023 rc = ringbuffer_queue(server->active->rb, buf, rc); in run_console_iteration()
1031 &(server->pollfds[server->dbus_pollfd_index]); in run_console_iteration()
1033 sd_bus_process(server->bus, NULL); in run_console_iteration()
1036 for (size_t i = 0; i < server->n_consoles; i++) { in run_console_iteration()
1037 struct console *console = server->consoles[i]; in run_console_iteration()
1048 int run_server(struct console_server *server) in run_server() argument
1053 if (server->n_consoles == 0) { in run_server()
1054 warnx("no console configured for this server"); in run_server()
1060 rc = run_console_iteration(server); in run_server()
1076 static struct console *console_init(struct console_server *server, in console_init() argument
1089 console->server = server; in console_init()
1149 static int console_server_add_console(struct console_server *server, in console_server_add_console() argument
1158 struct console **tmp = reallocarray(server->consoles, in console_server_add_console()
1159 server->n_consoles + 1, in console_server_add_console()
1162 warnx("could not realloc server->consoles"); in console_server_add_console()
1165 server->consoles = tmp; in console_server_add_console()
1167 console = console_init(server, config, console_id); in console_server_add_console()
1173 server->consoles[server->n_consoles++] = console; in console_server_add_console()
1180 console_server_add_consoles(struct console_server *server, in console_server_add_consoles() argument
1185 const int nsections = config_count_sections(server->config); in console_server_add_consoles()
1193 rc = console_server_add_console(server, server->config, in console_server_add_consoles()
1202 config_get_section_name(server->config, i); in console_server_add_consoles()
1209 rc = console_server_add_console(server, server->config, in console_server_add_consoles()
1217 config_get_value(server->config, "active-console"); in console_server_add_consoles()
1219 return server->consoles[0]; in console_server_add_consoles()
1225 for (size_t i = 0; i < server->n_consoles; i++) { in console_server_add_consoles()
1226 struct console *console = server->consoles[i]; in console_server_add_consoles()
1239 int console_server_init(struct console_server *server, in console_server_init() argument
1244 memset(server, 0, sizeof(struct console_server)); in console_server_init()
1246 server->tty_pollfd_index = -1; in console_server_init()
1248 server->config = config_init(config_filename); in console_server_init()
1249 if (server->config == NULL) { in console_server_init()
1253 rc = console_server_mux_init(server); in console_server_init()
1258 uart_routing_init(server->config); in console_server_init()
1260 rc = tty_init(server, server->config, config_tty_kname); in console_server_init()
1266 rc = dbus_server_init(server); in console_server_init()
1268 warnx("error during dbus init for console server"); in console_server_init()
1273 console_server_add_consoles(server, console_id); in console_server_init()
1286 void console_server_fini(struct console_server *server) in console_server_fini() argument
1288 for (size_t i = 0; i < server->n_consoles; i++) { in console_server_fini()
1289 console_fini(server->consoles[i]); in console_server_fini()
1292 free(server->consoles); in console_server_fini()
1293 dbus_server_fini(server); in console_server_fini()
1294 tty_fini(server); in console_server_fini()
1295 free(server->pollfds); in console_server_fini()
1296 console_server_mux_fini(server); in console_server_fini()
1297 config_fini(server->config); in console_server_fini()
1305 struct console_server server = { 0 }; in main() local
1337 rc = console_server_init(&server, config_filename, config_tty_kname, in main()
1341 rc = run_server(&server); in main()
1344 console_server_fini(&server); in main()