enum playlist_result
spl_save_queue(const char *name_utf8, const struct queue *queue)
{
	char *path_fs;
	FILE *file;

	if (map_spl_path() == NULL)
		return PLAYLIST_RESULT_DISABLED;

	if (!spl_valid_name(name_utf8))
		return PLAYLIST_RESULT_BAD_NAME;

	path_fs = map_spl_utf8_to_fs(name_utf8);
	if (path_fs == NULL)
		return PLAYLIST_RESULT_BAD_NAME;

	if (g_file_test(path_fs, G_FILE_TEST_EXISTS)) {
		g_free(path_fs);
		return PLAYLIST_RESULT_LIST_EXISTS;
	}

	file = fopen(path_fs, "w");
	g_free(path_fs);

	if (file == NULL)
		return PLAYLIST_RESULT_ERRNO;

	for (unsigned i = 0; i < queue_length(queue); i++)
		playlist_print_song(file, queue_get(queue, i));

	fclose(file);

	idle_add(IDLE_STORED_PLAYLIST);
	return PLAYLIST_RESULT_SUCCESS;
}
Esempio n. 2
0
enum playlist_result
spl_append_song(const char *utf8path, struct song *song)
{
	FILE *file;
	struct stat st;
	char *path_fs;

	if (!spl_valid_name(utf8path))
		return PLAYLIST_RESULT_BAD_NAME;

	path_fs = map_spl_utf8_to_fs(utf8path);
	if (path_fs == NULL)
		return PLAYLIST_RESULT_DISABLED;

	while (!(file = fopen(path_fs, "a")) && errno == EINTR);
	g_free(path_fs);
	if (file == NULL) {
		int save_errno = errno;
		while (fclose(file) != 0 && errno == EINTR);
		errno = save_errno;
		return PLAYLIST_RESULT_ERRNO;
	}

	if (fstat(fileno(file), &st) < 0) {
		int save_errno = errno;
		while (fclose(file) != 0 && errno == EINTR);
		errno = save_errno;
		return PLAYLIST_RESULT_ERRNO;
	}

	if (st.st_size / (MPD_PATH_MAX + 1) >= (off_t)playlist_max_length) {
		while (fclose(file) != 0 && errno == EINTR);
		return PLAYLIST_RESULT_TOO_LARGE;
	}

	playlist_print_song(file, song);

	while (fclose(file) != 0 && errno == EINTR);

	idle_add(IDLE_STORED_PLAYLIST);
	return PLAYLIST_RESULT_SUCCESS;
}
Esempio n. 3
0
bool
spl_append_song(const char *utf8path, struct song *song, GError **error_r)
{
    FILE *file;
    struct stat st;

    if (spl_map(error_r) == NULL)
        return false;

    char *path_fs = spl_map_to_fs(utf8path, error_r);
    if (path_fs == NULL)
        return false;

    file = fopen(path_fs, "a");
    g_free(path_fs);
    if (file == NULL) {
        playlist_errno(error_r);
        return false;
    }

    if (fstat(fileno(file), &st) < 0) {
        playlist_errno(error_r);
        fclose(file);
        return false;
    }

    if (st.st_size / (MPD_PATH_MAX + 1) >= (off_t)playlist_max_length) {
        fclose(file);
        g_set_error_literal(error_r, playlist_quark(),
                            PLAYLIST_RESULT_TOO_LARGE,
                            "Stored playlist is too large");
        return false;
    }

    playlist_print_song(file, song);

    fclose(file);

    idle_add(IDLE_STORED_PLAYLIST);
    return true;
}