Line |
Branch |
Exec |
Source |
1 |
|
|
/** |
2 |
|
|
* This file is part of the CernVM File System. |
3 |
|
|
*/ |
4 |
|
|
|
5 |
|
|
#ifndef CVMFS_UTIL_POSIX_H_ |
6 |
|
|
#define CVMFS_UTIL_POSIX_H_ |
7 |
|
|
|
8 |
|
|
#include <pthread.h> |
9 |
|
|
#include <sys/stat.h> |
10 |
|
|
#include <sys/types.h> |
11 |
|
|
#include <sys/uio.h> |
12 |
|
|
#include <unistd.h> |
13 |
|
|
|
14 |
|
|
#include <cassert> |
15 |
|
|
#include <cerrno> |
16 |
|
|
#include <cstddef> |
17 |
|
|
#include <map> |
18 |
|
|
#include <set> |
19 |
|
|
#include <string> |
20 |
|
|
#include <vector> |
21 |
|
|
|
22 |
|
|
#include "util/export.h" |
23 |
|
|
#include "util/pointer.h" |
24 |
|
|
#include "util/single_copy.h" |
25 |
|
|
|
26 |
|
|
#ifdef CVMFS_NAMESPACE_GUARD |
27 |
|
|
namespace CVMFS_NAMESPACE_GUARD { |
28 |
|
|
#endif |
29 |
|
|
|
30 |
|
|
const unsigned kPageSize = 4096; |
31 |
|
|
const size_t kMaxPathLength = 256; |
32 |
|
|
const int kDefaultFileMode = S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH; |
33 |
|
|
const int kDefaultDirMode = S_IXUSR | S_IWUSR | S_IRUSR | |
34 |
|
|
S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; |
35 |
|
|
const int kPrivateFileMode = S_IWUSR | S_IRUSR; |
36 |
|
|
const int kPrivateDirMode = S_IXUSR | S_IWUSR | S_IRUSR; |
37 |
|
|
|
38 |
|
|
/** |
39 |
|
|
* The magic numbers that identify a file system in statfs() |
40 |
|
|
* Adjust GetFileSystemInfo() when new file systems are added |
41 |
|
|
*/ |
42 |
|
|
enum EFileSystemTypes { |
43 |
|
|
kFsTypeUnknown = 0, |
44 |
|
|
kFsTypeAutofs = 0x0187, |
45 |
|
|
kFsTypeNFS = 0x6969, |
46 |
|
|
kFsTypeProc = 0x9fa0, |
47 |
|
|
kFsTypeBeeGFS = 0x19830326, |
48 |
|
|
// TMPFS_MAGIC from linux/magic.h; does not exist on mac |
49 |
|
|
// TODO(heretherebedragons): Might need some check for apple in the future |
50 |
|
|
kFsTypeTmpfs = 0x01021994 |
51 |
|
|
}; |
52 |
|
|
|
53 |
|
|
struct CVMFS_EXPORT FileSystemInfo { |
54 |
|
174 |
FileSystemInfo() : type(kFsTypeUnknown), is_rdonly(false) {} |
55 |
|
|
EFileSystemTypes type; |
56 |
|
|
bool is_rdonly; |
57 |
|
|
}; |
58 |
|
|
|
59 |
|
|
struct CVMFS_EXPORT LsofEntry { |
60 |
|
|
pid_t pid; |
61 |
|
|
uid_t owner; |
62 |
|
|
bool read_only; |
63 |
|
|
std::string executable; |
64 |
|
|
std::string path; |
65 |
|
|
|
66 |
|
15 |
LsofEntry() : pid(0), owner(0), read_only(false) {} |
67 |
|
|
}; |
68 |
|
|
|
69 |
|
|
CVMFS_EXPORT std::string MakeCanonicalPath(const std::string &path); |
70 |
|
|
CVMFS_EXPORT std::string GetParentPath(const std::string &path); |
71 |
|
|
CVMFS_EXPORT std::string GetFileName(const std::string &path); |
72 |
|
|
CVMFS_EXPORT void SplitPath(const std::string &path, |
73 |
|
|
std::string *dirname, |
74 |
|
|
std::string *filename); |
75 |
|
|
CVMFS_EXPORT bool IsAbsolutePath(const std::string &path); |
76 |
|
|
CVMFS_EXPORT std::string GetAbsolutePath(const std::string &path); |
77 |
|
|
CVMFS_EXPORT bool IsHttpUrl(const std::string &path); |
78 |
|
|
|
79 |
|
|
CVMFS_EXPORT std::string ReadSymlink(const std::string &path); |
80 |
|
|
CVMFS_EXPORT std::string ResolvePath(const std::string &path); |
81 |
|
|
CVMFS_EXPORT bool IsMountPoint(const std::string &path); |
82 |
|
|
CVMFS_EXPORT FileSystemInfo GetFileSystemInfo(const std::string &path); |
83 |
|
|
|
84 |
|
|
CVMFS_EXPORT void CreateFile(const std::string &path, const int mode, |
85 |
|
|
const bool ignore_failure = false); |
86 |
|
|
CVMFS_EXPORT int MakeSocket(const std::string &path, const int mode); |
87 |
|
|
CVMFS_EXPORT int MakeTcpEndpoint(const std::string &ipv4_address, int portno); |
88 |
|
|
CVMFS_EXPORT int ConnectSocket(const std::string &path); |
89 |
|
|
CVMFS_EXPORT int ConnectTcpEndpoint(const std::string &ipv4_address, |
90 |
|
|
int portno); |
91 |
|
|
CVMFS_EXPORT void MakePipe(int pipe_fd[2]); |
92 |
|
|
CVMFS_EXPORT void WritePipe(int fd, const void *buf, size_t nbyte); |
93 |
|
|
CVMFS_EXPORT void ReadPipe(int fd, void *buf, size_t nbyte); |
94 |
|
|
CVMFS_EXPORT bool ReadHalfPipe(int fd, void *buf, size_t nbyte, unsigned timeout_ms = 0); |
95 |
|
|
CVMFS_EXPORT void ClosePipe(int pipe_fd[2]); |
96 |
|
|
CVMFS_EXPORT bool DiffTree(const std::string &path_a, |
97 |
|
|
const std::string &path_b); |
98 |
|
|
|
99 |
|
|
CVMFS_EXPORT void Nonblock2Block(int filedes); |
100 |
|
|
CVMFS_EXPORT void Block2Nonblock(int filedes); |
101 |
|
|
CVMFS_EXPORT void SendMsg2Socket(const int fd, const std::string &msg); |
102 |
|
|
CVMFS_EXPORT bool SendFd2Socket(int socket_fd, int passing_fd); |
103 |
|
|
CVMFS_EXPORT int RecvFdFromSocket(int msg_fd); |
104 |
|
|
CVMFS_EXPORT std::string GetHostname(); |
105 |
|
|
|
106 |
|
|
CVMFS_EXPORT bool SwitchCredentials(const uid_t uid, const gid_t gid, |
107 |
|
|
const bool temporarily); |
108 |
|
|
|
109 |
|
|
CVMFS_EXPORT bool FileExists(const std::string &path); |
110 |
|
|
CVMFS_EXPORT int64_t GetFileSize(const std::string &path); |
111 |
|
|
CVMFS_EXPORT bool DirectoryExists(const std::string &path); |
112 |
|
|
CVMFS_EXPORT bool SymlinkExists(const std::string &path); |
113 |
|
|
CVMFS_EXPORT bool SymlinkForced(const std::string &src, |
114 |
|
|
const std::string &dest); |
115 |
|
|
CVMFS_EXPORT bool MkdirDeep(const std::string &path, const mode_t mode, |
116 |
|
|
bool verify_writable = true); |
117 |
|
|
CVMFS_EXPORT bool MakeCacheDirectories(const std::string &path, |
118 |
|
|
const mode_t mode); |
119 |
|
|
CVMFS_EXPORT FILE *CreateTempFile(const std::string &path_prefix, |
120 |
|
|
const int mode, |
121 |
|
|
const char *open_flags, |
122 |
|
|
std::string *final_path); |
123 |
|
|
CVMFS_EXPORT std::string CreateTempPath(const std::string &path_prefix, |
124 |
|
|
const int mode); |
125 |
|
|
CVMFS_EXPORT std::string CreateTempDir(const std::string &path_prefix); |
126 |
|
|
CVMFS_EXPORT std::string GetCurrentWorkingDirectory(); |
127 |
|
|
CVMFS_EXPORT int TryLockFile(const std::string &path); |
128 |
|
|
CVMFS_EXPORT int LockFile(const std::string &path); |
129 |
|
|
CVMFS_EXPORT int WritePidFile(const std::string &path); |
130 |
|
|
CVMFS_EXPORT void UnlockFile(const int filedes); |
131 |
|
|
CVMFS_EXPORT bool RemoveTree(const std::string &path); |
132 |
|
|
CVMFS_EXPORT |
133 |
|
|
std::vector<std::string> FindFilesBySuffix(const std::string &dir, |
134 |
|
|
const std::string &suffix); |
135 |
|
|
CVMFS_EXPORT |
136 |
|
|
std::vector<std::string> FindFilesByPrefix(const std::string &dir, |
137 |
|
|
const std::string &prefix); |
138 |
|
|
CVMFS_EXPORT |
139 |
|
|
std::vector<std::string> FindDirectories(const std::string &parent_dir); |
140 |
|
|
CVMFS_EXPORT std::string FindExecutable(const std::string &exe); |
141 |
|
|
CVMFS_EXPORT bool ListDirectory(const std::string &directory, |
142 |
|
|
std::vector<std::string> *names, |
143 |
|
|
std::vector<mode_t> *modes); |
144 |
|
|
|
145 |
|
|
CVMFS_EXPORT std::string GetUserName(); |
146 |
|
|
CVMFS_EXPORT std::string GetShell(); |
147 |
|
|
CVMFS_EXPORT bool GetUserNameOf(uid_t uid, std::string *username); |
148 |
|
|
CVMFS_EXPORT bool GetUidOf(const std::string &username, |
149 |
|
|
uid_t *uid, |
150 |
|
|
gid_t *main_gid); |
151 |
|
|
CVMFS_EXPORT bool GetGidOf(const std::string &groupname, gid_t *gid); |
152 |
|
|
CVMFS_EXPORT mode_t GetUmask(); |
153 |
|
|
CVMFS_EXPORT bool AddGroup2Persona(const gid_t gid); |
154 |
|
|
CVMFS_EXPORT std::string GetHomeDirectory(); |
155 |
|
|
|
156 |
|
|
CVMFS_EXPORT std::string GetArch(); |
157 |
|
|
|
158 |
|
|
CVMFS_EXPORT int SetLimitNoFile(unsigned limit_nofile); |
159 |
|
|
CVMFS_EXPORT void GetLimitNoFile(unsigned *soft_limit, unsigned *hard_limit); |
160 |
|
|
|
161 |
|
|
/** |
162 |
|
|
* Searches for open file descriptors on the subtree starting at path. |
163 |
|
|
* For the time being works only on Linux, not on macOS. |
164 |
|
|
*/ |
165 |
|
|
CVMFS_EXPORT std::vector<LsofEntry> Lsof(const std::string &path); |
166 |
|
|
|
167 |
|
|
CVMFS_EXPORT bool ProcessExists(pid_t pid); |
168 |
|
|
CVMFS_EXPORT void BlockSignal(int signum); |
169 |
|
|
CVMFS_EXPORT void WaitForSignal(int signum); |
170 |
|
|
CVMFS_EXPORT |
171 |
|
|
int WaitForChild(pid_t pid, |
172 |
|
|
const std::vector<int> &sig_ok = std::vector<int>()); |
173 |
|
|
CVMFS_EXPORT void Daemonize(); |
174 |
|
|
CVMFS_EXPORT bool ExecAsDaemon(const std::vector<std::string> &command_line, |
175 |
|
|
pid_t *child_pid = NULL); |
176 |
|
|
CVMFS_EXPORT bool Shell(int *pipe_stdin, int *pipe_stdout, int *pipe_stderr); |
177 |
|
|
CVMFS_EXPORT bool ExecuteBinary(int *fd_stdin, |
178 |
|
|
int *fd_stdout, |
179 |
|
|
int *fd_stderr, |
180 |
|
|
const std::string &binary_path, |
181 |
|
|
const std::vector<std::string> &argv, |
182 |
|
|
const bool double_fork = true, |
183 |
|
|
pid_t *child_pid = NULL); |
184 |
|
|
CVMFS_EXPORT bool ManagedExec(const std::vector<std::string> &command_line, |
185 |
|
|
const std::set<int> &preserve_fildes, |
186 |
|
|
const std::map<int, int> &map_fildes, |
187 |
|
|
const bool drop_credentials, |
188 |
|
|
const bool clear_env = false, |
189 |
|
|
const bool double_fork = true, |
190 |
|
|
pid_t *child_pid = NULL); |
191 |
|
|
CVMFS_EXPORT bool CloseAllFildes(const std::set<int> &preserve_fildes); |
192 |
|
|
|
193 |
|
|
CVMFS_EXPORT void SafeSleepMs(const unsigned ms); |
194 |
|
|
// Note that SafeWrite cannot return partial results but |
195 |
|
|
// SafeRead can (as we may have hit the EOF). |
196 |
|
|
CVMFS_EXPORT ssize_t SafeRead(int fd, void *buf, size_t nbyte); |
197 |
|
|
CVMFS_EXPORT bool SafeWrite(int fd, const void *buf, size_t nbyte); |
198 |
|
|
CVMFS_EXPORT bool SafeWriteV(int fd, struct iovec *iov, unsigned iovcnt); |
199 |
|
|
|
200 |
|
|
// Read the contents of a file descriptor to a string. |
201 |
|
|
CVMFS_EXPORT bool SafeReadToString(int fd, std::string *final_result); |
202 |
|
|
CVMFS_EXPORT bool SafeWriteToFile(const std::string &content, |
203 |
|
|
const std::string &path, int mode); |
204 |
|
|
|
205 |
|
|
#ifdef CVMFS_NAMESPACE_GUARD |
206 |
|
|
} // namespace CVMFS_NAMESPACE_GUARD |
207 |
|
|
#endif |
208 |
|
|
|
209 |
|
|
#endif // CVMFS_UTIL_POSIX_H_ |
210 |
|
|
|