63 lines
1.6 KiB
C++
63 lines
1.6 KiB
C++
|
// 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
|