1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #include "base/files/file_util.h" 6*635a8641SAndroid Build Coastguard Worker 7*635a8641SAndroid Build Coastguard Worker #include <errno.h> 8*635a8641SAndroid Build Coastguard Worker #include <linux/magic.h> 9*635a8641SAndroid Build Coastguard Worker #include <stdint.h> 10*635a8641SAndroid Build Coastguard Worker #include <sys/vfs.h> 11*635a8641SAndroid Build Coastguard Worker 12*635a8641SAndroid Build Coastguard Worker #include "base/files/file_path.h" 13*635a8641SAndroid Build Coastguard Worker 14*635a8641SAndroid Build Coastguard Worker namespace base { 15*635a8641SAndroid Build Coastguard Worker GetFileSystemType(const FilePath & path,FileSystemType * type)16*635a8641SAndroid Build Coastguard Workerbool GetFileSystemType(const FilePath& path, FileSystemType* type) { 17*635a8641SAndroid Build Coastguard Worker struct statfs statfs_buf; 18*635a8641SAndroid Build Coastguard Worker if (statfs(path.value().c_str(), &statfs_buf) < 0) { 19*635a8641SAndroid Build Coastguard Worker if (errno == ENOENT) 20*635a8641SAndroid Build Coastguard Worker return false; 21*635a8641SAndroid Build Coastguard Worker *type = FILE_SYSTEM_UNKNOWN; 22*635a8641SAndroid Build Coastguard Worker return true; 23*635a8641SAndroid Build Coastguard Worker } 24*635a8641SAndroid Build Coastguard Worker 25*635a8641SAndroid Build Coastguard Worker // Not all possible |statfs_buf.f_type| values are in linux/magic.h. 26*635a8641SAndroid Build Coastguard Worker // Missing values are copied from the statfs man page. 27*635a8641SAndroid Build Coastguard Worker // In some platforms, |statfs_buf.f_type| is declared as signed, but some of 28*635a8641SAndroid Build Coastguard Worker // the values will overflow it, causing narrowing warnings. Cast to the 29*635a8641SAndroid Build Coastguard Worker // largest possible unsigned integer type to avoid it. 30*635a8641SAndroid Build Coastguard Worker switch (static_cast<uintmax_t>(statfs_buf.f_type)) { 31*635a8641SAndroid Build Coastguard Worker case 0: 32*635a8641SAndroid Build Coastguard Worker *type = FILE_SYSTEM_0; 33*635a8641SAndroid Build Coastguard Worker break; 34*635a8641SAndroid Build Coastguard Worker case EXT2_SUPER_MAGIC: // Also ext3 and ext4 35*635a8641SAndroid Build Coastguard Worker case MSDOS_SUPER_MAGIC: 36*635a8641SAndroid Build Coastguard Worker case REISERFS_SUPER_MAGIC: 37*635a8641SAndroid Build Coastguard Worker case BTRFS_SUPER_MAGIC: 38*635a8641SAndroid Build Coastguard Worker case 0x5346544E: // NTFS 39*635a8641SAndroid Build Coastguard Worker case 0x58465342: // XFS 40*635a8641SAndroid Build Coastguard Worker case 0x3153464A: // JFS 41*635a8641SAndroid Build Coastguard Worker *type = FILE_SYSTEM_ORDINARY; 42*635a8641SAndroid Build Coastguard Worker break; 43*635a8641SAndroid Build Coastguard Worker case NFS_SUPER_MAGIC: 44*635a8641SAndroid Build Coastguard Worker *type = FILE_SYSTEM_NFS; 45*635a8641SAndroid Build Coastguard Worker break; 46*635a8641SAndroid Build Coastguard Worker case SMB_SUPER_MAGIC: 47*635a8641SAndroid Build Coastguard Worker case 0xFF534D42: // CIFS 48*635a8641SAndroid Build Coastguard Worker *type = FILE_SYSTEM_SMB; 49*635a8641SAndroid Build Coastguard Worker break; 50*635a8641SAndroid Build Coastguard Worker case CODA_SUPER_MAGIC: 51*635a8641SAndroid Build Coastguard Worker *type = FILE_SYSTEM_CODA; 52*635a8641SAndroid Build Coastguard Worker break; 53*635a8641SAndroid Build Coastguard Worker case HUGETLBFS_MAGIC: 54*635a8641SAndroid Build Coastguard Worker case RAMFS_MAGIC: 55*635a8641SAndroid Build Coastguard Worker case TMPFS_MAGIC: 56*635a8641SAndroid Build Coastguard Worker *type = FILE_SYSTEM_MEMORY; 57*635a8641SAndroid Build Coastguard Worker break; 58*635a8641SAndroid Build Coastguard Worker case CGROUP_SUPER_MAGIC: 59*635a8641SAndroid Build Coastguard Worker *type = FILE_SYSTEM_CGROUP; 60*635a8641SAndroid Build Coastguard Worker break; 61*635a8641SAndroid Build Coastguard Worker default: 62*635a8641SAndroid Build Coastguard Worker *type = FILE_SYSTEM_OTHER; 63*635a8641SAndroid Build Coastguard Worker } 64*635a8641SAndroid Build Coastguard Worker return true; 65*635a8641SAndroid Build Coastguard Worker } 66*635a8641SAndroid Build Coastguard Worker 67*635a8641SAndroid Build Coastguard Worker } // namespace base 68