/*
- * Copyright (C) 2007-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2007 Andre Noll <maan@tuebingen.mpg.de>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
#include "afh.h"
#include "afs.h"
#include "ipc.h"
+#include "sideband.h"
/** \file playlist.c Functions for loading and saving playlists. */
if (ret < 0)
goto err;
playlist->length = 0;
- ret = for_each_line_ro(playlist_def.data, playlist_def.size,
- add_playlist_entry, playlist);
+ ret = for_each_line(FELF_READ_ONLY, playlist_def.data,
+ playlist_def.size, add_playlist_entry, playlist);
osl_close_disk_object(&playlist_def);
if (ret < 0)
goto err;
struct osl_row *aft_row;
int ret = aft_get_row_of_path(path, &aft_row);
- if (ret >= 0)
- return 1;
- return para_printf(pb, "%s: %s\n", path, para_strerror(-ret));
+ if (ret < 0)
+ para_printf(pb, "%s: %s\n", path, para_strerror(-ret));
+ return 1; /* do not fail the loop on bad paths */
}
static int check_playlist(struct osl_row *row, void *data)
char *playlist_name;
int ret = pl_get_name_and_def_by_row(row, &playlist_name, &playlist_def);
- if (ret < 0)
- return para_printf(pb, "failed to get playlist data: %s\n",
+ if (ret < 0) { /* log error, but continue */
+ para_printf(pb, "failed to get playlist data: %s\n",
para_strerror(-ret));
+ return 1;
+ }
if (*playlist_name) { /* skip dummy row */
- ret = para_printf(pb, "checking playlist %s...\n", playlist_name);
- if (ret < 0)
- return ret;
- ret = for_each_line_ro(playlist_def.data, playlist_def.size,
- check_playlist_path, pb);
+ para_printf(pb, "checking playlist %s...\n", playlist_name);
+ for_each_line(FELF_READ_ONLY, playlist_def.data,
+ playlist_def.size, check_playlist_path, pb);
}
osl_close_disk_object(&playlist_def);
- return ret;
+ return 1;
}
/**
* Check the playlist table for inconsistencies.
*
- * \param fd The afs socket.
- * \param query Unused.
+ * \param aca This callback ignores ->query.
*
- * \return The return value of the underlying call to osl_rbtree_loop().
+ * \return Standard. Invalid paths are reported, but are not considered an
+ * error.
*/
-void playlist_check_callback(int fd, __a_unused const struct osl_object *query)
+int playlist_check_callback(struct afs_callback_arg *aca)
{
- struct para_buffer pb = {
- .max_size = SHMMAX,
- .private_data = &fd,
- .max_size_handler = pass_buffer_as_shm
- };
- int ret = para_printf(&pb, "checking playlists...\n");
-
- if (ret < 0)
- return;
- osl_rbtree_loop(playlists_table, BLOBCOL_ID, &pb,
- check_playlist);
- if (pb.offset)
- pass_buffer_as_shm(pb.buf, pb.offset, &fd);
- free(pb.buf);
+ para_printf(&aca->pbout, "checking playlists...\n");
+ return osl(osl_rbtree_loop(playlists_table, BLOBCOL_ID, &aca->pbout,
+ check_playlist));
}
/**
ret = pl_get_def_by_name(current_playlist.name, &playlist_def);
if (ret < 0)
return ret;
- ret = for_each_line_ro(playlist_def.data, playlist_def.size,
- search_path, new_path);
+ ret = for_each_line(FELF_READ_ONLY, playlist_def.data,
+ playlist_def.size, search_path, new_path);
osl_close_disk_object(&playlist_def);
is_admissible = (ret < 0);
if (was_admissible && is_admissible)