]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
Merge branch 'maint'
authorAndre Noll <maan@tuebingen.mpg.de>
Sun, 18 Jun 2023 13:31:28 +0000 (15:31 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Sun, 18 Jun 2023 13:31:28 +0000 (15:31 +0200)
A single patch which adds a missing error check.

* maint:
  audiod: Fix error checking in init_default_filters().

1  2 
audiod.c

diff --combined audiod.c
index 0e8e5981085b7d05b8a2a08f35a9bb7944a4d72d,2b2b7287f29c4268b1b22381a1f66b52096be74b..0d8f039c768938bd563b7f928cb7a9aa0f2776ab
+++ b/audiod.c
@@@ -44,6 -44,8 +44,6 @@@ static struct lls_parse_result *lpr
  #define OPT_GIVEN(_name) (lls_opt_given(OPT_RESULT(_name)))
  #define OPT_STRING_VAL(_name) (lls_string_val(0, OPT_RESULT(_name)))
  #define OPT_UINT32_VAL(_name) (lls_uint32_val(0, OPT_RESULT(_name)))
 -#define ENUM_STRING_VAL(_name) (lls_enum_string_val(OPT_UINT32_VAL(_name), \
 -      lls_opt(LSG_AUDIOD_PARA_AUDIOD_OPT_ ## _name, CMD_PTR)))
  
  __printf_2_3 void (*para_log)(int, const char*, ...) = daemon_log;
  /** define the array containing all supported audio formats */
@@@ -121,7 -123,7 +121,7 @@@ enum vss_status_flags 
   * This is needed also in audiod_command.c (for the tasks command), so it can
   * not be made static.
   */
 -struct sched sched = {.max_fileno = 0};
 +struct sched sched = {.timeout = 0};
  
  /* The task for obtaining para_server's status (para_client stat). */
  struct status_task {
@@@ -387,11 -389,11 +387,11 @@@ static void parse_config_or_die(void
                        para_strerror(-ret));
                exit(EXIT_FAILURE);
        }
 -      daemon_set_loglevel(ENUM_STRING_VAL(LOGLEVEL));
 +      daemon_set_loglevel(OPT_UINT32_VAL(LOGLEVEL));
        n = OPT_GIVEN(USER_ALLOW);
        if (n == 0)
                return;
 -      uid_whitelist = para_malloc(n * sizeof(uid_t));
 +      uid_whitelist = arr_alloc(n, sizeof(uid_t));
        for (i = 0; i < n; i++) {
                const char *arg = lls_string_val(i, OPT_RESULT(USER_ALLOW));
                int32_t val;
@@@ -443,8 -445,7 +443,8 @@@ static void close_receiver(int slot_num
        task_reap(&s->receiver_node->task);
        free(s->receiver_node);
        s->receiver_node = NULL;
 -      stat_task->current_audio_format_num = -1;
 +      if (audiod_status == AUDIOD_ON)
 +              stat_task->current_audio_format_num = -1;
        tv_add(now, &(struct timeval)EMBRACE(0, 200 * 1000),
                &a->restart_barrier);
  }
@@@ -478,23 -479,6 +478,23 @@@ static void close_writers(struct slot_i
        s->wns = NULL;
  }
  
 +static void notify_writers(int error)
 +{
 +      int i;
 +
 +      FOR_EACH_SLOT(i) {
 +              struct slot_info *s = slot + i;
 +              struct audio_format_info *a;
 +              int j;
 +
 +              if (s->format < 0)
 +                      continue;
 +              a = afi + s->format;
 +              for (j = 0; j < a->num_writers; j++)
 +                      task_notify(s->wns[j].task, error);
 +      }
 +}
 +
  static void close_filters(struct slot_info *s)
  {
        int i;
@@@ -562,7 -546,7 +562,7 @@@ static void open_filters(struct slot_in
                return;
        PARA_INFO_LOG("opening %s filters\n", audio_formats[s->format]);
        assert(s->fns == NULL);
 -      s->fns = para_calloc(nf * sizeof(struct filter_node));
 +      s->fns = zalloc(nf * sizeof(struct filter_node));
        parent = s->receiver_node->btrn;
        for (i = 0; i < nf; i++) {
                char buf[20];
                sprintf(buf, "%s (slot %d)", name, (int)(s - slot));
                fn->task = task_register(&(struct task_info) {
                        .name = buf,
 -                      .pre_select = f->pre_select,
 -                      .post_select = f->post_select,
 +                      .pre_monitor = f->pre_monitor,
 +                      .post_monitor = f->post_monitor,
                        .context = fn,
                }, &sched);
                parent = fn->btrn;
@@@ -600,7 -584,7 +600,7 @@@ static void open_writers(struct slot_in
        struct btr_node *parent = s->fns[a->num_filters - 1].btrn;
  
        assert(s->wns == NULL);
 -      s->wns = para_calloc(PARA_MAX(1U, a->num_writers)
 +      s->wns = zalloc(PARA_MAX(1U, a->num_writers)
                * sizeof(struct writer_node));
        for (i = 0; i < a->num_writers; i++) {
                wn = s->wns + i;
@@@ -627,7 -611,7 +627,7 @@@ static int open_receiver(int format
        if (ret < 0)
                return ret;
        slot_num = ret;
 -      rn = para_calloc(sizeof(*rn));
 +      rn = zalloc(sizeof(*rn));
        rn->receiver = r;
        rn->lpr = a->receiver_lpr;
        rn->btrn = btr_new_node(&(struct btr_node_description)
                audio_formats[format], name, slot_num);
        rn->task = task_register(&(struct task_info) {
                .name = name,
 -              .pre_select = r->pre_select,
 -              .post_select = r->post_select,
 +              .pre_monitor = r->pre_monitor,
 +              .post_monitor = r->post_monitor,
                .context = rn,
        }, &sched);
        return slot_num;
@@@ -747,8 -731,8 +747,8 @@@ static void compute_time_diff(const str
        if (count > 5) {
                int s = tv_diff(&diff, &stat_task->sa_time_diff, &tmp);
                if (tv_diff(&max_deviation, &tmp, NULL) < 0)
 -                      PARA_WARNING_LOG("time diff jump: %lums\n",
 -                              s * tv2ms(&tmp));
 +                      PARA_WARNING_LOG("time diff jump: %c%lums\n",
 +                              s < 0? '-' : '+', tv2ms(&tmp));
        }
        count++;
        sa_time_diff_sign = tv_convex_combination(
@@@ -817,7 -801,7 +817,7 @@@ static int parse_stream_command(const c
                return -E_MISSING_COLON;
        *cmd = p + 1;
        len = p - txt;
 -      re = para_malloc(len + 1);
 +      re = alloc(len + 1);
        strncpy(re, txt, len);
        re[len] = '\0';
        ret = get_matching_audio_format_nums(re);
@@@ -833,9 -817,12 +833,9 @@@ static int add_filter(int format, cons
        struct lls_parse_result *flpr;
  
        filter_num = filter_setup(cmdline, &cfg, &flpr);
 -      a->filter_lpr = para_realloc(a->filter_lpr,
 -              (nf + 1) * sizeof(flpr));
 -      a->filter_conf = para_realloc(a->filter_conf,
 -              (nf + 1) * sizeof(void *));
 -      a->filter_nums = para_realloc(a->filter_nums,
 -              (nf + 1) * sizeof(unsigned));
 +      a->filter_lpr = arr_realloc(a->filter_lpr, nf + 1, sizeof(flpr));
 +      a->filter_conf = arr_realloc(a->filter_conf, nf + 1, sizeof(void *));
 +      a->filter_nums = arr_realloc(a->filter_nums, nf + 1, sizeof(unsigned));
  
        a->filter_nums[nf] = filter_num;
        a->filter_conf[nf] = cfg;
@@@ -881,8 -868,8 +881,8 @@@ static int parse_writer_args(void
                if (a->num_writers > 0)
                        continue; /* already set up */
                a->num_writers = 1;
 -              a->wids = para_malloc(sizeof(int));
 -              a->writer_lpr = para_malloc(sizeof(struct lls_parse_result *));
 +              a->wids = alloc(sizeof(int));
 +              a->writer_lpr = alloc(sizeof(struct lls_parse_result *));
                a->wids[0] = check_writer_arg_or_die(NULL, a->writer_lpr);
                PARA_INFO_LOG("%s writer: %s (default)\n", audio_formats[i],
                        writer_name(a->wids[0]));
@@@ -958,7 -945,7 +958,7 @@@ static int init_default_filters(void
                 */
                if (strcmp(name, "udp") == 0 || strcmp(name, "dccp") == 0) {
                        tmp = para_strdup("fecdec");
-                       add_filter(i, tmp);
+                       ret = add_filter(i, tmp);
                        free(tmp);
                        if (ret < 0)
                                goto out;
@@@ -1050,7 -1037,7 +1050,7 @@@ static void init_local_socket(struct co
        exit(EXIT_FAILURE);
  }
  
 -static int signal_post_select(struct sched *s, void *context)
 +static int signal_post_monitor(struct sched *s, void *context)
  {
        struct signal_task *st = context;
        int ret, signum;
        ret = task_get_notification(st->task);
        if (ret < 0)
                return ret;
 -      signum = para_next_signal(&s->rfds);
 +      signum = para_next_signal();
        switch (signum) {
        case SIGINT:
        case SIGTERM:
        case SIGHUP:
 -              PARA_NOTICE_LOG("received signal %d\n", signum);
 +              PARA_WARNING_LOG("terminating on signal %d\n", signum);
                task_notify_all(s, E_AUDIOD_SIGNAL);
                return -E_AUDIOD_SIGNAL;
        }
        return 0;
  }
  
 -static void command_pre_select(struct sched *s, void *context)
 +static void command_pre_monitor(struct sched *s, void *context)
  {
        struct command_task *ct = context;
 -      para_fd_set(ct->fd, &s->rfds, &s->max_fileno);
 +      sched_monitor_readfd(ct->fd, s);
  }
  
 -static int command_post_select(struct sched *s, void *context)
 +static int command_post_monitor(struct sched *s, void *context)
  {
        int ret;
        struct command_task *ct = context;
        ret = task_get_notification(ct->task);
        if (ret < 0)
                return ret;
 -      ret = handle_connect(ct->fd, &s->rfds);
 +      ret = dispatch_local_connection(ct->fd);
        if (ret < 0) {
 -              PARA_ERROR_LOG("%s\n", para_strerror(-ret));
 +              PARA_NOTICE_LOG("%s\n", para_strerror(-ret));
                if (ret == -E_AUDIOD_TERM) {
                        task_notify_all(s, -ret);
                        return ret;
@@@ -1127,8 -1114,8 +1127,8 @@@ static void init_command_task(struct co
  
        ct->task = task_register(&(struct task_info) {
                .name = "command",
 -              .pre_select = command_pre_select,
 -              .post_select = command_post_select,
 +              .pre_monitor = command_pre_monitor,
 +              .post_monitor = command_post_monitor,
                .context = ct,
        }, &sched);
  }
@@@ -1230,9 -1217,8 +1230,9 @@@ static void start_stop_decoders(void
        struct slot_info *sl;
  
        close_unused_slots();
 -      if (audiod_status != AUDIOD_ON ||
 -                      !(stat_task->vss_status & VSS_STATUS_FLAG_PLAYING))
 +      if (audiod_status != AUDIOD_ON)
 +              return notify_writers(E_NOT_PLAYING);
 +      if (!(stat_task->vss_status & VSS_STATUS_FLAG_PLAYING))
                return notify_receivers(E_NOT_PLAYING);
        if (!must_start_decoder())
                return;
        audiod_status_dump(true);
  }
  
 -static void status_pre_select(struct sched *s, void *context)
 +static void status_pre_monitor(struct sched *s, void *context)
  {
        struct status_task *st = context;
        int i, ret, cafn = stat_task->current_audio_format_num;
@@@ -1281,7 -1267,7 +1281,7 @@@ min_delay
  }
  
  /* restart the client task if necessary */
 -static int status_post_select(struct sched *s, void *context)
 +static int status_post_monitor(struct sched *s, void *context)
  {
        struct status_task *st = context;
        int ret;
@@@ -1372,8 -1358,8 +1372,8 @@@ static void init_status_task(struct sta
  
        stat_task->task = task_register(&(struct task_info) {
                .name = "stat",
 -              .pre_select = status_pre_select,
 -              .post_select = status_post_select,
 +              .pre_monitor = status_pre_monitor,
 +              .post_monitor = status_post_monitor,
                .context = stat_task,
        }, &sched);
  }
@@@ -1457,7 -1443,7 +1457,7 @@@ int main(int argc, char *argv[]
        ret = lls(lls_parse(argc, argv, CMD_PTR, &lpr, &errctx));
        if (ret < 0)
                goto out;
 -      daemon_set_loglevel(ENUM_STRING_VAL(LOGLEVEL));
 +      daemon_set_loglevel(OPT_UINT32_VAL(LOGLEVEL));
        daemon_drop_privileges_or_die(OPT_STRING_VAL(USER),
                OPT_STRING_VAL(GROUP));
        version_handle_flag("audiod", OPT_GIVEN(VERSION));
  
        signal_task->task = task_register(&(struct task_info) {
                .name = "signal",
 -              .pre_select = signal_pre_select,
 -              .post_select = signal_post_select,
 +              .pre_monitor = signal_pre_monitor,
 +              .post_monitor = signal_post_monitor,
                .context = signal_task,
        }, &sched);
  
 -      sched.default_timeout.tv_sec = 2;
 -      sched.default_timeout.tv_usec = 999 * 1000;
 +      sched.default_timeout = 2999;
        ret = schedule(&sched);
        audiod_cleanup();
        sched_shutdown(&sched);