static int vmdk_probe(const uint8_t *buf, int buf_size, const char *filename)

{

    uint32_t magic;



    if (buf_size < 4)

        return 0;

    magic = be32_to_cpu(*(uint32_t *)buf);

    if (magic == VMDK3_MAGIC ||

        magic == VMDK4_MAGIC) {

        return 100;

    } else {

        const char *p = (const char *)buf;

        const char *end = p + buf_size;

        while (p < end) {

            if (*p == '#') {

                /* skip comment line */

                while (p < end && *p != '\n') {

                    p++;

                }

                p++;

                continue;

            }

            if (*p == ' ') {

                while (p < end && *p == ' ') {

                    p++;

                }

                /* skip '\r' if windows line endings used. */

                if (p < end && *p == '\r') {

                    p++;

                }

                /* only accept blank lines before 'version=' line */

                if (p == end || *p != '\n') {

                    return 0;

                }

                p++;

                continue;

            }

            if (end - p >= strlen("version=X\n")) {

                if (strncmp("version=1\n", p, strlen("version=1\n")) == 0 ||

                    strncmp("version=2\n", p, strlen("version=2\n")) == 0) {

                    return 100;

                }

            }

            if (end - p >= strlen("version=X\r\n")) {

                if (strncmp("version=1\r\n", p, strlen("version=1\r\n")) == 0 ||

                    strncmp("version=2\r\n", p, strlen("version=2\r\n")) == 0) {

                    return 100;

                }

            }

            return 0;

        }

        return 0;

    }

}
