1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/file_util.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/file_path.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
958d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen#include <errno.h>
1058d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen#include <sys/vfs.h>
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1258d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsennamespace file_util {
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1458d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsenbool GetFileSystemType(const FilePath& path, FileSystemType* type) {
1558d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen  struct statfs statfs_buf;
1658d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen  if (statfs(path.value().c_str(), &statfs_buf) < 0) {
1758d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    if (errno == ENOENT)
1858d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen      return false;
1958d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    *type = FILE_SYSTEM_UNKNOWN;
2058d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    return true;
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
2358d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen  // While you would think the possible values of f_type would be available
2458d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen  // in a header somewhere, it appears that is not the case.  These values
2558d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen  // are copied from the statfs man page.
2658d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen  switch (statfs_buf.f_type) {
2758d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    case 0:
2858d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen      *type = FILE_SYSTEM_0;
2958d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen      break;
3058d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    case 0xEF53:  // ext2, ext3.
3158d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    case 0x4D44:  // dos
3258d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    case 0x5346544E:  // NFTS
3358d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    case 0x52654973:  // reiser
3458d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    case 0x58465342:  // XFS
3558d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    case 0x9123683E:  // btrfs
3658d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    case 0x3153464A:  // JFS
3758d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen      *type = FILE_SYSTEM_ORDINARY;
3858d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen      break;
3958d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    case 0x6969:  // NFS
4058d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen      *type = FILE_SYSTEM_NFS;
4158d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen      break;
4258d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    case 0xFF534D42:  // CIFS
4358d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    case 0x517B:  // SMB
4458d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen      *type = FILE_SYSTEM_SMB;
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      break;
4658d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    case 0x73757245:  // Coda
4758d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen      *type = FILE_SYSTEM_CODA;
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      break;
4958d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    case 0x858458f6:  // ramfs
5058d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    case 0x01021994:  // tmpfs
5158d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen      *type = FILE_SYSTEM_MEMORY;
5258d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen      break;
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case 0x27e0eb: // CGROUP
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      *type = FILE_SYSTEM_CGROUP;
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
5658d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen    default:
5758d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen      *type = FILE_SYSTEM_OTHER;
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
5958d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen  return true;
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
6258d02015f8788a79b322c58d4bdbc914e4c333dcKristian Monsen}  // namespace
63