OSDN Git Service

Moved send_fd/receive_fd routines to src/socket.c .
authorJaroslav Kysela <perex@perex.cz>
Tue, 18 Mar 2003 18:00:05 +0000 (18:00 +0000)
committerJaroslav Kysela <perex@perex.cz>
Tue, 18 Mar 2003 18:00:05 +0000 (18:00 +0000)
aserver/aserver.c
include/local.h
src/Makefile.am
src/pcm/pcm_dmix.c
src/pcm/pcm_dmix_i386.h
src/pcm/pcm_shm.c
src/socket.c [new file with mode: 0644]

index cef3641..14d90a2 100644 (file)
@@ -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;
index 57eb0c1..e04c8c1 100644 (file)
@@ -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
index b631d17..afe7d59 100644 (file)
@@ -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 \
index c01686d..935f099 100644 (file)
@@ -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;
index 5ae7895..44c6ed4 100644 (file)
@@ -3,11 +3,11 @@
  * \ingroup PCM_Plugins
  * \brief PCM Direct Stream Mixing (dmix) Plugin Interface - I386 assembler code
  * \author Jaroslav Kysela <perex@suse.cz>
- * \date 2002
+ * \date 2003
  */
 /*
  *  PCM - Direct Stream Mixing
- *  Copyright (c) 2000 by Jaroslav Kysela <perex@suse.cz>
+ *  Copyright (c) 2003 by Jaroslav Kysela <perex@suse.cz>
  *
  *
  *   This library is free software; you can redistribute it and/or modify
index 619cdc5..23b5dda 100644 (file)
@@ -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 (file)
index 0000000..75f92c2
--- /dev/null
@@ -0,0 +1,112 @@
+/**
+ * \file pcm/socket.c
+ * \brief Socket helper routines
+ * \author Abramo Bagnara <abramo@alsa-project.org>
+ * \date 2003
+ */
+/*
+ *  Socket helper routines
+ *  Copyright (c) 2003 by Abramo Bagnara <abramo@alsa-project.org>
+ *
+ *
+ *   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 <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <unistd.h>
+#include <signal.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/shm.h>
+#include <sys/sem.h>
+#include <sys/wait.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/mman.h>
+#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