aboutsummaryrefslogtreecommitdiffstats
path: root/src/state_file.c
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-07-15 16:57:37 +0200
committerMax Kellermann <max@duempel.org>2009-07-15 16:57:37 +0200
commitf7cc5b2efddece7cdc4fc5b7fc5324d33b7dfa8f (patch)
treec3b528d0972f857c1d80f0d26eff3491b6929777 /src/state_file.c
parentdf7d7732c61deec0102950cb3d79b9bd114e73a9 (diff)
downloadmpd-f7cc5b2efddece7cdc4fc5b7fc5324d33b7dfa8f.tar.gz
mpd-f7cc5b2efddece7cdc4fc5b7fc5324d33b7dfa8f.tar.xz
mpd-f7cc5b2efddece7cdc4fc5b7fc5324d33b7dfa8f.zip
state_file: don't rewind the stream while reading the state file
Parse the state file line by line, let each subsystem probe a line. Only the playlist_state code gets the FILE pointer to read the following lines.
Diffstat (limited to 'src/state_file.c')
-rw-r--r--src/state_file.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/state_file.c b/src/state_file.c
index 3791c057d..18548d03c 100644
--- a/src/state_file.c
+++ b/src/state_file.c
@@ -63,6 +63,8 @@ static void
state_file_read(void)
{
FILE *fp;
+ char line[1024];
+ bool success;
assert(state_file_path != NULL);
@@ -75,11 +77,15 @@ state_file_read(void)
return;
}
- read_sw_volume_state(fp);
- rewind(fp);
- readAudioDevicesState(fp);
- rewind(fp);
- playlist_state_restore(fp, &g_playlist);
+ while (fgets(line, sizeof(line), fp) != NULL) {
+ g_strchomp(line);
+
+ success = read_sw_volume_state(line) ||
+ readAudioDevicesState(line) ||
+ playlist_state_restore(line, fp, &g_playlist);
+ if (!success)
+ g_warning("Unrecognized line in state file: %s", line);
+ }
while(fclose(fp) && errno == EINTR) /* nothing */;
}