diff --git a/src/fileio.c b/src/fileio.c index 2622c988..e6d5c037 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -57,48 +57,48 @@ struct ihexrec { }; -static int b2ihex(unsigned char * inbuf, int bufsize, +static int b2ihex(const unsigned char *inbuf, int bufsize, int recsize, int startaddr, - char * outfile, FILE * outf, FILEFMT ffmt); + const char *outfile, FILE *outf, FILEFMT ffmt); -static int ihex2b(char * infile, FILE * inf, - AVRMEM * mem, int bufsize, unsigned int fileoffset, +static int ihex2b(const char *infile, FILE *inf, + const AVRMEM *mem, int bufsize, unsigned int fileoffset, FILEFMT ffmt); -static int b2srec(unsigned char * inbuf, int bufsize, - int recsize, int startaddr, - char * outfile, FILE * outf); +static int b2srec(const unsigned char *inbuf, int bufsize, + int recsize, int startaddr, + const char *outfile, FILE *outf); -static int srec2b(char * infile, FILE * inf, - AVRMEM * mem, int bufsize, unsigned int fileoffset); +static int srec2b(const char *infile, FILE *inf, + const AVRMEM *mem, int bufsize, unsigned int fileoffset); -static int ihex_readrec(struct ihexrec * ihex, char * rec); +static int ihex_readrec(struct ihexrec *ihex, char *rec); -static int srec_readrec(struct ihexrec * srec, char * rec); +static int srec_readrec(struct ihexrec *srec, char *rec); -static int fileio_rbin(struct fioparms * fio, - char * filename, FILE * f, AVRMEM * mem, int size); +static int fileio_rbin(struct fioparms *fio, + const char *filename, FILE *f, const AVRMEM *mem, int size); -static int fileio_ihex(struct fioparms * fio, - char * filename, FILE * f, AVRMEM * mem, int size, - FILEFMT ffmt); +static int fileio_ihex(struct fioparms *fio, + const char *filename, FILE *f, const AVRMEM *mem, int size, + FILEFMT ffmt); -static int fileio_srec(struct fioparms * fio, - char * filename, FILE * f, AVRMEM * mem, int size); +static int fileio_srec(struct fioparms *fio, + const char *filename, FILE *f, const AVRMEM *mem, int size); #ifdef HAVE_LIBELF -static int elf2b(char * infile, FILE * inf, - AVRMEM * mem, struct avrpart * p, +static int elf2b(const char *infile, FILE *inf, + const AVRMEM *mem, const AVRPART *p, int bufsize, unsigned int fileoffset); -static int fileio_elf(struct fioparms * fio, - char * filename, FILE * f, AVRMEM * mem, - struct avrpart * p, int size); +static int fileio_elf(struct fioparms *fio, + const char *filename, FILE *f, const AVRMEM *mem, + const AVRPART *p, int size); #endif -static int fileio_num(struct fioparms * fio, - char * filename, FILE * f, AVRMEM * mem, int size, - FILEFMT fmt); +static int fileio_num(struct fioparms *fio, + const char *filename, FILE *f, const AVRMEM *mem, int size, + FILEFMT fmt); char * fileio_fmtstr(FILEFMT format) @@ -115,11 +115,11 @@ char * fileio_fmtstr(FILEFMT format) } -static int b2ihex(unsigned char * inbuf, int bufsize, +static int b2ihex(const unsigned char *inbuf, int bufsize, int recsize, int startaddr, - char * outfile, FILE * outf, FILEFMT ffmt) + const char *outfile, FILE *outf, FILEFMT ffmt) { - unsigned char * buf; + const unsigned char *buf; unsigned int nextaddr; int n, nbytes, n_64k; int i; @@ -292,8 +292,8 @@ static int ihex_readrec(struct ihexrec * ihex, char * rec) * If an error occurs, return -1. * * */ -static int ihex2b(char * infile, FILE * inf, - AVRMEM * mem, int bufsize, unsigned int fileoffset, +static int ihex2b(const char *infile, FILE *inf, + const AVRMEM *mem, int bufsize, unsigned int fileoffset, FILEFMT ffmt) { char buffer [ MAX_LINE_LEN ]; @@ -394,11 +394,11 @@ static int ihex2b(char * infile, FILE * inf, } } -static int b2srec(unsigned char * inbuf, int bufsize, +static int b2srec(const unsigned char *inbuf, int bufsize, int recsize, int startaddr, - char * outfile, FILE * outf) + const char *outfile, FILE *outf) { - unsigned char * buf; + const unsigned char *buf; unsigned int nextaddr; int n, nbytes, addr_width; unsigned char cksum; @@ -516,9 +516,9 @@ static int srec_readrec(struct ihexrec * srec, char * rec) return -1; srec->rectyp = rec[offset++]; if (srec->rectyp == 0x32 || srec->rectyp == 0x38) - addr_width = 3; /* S2,S8-record */ + addr_width = 3; /* S2,S8-record */ else if (srec->rectyp == 0x33 || srec->rectyp == 0x37) - addr_width = 4; /* S3,S7-record */ + addr_width = 4; /* S3,S7-record */ /* reclen */ if (offset + 2 > len) @@ -573,8 +573,8 @@ static int srec_readrec(struct ihexrec * srec, char * rec) } -static int srec2b(char * infile, FILE * inf, - AVRMEM * mem, int bufsize, unsigned int fileoffset) +static int srec2b(const char *infile, FILE * inf, + const AVRMEM *mem, int bufsize, unsigned int fileoffset) { char buffer [ MAX_LINE_LEN ]; unsigned int nextaddr, maxaddr; @@ -741,7 +741,7 @@ static Elf_Scn *elf_get_scn(Elf *e, Elf32_Phdr *ph, Elf32_Shdr **shptr) return NULL; } -static int elf_mem_limits(AVRMEM *mem, struct avrpart * p, +static int elf_mem_limits(const AVRMEM *mem, const AVRPART *p, unsigned int *lowbound, unsigned int *highbound, unsigned int *fileoff) @@ -799,8 +799,8 @@ static int elf_mem_limits(AVRMEM *mem, struct avrpart * p, } -static int elf2b(char * infile, FILE * inf, - AVRMEM * mem, struct avrpart * p, +static int elf2b(const char *infile, FILE *inf, + const AVRMEM *mem, const AVRPART *p, int bufsize, unsigned int fileoffset) { Elf *e; @@ -1039,9 +1039,8 @@ static char *itoa_simple(int n, char *buf, int base) -static int fileio_rbin(struct fioparms * fio, - char * filename, FILE * f, AVRMEM * mem, int size) -{ +static int fileio_rbin(struct fioparms *fio, + const char *filename, FILE *f, const AVRMEM *mem, int size) { int rc; unsigned char *buf = mem->buf; @@ -1069,26 +1068,29 @@ static int fileio_rbin(struct fioparms * fio, } -static int fileio_imm(struct fioparms * fio, - char * filename, FILE * f, AVRMEM * mem, int size) +static int fileio_imm(struct fioparms *fio, + const char *fname, FILE *f, const AVRMEM *mem, int size) { int rc = 0; - char * e, * p; + char *e, *p, *filename; unsigned long b; int loc; + filename = cfg_strdup(__func__, fname); + switch (fio->op) { case FIO_READ: loc = 0; p = strtok(filename, " ,"); while (p != NULL && loc < size) { b = strtoul(p, &e, 0); - /* check for binary formatted (0b10101001) strings */ - b = (strncmp (p, "0b", 2))? - strtoul (p, &e, 0): - strtoul (p + 2, &e, 2); + /* check for binary formatted (0b10101001) strings */ + b = (strncmp (p, "0b", 2))? + strtoul (p, &e, 0): + strtoul (p + 2, &e, 2); if (*e != 0) { pmsg_error("invalid byte value (%s) specified for immediate mode\n", p); + free(filename); return -1; } mem->buf[loc] = b; @@ -1100,26 +1102,30 @@ static int fileio_imm(struct fioparms * fio, case FIO_WRITE: pmsg_error("invalid file format 'immediate' for output\n"); + free(filename); return -1; default: pmsg_error("invalid operation=%d\n", fio->op); + free(filename); return -1; } if (rc < 0 || (fio->op == FIO_WRITE && rc < size)) { pmsg_ext_error("%s error %s %s: %s; %s %d of the expected %d bytes\n", fio->iodesc, fio->dir, filename, strerror(errno), fio->rw, rc, size); + free(filename); return -1; } + free(filename); return rc; } -static int fileio_ihex(struct fioparms * fio, - char * filename, FILE * f, AVRMEM * mem, int size, - FILEFMT ffmt) +static int fileio_ihex(struct fioparms *fio, + const char *filename, FILE *f, const AVRMEM *mem, int size, + FILEFMT ffmt) { int rc; @@ -1147,8 +1153,8 @@ static int fileio_ihex(struct fioparms * fio, } -static int fileio_srec(struct fioparms * fio, - char * filename, FILE * f, AVRMEM * mem, int size) +static int fileio_srec(struct fioparms *fio, + const char *filename, FILE *f, const AVRMEM *mem, int size) { int rc; @@ -1177,9 +1183,9 @@ static int fileio_srec(struct fioparms * fio, #ifdef HAVE_LIBELF -static int fileio_elf(struct fioparms * fio, - char * filename, FILE * f, AVRMEM * mem, - struct avrpart * p, int size) +static int fileio_elf(struct fioparms *fio, + const char *filename, FILE *f, const AVRMEM *mem, + const AVRPART *p, int size) { int rc; @@ -1202,9 +1208,9 @@ static int fileio_elf(struct fioparms * fio, #endif -static int fileio_num(struct fioparms * fio, - char * filename, FILE * f, AVRMEM * mem, int size, - FILEFMT fmt) +static int fileio_num(struct fioparms *fio, + const char *filename, FILE *f, const AVRMEM *mem, int size, + FILEFMT fmt) { const char *prefix; const char *name; @@ -1255,7 +1261,7 @@ static int fileio_num(struct fioparms * fio, for (i = 0; i < size; i++) { if (i > 0) { if (putc(',', f) == EOF) - goto writeerr; + goto writeerr; } num = (unsigned int)(mem->buf[i]); /* @@ -1265,7 +1271,7 @@ static int fileio_num(struct fioparms * fio, */ if (prefix[0] != '\0' && !(base == 8 && num < 8)) { if (fputs(prefix, f) == EOF) - goto writeerr; + goto writeerr; } itoa_simple(num, cbuf, base); if (fputs(cbuf, f) == EOF) @@ -1282,9 +1288,7 @@ static int fileio_num(struct fioparms * fio, } -int fileio_setparms(int op, struct fioparms * fp, - struct avrpart * p, AVRMEM * m) -{ +int fileio_setparms(int op, struct fioparms *fp, const AVRPART *p, const AVRMEM * m) { fp->op = op; switch (op) { @@ -1404,12 +1408,12 @@ int fileio_fmt_autodetect(const char * fname) -int fileio(int oprwv, char * filename, FILEFMT format, - struct avrpart * p, char * memtype, int size) +int fileio(int oprwv, const char *filename, FILEFMT format, + const AVRPART *p, const char *memtype, int size) { int op, rc; FILE * f; - char * fname; + const char *fname; struct fioparms fio; AVRMEM * mem; int using_stdio; diff --git a/src/libavrdude.h b/src/libavrdude.h index f4f2146d..a804cc6b 100644 --- a/src/libavrdude.h +++ b/src/libavrdude.h @@ -579,7 +579,8 @@ const char * pinmask_to_str(const pinmask_t * const pinmask); The target file will be selected at configure time. */ -extern long serial_recv_timeout; +extern long serial_recv_timeout; /* ms */ + union filedescriptor { int ifd; @@ -797,7 +798,6 @@ typedef struct programmer_t { int (*parseextparams) (const struct programmer_t *pgm, const LISTID xparams); void (*setup) (struct programmer_t *pgm); void (*teardown) (struct programmer_t *pgm); - // Cached r/w API for terminal reads/writes int (*write_byte_cached)(const struct programmer_t *pgm, const AVRPART *p, const AVRMEM *m, unsigned long addr, unsigned char value); @@ -969,8 +969,8 @@ char * fileio_fmtstr(FILEFMT format); int fileio_fmt_autodetect(const char * fname); -int fileio(int oprwv, char * filename, FILEFMT format, - struct avrpart * p, char * memtype, int size); +int fileio(int oprwv, const char *filename, FILEFMT format, + const AVRPART *p, const char *memtype, int size); #ifdef __cplusplus } @@ -1020,10 +1020,10 @@ extern UPDATE * dup_update(UPDATE * upd); extern UPDATE * new_update(int op, char * memtype, int filefmt, char * filename); extern void free_update(UPDATE * upd); -extern int do_op(PROGRAMMER * pgm, struct avrpart * p, UPDATE * upd, - enum updateflags flags); +extern int do_op(const PROGRAMMER *pgm, const AVRPART *p, UPDATE *upd, + enum updateflags flags); -extern int memstats(struct avrpart *p, char *memtype, int size, Filestats *fsp); +extern int memstats(const AVRPART *p, const char *memtype, int size, Filestats *fsp); // Convenience functions for printing const char *update_plural(int x); @@ -1036,7 +1036,7 @@ int update_is_okfile(const char *fn); int update_is_writeable(const char *fn); int update_is_readable(const char *fn); -int update_dryrun(struct avrpart *p, UPDATE *upd); +int update_dryrun(const AVRPART *p, UPDATE *upd); #ifdef __cplusplus diff --git a/src/update.c b/src/update.c index 13580536..319766ee 100644 --- a/src/update.c +++ b/src/update.c @@ -188,7 +188,7 @@ void free_update(UPDATE * u) // Memory statistics considering holes after a file read returned size bytes -int memstats(struct avrpart *p, char *memtype, int size, Filestats *fsp) { +int memstats(const AVRPART *p, const char *memtype, int size, Filestats *fsp) { Filestats ret = { 0 }; AVRMEM *mem = avr_locate_mem(p, memtype); @@ -332,7 +332,7 @@ int update_is_readable(const char *fn) { } -static void ioerror(const char *iotype, UPDATE *upd) { +static void ioerror(const char *iotype, const UPDATE *upd) { int errnocp = errno; pmsg_ext_error("file %s is not %s: ", update_outname(upd->filename), iotype); @@ -344,7 +344,7 @@ static void ioerror(const char *iotype, UPDATE *upd) { } // Basic checks to reveal serious failure before programming -int update_dryrun(struct avrpart *p, UPDATE *upd) { +int update_dryrun(const AVRPART *p, UPDATE *upd) { static char **wrote; static int nfwritten; @@ -426,10 +426,9 @@ int update_dryrun(struct avrpart *p, UPDATE *upd) { } -int do_op(PROGRAMMER * pgm, struct avrpart * p, UPDATE * upd, enum updateflags flags) -{ - struct avrpart * v; - AVRMEM * mem; +int do_op(const PROGRAMMER *pgm, const AVRPART *p, UPDATE *upd, enum updateflags flags) { + AVRPART *v; + AVRMEM *mem; int size; int rc; Filestats fs; @@ -486,6 +485,7 @@ int do_op(PROGRAMMER * pgm, struct avrpart * p, UPDATE * upd, enum updateflags f pmsg_error("read from file %s failed\n", update_inname(upd->filename)); return LIBAVRDUDE_GENERAL_FAILURE; } + size = rc; pmsg_info("reading input file %s for %s%s\n", update_inname(upd->filename), mem->desc, alias_mem_desc);