ap

An audio player suited to my tastes
Log | Files | Refs | README | LICENSE

commit fd42b7c2802b80594fc1944db191e33bb9a4fdea
parent 9d631531184e3604b269b451ac0f292eace57458
Author: Jacob R. Edwards <jacobouno@protonmail.com>
Date:   Wed, 14 Jul 2021 03:07:16 -0700

Dynamically allocate apcon and aps structures

It's easier for the caller if structure memory is dynamically
allocated.

Rename the apcon source file and functions to be simpler.

Diffstat:
Maps/aps.c | 56+++++++++++++++++++++++++++++++++-----------------------
Maps/aps.h | 2+-
Minclude/ap/ap.h | 3+--
Dinclude/ap/apcon.h | 8--------
Dinclude/ap/apfile.h | 1-
Ainclude/ap/con.h | 9+++++++++
Dlib/ap/apcon.c | 51---------------------------------------------------
Dlib/ap/apfile.c | 31-------------------------------
Alib/ap/con.c | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mlib/ap/mkfile | 2+-
10 files changed, 117 insertions(+), 118 deletions(-)

diff --git a/aps/aps.c b/aps/aps.c @@ -37,12 +37,12 @@ #include "config.h" #include "util.h" -static struct aps aps; +static struct aps *aps; void sigclose(int sig) { - aps.close = 1; + aps->close = 1; } void @@ -53,8 +53,8 @@ sigchld(int sig) while ((pid = waitpid(-1, &status, WCONTINUED | WNOHANG | WUNTRACED)) > 0) { - if (pid == aps.player.pid) - pupdate(&aps.player, status); + if (pid == aps->player.pid) + pupdate(&aps->player, status); } } @@ -76,13 +76,13 @@ aps_accept(struct aps *aps) int r; pfd.events = POLLIN; - pfd.fd = aps->con.s; + pfd.fd = aps->con->sock; r = poll(&pfd, 1, aps->nfds ? 0 : INFTIM); if (r <= 0) return r; - while ((s = accept4(aps->con.s, NULL, NULL, 0)) >= 0) { + while ((s = accept4(aps->con->sock, NULL, NULL, 0)) >= 0) { ++aps->nfds; aps->pfds[s].fd = s; if ((aps->clients[s].request = bufnew()) == NULL || @@ -142,20 +142,28 @@ run(struct aps *aps) return 0; } -int -aps_open(struct aps *aps) +struct aps * +aps_open(char *path) { + struct aps *aps; int i; - if (apcon_open(&aps->con, NULL, bind, SOCK_NONBLOCK) || - listen(aps->con.s, 10)) - return 1; + aps = calloc(1, sizeof(*aps)); + if (aps == NULL) + return NULL; + + aps->con = apopen(path, bind, SOCK_NONBLOCK); + if (aps->con == NULL || listen(aps->con->sock, 10)) { + free(aps); + return NULL; + } for (i = 0; i < LEN(aps->pfds); ++i) { aps->pfds[i].fd = -1; aps->pfds[i].events = POLLIN | POLLOUT; } - return 0; + + return aps; } void @@ -168,7 +176,7 @@ aps_close(struct aps *aps) for (i = 0; i < LEN(aps->pfds); ++i) if (aps->pfds[i].fd != -1) aps_drop(aps, i); - apcon_close(&aps->con); + apclose(aps->con); pstop(&aps->player); } @@ -186,25 +194,27 @@ main(int argc, char *argv[]) signal(SIGINT, sigclose); signal(SIGTERM, sigclose); + aps = aps_open(NULL); + if (aps == NULL) + die("unable to open connection"); + for (i = 1; player[i]; ++i) if (!player[i][0]) - player[i] = aps.player.path; + player[i] = aps->player.path; - if (aps_next(&aps, -1, LEN(next), next)) + if (aps_next(aps, -1, LEN(next), next)) die("aps_next"); - aps.player.argv = player + 1; - aps.player.prog = player[0]; - aps.player.state = STOPPED; + aps->player.argv = player + 1; + aps->player.prog = player[0]; + aps->player.state = STOPPED; - if (aps_open(&aps)) - die("open connection"); - if (run(&aps)) { + if (run(aps)) { perror("error"); - aps_close(&aps); + aps_close(aps); return 1; } - aps_close(&aps); + aps_close(aps); return 0; } diff --git a/aps/aps.h b/aps/aps.h @@ -13,7 +13,7 @@ struct aps { int close; int nfds; int playing; - struct apcon con; + struct apcon *con; struct client { struct buf *request; struct response *resp; diff --git a/include/ap/ap.h b/include/ap/ap.h @@ -2,7 +2,6 @@ #define AP_ARGV_MAX 128 #define AP_ARG_SEPS "\t" -#include "apcon.h" -#include "apfile.h" #include "client.h" +#include "con.h" #include "sock.h" diff --git a/include/ap/apcon.h b/include/ap/apcon.h @@ -1,8 +0,0 @@ -struct apcon { - char *path; - int (*init)(int, const struct sockaddr *, socklen_t); - int s; -}; - -int apcon_open(struct apcon *, char *, int (*)(int, const struct sockaddr *, socklen_t), int); -void apcon_close(struct apcon *); diff --git a/include/ap/apfile.h b/include/ap/apfile.h @@ -1 +0,0 @@ -char *apfile(char *); diff --git a/include/ap/con.h b/include/ap/con.h @@ -0,0 +1,9 @@ +struct apcon { + char *path; + int (*init)(int, const struct sockaddr *, socklen_t); + int sock; +}; + +char *apfile(char *); +struct apcon *apopen(char *, int (*)(int, const struct sockaddr *, socklen_t), int); +void apclose(struct apcon *); diff --git a/lib/ap/apcon.c b/lib/ap/apcon.c @@ -1,51 +0,0 @@ -/* Copyright 2021 Jacob R. Edwards - * - * ap -- audio player - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - */ - -#include <sys/socket.h> - -#include <stdlib.h> -#include <unistd.h> - -#include <ap.h> - -int -apcon_open(struct apcon *apc, char *path, - int (*init)(int, const struct sockaddr *, socklen_t), int flags) -{ - apc->path = apfile(path); - if (apc->path == NULL) - return 1; - - apc->s = sopen(apc->path, init, SOCK_STREAM | flags); - if (apc->s == -1) { - free(apc->path); - return 1; - } - - apc->init = init; - return 0; -} - -void -apcon_close(struct apcon *apc) -{ - sclose(apc->s); - if (apc->init == bind) - unlink(apc->path); - free(apc->path); -} diff --git a/lib/ap/apfile.c b/lib/ap/apfile.c @@ -1,31 +0,0 @@ -/* Copyright 2021 Jacob R. Edwards - * - * ap -- audio player - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - */ - -#include <stdlib.h> -#include <string.h> - -char * -apfile(char *path) -{ - if (path == NULL) { - path = getenv("apsock"); - if (path == NULL) - path = "/tmp/aps"; - } - return strdup(path); -} diff --git a/lib/ap/con.c b/lib/ap/con.c @@ -0,0 +1,72 @@ +/* Copyright 2021 Jacob R. Edwards + * + * ap -- audio player + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include <sys/socket.h> + +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include <ap.h> + +char * +apfile(char *path) +{ + if (path == NULL) { + path = getenv("apsock"); + if (path == NULL) + path = "/tmp/aps"; + } + return strdup(path); +} + +struct apcon * +apopen(char *path, int (*init)(int, const struct sockaddr *, socklen_t), int flags) +{ + struct apcon *apc; + + apc = malloc(sizeof(*apc)); + if (apc == NULL) + return NULL; + + apc->path = apfile(path); + if (apc->path == NULL) { + free(apc); + return NULL; + } + + apc->sock = sopen(apc->path, init, SOCK_STREAM | flags); + if (apc->sock == -1) { + free(apc->path); + free(apc); + return NULL; + } + + apc->init = init; + return apc; +} + +void +apclose(struct apcon *apc) +{ + sclose(apc->sock); + if (apc->init == bind) + unlink(apc->path); + free(apc->path); + free(apc); +} diff --git a/lib/ap/mkfile b/lib/ap/mkfile @@ -1,7 +1,7 @@ # Copyright 2021 Jacob R. Edwards name = libap.a -src = apcon.c apfile.c client.c sock.c +src = client.c con.c sock.c obj = ${src:%.c=%.o} hdir = ../../include/ap mk = ../../mk