From 2e7fe2865ad49e531fe07abb96fd3c66f6e07e91 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 18 Mar 2003 18:00:05 +0000 Subject: [PATCH] Moved send_fd/receive_fd routines to src/socket.c . --- aserver/aserver.c | 35 +-------------- include/local.h | 3 ++ src/Makefile.am | 2 +- src/pcm/pcm_dmix.c | 37 +--------------- src/pcm/pcm_dmix_i386.h | 4 +- src/pcm/pcm_shm.c | 36 ---------------- src/socket.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 120 insertions(+), 109 deletions(-) create mode 100644 src/socket.c diff --git a/aserver/aserver.c b/aserver/aserver.c index cef3641c..14d90a28 100644 --- a/aserver/aserver.c +++ b/aserver/aserver.c @@ -106,39 +106,6 @@ static int make_inet_socket(int port) return sock; } -static int send_fd(int sock, void *data, size_t len, int fd) -{ - int ret; - size_t cmsg_len = CMSG_LEN(sizeof(int)); - struct cmsghdr *cmsg = alloca(cmsg_len); - int *fds = (int *) CMSG_DATA(cmsg); - struct msghdr msghdr; - struct iovec vec; - - vec.iov_base = (void *)&data; - vec.iov_len = len; - - cmsg->cmsg_len = cmsg_len; - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_RIGHTS; - *fds = fd; - - msghdr.msg_name = NULL; - msghdr.msg_namelen = 0; - msghdr.msg_iov = &vec; - msghdr.msg_iovlen = 1; - msghdr.msg_control = cmsg; - msghdr.msg_controllen = cmsg_len; - msghdr.msg_flags = 0; - - ret = sendmsg(sock, &msghdr, 0 ); - if (ret < 0) { - SYSERROR("sendmsg failed"); - return -errno; - } - return ret; -} - struct pollfd *pollfds; unsigned int pollfds_count = 0; typedef struct waiter waiter_t; @@ -397,7 +364,7 @@ static int shm_ack_fd(client_t *client, int fd) pfd.events = POLLHUP; if (poll(&pfd, 1, 0) == 1) return -EBADFD; - err = send_fd(client->ctrl_fd, buf, 1, fd); + err = snd_send_fd(client->ctrl_fd, buf, 1, fd); if (err != 1) return -EBADFD; return 0; diff --git a/include/local.h b/include/local.h index 57eb0c1c..e04c8c15 100644 --- a/include/local.h +++ b/include/local.h @@ -151,6 +151,9 @@ size_t page_ptr(size_t object_offset, size_t object_size, size_t *offset, size_t int safe_strtol(const char *str, long *val); +int snd_send_fd(int sock, void *data, size_t len, int fd); +int snd_receive_fd(int sock, void *data, size_t len, int *fd); + #define HAVE_GNU_LD #define HAVE_ELF #define HAVE_ASM_PREVIOUS_DIRECTIVE diff --git a/src/Makefile.am b/src/Makefile.am index b631d174..afe7d59b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -9,7 +9,7 @@ VSYMS = endif lib_LTLIBRARIES = libasound.la -libasound_la_SOURCES = conf.c confmisc.c input.c output.c async.c error.c dlmisc.c +libasound_la_SOURCES = conf.c confmisc.c input.c output.c async.c error.c dlmisc.c socket.c libasound_la_LIBADD = control/libcontrol.la mixer/libmixer.la pcm/libpcm.la \ rawmidi/librawmidi.la timer/libtimer.la \ hwdep/libhwdep.la seq/libseq.la instr/libinstr.la \ diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c index c01686da..935f099c 100644 --- a/src/pcm/pcm_dmix.c +++ b/src/pcm/pcm_dmix.c @@ -332,39 +332,6 @@ static int make_local_socket(const char *filename, int server) return sock; } -static int send_fd(int sock, void *data, size_t len, int fd) -{ - int ret; - size_t cmsg_len = CMSG_LEN(sizeof(int)); - struct cmsghdr *cmsg = alloca(cmsg_len); - int *fds = (int *) CMSG_DATA(cmsg); - struct msghdr msghdr; - struct iovec vec; - - vec.iov_base = (void *)&data; - vec.iov_len = len; - - cmsg->cmsg_len = cmsg_len; - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_RIGHTS; - *fds = fd; - - msghdr.msg_name = NULL; - msghdr.msg_namelen = 0; - msghdr.msg_iov = &vec; - msghdr.msg_iovlen = 1; - msghdr.msg_control = cmsg; - msghdr.msg_controllen = cmsg_len; - msghdr.msg_flags = 0; - - ret = sendmsg(sock, &msghdr, 0 ); - if (ret < 0) { - SYSERR("sendmsg failed"); - return -errno; - } - return ret; -} - #if 0 #define server_printf(fmt, args...) printf(fmt, ##args) #else @@ -420,7 +387,7 @@ static void server_job(snd_pcm_dmix_t *dmix) unsigned char buf = 'A'; pfds[current+1].fd = sck; pfds[current+1].events = POLLIN | POLLERR | POLLHUP; - send_fd(sck, &buf, 1, dmix->hw_fd); + snd_send_fd(sck, &buf, 1, dmix->hw_fd); server_printf("DMIX SERVER: fd sent ok\n"); current++; } @@ -510,8 +477,6 @@ static int server_discard(snd_pcm_dmix_t *dmix) * client side */ -int snd_receive_fd(int sock, void *data, size_t len, int *fd); - static int client_connect(snd_pcm_dmix_t *dmix) { int ret; diff --git a/src/pcm/pcm_dmix_i386.h b/src/pcm/pcm_dmix_i386.h index 5ae7895f..44c6ed4e 100644 --- a/src/pcm/pcm_dmix_i386.h +++ b/src/pcm/pcm_dmix_i386.h @@ -3,11 +3,11 @@ * \ingroup PCM_Plugins * \brief PCM Direct Stream Mixing (dmix) Plugin Interface - I386 assembler code * \author Jaroslav Kysela - * \date 2002 + * \date 2003 */ /* * PCM - Direct Stream Mixing - * Copyright (c) 2000 by Jaroslav Kysela + * Copyright (c) 2003 by Jaroslav Kysela * * * This library is free software; you can redistribute it and/or modify diff --git a/src/pcm/pcm_shm.c b/src/pcm/pcm_shm.c index 619cdc52..23b5ddac 100644 --- a/src/pcm/pcm_shm.c +++ b/src/pcm/pcm_shm.c @@ -57,42 +57,6 @@ typedef struct { } snd_pcm_shm_t; #endif -#ifndef DOC_HIDDEN -int snd_receive_fd(int sock, void *data, size_t len, int *fd) -{ - int ret; - size_t cmsg_len = CMSG_LEN(sizeof(int)); - struct cmsghdr *cmsg = alloca(cmsg_len); - int *fds = (int *) CMSG_DATA(cmsg); - struct msghdr msghdr; - struct iovec vec; - - vec.iov_base = (void *)&data; - vec.iov_len = len; - - cmsg->cmsg_len = cmsg_len; - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_RIGHTS; - *fds = -1; - - msghdr.msg_name = NULL; - msghdr.msg_namelen = 0; - msghdr.msg_iov = &vec; - msghdr.msg_iovlen = 1; - msghdr.msg_control = cmsg; - msghdr.msg_controllen = cmsg_len; - msghdr.msg_flags = 0; - - ret = recvmsg(sock, &msghdr, 0); - if (ret < 0) { - SYSERR("recvmsg failed"); - return -errno; - } - *fd = *fds; - return ret; -} -#endif - static long snd_pcm_shm_action_fd0(snd_pcm_t *pcm, int *fd) { snd_pcm_shm_t *shm = pcm->private_data; diff --git a/src/socket.c b/src/socket.c new file mode 100644 index 00000000..75f92c25 --- /dev/null +++ b/src/socket.c @@ -0,0 +1,112 @@ +/** + * \file pcm/socket.c + * \brief Socket helper routines + * \author Abramo Bagnara + * \date 2003 + */ +/* + * Socket helper routines + * Copyright (c) 2003 by Abramo Bagnara + * + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "local.h" + +#ifndef DOC_HIDDEN +int snd_send_fd(int sock, void *data, size_t len, int fd) +{ + int ret; + size_t cmsg_len = CMSG_LEN(sizeof(int)); + struct cmsghdr *cmsg = alloca(cmsg_len); + int *fds = (int *) CMSG_DATA(cmsg); + struct msghdr msghdr; + struct iovec vec; + + vec.iov_base = (void *)&data; + vec.iov_len = len; + + cmsg->cmsg_len = cmsg_len; + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SCM_RIGHTS; + *fds = fd; + + msghdr.msg_name = NULL; + msghdr.msg_namelen = 0; + msghdr.msg_iov = &vec; + msghdr.msg_iovlen = 1; + msghdr.msg_control = cmsg; + msghdr.msg_controllen = cmsg_len; + msghdr.msg_flags = 0; + + ret = sendmsg(sock, &msghdr, 0 ); + if (ret < 0) { + SYSERR("sendmsg failed"); + return -errno; + } + return ret; +} + +int snd_receive_fd(int sock, void *data, size_t len, int *fd) +{ + int ret; + size_t cmsg_len = CMSG_LEN(sizeof(int)); + struct cmsghdr *cmsg = alloca(cmsg_len); + int *fds = (int *) CMSG_DATA(cmsg); + struct msghdr msghdr; + struct iovec vec; + + vec.iov_base = (void *)&data; + vec.iov_len = len; + + cmsg->cmsg_len = cmsg_len; + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SCM_RIGHTS; + *fds = -1; + + msghdr.msg_name = NULL; + msghdr.msg_namelen = 0; + msghdr.msg_iov = &vec; + msghdr.msg_iovlen = 1; + msghdr.msg_control = cmsg; + msghdr.msg_controllen = cmsg_len; + msghdr.msg_flags = 0; + + ret = recvmsg(sock, &msghdr, 0); + if (ret < 0) { + SYSERR("recvmsg failed"); + return -errno; + } + *fd = *fds; + return ret; +} +#endif -- 2.11.0