blob: fb65265bbe2cd7f19c44f755d720b8af5a2d2503 [file] [log] [blame]
#include <stdio.h>
#include <string.h>
#define FOTA_FBFVERSION_IMAGEID 0x464F5456 //"FOTV"
#if 0
static int get_fota_version(const char *fname, char *mversion, size_t msize)
{
FILE *fp;
int ret;
fp = fopen(fname, "rb");
if (fp == NULL)
{
perror("fopen");
return 1;
}
ret = 0;
do
{
int num_img;
size_t sz;
char buf[64];
sz = fread(buf, 1, 32, fp);
if (sz < 32 || strncmp(buf, "Marvell_FBF", 11)) /* check FBF magic */
{
ret = 2;
break;
}
sz = fread(buf, 1, 2, fp);
if (sz < 2 || buf[0] != 11 || buf[1] != 0) /* check format version */
{
ret = 3;
break;
}
ret = fseek(fp, 0x13C, SEEK_SET);
if (ret)
{
perror("fseek");
ret = 1;
break;
}
sz = fread(&num_img, 1, 4, fp);
if (sz < 4 || num_img <= 0) /* check number of images */
{
ret = 4;
break;
}
ret = 5; /* not found */
while (num_img--)
{
sz = fread(buf, 1, 52, fp);
if (sz < 52) /* check ImageStruct_11 size */
{
ret = 6;
break;
}
if (*(int *)buf == FOTA_FBFVERSION_IMAGEID) /* check image ID */
{
unsigned offset = ((int *)buf)[5];
offset <<= 13; /* 8KB sectors */
ret = fseek(fp, offset, SEEK_SET);
if (ret)
{
perror("fseek");
ret = 1;
break;
}
sz = fread(mversion, 1, msize, fp);
if (sz < msize || strnlen(mversion, sz) == sz) /* check ASCIIZ */
{
ret = 7;
break;
}
if (strncmp(mversion, "OTA", 3)) /* check prefix */
{
/* treat as successful */
}
else
{
char *p;
switch (mversion[3])
{
case '0': /* FOTA */
p = strchr(mversion, ';');
if (p)
{
sz = p - mversion - 4;
memmove(mversion, mversion + 4, sz);
mversion[sz] = '\0';
}
else
{
ret = 8;
}
break;
case '4': /* DFOTA */
p = strchr(mversion, ';');
if (p)
{
char *q = p + 1;
p = strchr(q, ';');
if (p)
{
sz = p - q;
memmove(mversion, q, sz);
mversion[sz] = '\0';
}
else
{
ret = 9;
}
}
else
{
ret = 8;
}
break;
default:
ret = 7;
break;
}
}
break;
}
}
} while (0);
fclose(fp);
return ret;
}
#endif