]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - afs.c
Fix handling of invalid entries in the score table.
[paraslash.git] / afs.c
diff --git a/afs.c b/afs.c
index 353626ee7cd37602e1faaeb37004ba278eb9e3f1..8a60166fe7e42d5f5762cb46547a9413df6bd342 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -487,17 +487,26 @@ int open_next_audio_file(void)
        int ret, shmid;
        char buf[8];
        long score;
-
+again:
        PARA_NOTICE_LOG("getting next audio file\n");
        ret = score_get_best(&aft_row, &score);
-       if (ret < 0)
-               return ret;
+       if (ret < 0) {
+               PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret));
+               goto no_admissible_files;
+       }
        ret = open_and_update_audio_file(aft_row, score, &afd);
-       if (ret < 0)
-               return ret;
+       if (ret < 0) {
+               PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret));
+               ret = score_delete(aft_row);
+               if (ret < 0) {
+                       PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret));
+                       goto no_admissible_files;
+               }
+               goto again;
+       }
        shmid = ret;
        if (!write_ok(server_socket)) {
-               PARA_EMERG_LOG("afs_socket not writable\n");
+               ret = -E_AFS_SOCKET;
                goto destroy;
        }
        *(uint32_t *)buf = NEXT_AUDIO_FILE;
@@ -506,10 +515,13 @@ int open_next_audio_file(void)
        close(afd.fd);
        if (ret >= 0)
                return ret;
-       PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret));
 destroy:
        shm_destroy(shmid);
        return ret;
+no_admissible_files:
+       *(uint32_t *)buf = NO_ADMISSIBLE_FILES;
+       *(uint32_t *)(buf + 4) = (uint32_t)0;
+       return send_bin_buffer(server_socket, buf, 8);
 }
 
 /* Never fails if arg == NULL */
@@ -846,8 +858,10 @@ static void execute_server_command(void)
        PARA_DEBUG_LOG("received: %s\n", buf);
        if (!strcmp(buf, "new")) {
                ret = open_next_audio_file();
-               if (ret < 0)
-                       PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret));
+               if (ret < 0) {
+                       PARA_EMERG_LOG("%s\n", PARA_STRERROR(-ret));
+                       unregister_tasks();
+               }
                return;
        }
        PARA_ERROR_LOG("unknown command\n");