// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/file_util.h"

#include "base/files/file_path.h"

#include <errno.h>
#include <sys/vfs.h>

namespace file_util {

bool GetFileSystemType(const base::FilePath& path, FileSystemType* type) {
  struct statfs statfs_buf;
  if (statfs(path.value().c_str(), &statfs_buf) < 0) {
    if (errno == ENOENT)
      return false;
    *type = FILE_SYSTEM_UNKNOWN;
    return true;
  }

  // While you would think the possible values of f_type would be available
  // in a header somewhere, it appears that is not the case.  These values
  // are copied from the statfs man page.
  switch (statfs_buf.f_type) {
    case 0:
      *type = FILE_SYSTEM_0;
      break;
    case 0xEF53:  // ext2, ext3.
    case 0x4D44:  // dos
    case 0x5346544E:  // NFTS
    case 0x52654973:  // reiser
    case 0x58465342:  // XFS
    case 0x9123683E:  // btrfs
    case 0x3153464A:  // JFS
      *type = FILE_SYSTEM_ORDINARY;
      break;
    case 0x6969:  // NFS
      *type = FILE_SYSTEM_NFS;
      break;
    case 0xFF534D42:  // CIFS
    case 0x517B:  // SMB
      *type = FILE_SYSTEM_SMB;
      break;
    case 0x73757245:  // Coda
      *type = FILE_SYSTEM_CODA;
      break;
    case 0x858458f6:  // ramfs
    case 0x01021994:  // tmpfs
      *type = FILE_SYSTEM_MEMORY;
      break;
    case 0x27e0eb: // CGROUP
      *type = FILE_SYSTEM_CGROUP;
      break;
    default:
      *type = FILE_SYSTEM_OTHER;
  }
  return true;
}

}  // namespace