blob: a0ba38816d8976a0085d753c47afe01c5a1c985e [file] [log] [blame]
// Copyright 2015 The Bazel Authors. All rights reserved.
//
// 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
//
// http://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 PROCESS_TOOLS_H__
#define PROCESS_TOOLS_H__
#include <sys/types.h>
#include <stdbool.h>
// see
// http://stackoverflow.com/questions/5641427/how-to-make-preprocessor-generate-a-string-for-line-keyword
#define S(x) #x
#define S_(x) S(x)
#define S__LINE__ S_(__LINE__)
#define DIE(args...) \
{ \
fprintf(stderr, __FILE__ ":" S__LINE__ ": " args); \
exit(EXIT_FAILURE); \
}
#define CHECK_CALL(x) \
if ((x) == -1) { \
fprintf(stderr, __FILE__ ":" S__LINE__ ": "); \
perror(#x); \
exit(EXIT_FAILURE); \
}
#define CHECK_NOT_NULL(x) \
if (x == NULL) { \
perror(#x); \
exit(EXIT_FAILURE); \
}
// Switch completely to the effective uid.
// Some programs (notably, bash) ignore the euid and just use the uid. This
// limits the ability for us to use process-wrapper as a setuid binary for
// security/user-isolation.
int SwitchToEuid();
// Switch completely to the effective gid.
int SwitchToEgid();
// Redirect stdout to the file stdout_path (but not if stdout_path is "-").
void RedirectStdout(const char *stdout_path);
// Redirect stderr to the file stdout_path (but not if stderr_path is "-").
void RedirectStderr(const char *stderr_path);
// Make sure the process group "pgrp" and all its subprocesses are killed.
// If "gracefully" is true, sends SIGTERM first and after a timeout of
// "graceful_kill_delay" seconds, sends SIGKILL.
// If not, send SIGKILL immediately.
void KillEverything(int pgrp, bool gracefully, double graceful_kill_delay);
// Set up a signal handler for a signal.
void HandleSignal(int sig, void (*handler)(int));
// Revert signal handler for a signal to the default.
void UnHandle(int sig);
// Use an empty signal mask for the process and set all signal handlers to their
// default.
void ClearSignalMask();
// Receive SIGALRM after the given timeout. No-op if the timeout is
// non-positive.
void SetTimeout(double timeout_secs);
// Wait for "pid" to exit and return its exit code.
// "name" is used for the error message only.
int WaitChild(pid_t pid, const char *name);
#endif // PROCESS_TOOLS_H__