FileSystem.hxx 3.55 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 * Copyright (C) 2003-2013 The Music Player Daemon Project
 * http://www.musicpd.org
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

20 21
#ifndef MPD_FS_FILESYSTEM_HXX
#define MPD_FS_FILESYSTEM_HXX
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

#include "check.h"
#include "fd_util.h"

#include "Path.hxx"

#include <sys/stat.h>
#include <unistd.h>
#include <assert.h>
#include <stdio.h>

namespace FOpenMode {
/**
 * Open mode for reading text files.
 */
constexpr Path::const_pointer ReadText = "r";

/**
 * Open mode for reading binary files.
 */
constexpr Path::const_pointer ReadBinary = "rb";

/**
 * Open mode for writing text files.
 */
constexpr Path::const_pointer WriteText = "w";

/**
 * Open mode for writing binary files.
 */
constexpr Path::const_pointer WriteBinary = "wb";
53 54 55 56 57 58 59 60 61 62

/**
 * Open mode for appending text files.
 */
constexpr Path::const_pointer AppendText = "a";

/**
 * Open mode for appending binary files.
 */
constexpr Path::const_pointer AppendBinary = "ab";
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
}

/**
 * Wrapper for fopen() that uses #Path names.
 */
static inline FILE *FOpen(const Path &file, Path::const_pointer mode)
{
	return fopen(file.c_str(), mode);
}

/**
 * Wrapper for open_cloexec() that uses #Path names.
 */
static inline int OpenFile(const Path &file, int flags, int mode)
{
	return open_cloexec(file.c_str(), flags, mode);
}

/**
 * Wrapper for rename() that uses #Path names.
 */
84
static inline bool RenameFile(const Path &oldpath, const Path &newpath)
85
{
86
	return rename(oldpath.c_str(), newpath.c_str()) == 0;
87 88 89 90 91
}

/**
 * Wrapper for stat() that uses #Path names.
 */
92 93
static inline bool StatFile(const Path &file, struct stat &buf,
			    bool follow_symlinks = true)
94
{
95 96 97 98 99 100 101 102 103
#ifdef WIN32
	(void)follow_symlinks;
	return stat(file.c_str(), &buf) == 0;
#else
	int ret = follow_symlinks
		? stat(file.c_str(), &buf)
		: lstat(file.c_str(), &buf);
	return ret == 0;
#endif
104 105 106 107 108
}

/**
 * Wrapper for unlink() that uses #Path names.
 */
109
static inline bool RemoveFile(const Path &file)
110
{
111
	return unlink(file.c_str()) == 0;
112 113 114 115 116
}

/**
 * Wrapper for readlink() that uses #Path names.
 */
117
Path ReadLink(const Path &path);
118 119 120 121

/**
 * Wrapper for access() that uses #Path names.
 */
122
static inline bool CheckAccess(const Path &path, int mode)
123 124 125 126
{
#ifdef WIN32
	(void)path;
	(void)mode;
127
	return true;
128
#else
129
	return access(path.c_str(), mode) == 0;
130 131 132 133
#endif
}

/**
134
 * Checks if #Path exists and is a regular file.
135
 */
136 137
static inline bool FileExists(const Path &path,
			      bool follow_symlinks = true)
138 139
{
	struct stat buf;
140
	return StatFile(path, buf, follow_symlinks) && S_ISREG(buf.st_mode);
141 142 143
}

/**
144
 * Checks if #Path exists and is a directory.
145
 */
146 147
static inline bool DirectoryExists(const Path &path,
				   bool follow_symlinks = true)
148 149
{
	struct stat buf;
150
	return StatFile(path, buf, follow_symlinks) && S_ISDIR(buf.st_mode);
151 152 153 154 155
}

/**
 * Checks if #Path exists.
 */
156 157
static inline bool PathExists(const Path &path,
			      bool follow_symlinks = true)
158 159
{
	struct stat buf;
160
	return StatFile(path, buf, follow_symlinks);
161 162 163
}

#endif