Module Name: src
Committed By: dholland
Date: Mon May 30 02:41:39 UTC 2016
Modified Files:
src/sys/arch/amiga/stand/binpatch: binpatch.c
Log Message:
Reindent.
To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/amiga/stand/binpatch/binpatch.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amiga/stand/binpatch/binpatch.c
diff -u src/sys/arch/amiga/stand/binpatch/binpatch.c:1.12 src/sys/arch/amiga/stand/binpatch/binpatch.c:1.13
--- src/sys/arch/amiga/stand/binpatch/binpatch.c:1.12 Mon May 30 02:36:37 2016
+++ src/sys/arch/amiga/stand/binpatch/binpatch.c Mon May 30 02:41:39 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: binpatch.c,v 1.12 2016/05/30 02:36:37 dholland Exp $ */
+/* $NetBSD: binpatch.c,v 1.13 2016/05/30 02:41:39 dholland Exp $ */
/* Author: Markus Wild [email protected] ??? */
/* Modified: Rob Leland [email protected] */
@@ -30,6 +30,7 @@ static char synusage[] =
"\t%s [-b|-w|-l] -s symbol[[[index]][=value]] binary\n"
"\t%s [-b|-w|-l] [-o offset] -s symbol [-r value] binary\n"
"\t%s [-b|-w|-l] [-o offset] -a address [-r value] binary\n";
+
static char desusage[] =
"DESCRIPTION\n"
"\tAllows the patching of BSD binaries, for example,a distributed\n"
@@ -77,8 +78,8 @@ extern int optind;
void error (char *) __attribute__((__noreturn__));
static void Synopsis(char *program_name);
static void Usage(char *program_name);
-static u_long FindAssign(char *symbol,u_long *rvalue);
-static void FindOffset(char *symbol,u_long *index);
+static u_long FindAssign(char *symbol, u_long *rvalue);
+static void FindOffset(char *symbol, u_long *index);
/* The following variables are so binpatch can be tested on itself */
int test = 1;
@@ -88,251 +89,253 @@ char viewb[10] = {0,0,1,0,1,1,0,1,1,1};
short vieww[10] = {0,0,1,0,1,1,0,1,1,1};
long viewl[10] = {0,0,1,0,1,1,0,1,1,1};
/* End of test binpatch variables */
+
int
main(int argc, char *argv[])
{
- struct exec e;
- int c;
- u_long addr = 0, offset = 0;
- u_long index = 0;/* Related to offset */
- u_long replace = 0, do_replace = 0;
- char *symbol = 0;
- char size = 4; /* default to long */
- char size_opt = 0; /* Flag to say size option was set, used with index */
- char *fname;
- char *pgname = argv[0]; /* Program name */
- int fd;
- int type, off;
- u_long lval;
- u_short sval;
- u_char cval;
-
-
- while ((c = getopt (argc, argv, "H:a:bwlr:s:o:")) != -1)
- switch (c)
- {
- case 'H':
- Usage(argv[0]);
- break;
- case 'a':
- if (addr || symbol)
- error ("only one address/symbol allowed");
- if (! strncmp (optarg, "0x", 2))
- sscanf (optarg, "%x", &addr);
- else
- addr = atoi (optarg);
- if (! addr)
- error ("invalid address");
- break;
-
- case 'b':
- size = 1;
- size_opt = 1;
- break;
-
- case 'w':
- size = 2;
- size_opt = 1;
- break;
-
- case 'l':
- size = 4;
- size_opt = 1;
- break;
-
- case 'r':
- do_replace = 1;
- if (! strncmp (optarg, "0x", 2))
- sscanf (optarg, "%x", &replace);
- else
- replace = atoi (optarg);
- break;
+ struct exec e;
+ int c;
+ u_long addr = 0, offset = 0;
+ u_long index = 0;/* Related to offset */
+ u_long replace = 0, do_replace = 0;
+ char *symbol = 0;
+ char size = 4; /* default to long */
+ char size_opt = 0; /* Flag to say size option was set, used with index */
+ char *fname;
+ char *pgname = argv[0]; /* Program name */
+ int fd;
+ int type, off;
+ u_long lval;
+ u_short sval;
+ u_char cval;
+
+
+ while ((c = getopt (argc, argv, "H:a:bwlr:s:o:")) != -1)
+ switch (c)
+ {
+ case 'H':
+ Usage(argv[0]);
+ break;
+ case 'a':
+ if (addr || symbol)
+ error ("only one address/symbol allowed");
+ if (! strncmp (optarg, "0x", 2))
+ sscanf (optarg, "%x", &addr);
+ else
+ addr = atoi (optarg);
+ if (! addr)
+ error ("invalid address");
+ break;
+
+ case 'b':
+ size = 1;
+ size_opt = 1;
+ break;
+
+ case 'w':
+ size = 2;
+ size_opt = 1;
+ break;
+
+ case 'l':
+ size = 4;
+ size_opt = 1;
+ break;
+
+ case 'r':
+ do_replace = 1;
+ if (! strncmp (optarg, "0x", 2))
+ sscanf (optarg, "%x", &replace);
+ else
+ replace = atoi (optarg);
+ break;
+
+ case 's':
+ if (addr || symbol)
+ error ("only one address/symbol allowed");
+ symbol = optarg;
+ break;
+
+ case 'o':
+ if (offset)
+ error ("only one offset allowed");
+ if (! strncmp (optarg, "0x", 2))
+ sscanf (optarg, "%x", &offset);
+ else
+ offset = atoi (optarg);
+ break;
+ }/* while switch() */
- case 's':
- if (addr || symbol)
- error ("only one address/symbol allowed");
- symbol = optarg;
- break;
-
- case 'o':
- if (offset)
- error ("only one offset allowed");
- if (! strncmp (optarg, "0x", 2))
- sscanf (optarg, "%x", &offset);
+ if (argc > 1)
+ {
+ if (addr || symbol)
+ {
+ argv += optind;
+ argc -= optind;
+
+ if (argc < 1)
+ error ("No file to patch.");
+
+ fname = argv[0];
+ if ((fd = open (fname, 0)) < 0)
+ error ("Can't open file");
+
+ if (read (fd, &e, sizeof (e)) != sizeof (e)
+ || N_BADMAG (e))
+ error ("Not a valid executable.");
+
+ /* fake mid, so the N_ macros work on the amiga.. */
+ e.a_midmag |= 127 << 16;
+
+ if (symbol)
+ {
+ struct nlist nl[2];
+ if (offset == 0)
+ {
+ u_long new_do_replace = 0;
+
+ new_do_replace = FindAssign(symbol,&replace);
+ if (new_do_replace && do_replace)
+ error("Cannot use both '=' and '-r' option!");
+ FindOffset(symbol,&index);
+ if (size_opt)
+ offset = index*size; /* Treat like an index */
+ else
+ offset = index; /* Treat index like an offset */
+ if (new_do_replace)
+ do_replace = new_do_replace;
+ }
+ nl[0].n_un.n_name = symbol;
+ nl[1].n_un.n_name = 0;
+ if (nlist (fname, nl) != 0)
+ {
+ fprintf(stderr,"Symbol is %s ",symbol);
+ error ("Symbol not found.");
+ }
+ addr = nl[0].n_value;
+ type = nl[0].n_type & N_TYPE;
+ }
+ else
+ {
+ type = N_UNDF;
+ if (addr >= N_TXTADDR(e) && addr < N_DATADDR(e))
+ type = N_TEXT;
+ else if (addr >= N_DATADDR(e) && addr < N_DATADDR(e) + e.a_data)
+ type = N_DATA;
+ }
+ addr += offset;
+
+ /* if replace-mode, have to reopen the file for writing.
+ Can't do that from the beginning, or nlist() will not
+ work (at least not under AmigaDOS) */
+ if (do_replace)
+ {
+ close (fd);
+ if ((fd = open (fname, 2)) == -1)
+ error ("Can't reopen file for writing.");
+ }
+
+ if (type != N_TEXT && type != N_DATA)
+ error ("address/symbol is not in text or data section.");
+
+ if (type == N_TEXT)
+ off = addr - N_TXTADDR(e) + N_TXTOFF(e);
+ else
+ off = addr - N_DATADDR(e) + N_DATOFF(e);
+
+ if (lseek (fd, off, 0) == -1)
+ error ("lseek");
+
+ /* not beautiful, but works on big and little endian machines */
+ switch (size)
+ {
+ case 1:
+ if (read (fd, &cval, 1) != 1)
+ error ("cread");
+ lval = cval;
+ break;
+
+ case 2:
+ if (read (fd, &sval, 2) != 2)
+ error ("sread");
+ lval = sval;
+ break;
+
+ case 4:
+ if (read (fd, &lval, 4) != 4)
+ error ("lread");
+ break;
+ }/* switch size */
+
+
+ if (symbol)
+ printf ("%s(0x%x): %d (0x%x)\n", symbol, addr, lval, lval);
+ else
+ printf ("0x%x: %d (0x%x)\n", addr, lval, lval);
+
+ if (do_replace)
+ {
+ if (lseek (fd, off, 0) == -1)
+ error ("write-lseek");
+ switch (size)
+ {
+ case 1:
+ cval = replace;
+ if (cval != replace)
+ error ("byte-value overflow.");
+ if (write (fd, &cval, 1) != 1)
+ error ("cwrite");
+ break;
+
+ case 2:
+ sval = replace;
+ if (sval != replace)
+ error ("word-value overflow.");
+ if (write (fd, &sval, 2) != 2)
+ error ("swrite");
+ break;
+
+ case 4:
+ if (write (fd, &replace, 4) != 4)
+ error ("lwrite");
+ break;
+ }/* switch(size) */
+ }/* if (do_replace) */
+
+ close (fd);
+ }/* if(addr || symbol ) */
+ else
+ {
+ error("Must specify either address or symbol.");
+ }
+ }/* if argc < 1 */
else
- offset = atoi (optarg);
- break;
- }/* while switch() */
-
- if (argc > 1)
- {
- if (addr || symbol)
- {
- argv += optind;
- argc -= optind;
-
- if (argc < 1)
- error ("No file to patch.");
-
- fname = argv[0];
- if ((fd = open (fname, 0)) < 0)
- error ("Can't open file");
-
- if (read (fd, &e, sizeof (e)) != sizeof (e)
- || N_BADMAG (e))
- error ("Not a valid executable.");
-
- /* fake mid, so the N_ macros work on the amiga.. */
- e.a_midmag |= 127 << 16;
-
- if (symbol)
- {
- struct nlist nl[2];
- if (offset == 0)
{
- u_long new_do_replace = 0;
- new_do_replace = FindAssign(symbol,&replace);
- if (new_do_replace && do_replace)
- error("Cannot use both '=' and '-r' option!");
- FindOffset(symbol,&index);
- if (size_opt)
- offset = index*size; /* Treat like an index */
- else
- offset = index; /* Treat index like an offset */
- if (new_do_replace)
- do_replace = new_do_replace;
+ Synopsis(pgname);
}
- nl[0].n_un.n_name = symbol;
- nl[1].n_un.n_name = 0;
- if (nlist (fname, nl) != 0)
- {
- fprintf(stderr,"Symbol is %s ",symbol);
- error ("Symbol not found.");
- }
- addr = nl[0].n_value;
- type = nl[0].n_type & N_TYPE;
- }
- else
- {
- type = N_UNDF;
- if (addr >= N_TXTADDR(e) && addr < N_DATADDR(e))
- type = N_TEXT;
- else if (addr >= N_DATADDR(e) && addr < N_DATADDR(e) + e.a_data)
- type = N_DATA;
- }
- addr += offset;
-
- /* if replace-mode, have to reopen the file for writing.
- Can't do that from the beginning, or nlist() will not
- work (at least not under AmigaDOS) */
- if (do_replace)
- {
- close (fd);
- if ((fd = open (fname, 2)) == -1)
- error ("Can't reopen file for writing.");
- }
-
- if (type != N_TEXT && type != N_DATA)
- error ("address/symbol is not in text or data section.");
-
- if (type == N_TEXT)
- off = addr - N_TXTADDR(e) + N_TXTOFF(e);
- else
- off = addr - N_DATADDR(e) + N_DATOFF(e);
-
- if (lseek (fd, off, 0) == -1)
- error ("lseek");
-
- /* not beautiful, but works on big and little endian machines */
- switch (size)
- {
- case 1:
- if (read (fd, &cval, 1) != 1)
- error ("cread");
- lval = cval;
- break;
-
- case 2:
- if (read (fd, &sval, 2) != 2)
- error ("sread");
- lval = sval;
- break;
-
- case 4:
- if (read (fd, &lval, 4) != 4)
- error ("lread");
- break;
- }/* switch size */
-
-
- if (symbol)
- printf ("%s(0x%x): %d (0x%x)\n", symbol, addr, lval, lval);
- else
- printf ("0x%x: %d (0x%x)\n", addr, lval, lval);
-
- if (do_replace)
- {
- if (lseek (fd, off, 0) == -1)
- error ("write-lseek");
- switch (size)
- {
- case 1:
- cval = replace;
- if (cval != replace)
- error ("byte-value overflow.");
- if (write (fd, &cval, 1) != 1)
- error ("cwrite");
- break;
-
- case 2:
- sval = replace;
- if (sval != replace)
- error ("word-value overflow.");
- if (write (fd, &sval, 2) != 2)
- error ("swrite");
- break;
-
- case 4:
- if (write (fd, &replace, 4) != 4)
- error ("lwrite");
- break;
- }/* switch(size) */
- }/* if (do_replace) */
-
- close (fd);
- }/* if(addr || symbol ) */
- else
- {
- error("Must specify either address or symbol.");
- }
- }/* if argc < 1 */
- else
- {
- Synopsis(pgname);
- }
- return(0);
+ return(0);
}/* main () */
void error (char *str)
{
- fprintf (stderr, "%s\n", str);
- exit (1);
+ fprintf (stderr, "%s\n", str);
+ exit (1);
}
/* Give user very short help to avoid scrolling screen much */
static void Synopsis(char *pgname)
{
- fprintf(stdout,synusage,pgname,pgname,pgname,pgname,pgname);
+ fprintf(stdout, synusage, pgname, pgname, pgname, pgname, pgname);
}
static void Usage(char *pgname)
{
- Synopsis(pgname);
- fprintf(stdout,desusage);
- exit(0);
+ Synopsis(pgname);
+ fprintf(stdout, desusage);
+ exit(0);
}
@@ -351,44 +354,44 @@ static void Usage(char *pgname)
*/
static void FindOffset(char *symbol,u_long *index)
{
- char *sb=strchr(symbol,'['); /* Start of '[', now line must
- contain matching']' */
- char *eb=strchr(symbol,']'); /* End of ']' */
- short sz=strlen(symbol); /* symbol size */
- if (sb)
- {
- if (eb && (eb > sb))
- {
- if ((eb - symbol) == (sz - 1))
- {
- char *sindex; /* Start of index */
- u_long newindex = 0;
- /* In the future we could get fancy and parse the
- sindex string for mathmatical expressions like:
- (3 - 1)*2 = 4 from above example,
- ugh forget I mentioned ot :-) !
- */
- sindex = sb + 1;
- *eb = '\0';
- newindex = (u_long)atoi(sindex);
- if (*index == 0)
- {
- *index = newindex;
- *sb = '\0'; /* Make _view[3] look like _view */
- }
- else
- fprintf(stderr,"Error index can only be specified once!\n");
- }
- else
- {
- fprintf(stderr,"Error: Garbage trailing ']'\n");
- }
- }
- else
- {
- fprintf(stderr,"Error ']' in symbol before '[' !\n");
- }
- }/* if sb != 0 */
+ char *sb=strchr(symbol,'['); /* Start of '[', now line must
+ contain matching']' */
+ char *eb=strchr(symbol,']'); /* End of ']' */
+ short sz=strlen(symbol); /* symbol size */
+ if (sb)
+ {
+ if (eb && (eb > sb))
+ {
+ if ((eb - symbol) == (sz - 1))
+ {
+ char *sindex; /* Start of index */
+ u_long newindex = 0;
+ /* In the future we could get fancy and parse the
+ sindex string for mathmatical expressions like:
+ (3 - 1)*2 = 4 from above example,
+ ugh forget I mentioned ot :-) !
+ */
+ sindex = sb + 1;
+ *eb = '\0';
+ newindex = (u_long)atoi(sindex);
+ if (*index == 0)
+ {
+ *index = newindex;
+ *sb = '\0'; /* Make _view[3] look like _view */
+ }
+ else
+ fprintf(stderr,"Error index can only be specified once!\n");
+ }
+ else
+ {
+ fprintf(stderr,"Error: Garbage trailing ']'\n");
+ }
+ }
+ else
+ {
+ fprintf(stderr,"Error ']' in symbol before '[' !\n");
+ }
+ }/* if sb != 0 */
}/* FindOffset */
/* FindAssign : Scans symbol name for an '=number' strips it off
@@ -396,23 +399,24 @@ static void FindOffset(char *symbol,u_lo
*/
static u_long FindAssign(char *symbol,u_long *rvalue)
{
- char *ce = rindex(symbol,'='); /* Assign symbol some number */
- char *cn = ce + 1; /* This should point at some number, no spaces allowed */
- u_long dr = 0; /* flag for do_replace */
- if (ce)
- {
- int nscan; /* number of variaables scanned in */
- /* get the number to assign to symbol and strip off = */
- for (cn=ce + 1; *cn==' '; cn++)
- ;
- if (! strncmp (cn, "0x", 2))
- nscan = sscanf (cn, "%x",rvalue);
- else
- nscan = sscanf(cn,"%d",rvalue);
- if (nscan != 1)
- error("Invalid value following '='");
- dr = 1;
- *ce = '\0';/* Now were left with just symbol */
- }/* if (ce) */
- return(dr);
+ char *ce = rindex(symbol,'='); /* Assign symbol some number */
+ char *cn = ce + 1; /* This should point at some number, no spaces allowed */
+ u_long dr = 0; /* flag for do_replace */
+
+ if (ce)
+ {
+ int nscan; /* number of variaables scanned in */
+ /* get the number to assign to symbol and strip off = */
+ for (cn=ce + 1; *cn==' '; cn++)
+ ;
+ if (! strncmp (cn, "0x", 2))
+ nscan = sscanf (cn, "%x",rvalue);
+ else
+ nscan = sscanf(cn,"%d",rvalue);
+ if (nscan != 1)
+ error("Invalid value following '='");
+ dr = 1;
+ *ce = '\0';/* Now were left with just symbol */
+ }/* if (ce) */
+ return(dr);
}/* FindAssign */