diff options
Diffstat (limited to 'src/coreclr/hosts/unixcorerun/corerun.cpp')
-rw-r--r-- | src/coreclr/hosts/unixcorerun/corerun.cpp | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/src/coreclr/hosts/unixcorerun/corerun.cpp b/src/coreclr/hosts/unixcorerun/corerun.cpp new file mode 100644 index 0000000000..da886d4338 --- /dev/null +++ b/src/coreclr/hosts/unixcorerun/corerun.cpp @@ -0,0 +1,162 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +#include <coreruncommon.h> +#include <string> +#include <string.h> +#include <sys/stat.h> + +// Display the command line options +void DisplayUsage() +{ + fprintf( + stderr, + "Usage: corerun [OPTIONS] assembly [ARGUMENTS]\n" + "Execute the specified managed assembly with the passed in arguments\n\n" + "Options:\n" + "-c, --clr-path path to the libcoreclr.so and the managed CLR assemblies\n"); +} + +// Parse the command line arguments +bool ParseArguments( + const int argc, + const char* argv[], + const char** clrFilesPath, + const char** managedAssemblyPath, + int* managedAssemblyArgc, + const char*** managedAssemblyArgv) +{ + bool success = false; + + *clrFilesPath = nullptr; + *managedAssemblyPath = nullptr; + *managedAssemblyArgv = nullptr; + *managedAssemblyArgc = 0; + + // The command line must contain at least the current exe name and the managed assembly path + if (argc >= 2) + { + for (int i = 1; i < argc; i++) + { + // Check for an option + if (argv[i][0] == '-') + { + // Path to the libcoreclr.so and the managed CLR assemblies + if (strcmp(argv[i], "-c") == 0 || strcmp(argv[i], "--clr-path") == 0) + { + i++; + if (i < argc) + { + *clrFilesPath = argv[i]; + } + else + { + fprintf(stderr, "Option %s: missing path\n", argv[i - 1]); + break; + } + } + else if (strcmp(argv[i], "-?") == 0 || strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) + { + DisplayUsage(); + break; + } + else + { + fprintf(stderr, "Unknown option %s\n", argv[i]); + break; + } + } + else + { + // First argument that is not an option is the managed assembly to execute + *managedAssemblyPath = argv[i]; + + int managedArgvOffset = (i + 1); + *managedAssemblyArgc = argc - managedArgvOffset; + if (*managedAssemblyArgc != 0) + { + *managedAssemblyArgv = &argv[managedArgvOffset]; + } + success = true; + break; + } + } + } + else + { + DisplayUsage(); + } + + return success; +} + +int corerun(const int argc, const char* argv[]) +{ + const char* clrFilesPath; + const char* managedAssemblyPath; + const char** managedAssemblyArgv; + int managedAssemblyArgc; + + if (!ParseArguments( + argc, + argv, + &clrFilesPath, + &managedAssemblyPath, + &managedAssemblyArgc, + &managedAssemblyArgv)) + { + // Invalid command line + return -1; + } + + // Check if the specified managed assembly file exists + struct stat sb; + if (stat(managedAssemblyPath, &sb) == -1) + { + perror("Managed assembly not found"); + return -1; + } + + // Verify that the managed assembly path points to a file + if (!S_ISREG(sb.st_mode)) + { + fprintf(stderr, "The specified managed assembly is not a file\n"); + return -1; + } + + // Make sure we have a full path for argv[0]. + std::string argv0AbsolutePath; + if (!GetAbsolutePath(argv[0], argv0AbsolutePath)) + { + perror("Could not get full path"); + return -1; + } + + std::string clrFilesAbsolutePath; + if(!GetClrFilesAbsolutePath(argv0AbsolutePath.c_str(), clrFilesPath, clrFilesAbsolutePath)) + { + return -1; + } + + std::string managedAssemblyAbsolutePath; + if (!GetAbsolutePath(managedAssemblyPath, managedAssemblyAbsolutePath)) + { + perror("Failed to convert managed assembly path to absolute path"); + return -1; + } + + int exitCode = ExecuteManagedAssembly( + argv0AbsolutePath.c_str(), + clrFilesAbsolutePath.c_str(), + managedAssemblyAbsolutePath.c_str(), + managedAssemblyArgc, + managedAssemblyArgv); + + return exitCode; +} + +int main(const int argc, const char* argv[]) +{ + return corerun(argc, argv); +} |