Result ProcessCIA(std::string dir, std::string titleName) { FILE *tik = fopen((dir + "/ticket").c_str(), "rb"); if (!tik) { return -1; } TIK_CONTEXT tik_context = process_tik(tik); FILE *tmd = fopen((dir + "/tmd").c_str(),"rb"); if (!tmd) { fclose(tik); return -1; } TMD_CONTEXT tmd_context = process_tmd(tmd); if(tik_context.result != 0 || tmd_context.result != 0){ printf("[!] Input files could not be processed successfully\n"); free(tmd_context.content_struct); fclose(tik); fclose(tmd); return -1; } int result; if (config.GetMode() == CConfig::Mode::INSTALL_CIA) { result = install_cia(tmd_context, tik_context); } else { FILE *output = fopen((dir + "/" + titleName + ".cia").c_str(),"wb"); if (!output) { result = -2; } else { result = generate_cia(tmd_context, tik_context, output); if(result != 0) { remove((dir + "/" + titleName + ".cia").c_str()); } } } // free allocated memory/handles free(tmd_context.content_struct); fclose(tik); fclose(tmd); // Clean up temp files remove((dir + "/ticket").c_str()); remove((dir + "/tmd").c_str()); return result; }
int main(int argc, char *argv[]) { app_title(); //Argument Checks if(argc < 3){ printf("[!] Not Enough Arguments\n"); help(argv[0]); return 1; } if(argc > 3){ printf("[!] Too Many Arguments\n"); help(argv[0]); return 1; } //Storing Current Working Directory char cwd[1024]; if (getcwdir(cwd, sizeof(cwd)) == NULL){ printf("[!] Could not store Current Working Directory\n"); return IO_FAIL; } //Changing to CDN Content Directory chdir(argv[1]); //Processing TIK FILE *tik = fopen("cetk","rb"); if(tik == NULL){ printf("[!] Could not open 'tik'\n"); return IO_FAIL; } TIK_CONTEXT tik_context = process_tik(tik); //Processing TMD FILE *tmd = fopen("tmd","rb"); if(tmd == NULL){ printf("[!] Could not open 'tmd'\n"); return IO_FAIL; } TMD_CONTEXT tmd_context = process_tmd(tmd); //Error Checking if(tik_context.result != 0 || tmd_context.result != 0){ printf("[!] Input files could not be processed successfully\n"); free(tmd_context.content_struct); free(tmd_context.content); fclose(tik); fclose(tmd); return FILE_PROCESS_FAIL; } //TID comparison check if(check_tid(tik_context.title_id,tmd_context.title_id) != TRUE){ printf("[!] Caution, Ticket and TMD Title IDs do not match\n"); printf("[!] CETK Title ID: "); u8_hex_print_be(tik_context.title_id,0x8); printf("\n"); printf("[!] TMD Title ID: "); u8_hex_print_be(tmd_context.title_id,0x8); printf("\n"); } //Title Version comparison if(tik_context.title_version != tmd_context.title_version){ printf("[!] Caution, Ticket and TMD Title Versions do not match\n"); printf("[!] CETK Title Ver: %d\n",tik_context.title_version); printf("[!] TMD Title Ver: %d\n",tmd_context.title_version); } //Returning to Original Working Directory chdir(cwd); //Opening Output file FILE *output = fopen(argv[2],"wb"); if(output == NULL){ printf("[!] Could not create '%s'\n",argv[2]); return IO_FAIL; } int result = generate_cia(tmd_context,tik_context,output); if(result != 0){ printf("[!] Failed to Generate %s\n",argv[2]); remove(argv[2]); } else printf("[*] %s Generated Sucessfully\n",argv[2]); return 0; }