diff options
author | Jens Arnold <amiconn@rockbox.org> | 2004-09-01 21:34:20 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2004-09-01 21:34:20 +0000 |
commit | ac9ad1a25dc46001f85f9e758804cc3f7dd5ae00 (patch) | |
tree | 684c3156ef14dc49e944106b27a2a2ab0b39e569 /apps/playlist.c | |
parent | 25d162d6ce3855c3e7b7f07c33a419dd43a3d571 (diff) |
Bug fix: Longish .playlist_control files got corrupted when doing ON->resume after stop without rebooting first
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5033 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/playlist.c')
-rw-r--r-- | apps/playlist.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/apps/playlist.c b/apps/playlist.c index d147226710..5263fc0ee7 100644 --- a/apps/playlist.c +++ b/apps/playlist.c @@ -245,6 +245,14 @@ static void new_playlist(struct playlist_info* playlist, const char *dir, static void create_control(struct playlist_info* playlist) { playlist->control_fd = creat(playlist->control_filename, 0000200); + if (playlist->control_fd >= 0) + { + /* have to close and re-open without O_TRUNC, otherwise it may get + chopped on closing (the file pointer is not always at the end) */ + close(playlist->control_fd); + playlist->control_fd = open(playlist->control_filename, O_RDWR); + } + if (playlist->control_fd < 0) { splash(HZ*2, true, "%s (%d)", str(LANG_PLAYLIST_CONTROL_ACCESS_ERROR), @@ -303,7 +311,7 @@ static void update_playlist_filename(struct playlist_info* playlist, sep="/"; dirlen++; } - + playlist->dirlen = dirlen; snprintf(playlist->filename, sizeof(playlist->filename), @@ -1253,7 +1261,7 @@ int playlist_resume(void) { /* str1=version str2=dir str3=file */ int version; - + if (!str1) { result = -1; @@ -1311,7 +1319,7 @@ int playlist_resume(void) last_position = atoi(str2); queue = (current_command == resume_add)?false:true; - + /* seek position is based on str3's position in buffer */ if (add_track_to_playlist(playlist, str3, position, @@ -1403,7 +1411,7 @@ int playlist_resume(void) /* to ignore any extra newlines */ current_command = resume_comment; } - else if(newline) + else if(newline) { newline = false; |