16d528ed9Sopenharmony_ci// Copyright (c) 2011 The Chromium Authors. All rights reserved.
26d528ed9Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be
36d528ed9Sopenharmony_ci// found in the LICENSE file.
46d528ed9Sopenharmony_ci
56d528ed9Sopenharmony_ci#include "base/files/file_util.h"
66d528ed9Sopenharmony_ci
76d528ed9Sopenharmony_ci#include <errno.h>
86d528ed9Sopenharmony_ci#include <linux/magic.h>
96d528ed9Sopenharmony_ci#include <sys/vfs.h>
106d528ed9Sopenharmony_ci
116d528ed9Sopenharmony_ci#include "base/files/file_path.h"
126d528ed9Sopenharmony_ci
136d528ed9Sopenharmony_cinamespace base {
146d528ed9Sopenharmony_ci
156d528ed9Sopenharmony_cibool GetFileSystemType(const FilePath& path, FileSystemType* type) {
166d528ed9Sopenharmony_ci  struct statfs statfs_buf;
176d528ed9Sopenharmony_ci  if (statfs(path.value().c_str(), &statfs_buf) < 0) {
186d528ed9Sopenharmony_ci    if (errno == ENOENT)
196d528ed9Sopenharmony_ci      return false;
206d528ed9Sopenharmony_ci    *type = FILE_SYSTEM_UNKNOWN;
216d528ed9Sopenharmony_ci    return true;
226d528ed9Sopenharmony_ci  }
236d528ed9Sopenharmony_ci
246d528ed9Sopenharmony_ci  // Not all possible |statfs_buf.f_type| values are in linux/magic.h.
256d528ed9Sopenharmony_ci  // Missing values are copied from the statfs man page.
266d528ed9Sopenharmony_ci  switch (statfs_buf.f_type) {
276d528ed9Sopenharmony_ci    case 0:
286d528ed9Sopenharmony_ci      *type = FILE_SYSTEM_0;
296d528ed9Sopenharmony_ci      break;
306d528ed9Sopenharmony_ci    case EXT2_SUPER_MAGIC:  // Also ext3 and ext4
316d528ed9Sopenharmony_ci    case MSDOS_SUPER_MAGIC:
326d528ed9Sopenharmony_ci    case REISERFS_SUPER_MAGIC:
336d528ed9Sopenharmony_ci    case BTRFS_SUPER_MAGIC:
346d528ed9Sopenharmony_ci    case 0x5346544E:  // NTFS
356d528ed9Sopenharmony_ci    case 0x58465342:  // XFS
366d528ed9Sopenharmony_ci    case 0x3153464A:  // JFS
376d528ed9Sopenharmony_ci      *type = FILE_SYSTEM_ORDINARY;
386d528ed9Sopenharmony_ci      break;
396d528ed9Sopenharmony_ci    case NFS_SUPER_MAGIC:
406d528ed9Sopenharmony_ci      *type = FILE_SYSTEM_NFS;
416d528ed9Sopenharmony_ci      break;
426d528ed9Sopenharmony_ci    case SMB_SUPER_MAGIC:
436d528ed9Sopenharmony_ci    case 0xFF534D42:  // CIFS
446d528ed9Sopenharmony_ci      *type = FILE_SYSTEM_SMB;
456d528ed9Sopenharmony_ci      break;
466d528ed9Sopenharmony_ci    case CODA_SUPER_MAGIC:
476d528ed9Sopenharmony_ci      *type = FILE_SYSTEM_CODA;
486d528ed9Sopenharmony_ci      break;
496d528ed9Sopenharmony_ci    case HUGETLBFS_MAGIC:
506d528ed9Sopenharmony_ci    case RAMFS_MAGIC:
516d528ed9Sopenharmony_ci    case TMPFS_MAGIC:
526d528ed9Sopenharmony_ci      *type = FILE_SYSTEM_MEMORY;
536d528ed9Sopenharmony_ci      break;
546d528ed9Sopenharmony_ci    case CGROUP_SUPER_MAGIC:
556d528ed9Sopenharmony_ci      *type = FILE_SYSTEM_CGROUP;
566d528ed9Sopenharmony_ci      break;
576d528ed9Sopenharmony_ci    default:
586d528ed9Sopenharmony_ci      *type = FILE_SYSTEM_OTHER;
596d528ed9Sopenharmony_ci  }
606d528ed9Sopenharmony_ci  return true;
616d528ed9Sopenharmony_ci}
626d528ed9Sopenharmony_ci
636d528ed9Sopenharmony_ci}  // namespace base
64