/* * The Qubes OS Project, http://www.qubes-os.org * * Copyright (C) 2010 Rafal Wojtczuk * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include //#include "qrexec.h" int get_server_socket(const char *socket_address) { struct sockaddr_un sockname; int s; if (unlink(socket_address) < 0) { printf("unlink(%s) failed\n", socket_address); exit(1); } s = socket(AF_UNIX, SOCK_STREAM, 0); if (s < 0) { printf("socket() failed\n"); exit(1); } memset(&sockname, 0, sizeof(sockname)); sockname.sun_family = AF_UNIX; strncpy(sockname.sun_path, socket_address, sizeof sockname.sun_path); sockname.sun_path[sizeof sockname.sun_path - 1] = 0; if (bind(s, (struct sockaddr *) &sockname, sizeof(sockname)) == -1) { printf("bind() failed\n"); close(s); exit(1); } // chmod(sockname.sun_path, 0666); if (listen(s, 5) == -1) { perror("listen() failed\n"); close(s); exit(1); } return s; } int do_accept(int s) { struct sockaddr_un peer; unsigned int addrlen; int fd; addrlen = sizeof(peer); fd = accept(s, (struct sockaddr *) &peer, &addrlen); if (fd == -1) { perror("unix accept"); exit(1); } return fd; }