[tarball](./releases/paraslash-0.6.1.tar.xz),
[signature](./releases/paraslash-0.6.1.tar.xz.asc)
+---------------------------------------
+0.5.9 (2021-11-04) "reversed dimension"
+---------------------------------------
+This release contains a few important fixes which have accumulated in
+the maint branch. The paraslash-0.5.x series has now reached its end
+of life and will no longer be supported. All users should upgrade to
+a more recent version at this point.
+
+- Fix an issue with the bash completion script.
+- Initialize the random seed also when using libgrypt.
+- Fix some compiler warnings in the resample filter
+- Don't return spurious errors from the ff server command.
+
+Downloads:
+[tarball](./releases/paraslash-0.5.9.tar.bz2),
+[signature](./releases/paraslash-0.5.9.tar.bz2.asc)
+
---------------------------------------
0.5.8 (2017-09-23) "branching parabola"
---------------------------------------
return write_all(server_socket, buf, 8);
}
-/* Never fails if arg == NULL */
static int activate_mood_or_playlist(const char *arg, int *num_admissible,
char **errmsg)
{
int ret;
if (!arg) {
- ret = change_current_mood(NULL, NULL); /* always successful */
mode = PLAY_MODE_MOOD;
+ ret = change_current_mood(NULL, errmsg);
+ if (ret < 0) {
+ if (num_admissible)
+ *num_admissible = 0;
+ return ret;
+ }
} else {
if (!strncmp(arg, "p/", 2)) {
ret = playlist_open(arg + 2);
{
int ret = activate_mood_or_playlist(arg, NULL, NULL);
if (ret < 0) {
- assert(arg);
PARA_WARNING_LOG("could not activate %s: %s\n", arg,
para_strerror(-ret));
- activate_mood_or_playlist(NULL, NULL, NULL);
+ if (arg)
+ activate_mood_or_playlist(NULL, NULL, NULL);
}
}
if (ret < 0)
para_printf(&aca->pbout, "error while adding %s\n",
lls_input(i, aca->lpr));
+ lls_free_parse_result(aca->lpr, cmd);
return ret;
}
goto rm_btrn;
while (input_available()) {
if (i9ep->stdout_btrn) {
- unsigned len = i9ep->key_sequence_length;
- assert(len < sizeof(i9ep->key_sequence) - 1);
- buf = i9ep->key_sequence + len;
- ret = read(i9ep->ici->fds[0], buf, 1);
- if (ret < 0) {
- ret = -ERRNO_TO_PARA_ERROR(errno);
- goto rm_btrn;
+ while (i9ep->key_sequence_length < sizeof(i9ep->key_sequence) - 1) {
+ buf = i9ep->key_sequence + i9ep->key_sequence_length;
+ ret = read(i9ep->ici->fds[0], buf, 1);
+ if (ret < 0) {
+ ret = -ERRNO_TO_PARA_ERROR(errno);
+ goto rm_btrn;
+ }
+ if (ret == 0) {
+ ret = -E_I9E_EOF;
+ goto rm_btrn;
+ }
+ buf[1] = '\0';
+ i9ep->key_sequence_length++;
+ rl_stuff_char((int)(unsigned char)*buf);
+ rl_callback_read_char();
+ if (!input_available())
+ break;
}
- ret = -E_I9E_EOF;
- if (ret == 0)
- goto rm_btrn;
- buf[1] = '\0';
- i9ep->key_sequence_length++;
- rl_stuff_char((int)(unsigned char)*buf);
- }
- rl_callback_read_char();
+ i9ep->key_sequence_length = 0;
+ } else
+ rl_callback_read_char();
ret = 0;
}
if (!i9ep->stdout_btrn)
*
* If there is already an open mood, it will be closed first.
*
- * \return Positive on success, negative on errors. Loading the dummy mood
- * always succeeds.
+ * \return Positive on success, negative on errors.
*
* \sa struct \ref afs_info::last_played, \ref mp_eval_row().
*/
if (mood_name) {
struct mood *m;
struct osl_row *row;
- struct osl_object obj = {
- .data = (char *)mood_name,
- .size = strlen(mood_name) + 1
- };
+ struct osl_object obj;
+
+ if (!*mood_name) {
+ *errmsg = make_message("empty mood name");
+ return -ERRNO_TO_PARA_ERROR(EINVAL);
+ }
+ obj.data = (char *)mood_name;
+ obj.size = strlen(mood_name) + 1;
ret = osl(osl_get_row(moods_table, BLOBCOL_NAME, &obj, &row));
if (ret < 0) {
if (errmsg)
if (ret < 0) {
if (errmsg)
*errmsg = make_message("audio file loop failed");
- return ret;
+ goto out;
}
for (i = 0; i < statistics.num; i++) {
struct admissible_file_info *a = aa.array + i;
ret = statistics.num;
out:
free(aa.array);
+ if (ret < 0)
+ close_current_mood();
return ret;
}
mp_yy_delete_buffer(buffer_state, scanner);
mp_yylex_destroy(scanner);
if (ctx->errmsg) { /* parse error */
+ mp_free_ast(ctx->ast);
if (errmsg)
*errmsg = ctx->errmsg;
else
ret = task_get_notification(sct->task);
if (ret < 0)
- return ret;
+ goto fail;
for (n = 0; n < sct->num_listen_fds; n++) {
ret = command_task_accept(n, s, sct);
- if (ret < 0) {
- free(sct->listen_fds);
- return ret;
- }
+ if (ret < 0)
+ goto fail;
}
return 0;
+fail:
+ free(sct->listen_fds);
+ return ret;
}
static void init_server_command_task(struct server_command_task *sct,
static void vss_eof(struct vss_task *vsst)
{
-
if (!vsst->map)
return;
if (mmd->new_vss_status_flags & VSS_NOMORE)
para_munmap(vsst->map, vsst->mapsize);
vsst->map = NULL;
mmd->chunks_sent = 0;
- //mmd->offset = 0;
mmd->afd.afhi.seconds_total = 0;
+ mmd->afd.afhi.chunks_total = 0;
mmd->afd.afhi.chunk_tv.tv_sec = 0;
mmd->afd.afhi.chunk_tv.tv_usec = 0;
free(mmd->afd.afhi.chunk_table);