Add option -D to run in the background using daemon(3).

Also changed the message output to using syslog(3).
This commit is contained in:
nakayama 2019-07-27 20:10:29 +00:00
parent 5442ac99a4
commit aa464b6cac
3 changed files with 75 additions and 52 deletions

View File

@ -1,4 +1,4 @@
# $NetBSD: Makefile,v 1.2 2017/01/28 23:19:20 christos Exp $
# $NetBSD: Makefile,v 1.3 2019/07/27 20:10:29 nakayama Exp $
.include <bsd.own.mk>
@ -9,8 +9,8 @@ SRCS= bta2dpd.c avdtp.c sbc_encode.c
MAN= bta2dpd.8
CFLAGS+= -I.
DPADD+= ${LIBBLUETOOTH} ${LIBEVENT}
LDADD+= -lbluetooth -levent
DPADD+= ${LIBBLUETOOTH} ${LIBEVENT} ${LIBUTIL}
LDADD+= -lbluetooth -levent -lutil
CLEANFILES+= sbc_crc.h sbc_coeffs.h
sbc_encode.c: sbc_coeffs.h sbc_crc.h

View File

@ -1,4 +1,4 @@
.\" $NetBSD: bta2dpd.8,v 1.3 2018/05/15 04:25:25 nat Exp $
.\" $NetBSD: bta2dpd.8,v 1.4 2019/07/27 20:10:29 nakayama Exp $
.\"
.\" Copyright (c) 2015 - 2016 Nathanial Sloss <nathanialsloss@yahoo.com.au>
.\" All rights reserved.
@ -29,7 +29,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd March 2, 2016
.Dd July 27, 2019
.Dt BTA2DPD 8
.Os
.Sh NAME
@ -37,7 +37,7 @@
.Nd Bluetooth Advanced Audio Distribution Profile daemon
.Sh SYNOPSIS
.Nm
.Op Fl v
.Op Fl \&Dv
.Op Fl A Ar bitpool_allocation
.Op Fl B Ar bitpool
.Op Fl b Ar blocks
@ -52,7 +52,7 @@
.Ar files ...
.Nm
.Fl K
.Op Fl Iv
.Op Fl DIv
.Op Fl A Ar bitpool_allocation
.Op Fl B Ar bitpool
.Op Fl b Ar blocks
@ -105,6 +105,8 @@ Use
with only the
.Fl v
option and the maximum bitpool for your device will be printed to stdout.
.It Fl D
Run in the background.
.It Fl d Ar device
Local device address.
May be given as BDADDR or device name.

View File

@ -1,4 +1,4 @@
/* $NetBSD: bta2dpd.c,v 1.5 2018/01/13 10:20:45 nat Exp $ */
/* $NetBSD: bta2dpd.c,v 1.6 2019/07/27 20:10:29 nakayama Exp $ */
/*-
* Copyright (c) 2015 - 2016 Nathanial Sloss <nathanialsloss@yahoo.com.au>
@ -82,7 +82,9 @@ __RCSID("$NetBSD");
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <unistd.h>
#include <util.h>
#include <errno.h>
#include "avdtp_signal.h"
@ -216,6 +218,7 @@ static struct event recv_ev; /* audio sink event */
static struct event ctl_ev; /* avdtp ctl event */
struct l2cap_info info;
static bool runasDaemon;
static bool asSpeaker;
static bool initDiscover; /* initiate avdtp discover */
static bool verbose; /* copy to stdout */
@ -250,10 +253,11 @@ static void do_interrupt(int, short, void *);
static void do_recv(int, short, void *);
static void do_ctlreq(int, short, void *);
#define log_err(x, ...) if (verbose) { fprintf (stderr, x "\n",\
__VA_ARGS__); }
#define log_info(x, ...) if (verbose) { fprintf (stderr, x "\n",\
__VA_ARGS__); }
#define log_err(st, fmt, args...) \
do { syslog(LOG_ERR, fmt, ##args); exit(st); } while (0)
#define log_warn(fmt, args...) syslog(LOG_WARNING, fmt, ##args)
#define log_info(fmt, args...) syslog(LOG_INFO, fmt, ##args)
#define log_debug(fmt, args...) syslog(LOG_DEBUG, fmt, ##args)
int
main(int ac, char *av[])
@ -263,7 +267,7 @@ main(int ac, char *av[])
bdaddr_copy(&info.laddr, BDADDR_ANY);
sc = hc = -1;
verbose = asSpeaker = test_mode = initDiscover = false;
verbose = asSpeaker = test_mode = initDiscover = runasDaemon = false;
n = m = l = i = j = o = 0;
freqs[0] = frequency;
channel_config[0] = channel_mode;
@ -272,7 +276,7 @@ main(int ac, char *av[])
alloc_config[0] = alloc_method;
channel_config[0] = channel_mode;
while ((ch = getopt(ac, av, "A:a:B:b:d:e:f:IKM:m:p:r:tV:v")) != EOF) {
while ((ch = getopt(ac, av, "A:a:B:b:Dd:e:f:IKM:m:p:r:tV:v")) != EOF) {
switch (ch) {
case 'A':
for (k = 0; k < (int)strlen(optarg); k++) {
@ -331,6 +335,9 @@ main(int ac, char *av[])
usage();
}
break;
case 'D':
runasDaemon = true;
break;
case 'd': /* local device address */
if (!bt_devaddr(optarg, &info.laddr))
usage();
@ -446,6 +453,9 @@ main(int ac, char *av[])
for (i = 0; i < numfiles; i++)
files2open[i] = av[i];
if (runasDaemon && test_mode)
usage();
if (bdaddr_any(&info.raddr) && (!asSpeaker && !test_mode))
usage();
@ -508,21 +518,31 @@ main(int ac, char *av[])
if (bitpool == 0 || tmpbitpool < bitpool)
bitpool = (uint8_t)tmpbitpool;
if (runasDaemon) {
if (daemon(0, 0) == -1)
err(EXIT_FAILURE, "daemon");
pidfile(NULL);
openlog(getprogname(), LOG_NDELAY | LOG_PID, LOG_DAEMON);
} else {
openlog(getprogname(), LOG_NLOG | LOG_PERROR | LOG_PTRIM,
LOG_USER);
}
again:
base = event_init();
if (asSpeaker == 0) {
if (init_client(&info) < 0)
err(EXIT_FAILURE, "init client");
log_err(EXIT_FAILURE, "init client: %m");
} else {
if (init_server(&info) < 0)
err(EXIT_FAILURE, "init server");
log_err(EXIT_FAILURE, "init server: %m");
}
if (verbose) {
fprintf(stderr, "A2DP:\n");
fprintf(stderr, "\tladdr: %s\n", bt_ntoa(&info.laddr, NULL));
fprintf(stderr, "\traddr: %s\n", bt_ntoa(&info.raddr, NULL));
log_info("A2DP:");
log_info("\tladdr: %s", bt_ntoa(&info.laddr, NULL));
log_info("\traddr: %s", bt_ntoa(&info.raddr, NULL));
}
event_base_loop(base, 0);
@ -546,10 +566,10 @@ static void
usage(void)
{
fprintf(stderr,
"usage:\t%s [-v] [-d device] [-m mode] [-r rate] [-M mtu]\n"
"usage:\t%s [-v] [-D] [-d device] [-m mode] [-r rate] [-M mtu]\n"
"\t\t[-V volume] [-f mode] [-b blocks] [-e bands] [-A alloc]\n"
"\t\t[-B bitpool] -a address files...\n"
"\t%s [-v] [-d device] [-m mode] [-p psm] [-B bitpool]\n"
"\t%s [-v] [-D] [-d device] [-m mode] [-p psm] [-B bitpool]\n"
"\t\t[-a address] [-M mtu] [-r rate] [-I] -K file\n"
"\t%s -t [-v] [-K] [-r rate] [-M mtu] [-V volume] [-f mode]\n"
"\t\t[-b blocks] [-e bands] [-A alloc] [-B bitpool] files...\n"
@ -558,6 +578,7 @@ usage(void)
"\t-a address Remote device address\n"
"\tfiles... Files to read from (Defaults to stdin/stdout)\n"
"\t-v Verbose output\n"
"\t-D Run in the background\n"
"\t-M mtu MTU for transmission\n"
"\t-B bitpool Maximum bitpool value for encoding\n"
"\t-V volume Volume multiplier 0,1,2.\n"
@ -681,7 +702,7 @@ do_ctlreq(int fd, short ev, void *arg)
avdtpSendReject(fd, fd, trans, signal);
}
if (verbose)
fprintf(stderr, "Received command %d\n",signal);
log_debug("Received command %d", signal);
} else {
switch (signal) {
case AVDTP_DISCOVER:
@ -704,7 +725,7 @@ do_ctlreq(int fd, short ev, void *arg)
}
if (!result && verbose)
fprintf(stderr, "Bitpool value = %d\n",bitpool);
log_debug("Bitpool value = %d", bitpool);
state = 3;
break;
case AVDTP_SET_CONFIGURATION:
@ -725,7 +746,7 @@ do_ctlreq(int fd, short ev, void *arg)
avdtpSendReject(fd, fd, trans, signal);
}
if (verbose)
fprintf(stderr, "Responded to command %d\n",signal);
log_debug("Responded to command %d", signal);
}
@ -735,7 +756,7 @@ do_ctlreq(int fd, short ev, void *arg)
if (asSpeaker && state == 6) {
len = sizeof(addr);
if ((sc = accept(orighc,(struct sockaddr*)&addr, &len)) < 0)
err(EXIT_FAILURE, "stream accept");
log_err(EXIT_FAILURE, "stream accept: %m");
}
if (state == 6)
@ -757,8 +778,8 @@ do_ctlreq(int fd, short ev, void *arg)
if (setsockopt(sc, BTPROTO_L2CAP, SO_L2CAP_LM,
&l2cap_mode, sizeof(l2cap_mode)) == -1) {
log_err("Could not set link mode (0x%4.4x)", l2cap_mode);
exit(EXIT_FAILURE);
log_err(EXIT_FAILURE, "Could not set link mode (0x%4.4x)",
l2cap_mode);
}
bdaddr_copy(&addr.bt_bdaddr, &info.raddr);
@ -774,13 +795,13 @@ opened_connection:
if (asSpeaker) {
event_set(&recv_ev, sc, EV_READ | EV_PERSIST, do_recv, NULL);
if (event_add(&recv_ev, NULL) < 0)
err(EXIT_FAILURE, "recv_ev");
log_err(EXIT_FAILURE, "recv_ev: %m");
state = 7;
} else {
event_set(&interrupt_ev, audfile, EV_READ | EV_PERSIST,
do_interrupt, NULL);
if (event_add(&interrupt_ev, NULL) < 0)
err(EXIT_FAILURE, "interrupt_ev");
log_err(EXIT_FAILURE, "interrupt_ev: %m");
state = 7;
}
@ -800,7 +821,7 @@ do_recv(int fd, short ev, void *arg)
len = recvstream(fd, audfile);
if (verbose)
fprintf(stderr, "Recving %zd bytes\n",len);
log_debug("Recving %zd bytes", len);
if (len < 0) {
event_del(&recv_ev);
@ -834,7 +855,7 @@ next_file:
currentFileInd++;
audfile = open(files2open[currentFileInd], O_RDONLY);
if (audfile < 0) {
warn("error opening file %s",
log_warn("error opening file %s: %m",
files2open[currentFileInd]);
goto next_file;
}
@ -843,11 +864,11 @@ next_file:
event_set(&interrupt_ev, audfile, EV_READ |
EV_PERSIST, do_interrupt, NULL);
if (event_add(&interrupt_ev, NULL) < 0)
err(EXIT_FAILURE, "interrupt_ev");
log_err(EXIT_FAILURE, "interrupt_ev: %m");
}
if (verbose)
fprintf(stderr, "Streaming %zd bytes\n",len);
log_debug("Streaming %zd bytes", len);
}
/*
@ -862,7 +883,7 @@ init_server(struct l2cap_info *myInfo)
static bool first_time = true;
if (atexit(exit_func))
err(EXIT_FAILURE,"atexit failed to initialize");
log_err(EXIT_FAILURE, "atexit failed to initialize: %m");
if (numfiles == 0)
audfile = STDOUT_FILENO;
@ -878,7 +899,7 @@ init_server(struct l2cap_info *myInfo)
audfile = open(files2open[0], flags, 0600);
if (audfile < 0) {
err(EXIT_FAILURE, "error opening file %s",
log_err(EXIT_FAILURE, "error opening file %s: %m",
files2open[0]);
}
}
@ -914,8 +935,8 @@ init_server(struct l2cap_info *myInfo)
if (setsockopt(orighc, BTPROTO_L2CAP, SO_L2CAP_LM,
&l2cap_mode, sizeof(l2cap_mode)) == -1) {
log_err("Could not set link mode (0x%4.4x)", l2cap_mode);
exit(EXIT_FAILURE);
log_err(EXIT_FAILURE, "Could not set link mode (0x%4.4x)",
l2cap_mode);
}
bdaddr_copy(&addr.bt_bdaddr, &myInfo->raddr);
@ -931,7 +952,7 @@ init_server(struct l2cap_info *myInfo)
event_set(&ctl_ev, hc, EV_READ | EV_PERSIST, do_ctlreq, NULL);
if (event_add(&ctl_ev, NULL) < 0)
err(EXIT_FAILURE, "ctl_ev");
log_err(EXIT_FAILURE, "ctl_ev: %m");
just_decode:
if (test_mode) {
@ -941,7 +962,7 @@ just_decode:
event_set(&recv_ev, sc, EV_READ | EV_PERSIST, do_recv, NULL);
if (event_add(&recv_ev, NULL) < 0)
err(EXIT_FAILURE, "recv_ev");
log_err(EXIT_FAILURE, "recv_ev: %m");
}
return 0;
@ -958,7 +979,7 @@ init_client(struct l2cap_info *myInfo)
int i;
if (atexit(exit_func))
err(EXIT_FAILURE,"atexit failed to initialize");
log_err(EXIT_FAILURE, "atexit failed to initialize: %m");
if (numfiles == 0)
audfile = STDIN_FILENO;
@ -966,13 +987,14 @@ init_client(struct l2cap_info *myInfo)
for (i = 0; i < numfiles; i++) {
audfile = open(files2open[i], O_RDONLY);
if (audfile < 0)
warn("error opening file %s",files2open[i]);
log_warn("error opening file %s: %m",
files2open[i]);
else
break;
}
startFileInd = i;
if (startFileInd > numfiles - 1)
errx(EXIT_FAILURE,"error opening file%s",
log_err(EXIT_FAILURE, "error opening file%s",
(numfiles > 1) ? "s":"");
}
@ -1010,8 +1032,8 @@ init_client(struct l2cap_info *myInfo)
if (setsockopt(orighc, BTPROTO_L2CAP, SO_L2CAP_LM,
&l2cap_mode, sizeof(l2cap_mode)) == -1) {
log_err("Could not set link mode (0x%4.4x)", l2cap_mode);
exit(EXIT_FAILURE);
log_err(EXIT_FAILURE, "Could not set link mode (0x%4.4x)",
l2cap_mode);
}
bdaddr_copy(&addr.bt_bdaddr, &myInfo->raddr);
@ -1023,7 +1045,7 @@ init_client(struct l2cap_info *myInfo)
event_set(&ctl_ev, hc, EV_READ | EV_PERSIST, do_ctlreq, NULL);
if (event_add(&ctl_ev, NULL) < 0)
err(EXIT_FAILURE, "ctl_ev");
log_err(EXIT_FAILURE, "ctl_ev: %m");
just_encode:
if (test_mode) {
@ -1033,7 +1055,7 @@ just_encode:
event_set(&interrupt_ev, audfile, EV_READ | EV_PERSIST,
do_interrupt, NULL);
if (event_add(&interrupt_ev, NULL) < 0)
err(EXIT_FAILURE, "interrupt_ev");
log_err(EXIT_FAILURE, "interrupt_ev: %m");
}
return 0;
@ -1051,8 +1073,8 @@ client_query(void)
myss = sdp_open(&info.laddr, &info.raddr);
if (myss == NULL) {
log_err("%s: Could not open sdp session", service_type);
exit(EXIT_FAILURE);
log_err(EXIT_FAILURE, "%s: Could not open sdp session",
service_type);
}
log_info("Searching for %s service at %s",
@ -1085,8 +1107,8 @@ client_query(void)
rv = sdp_service_search_attribute(myss, &ssp, &ail, &rsp);
if (!rv) {
log_err("%s: Required sdp record not found", service_type);
exit(EXIT_FAILURE);
log_err(EXIT_FAILURE, "%s: Required sdp record not found",
service_type);
}
/*
@ -1116,8 +1138,7 @@ client_query(void)
sdp_close(myss);
if (!rv) {
log_err("%s query failed", service_type);
exit(EXIT_FAILURE);
log_err(EXIT_FAILURE, "%s query failed", service_type);
}
l2cap_psm = (uint16_t)psm;