コード例 #1
0
ファイル: packbin.c プロジェクト: jhbsz/DIR-850L_A1
void
main(int argc, char *argv[])
{
    FILE *              fp1;
    FILE *              fp2;
    char                tmpFilename[50] = "packbin.XXXXXX";
    unsigned char       imgType;
    unsigned long       imgSize,dateofday,timeofday;
    unsigned long       padTo;
    struct stat         fileStat;
    unsigned long       i;
    unsigned char       ch;
    unsigned char *     pch;
    unsigned char       chksum;

    fileImageHeader_t   imghdr;
    struct timeval timeval;
    struct tm *ut;
    time_t tt;

    tt = time(NULL);
    gettimeofday(&timeval,NULL);
    //gmtime_r(&tt,&ut);
    ut=localtime(&tt);
    printf("date %04d/%02d/%02d %02d:%02d:%02d \n",
           1900+ut->tm_year,
           ut->tm_mon+1,
           ut->tm_mday,
           ut->tm_hour,
           ut->tm_min,
           ut->tm_sec
          );
    dateofday=((ut->tm_year+1900)<<16)+((ut->tm_mon+1)<<8)+(ut->tm_mday);
    timeofday=((ut->tm_hour)<<24)+((ut->tm_min)<<16)+((ut->tm_sec)<<8);
    printf("%08x %08x\n",dateofday,timeofday);
    /* Check arguments */
    if (argc < 5)
    {
        printf("Usage: PACKBIN input_file image_type pad_to output_file\n");
        printf("    input_file    Name of the input binary image file.\n");
        printf("    image_type    [r|b|k] for [runtime|boot|kernel+fs].\n");
        printf("    pad_to        Size of the output binary image. (0 means no padding)\n");
        printf("    output_file   Name of the output binary image file.\n");

        return;
    }

    /* Open file */
    if ((fp1=fopen(argv[1], "r+b")) == NULL)
    {
        printf("Cannot open %s !!\n", argv[1]);
        return;
    }

    /* Get image type */
    imgType = (unsigned char) *argv[2];
    bzero((void *) &imghdr, sizeof(fileImageHeader_t));
    switch (imgType)
    {
    case 'r':
        imghdr.imageType = ENDIAN_SWITCH16(RTL_IMAGE_TYPE_RUN);
        break;
    case 'b':
        imghdr.imageType = ENDIAN_SWITCH16(RTL_IMAGE_TYPE_BOOT);
        break;
    case 'k':
        imghdr.imageType = ENDIAN_SWITCH16(RTL_IMAGE_TYPE_KFS);
        break;

    default:
        printf("Image type error !!\n");
    }

    /* Get padding size */
    padTo = strtol(argv[3], NULL, 0);

    /* Get file size */
    if (stat(argv[1], &fileStat) != 0)
    {
        printf("Cannot get file statistics !!\n");
        fclose(fp1);
        exit(-1);
    }
    imgSize = fileStat.st_size;

    /* Check padding size */
    if ( (padTo < imgSize + sizeof(fileImageHeader_t)) && (padTo != 0) )
    {
        printf("Padding size error !!\n");
        fclose(fp1);
        exit(-1);
    }
    if (!padTo)
    {
        if (imgSize%2)
            padTo=(imgSize+sizeof(fileImageHeader_t))+1;
    }
    printf("Image Original Size = 0x%lx\n", imgSize);

    /* Temparay file */
    //tmpnam(tmpFilename);
    mkstemp(tmpFilename);
    if ((fp2=fopen(tmpFilename, "w+b")) == NULL)
    {
        printf("Cannot open temprary file !!\n");
        return;
    }

    /* Copy image */
    fseek(fp1, 0L, SEEK_SET);
    fseek(fp2, sizeof(fileImageHeader_t), SEEK_SET);
    chksum = 0;
    for (i=0; i<imgSize; i++)
    {
        ch = fgetc(fp1);
        fputc(ch, fp2);
        chksum ^= ch;
    }

    /* Padding */
    if (padTo)
        while (i++ < (padTo - sizeof(fileImageHeader_t)))
            fputc(0, fp2);

    /* Forge image header */
    printf("      Magic Number = 0x%lx\n", RTL_PRODUCT_MAGIC);
    imghdr.productMagic = ENDIAN_SWITCH32(RTL_PRODUCT_MAGIC);
    imghdr.imageHdrVer = RTL_IMAGE_HDR_VER_1_0;
    /* date and time to be implemented */
    imghdr.date=ENDIAN_SWITCH32(dateofday);
    imghdr.time=ENDIAN_SWITCH32(timeofday);
    if (padTo)
        imghdr.imageLen = ENDIAN_SWITCH32(padTo - sizeof(fileImageHeader_t));
    else
        imghdr.imageLen = ENDIAN_SWITCH32(imgSize);
    printf("      Body Checksum = 0x%x\n", chksum);
    imghdr.imageBdyCksm = chksum;
    /* Calculate header checksum */
    pch = (unsigned char *) &imghdr;
    chksum = 0;
    for (i=0; i<(sizeof(fileImageHeader_t)-1); i++)
        chksum ^= *pch++;
    imghdr.imageHdrCksm = chksum;
    printf("      Header Checksum = 0x%x\n", chksum);

    /* Write header */
    pch = (unsigned char *) &imghdr;
    fseek(fp2, 0L, SEEK_SET);
    for (i=0; i<sizeof(fileImageHeader_t); i++)
        fputc(*pch++, fp2);

    /* Close file and exit */
    fclose(fp1);
    fclose(fp2);

    printf("Binary image %s generated!\n", argv[4]);
    remove(argv[4]);
    rename(tmpFilename, argv[4]);
}
コード例 #2
0
ファイル: packhdr.c プロジェクト: ZigFisher/FlyRouter
int
main(int argc, char *argv[])
{
    FILE *              fp1;
    FILE *              fp2;
    char                tmpFilename[50] = "packbin.XXXXXX";
    unsigned long       imgSize,dateofday,timeofday;
    struct stat         fileStat;
    unsigned long       i;
    unsigned char       ch;
    //unsigned long       boardMagic;
    long boardMagic;
    
	struct timeval timeval;
	struct tm *ut;
	time_t tt;

	tt = time(NULL);
	gettimeofday(&timeval,NULL);
	//gmtime_r(&tt,&ut);
	ut=localtime(&tt);
	printf("date %04d/%02d/%02d %02d:%02d:%02d \n",
			1900+ut->tm_year,
			ut->tm_mon+1,
			ut->tm_mday,
			ut->tm_hour,
			ut->tm_min,
			ut->tm_sec
			);
    	dateofday=((ut->tm_year+1900)<<16)+((ut->tm_mon+1)<<8)+(ut->tm_mday);
    	timeofday=((ut->tm_hour)<<24)+((ut->tm_min)<<16)+((ut->tm_sec)<<8);
	printf("%08lx %08lx\n",dateofday,timeofday);
    /* Check arguments */
    if (argc < 4)
    {
        printf("Usage: PACKHDR board_magic input_file output_file\n");
	printf("    board_magic   Hardware board's magic id.\n");
        printf("    input_file    Name of the input binary image file.\n");
        printf("    output_file   Name of the output binary image file.\n");
        
        return 0;
    }
    
    /* Get board_magic */
    boardMagic = ENDIAN_SWITCH32(strtol(argv[1], NULL, 0));
    if(boardMagic == 0x7fffffff || boardMagic == 0xffffff7f)
    	boardMagic = 0xffffffff;
    printf("boardMagic=%x\n", boardMagic);
    /* Open file */
     if ((fp1=fopen(argv[2], "r+b")) == NULL)
    {
        printf("Cannot open %s !!\n", argv[1]);
        return -1;
    }
    
    /* Get file size */
    if (stat(argv[2], &fileStat) != 0)
    {
        printf("Cannot get file statistics !!\n");
        fclose(fp1);
        exit(-1);
    }
    imgSize = fileStat.st_size;
    
    printf("Image Original Size = 0x%lx\n", imgSize);
    
    /* Temparay file */
    //tmpnam(tmpFilename);
    mkstemp(tmpFilename);
    if ((fp2=fopen(tmpFilename, "w+b")) == NULL)
    {
        printf("Cannot open temprary file !!\n");
        return -2;
    }
    
    /* Copy image */
    fseek(fp1, 0L, SEEK_SET);
    fseek(fp2, 0L, SEEK_SET);
    fwrite((void*)&boardMagic, sizeof(boardMagic), 1, fp2);
    for (i=0; i<imgSize; i++) {
        ch = fgetc(fp1);
	fputc(ch, fp2);
    }
    
    /* Close file and exit */
    fclose(fp1);
    fclose(fp2);
    
    printf("Binary image %s generated!\n", argv[3]);
    remove(argv[3]);
    rename(tmpFilename, argv[3]);

	return 0;
}