| #ifndef _LIBEXPERIMENTS_UTILS_H_ |
| #define _LIBEXPERIMENTS_UTILS_H_ |
| |
| #include <stdint.h> |
| #include <sys/time.h> |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #include <unistd.h> |
| |
| #include <string> |
| #include <ostream> |
| #include <vector> |
| |
| // |
| // Subset of utils functions copied from vendor/google/mcastcapture/utils/. |
| // |
| |
| // Namespace is needed to avoid conflicts when other modules with identical |
| // function names are linking against libexperiments.so. |
| namespace libexperiments_utils { |
| |
| #define MAX(x, y) ((x) > (y) ? (x) : (y)) |
| #define MIN(x, y) ((x) < (y) ? (x) : (y)) |
| |
| const int64_t kUsecsPerSec = 1000000LL; |
| const int64_t kNsecsPerSec = 1000000000LL; |
| const int64_t kNsecsPerUsec = 1000LL; |
| |
| static inline int64_t secs_to_usecs(int64_t secs) { |
| return secs * kUsecsPerSec; |
| } |
| |
| void log(const char* cstr, ...) |
| __attribute__((format(printf, 1, 2))); |
| |
| void log_perror(int err, const char* cstr, ...) |
| __attribute__((format(printf, 2, 3))); |
| |
| // Measures elapsed time in usecs. |
| uint64_t us_elapse(uint64_t start_time_us); |
| |
| void us_sleep(uint64_t usecs); |
| |
| static inline bool file_exists(const char *name) { |
| return access(name, F_OK) == 0; |
| } |
| |
| static inline bool directory_exists(const char *path) { |
| struct stat dir_stat; |
| if (stat(path, &dir_stat) != 0) { |
| return false; |
| } |
| return S_ISDIR(dir_stat.st_mode); |
| } |
| |
| // This function runs the command cmd (but not in a shell), providing the |
| // return code, stdout, and stderr. It also allows to specify the stdin, |
| // and a command timeout value (timeout_usec, use <0 to block indefinitely). |
| // Note that the timeout is fired only if the command stops producing |
| // either stdout or stderr. A process that periodically produces output |
| // will never be killed. |
| // Returns an extended error code: |
| // - 0 if everything is successful, |
| // -1 if any step fails, |
| // -2 if timeout, and |
| // -3 if the command output (stdout+stderr) is too large (kMaxRunCmdOutput). |
| int run_cmd(const std::vector<std::string> &cmd, const std::string &in, |
| int *status, |
| std::ostream *out, |
| std::ostream *err, |
| int64_t timeout_usec); |
| |
| // |
| // String printf functions, ported from stringprintf.cc/h |
| // |
| |
| // Return a C++ string |
| std::string StringPrintf(const char* format, ...) |
| __attribute__((format(printf, 1, 2))); |
| |
| } // namespace libexperiments_utils |
| |
| #endif // _LIBEXPERIMENTS_UTILS_H_ |