/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * 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.
 */

/*
 * "find_lock.exe", for Windows only.
 */

#ifdef _WIN32

#include "utils.h"
#include "find_lock.h"
#include <io.h>
#include <fcntl.h>

int main(int argc, char* argv[]) {

    gIsConsole = true; // tell utils to to print errors to stderr
    gIsDebug = (getenv("ANDROID_SDKMAN_DEBUG") != NULL);
    CPath dirPath;
    bool doPrintUsage = false;

    for (int i = 1; i < argc; i++) {
        if (strncmp(argv[i], "-d", 2) == 0) {
            gIsDebug = true;

        } else if (dirPath.isEmpty()) {
            dirPath.set(argv[i]);

        } else {
            doPrintUsage = true;
        }
    }

    if (dirPath.isEmpty()) {
        fprintf(stderr, "Error: Missing directory path\n");
        doPrintUsage = true;

    } else if (!dirPath.dirExists()) {
        fprintf(stderr, "Error: '%s' is not a valid directory.\n", dirPath.cstr());
        return 1;
    }

    if (doPrintUsage) {
        printf(
            "Usage: find_lock.exe [options] sdk_directory_path\n"
            "\n"
            "Outputs the names of modules that are locking the given directory.\n"
            "Returns code 0 when found, 1 when not found.\n"
            "\n"
            "Options:\n"
            "-h / -help   : This help.\n"
            "-t / -test   : Internal test.\n"
            );
        return 2;
    }

    CString result;
    if (findLock(dirPath, &result)) {
        fflush(stdout);
        fflush(stderr);
        printf("%s", result.cstr());
        return 0;
    }
    return 1;
}

#endif /* _WIN32 */
