17f2ac410Schristos /* Serial interface for local domain connections on Un*x like systems. 27f2ac410Schristos 3*6881a400Schristos Copyright (C) 1992-2023 Free Software Foundation, Inc. 47f2ac410Schristos 57f2ac410Schristos This file is part of GDB. 67f2ac410Schristos 77f2ac410Schristos This program is free software; you can redistribute it and/or modify 87f2ac410Schristos it under the terms of the GNU General Public License as published by 97f2ac410Schristos the Free Software Foundation; either version 3 of the License, or 107f2ac410Schristos (at your option) any later version. 117f2ac410Schristos 127f2ac410Schristos This program is distributed in the hope that it will be useful, 137f2ac410Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of 147f2ac410Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 157f2ac410Schristos GNU General Public License for more details. 167f2ac410Schristos 177f2ac410Schristos You should have received a copy of the GNU General Public License 187f2ac410Schristos along with this program. If not, see <http://www.gnu.org/licenses/>. */ 197f2ac410Schristos 207f2ac410Schristos #include "defs.h" 217f2ac410Schristos #include "serial.h" 227f2ac410Schristos #include "ser-base.h" 237f2ac410Schristos 247f2ac410Schristos #include <sys/socket.h> 257f2ac410Schristos #include <sys/un.h> 267f2ac410Schristos 277f2ac410Schristos #ifndef UNIX_PATH_MAX 287f2ac410Schristos #define UNIX_PATH_MAX sizeof(((struct sockaddr_un *) NULL)->sun_path) 297f2ac410Schristos #endif 307f2ac410Schristos 317f2ac410Schristos /* Open an AF_UNIX socket. */ 327f2ac410Schristos 337f2ac410Schristos static int 347f2ac410Schristos uds_open (struct serial *scb, const char *name) 357f2ac410Schristos { 367f2ac410Schristos struct sockaddr_un addr; 377f2ac410Schristos 387f2ac410Schristos if (strlen (name) > UNIX_PATH_MAX - 1) 397f2ac410Schristos { 407f2ac410Schristos warning 417f2ac410Schristos (_("The socket name is too long. It may be no longer than %s bytes."), 427f2ac410Schristos pulongest (UNIX_PATH_MAX - 1L)); 437f2ac410Schristos return -1; 447f2ac410Schristos } 457f2ac410Schristos 467f2ac410Schristos memset (&addr, 0, sizeof addr); 477f2ac410Schristos addr.sun_family = AF_UNIX; 487f2ac410Schristos strncpy (addr.sun_path, name, UNIX_PATH_MAX - 1); 497f2ac410Schristos 507f2ac410Schristos int sock = socket (AF_UNIX, SOCK_STREAM, 0); 517f2ac410Schristos 527f2ac410Schristos if (connect (sock, (struct sockaddr *) &addr, 537f2ac410Schristos sizeof (struct sockaddr_un)) < 0) 547f2ac410Schristos { 557f2ac410Schristos close (sock); 567f2ac410Schristos scb->fd = -1; 577f2ac410Schristos return -1; 587f2ac410Schristos } 597f2ac410Schristos 607f2ac410Schristos scb->fd = sock; 617f2ac410Schristos 627f2ac410Schristos return 0; 637f2ac410Schristos } 647f2ac410Schristos 657f2ac410Schristos static void 667f2ac410Schristos uds_close (struct serial *scb) 677f2ac410Schristos { 687f2ac410Schristos if (scb->fd == -1) 697f2ac410Schristos return; 707f2ac410Schristos 717f2ac410Schristos close (scb->fd); 727f2ac410Schristos scb->fd = -1; 737f2ac410Schristos } 747f2ac410Schristos 757f2ac410Schristos static int 767f2ac410Schristos uds_read_prim (struct serial *scb, size_t count) 777f2ac410Schristos { 787f2ac410Schristos return recv (scb->fd, scb->buf, count, 0); 797f2ac410Schristos } 807f2ac410Schristos 817f2ac410Schristos static int 827f2ac410Schristos uds_write_prim (struct serial *scb, const void *buf, size_t count) 837f2ac410Schristos { 847f2ac410Schristos return send (scb->fd, buf, count, 0); 857f2ac410Schristos } 867f2ac410Schristos 877f2ac410Schristos /* The local socket ops. */ 887f2ac410Schristos 897f2ac410Schristos static const struct serial_ops uds_ops = 907f2ac410Schristos { 917f2ac410Schristos "local", 927f2ac410Schristos uds_open, 937f2ac410Schristos uds_close, 947f2ac410Schristos NULL, 957f2ac410Schristos ser_base_readchar, 967f2ac410Schristos ser_base_write, 977f2ac410Schristos ser_base_flush_output, 987f2ac410Schristos ser_base_flush_input, 997f2ac410Schristos ser_base_send_break, 1007f2ac410Schristos ser_base_raw, 1017f2ac410Schristos ser_base_get_tty_state, 1027f2ac410Schristos ser_base_copy_tty_state, 1037f2ac410Schristos ser_base_set_tty_state, 1047f2ac410Schristos ser_base_print_tty_state, 1057f2ac410Schristos ser_base_setbaudrate, 1067f2ac410Schristos ser_base_setstopbits, 1077f2ac410Schristos ser_base_setparity, 1087f2ac410Schristos ser_base_drain_output, 1097f2ac410Schristos ser_base_async, 1107f2ac410Schristos uds_read_prim, 1117f2ac410Schristos uds_write_prim 1127f2ac410Schristos }; 1137f2ac410Schristos 1147d62b00eSchristos void _initialize_ser_socket (); 1157f2ac410Schristos void 1167d62b00eSchristos _initialize_ser_socket () 1177f2ac410Schristos { 1187f2ac410Schristos serial_add_interface (&uds_ops); 1197f2ac410Schristos } 120