#include "TegraDetector.h"
#include <zlib.h>
#include <string.h>

#define KERNEL_CONFIG "/proc/config.gz"
#define KERNEL_CONFIG_MAX_LINE_WIDTH 512
#define KERNEL_CONFIG_TEGRA_MAGIC "CONFIG_ARCH_TEGRA=y"
#define KERNEL_CONFIG_TEGRA2_MAGIC "CONFIG_ARCH_TEGRA_2x_SOC=y"
#define KERNEL_CONFIG_TEGRA3_MAGIC "CONFIG_ARCH_TEGRA_3x_SOC=y"
#define KERNEL_CONFIG_TEGRA4_MAGIC "CONFIG_ARCH_TEGRA_11x_SOC=y"
#define MAX_DATA_LEN    4096

int DetectTegra()
{
    int result = TEGRA_NOT_TEGRA;
    gzFile kernelConfig = gzopen(KERNEL_CONFIG, "r");
    if (kernelConfig != 0)
    {
        char tmpbuf[KERNEL_CONFIG_MAX_LINE_WIDTH];
        const char *tegra_config = KERNEL_CONFIG_TEGRA_MAGIC;
        const char *tegra2_config = KERNEL_CONFIG_TEGRA2_MAGIC;
        const char *tegra3_config = KERNEL_CONFIG_TEGRA3_MAGIC;
        const char *tegra4_config = KERNEL_CONFIG_TEGRA4_MAGIC;
        int len = strlen(tegra_config);
        int len2 = strlen(tegra2_config);
        int len3 = strlen(tegra3_config);
        int len4 = strlen(tegra4_config);
        while (0 != gzgets(kernelConfig, tmpbuf, KERNEL_CONFIG_MAX_LINE_WIDTH))
        {
            if (0 == strncmp(tmpbuf, tegra_config, len))
            {
                result = 1;
            }

            if (0 == strncmp(tmpbuf, tegra2_config, len2))
            {
                result = 2;
                break;
            }

            if (0 == strncmp(tmpbuf, tegra3_config, len3))
            {
                result = 3;
                break;
            }

            if (0 == strncmp(tmpbuf, tegra4_config, len4))
            {
                result = 4;
                break;
            }
        }
        gzclose(kernelConfig);
    }
    else
    {
        result = TEGRA_DETECTOR_ERROR;
    }

    return result;
}