]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - aft.c
Make allow/deny syntax consistent with that of add/delete
[paraslash.git] / aft.c
diff --git a/aft.c b/aft.c
index 3283dda82d309769fa569d7ab6b32b299d368b4f..995c7552129512c6e2dc6228c165779c9e7979a0 100644 (file)
--- a/aft.c
+++ b/aft.c
@@ -980,12 +980,66 @@ void make_empty_status_items(char *buf)
        );
 }
 
+static void fixup_taginfo(char *begin, char *end)
+{
+       char *p = begin;
+
+       for (;;) {
+               p = strchr(p, '\n');
+               if (!p)
+                       break;
+               if (p >= end - 1)
+                       break;
+               *p = ' ';
+               p++;
+       }
+}
+
+/* crap, remove this ASAP. */
+static int fixup_info_string(char *info_string)
+{
+       char *t1, *t2, *end;
+
+       if (strncmp(info_string, "audio_file_info:", 16))
+               return -ERRNO_TO_PARA_ERROR(EINVAL);
+       t1 = strstr(info_string, "\ntaginfo1:");
+       if (!t1)
+               return -ERRNO_TO_PARA_ERROR(EINVAL);
+       t2 = strstr(info_string, "\ntaginfo2: ");
+       if (!t2)
+               return -ERRNO_TO_PARA_ERROR(EINVAL);
+
+       end = t2 + strlen(t2) + 1;
+       fixup_taginfo(info_string + 16, t1);
+       fixup_taginfo(t1 + 10, t2);
+       fixup_taginfo(t2 + 10, end);
+
+       if (t1 - info_string < 80 && t2 - t1 < 80 && end - t2 < 80)
+               return 0;
+       if (t1 - info_string >= 80) {
+               memmove(info_string + 80, t1, end - t1);
+               t1 = info_string + 80;
+               t2 -= t1 - info_string - 80;
+               end -= t1 - info_string - 80;
+       }
+       if (t2 - t1 >= 80) {
+               memmove(t1 + 80, t2, end - t2);
+               end -= t2 - t1 - 80;
+               t2 = t1 + 80;
+       }
+       if (end - t2 >= 80) {
+               t2[78] = '\n';
+               t2[79] = '\0';
+       }
+       return 1;
+}
+
 static int make_status_items(struct audio_file_data *afd,
                struct afs_info *afsi, char *path, long score,
                HASH_TYPE *hash)
 {
        struct ls_data d = {
-               .afhi = afd->afhi, /* struct copy */
+               .afhi = afd->afhi,
                .afsi = *afsi,
                .path = path,
                .score = score,
@@ -999,6 +1053,12 @@ static int make_status_items(struct audio_file_data *afd,
        time_t current_time;
        int ret;
 
+       ret = fixup_info_string(afd->afhi.info_string);
+       if (ret < 0) {
+               PARA_WARNING_LOG("ignoring invalid tag info\n");
+               afd->afhi.info_string[0] = '\0';
+       } else if (ret)
+               PARA_NOTICE_LOG("truncated overlong tag info\n");
        time(&current_time);
        ret = print_list_item(&d, &opts, &pb, current_time); /* frees info string */
        afd->afhi.info_string = NULL;