/*
 * Copyright (C) 2014-2021 Tuxera Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ANDROID_VOLD_FILESYSTEMS_H
#define ANDROID_VOLD_FILESYSTEMS_H

#include <utils/Errors.h>

#include <string>

namespace android {
namespace vold {

typedef enum {
    FSTYPE_UNRECOGNIZED,
    FSTYPE_FAT,
    FSTYPE_EXFAT,
    FSTYPE_NTFS,
    FSTYPE_HFSPLUS,
    FSTYPE_APFS,
} FSType;

namespace filesystems {

int Detect(const std::string& source, FSType *outFsType);

bool IsSupported(FSType fsType);

status_t Check(FSType fsType, const std::string& source);
status_t Mount(FSType fsType, const std::string& source, const std::string& target, bool ro,
        bool remount, bool executable, int ownerUid, int ownerGid, int permMask,
        bool createLost);
status_t Format(FSType fsType, const std::string& source, unsigned long numSectors);

const char* FsName(FSType fsType);

}  // namespace filesystems
}  // namespace vold
}  // namespace android

#endif
