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; }
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; }
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; }