snd_config_t *conf;
snd_config_iterator_t i, next;
const char *sockname = NULL;
- const char *host = NULL;
long port = -1;
int err;
char *srvname;
- struct hostent *h;
+
command = argv[0];
while ((c = getopt_long(argc, argv, "h", long_options, 0)) != -1) {
switch (c) {
continue;
if (strcmp(id, "comment") == 0)
continue;
- if (strcmp(id, "host") == 0) {
- err = snd_config_get_string(n, &host);
- if (err < 0) {
- ERROR("Invalid type for %s", id);
- return 1;
- }
+ if (strcmp(id, "host") == 0)
continue;
- }
if (strcmp(id, "socket") == 0) {
err = snd_config_get_string(n, &sockname);
if (err < 0) {
ERROR("Unknown field %s", id);
return 1;
}
- if (!host) {
- ERROR("host is not defined");
- return 1;
- }
- h = gethostbyname(host);
- if (!h) {
- ERROR("Cannot resolve %s", host);
- return 1;
- }
- if (!snd_is_local(h)) {
- ERROR("%s is not the local host", host);
- return 1;
- }
if (!sockname && port < 0) {
ERROR("either socket or port need to be defined");
return 1;
#include "../src/control/control_local.h"
int snd_receive_fd(int sock, void *data, size_t len, int *fd);
-int snd_is_local(struct hostent *hent);
typedef enum _snd_dev_type {
SND_DEV_TYPE_PCM,
return sock;
}
-#if 0
-static int make_inet_socket(const char *host, int port)
-{
- struct sockaddr_in addr;
- int sock;
- struct hostent *h = gethostbyname(host);
- if (!h)
- return -ENOENT;
-
- sock = socket(PF_INET, SOCK_STREAM, 0);
- if (sock < 0)
- return -errno;
-
- addr.sin_family = AF_INET;
- addr.sin_port = htons(port);
- memcpy(&addr.sin_addr, h->h_addr_list[0], sizeof(struct in_addr));
-
- if (connect(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0)
- return -errno;
- return sock;
-}
-#endif
-
int snd_ctl_shm_open(snd_ctl_t **handlep, const char *name, const char *sockname, const char *sname, int mode)
{
snd_ctl_t *ctl;
const char *server = NULL;
const char *ctl_name = NULL;
snd_config_t *sconfig;
- const char *host = NULL;
const char *sockname = NULL;
long port = -1;
int err;
- int local;
- struct hostent *h;
+
snd_config_for_each(i, next, conf) {
snd_config_t *n = snd_config_iterator_entry(i);
const char *id;
continue;
if (strcmp(id, "comment") == 0)
continue;
- if (strcmp(id, "host") == 0) {
- err = snd_config_get_string(n, &host);
- if (err < 0) {
- SNDERR("Invalid type for %s", id);
- goto _err;
- }
+ if (strcmp(id, "host") == 0)
continue;
- }
if (strcmp(id, "socket") == 0) {
err = snd_config_get_string(n, &sockname);
if (err < 0) {
goto _err;
}
- if (!host) {
- SNDERR("host is not defined");
- goto _err;
- }
if (!sockname) {
SNDERR("socket is not defined");
goto _err;
}
- h = gethostbyname(host);
- if (!h) {
- SNDERR("Cannot resolve %s", host);
- goto _err;
- }
- local = snd_is_local(h);
- if (!local) {
- SNDERR("%s is not the local host", host);
- goto _err;
- }
err = snd_ctl_shm_open(handlep, name, sockname, ctl_name, mode);
_err:
snd_config_delete(sconfig);
return sock;
}
-#if 0
-static int make_inet_socket(const char *host, int port)
-{
- struct sockaddr_in addr;
- int sock;
- struct hostent *h = gethostbyname(host);
- if (!h)
- return -ENOENT;
-
- sock = socket(PF_INET, SOCK_STREAM, 0);
- if (sock < 0) {
- SYSERR("socket failed");
- return -errno;
- }
-
- addr.sin_family = AF_INET;
- addr.sin_port = htons(port);
- memcpy(&addr.sin_addr, h->h_addr_list[0], sizeof(struct in_addr));
-
- if (connect(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
- SYSERR("connect failed");
- return -errno;
- }
- return sock;
-}
-#endif
-
/**
* \brief Creates a new shared memory PCM
* \param pcmp Returns created PCM handle
const char *server = NULL;
const char *pcm_name = NULL;
snd_config_t *sconfig;
- const char *host = NULL;
const char *sockname = NULL;
long port = -1;
int err;
- int local;
- struct hostent *h;
+
snd_config_for_each(i, next, conf) {
snd_config_t *n = snd_config_iterator_entry(i);
const char *id;
continue;
if (strcmp(id, "comment") == 0)
continue;
- if (strcmp(id, "host") == 0) {
- err = snd_config_get_string(n, &host);
- if (err < 0) {
- SNDERR("Invalid type for %s", id);
- goto _err;
- }
+ if (strcmp(id, "host") == 0)
continue;
- }
if (strcmp(id, "socket") == 0) {
err = snd_config_get_string(n, &sockname);
if (err < 0) {
goto __error;
}
- if (!host) {
- SNDERR("host is not defined");
- goto _err;
- }
if (!sockname) {
SNDERR("socket is not defined");
goto _err;
}
- h = gethostbyname(host);
- if (!h) {
- SNDERR("Cannot resolve %s", host);
- goto _err;
- }
- local = snd_is_local(h);
- if (!local) {
- SNDERR("%s is not the local host", host);
- goto _err;
- }
err = snd_pcm_shm_open(pcmp, name, sockname, pcm_name, stream, mode);
__error:
snd_config_delete(sconfig);
*fd = *fds;
return ret;
}
-
-int snd_is_local(struct hostent *hent)
-{
- int s;
- int err;
- struct ifconf conf;
- size_t numreqs = 10;
- size_t i;
- struct in_addr *haddr = (struct in_addr*) hent->h_addr_list[0];
-
- s = socket(PF_INET, SOCK_STREAM, 0);
- if (s < 0) {
- SYSERR("socket failed");
- return -errno;
- }
-
- conf.ifc_len = numreqs * sizeof(struct ifreq);
- conf.ifc_buf = malloc((unsigned int) conf.ifc_len);
- if (! conf.ifc_buf) {
- close(s);
- return -ENOMEM;
- }
- while (1) {
- err = ioctl(s, SIOCGIFCONF, &conf);
- if (err < 0) {
- SYSERR("SIOCGIFCONF failed");
- close(s);
- return -errno;
- }
- if ((size_t)conf.ifc_len < numreqs * sizeof(struct ifreq))
- break;
- numreqs *= 2;
- conf.ifc_len = numreqs * sizeof(struct ifreq);
- conf.ifc_buf = realloc(conf.ifc_buf, (unsigned int) conf.ifc_len);
- if (! conf.ifc_buf) {
- close(s);
- return -ENOMEM;
- }
- }
- numreqs = conf.ifc_len / sizeof(struct ifreq);
- for (i = 0; i < numreqs; ++i) {
- struct ifreq *req = &conf.ifc_req[i];
- struct sockaddr_in *s_in = (struct sockaddr_in *)&req->ifr_addr;
- s_in->sin_family = AF_INET;
- err = ioctl(s, SIOCGIFADDR, req);
- if (err < 0)
- continue;
- if (haddr->s_addr == s_in->sin_addr.s_addr)
- break;
- }
- close(s);
- free(conf.ifc_buf);
- return i < numreqs;
-}
#endif