/* This file is part of TALER Copyright (C) 2020 Taler Systems SA TALER 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 3, or (at your option) any later version. TALER 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 TALER; see the file COPYING. If not, see */ /** * @file util/secmod_common.c * @brief Common functions for the exchange security modules * @author Florian Dold */ #include "platform.h" #include "taler_util.h" #include "taler_signatures.h" struct GNUNET_NETWORK_Handle * TES_open_socket (const char *unixpath) { int sock; mode_t old_umask; struct GNUNET_NETWORK_Handle *ret = NULL; /* Change permissions so that group read/writes are allowed. * We need this for multi-user exchange deployment with privilege * separation, where taler-exchange-httpd is part of a group * that allows it to talk to secmod. */ old_umask = umask (S_IROTH | S_IWOTH | S_IXOTH); sock = socket (PF_UNIX, SOCK_DGRAM, 0); if (-1 == sock) { GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket"); goto cleanup; } { struct sockaddr_un un; if (GNUNET_OK != GNUNET_DISK_directory_create_for_file (unixpath)) { GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "mkdir(dirname)", unixpath); } if (0 != unlink (unixpath)) { if (ENOENT != errno) GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "unlink", unixpath); } memset (&un, 0, sizeof (un)); un.sun_family = AF_UNIX; strncpy (un.sun_path, unixpath, sizeof (un.sun_path) - 1); if (0 != bind (sock, (const struct sockaddr *) &un, sizeof (un))) { GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "bind", unixpath); GNUNET_break (0 == close (sock)); goto cleanup; } ret = GNUNET_NETWORK_socket_box_native (sock); } cleanup: (void) umask (old_umask); return ret; }