153ca1f3190680f3e86aebe0f72f7918d63f71e0dCharles Davis//===- llvm/Support/Unix/Unix.h - Common Unix Include File -------*- C++ -*-===// 2f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman// 3b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer// The LLVM Compiler Infrastructure 4b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman// 8b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer//===----------------------------------------------------------------------===// 9b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer// 10b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer// This file defines things specific to Unix implementations. 11b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer// 12b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer//===----------------------------------------------------------------------===// 13b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer 147c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#ifndef LLVM_SYSTEM_UNIX_UNIX_H 157c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#define LLVM_SYSTEM_UNIX_UNIX_H 167c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer 17b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer//===----------------------------------------------------------------------===// 18b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer//=== WARNING: Implementation here must contain only generic UNIX code that 19b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer//=== is guaranteed to work on all UNIX variants. 20b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer//===----------------------------------------------------------------------===// 21b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer 22551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Config/config.h" // Get autoconf configuration settings 237a9ff3d36c5bbf1f30795a5113978876e137031aMichael J. Spencer#include "llvm/Support/Errno.h" 24c3de9524268cfcd2d04fbf464d3b1dafc20f3e7cReid Spencer#include <cstdlib> 25c3de9524268cfcd2d04fbf464d3b1dafc20f3e7cReid Spencer#include <cstdio> 26c3de9524268cfcd2d04fbf464d3b1dafc20f3e7cReid Spencer#include <cstring> 27c3de9524268cfcd2d04fbf464d3b1dafc20f3e7cReid Spencer#include <cerrno> 287c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#include <string> 297c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#include <algorithm> 307c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer 317c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#ifdef HAVE_UNISTD_H 327c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#include <unistd.h> 337c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#endif 347c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer 357c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#ifdef HAVE_SYS_TYPES_H 36b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer#include <sys/types.h> 377c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#endif 387c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer 397c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#ifdef HAVE_SYS_PARAM_H 40b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer#include <sys/param.h> 41f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman#endif 427c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer 437c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#ifdef HAVE_ASSERT_H 44b60bf6171d031ef38948b40ef0f8de5233f9361cReid Spencer#include <assert.h> 457c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#endif 467c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer 478dab5047999c57cdcf24ff04e20a1f2c9a100d8fMichael J. Spencer#ifdef HAVE_SYS_TIME_H 487c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer# include <sys/time.h> 497c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#endif 508dab5047999c57cdcf24ff04e20a1f2c9a100d8fMichael J. Spencer#include <time.h> 517c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer 527c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#ifdef HAVE_SYS_WAIT_H 537c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer# include <sys/wait.h> 547c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#endif 557c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer 567c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#ifndef WEXITSTATUS 577c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) 587c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#endif 597c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer 607c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#ifndef WIFEXITED 617c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer# define WIFEXITED(stat_val) (((stat_val) & 255) == 0) 627c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#endif 63b89a2237ea79e0576fdb426b124f1940f53da159Reid Spencer 644ce5dc63778f36f61b510456783f15a224406e68Reid Spencer/// This function builds an error message into \p ErrMsg using the \p prefix 654ce5dc63778f36f61b510456783f15a224406e68Reid Spencer/// string and the Unix error number given by \p errnum. If errnum is -1, the 664ce5dc63778f36f61b510456783f15a224406e68Reid Spencer/// default then the value of errno is used. 674ce5dc63778f36f61b510456783f15a224406e68Reid Spencer/// @brief Make an error message 68a7f2a9e69fc53920640c4707cc8c4045d9ea7db9Daniel Dunbar/// 69a7f2a9e69fc53920640c4707cc8c4045d9ea7db9Daniel Dunbar/// If the error number can be converted to a string, it will be 70a7f2a9e69fc53920640c4707cc8c4045d9ea7db9Daniel Dunbar/// separated from prefix by ": ". 71844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic inline bool MakeErrMsg( 724ce5dc63778f36f61b510456783f15a224406e68Reid Spencer std::string* ErrMsg, const std::string& prefix, int errnum = -1) { 734ce5dc63778f36f61b510456783f15a224406e68Reid Spencer if (!ErrMsg) 745a060775da43ec2ef37e839e93a0805d543708a9Reid Spencer return true; 754ce5dc63778f36f61b510456783f15a224406e68Reid Spencer if (errnum == -1) 764ce5dc63778f36f61b510456783f15a224406e68Reid Spencer errnum = errno; 77ed1c0ffe0b2287deaee7cba7506c93aa34c6d4b7Jeffrey Yasskin *ErrMsg = prefix + ": " + llvm::sys::StrError(errnum); 785a060775da43ec2ef37e839e93a0805d543708a9Reid Spencer return true; 794ce5dc63778f36f61b510456783f15a224406e68Reid Spencer} 804ce5dc63778f36f61b510456783f15a224406e68Reid Spencer 817c1e2f96cdf87592736091ca9ec164c7e9d08d6dReid Spencer#endif 82