static int process_module(char *credits, size_t credits_len, char *filename) { FILE *modfile; struct stat st; size_t modfilelen; unsigned char *buf; char pre[11]; char tmpstr[256]; size_t rb; #ifndef EMSCRIPTEN if (!(modfile = fopen(filename, "rb"))) return 0; if (fstat(fileno(modfile), &st)) return 0; modfilelen = st.st_size; #else struct AFILE *uo= uade_fopen(filename, "rb"); if ((modfile = uo->file) == NULL) { if (uo->async_status<0) return -1; return 0; } modfilelen= uade_get_file_size(filename); #endif if ((buf = malloc(modfilelen)) == NULL) { fprintf(stderr, "uade: can't allocate mem in process_module()"); fclose(modfile); return 0; } rb = 0; while (rb < modfilelen) { size_t ret = fread(&buf[rb], 1, modfilelen - rb, modfile); if (ret == 0) break; rb += ret; } fclose(modfile); if (rb < modfilelen) { fprintf(stderr, "uade: song info could not read %s fully\n", filename); free(buf); return 0; } snprintf(tmpstr, sizeof tmpstr, "UADE2 MODINFO:\n\nFile name: %s\nFile length: %zd bytes\n", filename, modfilelen); strlcpy(credits, tmpstr, credits_len); /* Get filetype in pre */ uade_filemagic(buf, modfilelen, pre, modfilelen, filename, 0); snprintf(tmpstr, sizeof tmpstr, "File prefix: %s.*\n", pre); strlcat(credits, tmpstr, credits_len); if (strcasecmp(pre, "CUST") == 0) { /* CUST */ process_custom(credits, credits_len, buf, modfilelen); } else if (strcasecmp(pre, "DM2") == 0) { /* DM2 */ process_dm2_mod(credits, credits_len, buf, modfilelen); } else if (strcasecmp(pre, "DIGI") == 0) { /* DIGIBooster */ process_digi_mod(credits, credits_len, buf, modfilelen); } else if ((strcasecmp(pre, "AHX") == 0) || (strcasecmp(pre, "THX") == 0)) { /* AHX */ process_ahx_mod(credits, credits_len, buf, modfilelen); } else if ((strcasecmp(pre, "MOD15") == 0) || (strcasecmp(pre, "MOD15_UST") == 0) || (strcasecmp(pre, "MOD15_MST") == 0) || (strcasecmp(pre, "MOD15_ST-IV") == 0)) { /*MOD15 */ process_ptk_mod(credits, credits_len, 15, buf, modfilelen); } else if ((strcasecmp(pre, "MOD") == 0) || (strcasecmp(pre, "MOD_DOC") == 0) || (strcasecmp(pre, "MOD_NTK") == 0) || (strcasecmp(pre, "MOD_NTK1") == 0) || (strcasecmp(pre, "MOD_NTK2") == 0) || (strcasecmp(pre, "MOD_FLT4") == 0) || (strcasecmp(pre, "MOD_FLT8") == 0) || (strcasecmp(pre, "MOD_ADSC4") == 0) || (strcasecmp(pre, "MOD_ADSC8") == 0) || (strcasecmp(pre, "MOD_COMP") == 0) || (strcasecmp(pre, "MOD_NTKAMP") == 0) || (strcasecmp(pre, "PPK") == 0) || (strcasecmp(pre, "MOD_PC") == 0) || (strcasecmp(pre, "ICE") == 0) || (strcasecmp(pre, "ADSC") == 0)) { /*MOD*/ process_ptk_mod(credits, credits_len, 31, buf, modfilelen); } else if (strcasecmp(pre, "DL") == 0) { process_WTWT_mod(credits, credits_len, buf, modfilelen, "UNCL", "EART", 0x28); } else if (strcasecmp(pre, "BSS") == 0) { process_WTWT_mod(credits, credits_len, buf, modfilelen, "BEAT", "HOVE", 0x1c); } else if (strcasecmp(pre, "GRAY") == 0) { process_WTWT_mod(credits, credits_len, buf, modfilelen, "FRED", "GRAY", 0x10); } else if (strcasecmp(pre, "JMF") == 0) { process_WTWT_mod(credits, credits_len, buf, modfilelen, "J.FL", "OGEL", 0x14); } else if (strcasecmp(pre, "SPL") == 0) { process_WTWT_mod(credits, credits_len, buf, modfilelen, "!SOP", "ROL!", 0x10); } else if (strcasecmp(pre, "HD") == 0) { process_WTWT_mod(credits, credits_len, buf, modfilelen, "H.DA", "VIES", 24); } else if (strcasecmp(pre, "RIFF") == 0) { process_WTWT_mod(credits, credits_len, buf, modfilelen, "RIFF", "RAFF", 0x14); } else if (strcasecmp(pre, "FP") == 0) { process_WTWT_mod(credits, credits_len, buf, modfilelen, "F.PL", "AYER", 0x8); } else if (strcasecmp(pre, "CORE") == 0) { process_WTWT_mod(credits, credits_len, buf, modfilelen, "S.PH", "IPPS", 0x20); } else if (strcasecmp(pre, "BDS") == 0) { process_WTWT_mod(credits, credits_len, buf, modfilelen, "DAGL", "ISH!", 0x14); } free(buf); return 0; }
static struct eagleplayer *analyze_file_format(int *content, const char *modulename, struct uade_state *state) { struct stat st; char ext[MAX_SUFFIX_LENGTH]; FILE *f; struct eagleplayer *contentcandidate = NULL; struct eagleplayer *namecandidate = NULL; char *prefix, *postfix, *t; size_t bufsize, bytesread; uint8_t buf[8192]; *content = 0; if ((f = fopen(modulename, "rb")) == NULL) return NULL; if (fstat(fileno(f), &st)) uadeerror("Very weird stat error: %s (%s)\n", modulename, strerror(errno)); bufsize = sizeof buf; bytesread = atomic_fread(buf, 1, bufsize, f); fclose(f); if (bytesread == 0) return NULL; memset(&buf[bytesread], 0, bufsize - bytesread); uade_filemagic(buf, bytesread, ext, st.st_size, modulename, state->config.verbose); if (strcmp(ext, "reject") == 0) return NULL; if (ext[0] != 0 && state->config.verbose) __android_log_print(ANDROID_LOG_VERBOSE, "UADE", "Content recognized: %s (%s)\n", ext, modulename); if (strcmp(ext, "packed") == 0) return NULL; if (!load_playerstore(state)) return NULL; /* First do filename detection (we'll later do content detection) */ t = xbasename(modulename); if (strlcpy((char *) buf, t, sizeof buf) >= sizeof buf) return NULL; t = strchr((char *) buf, '.'); if (t == NULL) return NULL; *t = 0; prefix = (char *) buf; if (strlen(prefix) < MAX_SUFFIX_LENGTH) namecandidate = get_eagleplayer(prefix, state->playerstore); if (namecandidate == NULL) { /* Try postfix */ t = xbasename(modulename); strlcpy((char *) buf, t, sizeof buf); postfix = strrchr((char *) buf, '.') + 1; /* postfix != NULL */ if (strlen(postfix) < MAX_SUFFIX_LENGTH) namecandidate = get_eagleplayer(postfix, state->playerstore); } /* If filemagic found a match, we'll use player plugins associated with that extension */ if (ext[0]) { contentcandidate = get_eagleplayer(ext, state->playerstore); if (contentcandidate != NULL) { /* Do not recognize name detectable eagleplayers by content */ if (namecandidate == NULL || (namecandidate->flags & ES_NAME_DETECTION) == 0) { *content = 1; return contentcandidate; } } else { if (state->config.verbose) __android_log_print(ANDROID_LOG_VERBOSE, "UADE", "%s not in eagleplayer.conf\n", ext); } } if (state->config.verbose) __android_log_print(ANDROID_LOG_VERBOSE, "UADE", "Format detection by filename\n"); return namecandidate; }