15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/files/file_util.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <errno.h> 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <linux/magic.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/vfs.h> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/file_path.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Make sure some of the newer macros from magic.h are defined. 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO(mostynb@opera.com): remove this after 2014. 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef BTRFS_SUPER_MAGIC 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define BTRFS_SUPER_MAGIC 0x9123683E 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef HUGETLBFS_MAGIC 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define HUGETLBFS_MAGIC 0x958458f6 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef RAMFS_MAGIC 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define RAMFS_MAGIC 0x858458f6 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef TMPFS_MAGIC 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define TMPFS_MAGIC 0x01021994 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace base { 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool GetFileSystemType(const FilePath& path, FileSystemType* type) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct statfs statfs_buf; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (statfs(path.value().c_str(), &statfs_buf) < 0) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (errno == ENOENT) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *type = FILE_SYSTEM_UNKNOWN; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Not all possible |statfs_buf.f_type| values are in linux/magic.h. 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Missing values are copied from the statfs man page. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (statfs_buf.f_type) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 0: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *type = FILE_SYSTEM_0; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case EXT2_SUPER_MAGIC: // Also ext3 and ext4 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case MSDOS_SUPER_MAGIC: 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case REISERFS_SUPER_MAGIC: 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case BTRFS_SUPER_MAGIC: 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case 0x5346544E: // NTFS 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 0x58465342: // XFS 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 0x3153464A: // JFS 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *type = FILE_SYSTEM_ORDINARY; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case NFS_SUPER_MAGIC: 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *type = FILE_SYSTEM_NFS; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case SMB_SUPER_MAGIC: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 0xFF534D42: // CIFS 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *type = FILE_SYSTEM_SMB; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case CODA_SUPER_MAGIC: 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *type = FILE_SYSTEM_CODA; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case HUGETLBFS_MAGIC: 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case RAMFS_MAGIC: 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case TMPFS_MAGIC: 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *type = FILE_SYSTEM_MEMORY; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case CGROUP_SUPER_MAGIC: 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *type = FILE_SYSTEM_CGROUP; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *type = FILE_SYSTEM_OTHER; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace base 79