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