Пример #1
0
int main(int argc, char *argv[])
{
	int	iDataRecordCount;
	long lFilePos;

	indexKey = ACCOUNT_NAME;

	checkCommandArguments( argc );
	checkInputFile( argv[1] );
	checkOutputFile();

	// calculate record count in data file
	iDataRecordCount = checkRecordCount();

	lFilePos = ftell(fpData);

	writeIndexHeader( iDataRecordCount );
	writeIndexFile( iDataRecordCount, lFilePos ) ;

	fclose( fpData );
	fclose( fpIndexFile );

	return 0;
}
Пример #2
0
int main(int argc, char** argv)
{
    int argNum=1;
#ifdef COMPACT_FILENAME_BUFFER
    const char *outFile = NULL;
#else
    char outFile[80]= {0};
#endif
    TYPE_T type;
    int mask=0, fh_out, fh_in, len, i, total=0;
    unsigned char *buf, *buf1;
    struct stat sbuf;
    int byteswap=0, cascade=0, last_idx=-1, is_all=0;
    int offset=0, with_header;
    IMG_HEADER_Tp pHeader;
    unsigned long burnAddr=0;
    IMG_HEADER_T allHeader;
    unsigned short checksum=0;

    memset(&sector, 0, sizeof(sector));

    while (argNum < argc) {
        if ( !strcmp(argv[argNum], "-o") ) {
            if (++argNum >= argc)
                break;
#ifdef COMPACT_FILENAME_BUFFER
            outFile = argv[argNum];
#else
            sscanf(argv[argNum], "%s", outFile);
#endif
        }
        else if ( !strcmp(argv[argNum], "-s") ) {
            byteswap = 1;
        }
        else if ( !strcmp(argv[argNum], "-c") ) {
            cascade = 1;
        }
        else if ( !strcmp(argv[argNum], "-a") ) {
            is_all = 1;
            memset(&allHeader, '\0', sizeof(IMG_HEADER_T));
            memcpy(allHeader.signature, ALL_HEADER, SIGNATURE_LEN);
        }
#if 0
        else if ( !strcmp(argv[argNum], "-a2") ) {
            is_all = 1;
            memset(&allHeader, '\0', sizeof(IMG_HEADER_T));
            memcpy(allHeader.signature, ALL_HEADER2, SIGNATURE_LEN);
        }
#endif
        else {
            if (is_all) {
                if ((argNum+1) < argc) {
                    printf("argument error, only input file could be specified!\n");
                    return -1;
                }
#ifdef COMPACT_FILENAME_BUFFER
                sector[0].filename = argv[argNum];
#else
                strcpy(sector[0].filename,argv[argNum]);
#endif
                sector[0].type=ALL;
                sector[0].with_header=0;
                mask |= (1 << ALL);
            }
            else {
                type=checkInputFile(argv[argNum], &with_header);
                DEBUG_PRINT("filename=%s, type=%d\n", argv[argNum], type);
                if (type == INVALID_FILE) {
                    printf("\nInvalid input file %s!!\n", argv[argNum]);
                    showHelp();
                    exit(1);
                }
#ifdef COMPACT_FILENAME_BUFFER
                sector[type].filename = argv[argNum];
#else
                strcpy(sector[type].filename, argv[argNum]);
#endif
                sector[type].with_header = with_header;
                sector[type].type = type;
                mask |= (1 << type);
            }
        }
        argNum++;
    }

#ifdef COMPACT_FILENAME_BUFFER
    if( outFile == NULL )
#else
    if (!outFile[0])
#endif
    {
        printf("No output file specified!\n");
        showHelp();
        exit(1);
    }

    if (mask == 0) {
        printf("No valid input image found!\n");
        exit(1);
    }

    // Create output file
#ifdef WIN32
    _chmod(outFile, S_IREAD|S_IWRITE);
    fh_out = open(outFile, O_RDWR|O_CREAT|O_TRUNC|O_BINARY);
#else
    chmod(outFile, S_IREAD|S_IWRITE);
    fh_out = open(outFile, O_RDWR|O_CREAT|O_TRUNC, 0644);
#endif
    if (fh_out == -1) {
        printf("Create output file %s error!\n", outFile);
        exit(1);
    }

    if (is_all) {
        write(fh_out, &allHeader, sizeof(allHeader));
        total += sizeof(allHeader);
        printf("\nGenerate ");
    }
    else
        printf("\nMerge ");

    for (i=BOOT_CODE; i<=ROOT ; i++) {
#ifdef COMPACT_FILENAME_BUFFER
        if (sector[i].filename)
#else
        if (sector[i].filename[0])
#endif
        {
            if ( stat(sector[i].filename, &sbuf) != 0 ) {
                printf("Stat file %s error!\n", sector[i].filename);
                exit(1);
            }
            buf = malloc(sbuf.st_size+1);
            if (buf == NULL) {
                printf("allocate buffer failed %d!\n", (int)sbuf.st_size);
                exit(1);
            }
#ifdef WIN32
            fh_in = open(sector[i].filename, O_RDONLY|O_BINARY);
#else
            fh_in = open(sector[i].filename, O_RDONLY,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
#endif
            if (fh_in < 0) {
                printf("Open file %s error!\n", sector[i].filename);
                close(fh_out);
                exit(1);
            }

            switch(sector[i].type) {
            case BOOT_CODE:
                printf("BOOT-CODE ");
                break;
            case CONFIG:
                printf("CONFIG-DATA(%s) ", (no_hw_config ? "no-hw" : "all"));
                break;
            case WEB_PAGES:
                printf("WEB-PAGES ");
                break;
            case SYS:
                printf("LINUX ");
                break;
            case ROOT:
                printf("ROOT ");
                break;
            case ALL:
                printf("ALL ");
                break;
            case INVALID_FILE:
                break;
            }

            if (read(fh_in, buf, sbuf.st_size) != sbuf.st_size) {
                printf("Read file %s error!\n", sector[i].filename);
                close(fh_in);
                close(fh_out);
                free(buf);
                exit(1);
            }

            if (is_all)
                checksum = calculateChecksum((char *)buf, sbuf.st_size, checksum);
            else {
                if (sector[i].with_header) {
                    if (sector[i].type == CONFIG) {
                        if (no_hw_config == 0)
                            burnAddr = HW_SETTING_OFFSET;
                        else
                            burnAddr = DEFAULT_SETTING_OFFSET;
                    }
                    else {
                        pHeader = (IMG_HEADER_Tp)buf;
                        burnAddr = DWORD_SWAP(pHeader->burnAddr);
                    }
                }
                else
                    burnAddr = 0;

                if (byteswap) {
                    if (sbuf.st_size % 2) {
                        buf[sbuf.st_size] = '\0';
                        sbuf.st_size++;
                    }
                    do_byteswap(buf, sbuf.st_size);
                }

                // try to append 0 if necessary
                if (!cascade && last_idx!=-1 && sector[i].with_header) {
                    if ((sector[last_idx].offset+sector[last_idx].size) < burnAddr) {
                        len = burnAddr - (sector[last_idx].offset+sector[last_idx].size);
                        buf1 = calloc(len, 1);
                        if (buf1 == NULL) {
                            printf("allocate buffer failed %d!\n", len);
                            exit(1);
                        }
                        write(fh_out, buf1, len);	// pad 0

                        free(buf1);
                        total += len;
//				printf("pad size=%d, last_idx=%d, burnAddr=%d\n", len, last_idx, burnAddr);
                    }
                }

                // skip header if necessary
                if (!cascade && sector[i].with_header &&
                        ((sector[i].type == ROOT) || (sector[i].type == BOOT_CODE))) {
                    offset = sizeof(IMG_HEADER_T);
//				sbuf.st_size -= sizeof(IMG_HEADER_T);
                }
                else
                    offset = 0;
            }

//		printf("write offset=%d, size=%d\n", offset, 	sbuf.st_size);
            if ( write(fh_out, buf + offset , sbuf.st_size-offset) != sbuf.st_size-offset) {
                printf("Write output file %s error!\n", outFile);
                close(fh_in);
                close(fh_out);
                free(buf);
                exit(1);
            }
            close(fh_in);
            if (burnAddr > 0)
                sector[i].offset = burnAddr;
            else
                sector[i].offset = total;
            sector[i].size = sbuf.st_size-offset;

//	printf("section[%d], offset=%d, size=%d\n", i, sector[i].offset, sector[i].size);

            total += sbuf.st_size;
            free(buf);
            last_idx = i;
            if (is_all)
                break;
        }
    }

    if (is_all) {
        allHeader.len = DWORD_SWAP((total+2));
        checksum = calculateChecksum((char *)&allHeader, sizeof(allHeader), checksum);
        checksum = WORD_SWAP((~checksum+1));
        write(fh_out, &checksum, 2);
        lseek(fh_out, 0, SEEK_SET);
        allHeader.len = DWORD_SWAP((total+2));
//		allHeader.startAddr = DWORD_SWAP(image_num);
        write(fh_out, &allHeader, sizeof(allHeader));
        total += (2 + sizeof(allHeader));
    }
    close(fh_out);

#ifdef WIN32
    _chmod(outFile, S_IREAD);
#else
    chmod(outFile, DEFFILEMODE);
#endif

    printf("=> %s ok, size=%d.\n", outFile, total);
    exit(0);
}