|  | // Copyright 2020 the V8 project authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  | // Copyright 2019 Google LLC | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | // https://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | #ifndef __LIBREPRL_H__ | 
|  | #define __LIBREPRL_H__ | 
|  |  | 
|  | #include <stdint.h> | 
|  | #include <sys/types.h> | 
|  |  | 
|  | /// Maximum size for data transferred through REPRL. In particular, this is the | 
|  | /// maximum size of scripts that can be executed. Currently, this is 16MB. | 
|  | /// Executing a 16MB script file is very likely to take longer than the typical | 
|  | /// timeout, so the limit on script size shouldn't be a problem in practice. | 
|  | #define REPRL_MAX_DATA_SIZE (16 << 20) | 
|  |  | 
|  | /// Opaque struct representing a REPRL execution context. | 
|  | struct reprl_context; | 
|  |  | 
|  | /// Allocates a new REPRL context. | 
|  | /// @return an uninitialzed REPRL context | 
|  | struct reprl_context* reprl_create_context(); | 
|  |  | 
|  | /// Initializes a REPRL context. | 
|  | /// @param ctx An uninitialized context | 
|  | /// @param argv The argv vector for the child processes | 
|  | /// @param envp The envp vector for the child processes | 
|  | /// @param capture_stdout Whether this REPRL context should capture the child's | 
|  | /// stdout | 
|  | /// @param capture_stderr Whether this REPRL context should capture the child's | 
|  | /// stderr | 
|  | /// @return zero in case of no errors, otherwise a negative value | 
|  | int reprl_initialize_context(struct reprl_context* ctx, const char** argv, | 
|  | const char** envp, int capture_stdout, | 
|  | int capture_stderr); | 
|  |  | 
|  | /// Destroys a REPRL context, freeing all resources held by it. | 
|  | /// @param ctx The context to destroy | 
|  | void reprl_destroy_context(struct reprl_context* ctx); | 
|  |  | 
|  | /// Executes the provided script in the target process, wait for its completion, | 
|  | /// and return the result. If necessary, or if fresh_instance is true, this will | 
|  | /// automatically spawn a new instance of the target process. | 
|  | /// | 
|  | /// @param ctx The REPRL context | 
|  | /// @param script The script to execute | 
|  | /// @param script_length The size of the script in bytes | 
|  | /// @param timeout The maximum allowed execution time in milliseconds | 
|  | /// @param execution_time A pointer to which, if execution succeeds, the | 
|  | /// execution time in milliseconds is written to | 
|  | /// @param fresh_instance if true, forces the creation of a new instance of the | 
|  | /// target | 
|  | /// @return A REPRL exit status (see below) or a negative number in case of an | 
|  | /// error | 
|  | int reprl_execute(struct reprl_context* ctx, const char* script, | 
|  | uint64_t script_length, uint64_t timeout, | 
|  | uint64_t* execution_time, int fresh_instance); | 
|  |  | 
|  | /// Returns true if the execution terminated due to a signal. | 
|  | int RIFSIGNALED(int status); | 
|  |  | 
|  | /// Returns true if the execution finished normally. | 
|  | int RIFEXITED(int status); | 
|  |  | 
|  | /// Returns true if the execution terminated due to a timeout. | 
|  | int RIFTIMEDOUT(int status); | 
|  |  | 
|  | /// Returns the terminating signal in case RIFSIGNALED is true. | 
|  | int RTERMSIG(int status); | 
|  |  | 
|  | /// Returns the exit status in case RIFEXITED is true. | 
|  | int REXITSTATUS(int status); | 
|  |  | 
|  | /// Returns the stdout data of the last successful execution if the context is | 
|  | /// capturing stdout, otherwise an empty string. The output is limited to | 
|  | /// REPRL_MAX_FAST_IO_SIZE (currently 16MB). | 
|  | /// @param ctx The REPRL context | 
|  | /// @return A string pointer which is owned by the REPRL context and thus should | 
|  | /// not be freed by the caller | 
|  | const char* reprl_fetch_stdout(struct reprl_context* ctx); | 
|  |  | 
|  | /// Returns the stderr data of the last successful execution if the context is | 
|  | /// capturing stderr, otherwise an empty string. The output is limited to | 
|  | /// REPRL_MAX_FAST_IO_SIZE (currently 16MB). | 
|  | /// @param ctx The REPRL context | 
|  | /// @return A string pointer which is owned by the REPRL context and thus should | 
|  | /// not be freed by the caller | 
|  | const char* reprl_fetch_stderr(struct reprl_context* ctx); | 
|  |  | 
|  | /// Returns the fuzzout data of the last successful execution. | 
|  | /// The output is limited to REPRL_MAX_FAST_IO_SIZE (currently 16MB). | 
|  | /// @param ctx The REPRL context | 
|  | /// @return A string pointer which is owned by the REPRL context and thus should | 
|  | /// not be freed by the caller | 
|  | const char* reprl_fetch_fuzzout(struct reprl_context* ctx); | 
|  |  | 
|  | /// Returns a string describing the last error that occurred in the given | 
|  | /// context. | 
|  | /// @param ctx The REPRL context | 
|  | /// @return A string pointer which is owned by the REPRL context and thus should | 
|  | /// not be freed by the caller | 
|  | const char* reprl_get_last_error(struct reprl_context* ctx); | 
|  |  | 
|  | #endif |