version 1.46, 2021/07/12 15:09:20 |
version 1.47, 2021/11/01 14:43:25 |
|
|
struct dev *d; |
struct dev *d; |
|
|
for (d = dev_list; d != NULL; d = d->next) { |
for (d = dev_list; d != NULL; d = d->next) { |
if (d->alt_list->next == NULL && |
if (strcmp(d->path, path) == 0) |
strcmp(d->alt_list->name, path) == 0) |
|
return d; |
return d; |
} |
} |
if (!bufsz && !round) { |
if (!bufsz && !round) { |
|
|
struct port *c; |
struct port *c; |
|
|
for (c = port_list; c != NULL; c = c->next) { |
for (c = port_list; c != NULL; c = c->next) { |
if (c->path_list->next == NULL && |
if (strcmp(c->path, path) == 0) |
strcmp(c->path_list->str, path) == 0) |
|
return c; |
return c; |
} |
} |
c = port_new(path, MODE_MIDIMASK, hold); |
c = port_new(path, MODE_MIDIMASK, hold); |
|
|
start_helper(int background) |
start_helper(int background) |
{ |
{ |
struct dev *d; |
struct dev *d; |
struct dev_alt *da; |
|
struct port *p; |
struct port *p; |
struct passwd *pw; |
struct passwd *pw; |
struct name *n; |
|
int s[2]; |
int s[2]; |
pid_t pid; |
pid_t pid; |
|
|
|
|
err(1, "cannot drop privileges"); |
err(1, "cannot drop privileges"); |
} |
} |
for (d = dev_list; d != NULL; d = d->next) { |
for (d = dev_list; d != NULL; d = d->next) { |
for (da = d->alt_list; da != NULL; da = da->next) { |
dounveil(d->path, "rsnd/", "/dev/audio"); |
dounveil(da->name, "rsnd/", "/dev/audio"); |
dounveil(d->path, "rsnd/", "/dev/audioctl"); |
dounveil(da->name, "rsnd/", "/dev/audioctl"); |
|
} |
|
} |
} |
for (p = port_list; p != NULL; p = p->next) { |
for (p = port_list; p != NULL; p = p->next) { |
for (n = p->path_list; n != NULL; n = n->next) |
dounveil(p->path, "rmidi/", "/dev/rmidi"); |
dounveil(n->str, "rmidi/", "/dev/rmidi"); |
|
} |
} |
if (pledge("stdio sendfd rpath wpath", NULL) == -1) |
if (pledge("stdio sendfd rpath wpath", NULL) == -1) |
err(1, "pledge"); |
err(1, "pledge"); |
|
|
char base[SOCKPATH_MAX], path[SOCKPATH_MAX]; |
char base[SOCKPATH_MAX], path[SOCKPATH_MAX]; |
unsigned int mode, dup, mmc, vol; |
unsigned int mode, dup, mmc, vol; |
unsigned int hold, autovol, bufsz, round, rate; |
unsigned int hold, autovol, bufsz, round, rate; |
|
unsigned int reopen_list; |
const char *str; |
const char *str; |
struct aparams par; |
struct aparams par; |
struct dev *d; |
struct opt *o; |
struct port *p; |
struct dev *d, *dev_first, *dev_next; |
|
struct port *p, *port_first, *port_next; |
struct listen *l; |
struct listen *l; |
struct passwd *pw; |
struct passwd *pw; |
struct tcpaddr { |
struct tcpaddr { |
|
|
rmax = 1; |
rmax = 1; |
aparams_init(&par); |
aparams_init(&par); |
mode = MODE_PLAY | MODE_REC; |
mode = MODE_PLAY | MODE_REC; |
|
dev_first = dev_next = NULL; |
|
port_first = port_next = NULL; |
tcpaddr_list = NULL; |
tcpaddr_list = NULL; |
d = NULL; |
d = NULL; |
p = NULL; |
p = NULL; |
|
|
break; |
break; |
case 'q': |
case 'q': |
p = mkport(optarg, hold); |
p = mkport(optarg, hold); |
|
/* create new circulate list */ |
|
port_first = port_next = p; |
break; |
break; |
case 'Q': |
case 'Q': |
if (p == NULL) |
if (p == NULL) |
errx(1, "-Q %s: no ports defined", optarg); |
errx(1, "-Q %s: no ports defined", optarg); |
namelist_add(&p->path_list, optarg); |
p = mkport(optarg, hold); |
|
/* add to circulate list */ |
|
p->alt_next = port_next; |
|
port_first->alt_next = p; |
|
port_next = p; |
break; |
break; |
case 'a': |
case 'a': |
hold = opt_onoff(); |
hold = opt_onoff(); |
|
|
case 'f': |
case 'f': |
d = mkdev(optarg, &par, 0, bufsz, round, |
d = mkdev(optarg, &par, 0, bufsz, round, |
rate, hold, autovol); |
rate, hold, autovol); |
|
/* create new circulate list */ |
|
dev_first = dev_next = d; |
break; |
break; |
case 'F': |
case 'F': |
if (d == NULL) |
if (d == NULL) |
errx(1, "-F %s: no devices defined", optarg); |
errx(1, "-F %s: no devices defined", optarg); |
if (!dev_addname(d, optarg)) |
d = mkdev(optarg, &par, 0, bufsz, round, |
exit(1); |
rate, hold, autovol); |
|
/* add to circulate list */ |
|
d->alt_next = dev_next; |
|
dev_first->alt_next = d; |
|
dev_next = d; |
break; |
break; |
default: |
default: |
fputs(usagestr, stderr); |
fputs(usagestr, stderr); |
|
|
bufsz, round, rate, 0, autovol); |
bufsz, round, rate, 0, autovol); |
} |
} |
} |
} |
|
|
|
/* |
|
* Add default sub-device (if none) backed by the last device |
|
*/ |
|
o = opt_byname("default"); |
|
if (o == NULL) { |
|
o = mkopt("default", dev_list, pmin, pmax, rmin, rmax, |
|
mode, vol, 0, dup); |
|
if (o == NULL) |
|
return 1; |
|
} |
|
|
|
/* |
|
* For each device create an anonymous sub-device using |
|
* the "default" sub-device as template |
|
*/ |
for (d = dev_list; d != NULL; d = d->next) { |
for (d = dev_list; d != NULL; d = d->next) { |
if (opt_byname(d, "default")) |
if (opt_new(d, NULL, o->pmin, o->pmax, o->rmin, o->rmax, |
continue; |
o->maxweight, o->mtc != NULL, o->dup, o->mode) == NULL) |
if (mkopt("default", d, pmin, pmax, rmin, rmax, |
|
mode, vol, mmc, dup) == NULL) |
|
return 1; |
return 1; |
|
dev_adjpar(d, o->mode, o->pmax, o->rmax); |
} |
} |
|
|
setsig(); |
setsig(); |
|
|
if (!dev_init(d)) |
if (!dev_init(d)) |
return 1; |
return 1; |
} |
} |
|
for (o = opt_list; o != NULL; o = o->next) |
|
opt_init(o); |
if (background) { |
if (background) { |
log_flush(); |
log_flush(); |
log_level = 0; |
log_level = 0; |
|
|
break; |
break; |
if (reopen_flag) { |
if (reopen_flag) { |
reopen_flag = 0; |
reopen_flag = 0; |
for (d = dev_list; d != NULL; d = d->next) |
|
dev_reopen(d); |
reopen_list = 0; |
for (p = port_list; p != NULL; p = p->next) |
for (d = dev_list; d != NULL; d = d->next) { |
port_reopen(p); |
if (d->pstate != DEV_CFG) |
|
reopen_list |= (1 << d->num); |
|
} |
|
for (d = dev_list; d != NULL; d = d->next) { |
|
if (reopen_list & (1 << d->num)) |
|
dev_migrate(d); |
|
} |
|
|
|
reopen_list = 0; |
|
for (p = port_list; p != NULL; p = p->next) { |
|
if (p->state != PORT_CFG) |
|
reopen_list |= (1 << p->num); |
|
} |
|
for (p = port_list; p != NULL; p = p->next) { |
|
if (reopen_list & (1 << p->num)) { |
|
if (port_migrate(p) != p) |
|
port_close(p); |
|
} |
|
} |
} |
} |
if (!fdpass_peer) |
if (!fdpass_peer) |
break; |
break; |
|
|
listen_close(listen_list); |
listen_close(listen_list); |
while (sock_list != NULL) |
while (sock_list != NULL) |
sock_close(sock_list); |
sock_close(sock_list); |
|
for (o = opt_list; o != NULL; o = o->next) |
|
opt_done(o); |
for (d = dev_list; d != NULL; d = d->next) |
for (d = dev_list; d != NULL; d = d->next) |
dev_done(d); |
dev_done(d); |
for (p = port_list; p != NULL; p = p->next) |
for (p = port_list; p != NULL; p = p->next) |