RTDECL(int) RTManifestReadStandard(RTMANIFEST hManifest, RTVFSIOSTREAM hVfsIos) { return RTManifestReadStandardEx(hManifest, hVfsIos, NULL, 0); }
/** * Verify a manifest. * * @returns Program exit code, failures with error message. * @param pszManifest The manifest file. NULL if standard input. * @param fStdFormat Whether to expect standard format (true) or * java format (false). * @param pszChDir The directory to change into before processing * the files in the manifest. */ static RTEXITCODE rtManifestDoVerify(const char *pszManifest, bool fStdFormat, const char *pszChDir) { /* * Open the manifest. */ int rc; RTVFSIOSTREAM hVfsIos; if (!pszManifest) { rc = RTVfsIoStrmFromStdHandle(RTHANDLESTD_INPUT, RTFILE_O_READ, false /*fLeaveOpen*/, &hVfsIos); if (RT_FAILURE(rc)) return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to prepare standard input for reading: %Rrc", rc); } else { const char *pszError; rc = RTVfsChainOpenIoStream(pszManifest, RTFILE_O_READ | RTFILE_O_DENY_WRITE | RTFILE_O_OPEN, &hVfsIos, &pszError); if (RT_FAILURE(rc)) { if (pszError && *pszError) return RTMsgErrorExit(RTEXITCODE_FAILURE, "RTVfsChainOpenIoStream failed with rc=%Rrc:\n" " '%s'\n", " %*s^\n", rc, pszManifest, pszError - pszManifest, ""); return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed with %Rrc opening the input manifest '%s'", rc, pszManifest); } } /* * Read it. */ RTMANIFEST hManifest; rc = RTManifestCreate(0 /*fFlags*/, &hManifest); if (RT_SUCCESS(rc)) { if (fStdFormat) { char szErr[4096 + 1024]; rc = RTManifestReadStandardEx(hManifest, hVfsIos, szErr, sizeof(szErr)); if (RT_SUCCESS(rc)) { RTVfsIoStrmRelease(hVfsIos); hVfsIos = NIL_RTVFSIOSTREAM; /* * Do the verification. */ /** @todo We're missing some enumeration APIs here! */ RTMsgError("The manifest read fine, but the actual verification code is yet to be written. Sorry."); rc = VERR_NOT_IMPLEMENTED; #if 1 /* For now, just write the manifest to stdout so we can test the read routine. */ RTVFSIOSTREAM hVfsIosOut; rc = RTVfsIoStrmFromStdHandle(RTHANDLESTD_OUTPUT, RTFILE_O_WRITE, false /*fLeaveOpen*/, &hVfsIosOut); if (RT_SUCCESS(rc)) { RTManifestWriteStandard(hManifest, hVfsIosOut); RTVfsIoStrmRelease(hVfsIosOut); } #endif } else if (szErr[0]) RTMsgError("Error reading manifest: %s", szErr); else RTMsgError("Error reading manifest: %Rrc", rc); } else { RTMsgError("Support for Java manifest files is not implemented yet"); rc = VERR_NOT_IMPLEMENTED; } RTManifestRelease(hManifest); } RTVfsIoStrmRelease(hVfsIos); return RT_SUCCESS(rc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE; }