/*------------------------------------------------------------------------------------------*\ * * $Id: copy_firmware.c 1.3 2003/12/11 11:08:46Z mpommerenke Exp $ * * $Log: copy_firmware.c $ * Revision 1.3 2003/12/11 11:08:46Z mpommerenke * \*------------------------------------------------------------------------------------------*/ #include #include #include #include #include #include #include #define BLOCKSIZE 1024*64 /*------------------------------------------------------------------------------------------*\ \*------------------------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { int src, dst; int rd = 0, wr = 0; unsigned long size = 0, offset, wrote = 0; char *buf; struct stat sz; char *firmware_file = argv[1]; char *mtd_file = argv[2]; int i, urlader = 0; /*--------------------------------------------------------------------------------------*\ \*--------------------------------------------------------------------------------------*/ for(i = 1 ; i < argc ; i++) { if(argv[i][0] == '-') { switch(argv[i][1]) { case 'i': /*--- in file ---*/ firmware_file = argv[++i]; break; case 'o': /*--- out file ---*/ mtd_file = argv[++i]; break; case 'u': /*--- urlader ---*/ urlader = 1; break; } } } buf = malloc(BLOCKSIZE); if (!buf) return -1; src = open(firmware_file, O_RDONLY); dst = open(mtd_file, O_WRONLY); if ((src == -1) || (dst == -1)) return -1; if ((src == 0) || (dst == 0)) { close(src); close(dst); return -1; } fstat(src, &sz); size = sz.st_size; printf("%s: copy %s to %s\n", argv[0], firmware_file, mtd_file); /*--------------------------------------------------------------------------------------*\ \*--------------------------------------------------------------------------------------*/ printf("programming: "); while ((rd = read(src, buf, BLOCKSIZE)) > 0) { if(urlader == 0) { /*--- die letzten 8 bytes ignorieren ---*/ if ((wrote + rd) >= size) rd -= 8; if (rd < 0) rd = 0; } offset = 0; while (((wr = write(dst, &buf[offset], (rd - offset))) > 0) && (rd - offset)) { offset += wr; } if(wr < 0) { printf("%s: write error %d errno %d (wrote %u bytes)\n", argv[0], wr, errno, wrote); break; } wrote += offset; /*--- printf("%s: Wrote %lu bytes.\n", argv[0], wrote); ---*/ printf("."); } printf("\n"); if(rd < 0) { printf("%s: read error %d errno %d\n", argv[0], rd, errno); } close(src); /*--------------------------------------------------------------------------------------*\ \*--------------------------------------------------------------------------------------*/ printf("closing: %s ", mtd_file); close(dst); printf("\n"); free(buf); if ((rd < 0) || (wr < 0)) { printf("%s: failed!\n", argv[0]); if (rd < 0) return -1; else return -1; } printf("%s: successful!\n", argv[0]); return 0; }